From 7d7e85236c1812b082434fa0b4b2fc3023660304 Mon Sep 17 00:00:00 2001 From: yulongcai <141199398+yulongcai@users.noreply.github.com> Date: Fri, 12 Apr 2024 11:39:50 +0800 Subject: [PATCH 01/81] ADM-898[backend][frontend]: feat: block' in board mapping is mutually exclusive with 'flag as block' (#1350) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * ADM-898:[backend] feat: should not export cycle time flag on table header when not consider flag as block * ADM-898:[frontend]feat: not show flagCard when board mapping table has ‘block’ column * ADM-898:[frontend]feat: warning pop-up when conflict * ADM-898:[frontend]refactor: refactor codes * ADM-898:[frontend]refactor: remove fromFlag * ADM-898:[frontend]feat: not show flagCard when board mapping table has ‘block’ column * ADM-873-bug:[backend] feat: add test for as flag is block is false * ADM-898:[frontend]feat: add status logic * ADM-898:[frontend]refactor: refactor code * ADM-898:[backend] fix: fix bug for not calculate flag block to cycle when consider flag as block * ADM-886:[docs]docs: refactor chart API docs sequence diagram (#1339) * ADM-886:[docs]docs: update chart API image size * ADM-886:[docs]docs: update chart API docs content * ADM-886:[docs]docs: refactor chart API docs * ADM-886:[docs]docs: refactor chart API docs sequence diagram * ADM 834 add frontend validation to board Id (#1338) * ADM-834:[frontend]feat: fix rebase * ADM-834:[backend]feat: added api for domain url check * ADM-834:[backend]feat: add dashboard api for site check * ADM-834:[backend]feat: added api for domain url check * ADM-834:[frontend]fix: fix rebase * ADM-834:[frontend]fix: add regex validation to board id * ADM-834:[frontend]fix: fix lint * ADM 751 [docs]docs: fix readme in board mappings part (#1334) * ADM-751:[frontend]feat: add by status e2e test flow into import test * ADM-751:[frontend]feat: add more flow in create test * ADM-751:[frontend]feat: fix lint and refactor fixture file * ADM-751:[frontend]feat: fix by state flow and add new test * ADM-751:[frontend]feat: refactored file strcture and implemented new e2e test for cycle time status testing, just need to fix the data then * ADM-751:[frontend]feat: rework the by status flow e2e test, remove unnecessary steps * ADM-751:[frontend]feat: fix test flow again * ADM-751:[frontend]feat: fix type check * ADM-751:[frontend]feat: add status flow e2e test in import test * ADM-751:[frontend]fix: fix lint * ADM-882:[backend]feat: add import json file * ADM-751:[frontend]fix: refactor code * ADM-751:[frontend]fix: refactor code fix type * ADM-751:[docs]docs: fix readme in board mappings * ADM-751:[docs]docs: remove conflicted rework part * ADM-751 refactor --------- Co-authored-by: guzhongren * chore(sbom): generate sbom when releasing (#1340) * ADM-833:[frontend]feat:add e2e unhappy path scenarios (#1328) * ADM-833:[frontend]feat:add e2e unhappy path scenarios ADM-833: [frontend] add e2e test scenarios ADM-833: [frontend] fix: fix code style error ADM-833: [frontend] feat: add unhappy path scenoria ADM-833: [frontend] feat: optimize add and remove new pipeline,add unhappy path template ADM-833: [frontend] feat: optimize remove new pipeline,unhappy path template ADM-833: [frontend] feat: optimize remove new pipeline,unhappy path template ADM-833:[frontend]feat:merge unhappy path scenario ADM-833: [frontend] update: update e2e test scenarios ADM-833: [frontend] fix: fix code style error ADM-833: [frontend] update: update e2e test scenarios ADM-833: [frontend] update: update e2e test scenarios ADM-833: [frontend] fix: fix e2e test error ADM-833:[frontend]feat:distinguish major and unhappy path test in local environment ADM-833: [frontend] feat: sperate major and all ADM-833[frontend]feat:change branch invalid error message ADM-833: [frontend] fix: fix index.ts error ADM-833: [frontend] fix: remove the log file ADM-833: [frontend] fix: fix conflict with main branch ADM-833: [frontend] fix: revert readme ADM-833: [frontend] fix: remove log file ADM-833: [frontend] fix: modify .gitignore, add omit logs * ADM-833 fix path * ADM-833: [frontend] fix: update the spec location * ADM-833: [frontend] fix: fix daterange error * ADM-833: [frontend] fix: fix review error * ADM-833: [frontend] fix: fix review error --------- Co-authored-by: YaoZhang-Daniel Co-authored-by: guzhongren * ADM-833: [frontend] fix: fix env error (#1341) * ADM-833:[frontend]feat:add e2e unhappy path scenarios ADM-833: [frontend] add e2e test scenarios ADM-833: [frontend] fix: fix code style error ADM-833: [frontend] feat: add unhappy path scenoria ADM-833: [frontend] feat: optimize add and remove new pipeline,add unhappy path template ADM-833: [frontend] feat: optimize remove new pipeline,unhappy path template ADM-833: [frontend] feat: optimize remove new pipeline,unhappy path template ADM-833:[frontend]feat:merge unhappy path scenario ADM-833: [frontend] update: update e2e test scenarios ADM-833: [frontend] fix: fix code style error ADM-833: [frontend] update: update e2e test scenarios ADM-833: [frontend] update: update e2e test scenarios ADM-833: [frontend] fix: fix e2e test error ADM-833:[frontend]feat:distinguish major and unhappy path test in local environment ADM-833: [frontend] feat: sperate major and all ADM-833[frontend]feat:change branch invalid error message ADM-833: [frontend] fix: fix index.ts error ADM-833: [frontend] fix: remove the log file ADM-833: [frontend] fix: fix conflict with main branch ADM-833: [frontend] fix: revert readme ADM-833: [frontend] fix: remove log file ADM-833: [frontend] fix: modify .gitignore, add omit logs * ADM-833 fix path * ADM-833: [frontend] fix: update the spec location * ADM-833: [frontend] fix: fix daterange error * ADM-833: [frontend] fix: fix review error * ADM-833: [frontend] fix: fix review error * ADM-833: [frontend] fix: fix env error --------- Co-authored-by: YaoZhang-Daniel Co-authored-by: guzhongren * Revert "ADM-833: [frontend] fix: fix env error (#1341)" (#1344) This reverts commit eed90dc2ee055d2b0601db4ddfb22877effbf7a7. * [ADM-833][frontend]: chore: fix the e2e env injection error. (#1345) * refactor(e2e): name conversion[frontend] * fix(e2e): fix type check[frontend] * ADM-898:[frontend]fix: fix test * ADM-898:[frontend]feat: add test for CycleTime * ADM-898:[frontend]fix: fix UpperCase error * ADM-898:[frontend]fix: fix default value * ADM-898:[frontend]fix: fix import treatFlagCardAsBlock value * ADM-898:[backend] fix: repair e2e test * ADM-898:[backend] fix: repair e2e test to delete check consider flag as block * ADM-898:[backend] fix: sonar issue * [ADM-877][frontend]: feat: remove the limit of start-date & end-date selection. (#1342) * [ADM-877][frontend]: feat: remove the limit of start-date & end-date selection. * [ADM-877][frontend]: chore: refine code. * ADM-873:[frontend][backend] fix: fix success notification (#1327) * ADM-873-bug:[docx] docx: fix docx * ADM-873:[frontend]fix: fix error notification * ADM-873:[frontend]refactor: refactor code * ADM-873-bug:[backend] feat: return flag for whether it has file create by this invoke * Revert "ADM-873:[frontend]refactor: refactor code" This reverts commit e2fe52fc2c1b41dd0c2743daed78a6ff08a98f56. * Revert "ADM-873:[frontend]fix: fix error notification" This reverts commit b659c63af9143eecc97ae83f322f61885b9ad447. * ADM-873:[frontend]fix: use hasCsvFileCreateSuccessful to handle success notification * ADM-873-bug:[backend] feat: return has csv create successful when get completed * ADM-873-bug:[backend] fix: rename * ADM-873:[frontend]fix: fix test * ADM-873:[frontend]refactor: rename hasCsvFileCreateSuccessful to isSuccessfulCreateCsvFile * ADM-873:[backend]refactor: modify test info * ADM-873:[backend]refactor: format code --------- Co-authored-by: yulongcai Co-authored-by: Rui7ing <129819182+Rui7ing@users.noreply.github.com> * [frontend] feat/adm 811: Do not clear the configuration settings when returning from the metric page to the configuration page. (#1343) * [feat][adm-811]: remove GoCD option * [frontend][adm-811]: feat: remove clear config data trigger when back to config page * [frontend][adm-811]: refact: refact unit test * [frontend][adm-811]: replace fireEvent use userEvent * [frontend][adm-811]: fix failed case * Adm 910[docs] feat: add Github graghQL rate limit issue (#1348) * ADM-910[docs] feat: add Node and Rate limits and calculate * ADM-910[docs] feat: add flew chart for get data by github api * Adm 912[frontend]: ui refine date picker in metrics page (#1349) * ADM-912 feat: display date ranges * ADM-912 test: add unit test * ADM-912 fix: fix css * ADM-912 fix: fix color * ADM-912 fix: fix hex color * ADM-912 fix: use color from theme * ADM-898:[frontend]feat: add block case * ADM-898:[frontend]fix: fix test for treatFlagCardAsBlock * ADM-898:[frontend]fix: fix bug * ADM-898 fix: fix treat flag card as block when import * ADM-898 fix: fix treat flag card as block when create * ADM-898 refactor: rename * ADM-898:[frontend]fix: remove unnecessary cycleTimeSettings * ADM-898 fix: fix test * ADM-898:[backend] refactor: refactor code * ADM-898 test: add unit test * ADM-898 test: add e2e test for no block column board when create project * ADM-898 test: add e2e test for no block column board when import project * ADM-898:[frontend]refactor: iterate over test data and run tests using forEach * ADM-898:[frontend]refactor: export BLOCK_COLUMN_NAME * ADM-898:[frontend]refactor: fix prettier error * ADM-898:[frontend]fix: fix the error from merge --------- Co-authored-by: Tingyu Dong Co-authored-by: Steveay <907221539@qq.com> Co-authored-by: PengxiWPix <113176309+PengxiWPix@users.noreply.github.com> Co-authored-by: guzhongren Co-authored-by: YaoZhang87 <162096287+YaoZhang87@users.noreply.github.com> Co-authored-by: YaoZhang-Daniel Co-authored-by: Chao <89126516+mrcuriosity-tw@users.noreply.github.com> Co-authored-by: TingyuDong <113588395+TingyuDong@users.noreply.github.com> Co-authored-by: Rui7ing <129819182+Rui7ing@users.noreply.github.com> Co-authored-by: K Chow Co-authored-by: junbo dai Co-authored-by: Leiqiuhong <141199516+Leiqiuhong@users.noreply.github.com> Co-authored-by: Leiqiuhong --- .../service/board/jira/JiraService.java | 3 +- .../main/java/heartbeat/util/BoardUtil.java | 22 +++++---- .../service/jira/JiraServiceTest.java | 2 +- .../java/heartbeat/util/BoardUtilTest.java | 18 ++++++- ...ItemsListAndCycleTimeInfosListFixture.java | 46 +++++++++++------- .../containers/MetricsStep/CycleTime.test.tsx | 21 +++++++- .../MetricsStep/MetricsStep.test.tsx | 2 +- .../__tests__/context/metricsSlice.test.ts | 28 +++++++++++ frontend/__tests__/fixtures.ts | 1 - .../hooks/reportMapper/report.test.tsx | 10 ++-- .../board-data-without-block-column.csv | 4 ++ .../e2e/fixtures/create-new/board-data.csv | 48 +++++++++---------- .../e2e/fixtures/create-new/config-step.ts | 19 ++++++++ .../e2e/fixtures/create-new/metrics-step.ts | 24 +++++++++- .../e2e/fixtures/create-new/report-result.ts | 4 +- .../board-data-by-status.csv | 10 ++-- .../cycle-time-by-column-fixture.ts | 2 +- .../board-data-without-block-column.csv | 7 +++ .../e2e/fixtures/import-file/board-data.csv | 2 +- frontend/e2e/pages/metrics/config-step.ts | 3 +- frontend/e2e/pages/metrics/metrics-step.ts | 36 ++++++++++++-- frontend/e2e/pages/metrics/report-step.ts | 15 ++++++ .../major-path/create-a-new-project.spec.ts | 46 +++++++++++++++++- .../cycle-time-by-status-test.spec.ts | 2 - .../import-project-from-file.spec.ts | 10 +++- .../e2e/specs/major-path/page-jumps.spec.ts | 2 - frontend/src/clients/report/ReportClient.ts | 1 - frontend/src/clients/report/dto/response.ts | 1 - frontend/src/constants/resources.ts | 5 +- .../MetricsStep/CycleTime/index.tsx | 36 ++++++++++++-- frontend/src/context/Metrics/metricsSlice.ts | 35 +++++++++++--- frontend/src/hooks/useVerifyBoardEffect.ts | 2 - frontend/src/utils/util.ts | 16 ++++++- 33 files changed, 385 insertions(+), 98 deletions(-) create mode 100644 frontend/e2e/fixtures/create-new/board-data-without-block-column.csv create mode 100644 frontend/e2e/fixtures/import-file/board-data-without-block-column.csv diff --git a/backend/src/main/java/heartbeat/service/board/jira/JiraService.java b/backend/src/main/java/heartbeat/service/board/jira/JiraService.java index b22b29a3dd..27e77de786 100644 --- a/backend/src/main/java/heartbeat/service/board/jira/JiraService.java +++ b/backend/src/main/java/heartbeat/service/board/jira/JiraService.java @@ -844,7 +844,8 @@ private CycleTimeInfoDTO getCycleTime(CardHistoryResponseDTO cardHistoryResponse keyFlagged); List cycleTimeInfos = boardUtil.getCycleTimeInfos(statusChangedArray, realDoneStatus, treatFlagCardAsBlock); - List originCycleTimeInfos = boardUtil.getOriginCycleTimeInfos(statusChangedArray); + List originCycleTimeInfos = boardUtil.getOriginCycleTimeInfos(statusChangedArray, + treatFlagCardAsBlock); return CycleTimeInfoDTO.builder() .cycleTimeInfos(cycleTimeInfos) diff --git a/backend/src/main/java/heartbeat/util/BoardUtil.java b/backend/src/main/java/heartbeat/util/BoardUtil.java index c974755051..fd316d5e6c 100644 --- a/backend/src/main/java/heartbeat/util/BoardUtil.java +++ b/backend/src/main/java/heartbeat/util/BoardUtil.java @@ -20,10 +20,12 @@ public class BoardUtil { private final WorkDay workDay; - public List getOriginCycleTimeInfos(List statusChangedArray) { + public List getOriginCycleTimeInfos(List statusChangedArray, + Boolean treatFlagCardAsBlock) { List flagTimeStamp = getFlagTimeStamps(statusChangedArray); List columnTimeStamp = getColumnTimeStamps(statusChangedArray); - List originCycleTimeInfos = calculateOriginCycleTime(flagTimeStamp, columnTimeStamp); + List originCycleTimeInfos = calculateOriginCycleTime(flagTimeStamp, columnTimeStamp, + treatFlagCardAsBlock); return getCollectRemovedDuplicates(originCycleTimeInfos); } @@ -50,7 +52,7 @@ public List getCycleTimeInfos(List statusChang } private List calculateOriginCycleTime(List flagTimeStamp, - List columnTimeStamp) { + List columnTimeStamp, Boolean treatFlagCardAsBlock) { List originCycleTimeInfos = new ArrayList<>(); for (StatusTimeStamp columnTimeStampItem : columnTimeStamp) { @@ -62,9 +64,11 @@ private List calculateOriginCycleTime(List flagT .build()); } - double totalFlagTimeInDays = calculateTotalFlagCycleTime(flagTimeStamp); - originCycleTimeInfos - .add(CycleTimeInfo.builder().day(totalFlagTimeInDays).column(CardStepsEnum.FLAG.getValue()).build()); + if (Boolean.TRUE.equals(treatFlagCardAsBlock)) { + double totalFlagTimeInDays = calculateTotalFlagCycleTime(flagTimeStamp); + originCycleTimeInfos + .add(CycleTimeInfo.builder().day(totalFlagTimeInDays).column(CardStepsEnum.FLAG.getValue()).build()); + } return originCycleTimeInfos; } @@ -101,10 +105,8 @@ private List calculateCycleTime(List realDoneStatus, List } if (!isBlockColumnExisted(columnTimeStamp) && totalFlagTimeInDays > 0) { double blockDays = totalFlagTimeInDays - totalFlagAndRealDoneOverlapTime; - cycleTimeInfos.add(CycleTimeInfo.builder() - .day(blockDays) - .column(CardStepsEnum.BLOCK.getValue().toUpperCase()) - .build()); + cycleTimeInfos.add( + CycleTimeInfo.builder().day(blockDays).column(CardStepsEnum.FLAG.getValue().toUpperCase()).build()); } return cycleTimeInfos; diff --git a/backend/src/test/java/heartbeat/service/jira/JiraServiceTest.java b/backend/src/test/java/heartbeat/service/jira/JiraServiceTest.java index f404d6525e..b08f514373 100644 --- a/backend/src/test/java/heartbeat/service/jira/JiraServiceTest.java +++ b/backend/src/test/java/heartbeat/service/jira/JiraServiceTest.java @@ -1166,7 +1166,7 @@ public void shouldProcessCustomFieldsForCardsWhenCallGetStoryPointsAndCycleTime( when(jiraFeignClient.getJiraCardHistoryByCount(any(), any(), anyInt(), anyInt(), any())) .thenReturn(CARD_HISTORY_MULTI_RESPONSE_BUILDER().build()); when(boardUtil.getCycleTimeInfos(any(), any(), any())).thenReturn(CYCLE_TIME_INFO_LIST()); - when(boardUtil.getOriginCycleTimeInfos(any())).thenReturn(CYCLE_TIME_INFO_LIST()); + when(boardUtil.getOriginCycleTimeInfos(any(), any())).thenReturn(CYCLE_TIME_INFO_LIST()); CardCollection doneCards = jiraService.getStoryPointsAndCycleTimeAndReworkInfoForDoneCards( storyPointsAndCycleTimeRequest, jiraBoardSetting.getBoardColumns(), List.of("Zhang San"), ""); diff --git a/backend/src/test/java/heartbeat/util/BoardUtilTest.java b/backend/src/test/java/heartbeat/util/BoardUtilTest.java index f676888c5b..65bfbd565f 100644 --- a/backend/src/test/java/heartbeat/util/BoardUtilTest.java +++ b/backend/src/test/java/heartbeat/util/BoardUtilTest.java @@ -81,7 +81,7 @@ void calculateCycleTimeWhenTreatFlagCardAsBlockIsFalse() { } @Test - void calculateOriginCycleTimeOfColumn() { + void shouldCalculateOriginCycleTimeGivenTreatFlagCardAsBlockIsTrue() { List statusChangedItems = StatusChangedItemsListAndCycleTimeInfosListFixture .STATUS_CHANGED_ITEMS_LIST_OF_ORIGIN(); List statusChangedItemsExpect = StatusChangedItemsListAndCycleTimeInfosListFixture @@ -89,8 +89,22 @@ void calculateOriginCycleTimeOfColumn() { when(workDay.calculateWorkDaysBy24Hours(anyLong(), anyLong())) .thenReturn(StatusChangedItemsListAndCycleTimeInfosListFixture.EXPECT_DAYS); - List result = boardUtil.getOriginCycleTimeInfos(statusChangedItems); + + List result = boardUtil.getOriginCycleTimeInfos(statusChangedItems, Boolean.TRUE); Assertions.assertEquals(statusChangedItemsExpect, result); } + @Test + void shouldCalculateOriginCycleTimeGivenTreatFlagCardAsBlockIsFalse() { + List statusChangedItems = StatusChangedItemsListAndCycleTimeInfosListFixture + .STATUS_CHANGED_ITEMS_LIST_OF_ORIGIN(); + List statusChangedItemsWithoutFlagExpect = StatusChangedItemsListAndCycleTimeInfosListFixture + .CYCLE_TIME_INFOS_LIST_OF_ORIGIN_WITHOUT_FLAG(); + + when(workDay.calculateWorkDaysBy24Hours(anyLong(), anyLong())) + .thenReturn(StatusChangedItemsListAndCycleTimeInfosListFixture.EXPECT_DAYS); + List result = boardUtil.getOriginCycleTimeInfos(statusChangedItems, Boolean.FALSE); + Assertions.assertEquals(statusChangedItemsWithoutFlagExpect, result); + } + } diff --git a/backend/src/test/java/heartbeat/util/StatusChangedItemsListAndCycleTimeInfosListFixture.java b/backend/src/test/java/heartbeat/util/StatusChangedItemsListAndCycleTimeInfosListFixture.java index 8e0c8126ed..f2cbdc7fed 100644 --- a/backend/src/test/java/heartbeat/util/StatusChangedItemsListAndCycleTimeInfosListFixture.java +++ b/backend/src/test/java/heartbeat/util/StatusChangedItemsListAndCycleTimeInfosListFixture.java @@ -9,6 +9,14 @@ public class StatusChangedItemsListAndCycleTimeInfosListFixture { public static double EXPECT_DAYS = 4.0; + public static final String DONE = "DONE"; + + public static final String BLOCK = "BLOCK"; + + public static final String IN_PROGRESS = "IN PROGRESS"; + + public static final String FLAG = "FLAG"; + public static List STATUS_CHANGED_ITEMS_LIST_OF_REAL_DONE_COLUMN() { return List.of(StatusChangedItem.builder().timestamp(1000000L).status("In Progress").build(), StatusChangedItem.builder().timestamp(2000000L).status("DONE").build(), @@ -17,9 +25,9 @@ public static List STATUS_CHANGED_ITEMS_LIST_OF_REAL_DONE_COL } public static List CYCLE_TIME_INFOS_LIST_OF_REAL_DONE_COLUMN() { - return List.of(CycleTimeInfo.builder().column("DONE").day(EXPECT_DAYS).build(), - CycleTimeInfo.builder().column("BLOCK").day(0.0).build(), - CycleTimeInfo.builder().column("IN PROGRESS").day(EXPECT_DAYS).build()); + return List.of(CycleTimeInfo.builder().column(DONE).day(EXPECT_DAYS).build(), + CycleTimeInfo.builder().column(IN_PROGRESS).day(EXPECT_DAYS).build(), + CycleTimeInfo.builder().column(FLAG).day(0.0).build()); } public static List STATUS_CHANGED_ITEMS_LIST_OF_BLOCK_COLUMN() { @@ -31,9 +39,9 @@ public static List STATUS_CHANGED_ITEMS_LIST_OF_BLOCK_COLUMN( } public static List CYCLE_TIME_INFOS_LIST_OF_BLOCK_COLUMN() { - return List.of(CycleTimeInfo.builder().column("DONE").day(EXPECT_DAYS).build(), - CycleTimeInfo.builder().column("BLOCK").day(EXPECT_DAYS).build(), - CycleTimeInfo.builder().column("IN PROGRESS").day(EXPECT_DAYS).build()); + return List.of(CycleTimeInfo.builder().column(DONE).day(EXPECT_DAYS).build(), + CycleTimeInfo.builder().column(BLOCK).day(EXPECT_DAYS).build(), + CycleTimeInfo.builder().column(IN_PROGRESS).day(EXPECT_DAYS).build()); } public static List STATUS_CHANGED_ITEMS_LIST_OF_OTHER_COLUMN() { @@ -45,9 +53,9 @@ public static List STATUS_CHANGED_ITEMS_LIST_OF_OTHER_COLUMN( } public static List CYCLE_TIME_INFOS_LIST_OF_OTHER_COLUMN() { - return List.of(CycleTimeInfo.builder().column("DONE").day(EXPECT_DAYS).build(), - CycleTimeInfo.builder().column("BLOCK").day(8.0).build(), - CycleTimeInfo.builder().column("IN PROGRESS").day(0.0).build()); + return List.of(CycleTimeInfo.builder().column(DONE).day(EXPECT_DAYS).build(), + CycleTimeInfo.builder().column(BLOCK).day(8.0).build(), + CycleTimeInfo.builder().column(IN_PROGRESS).day(0.0).build()); } public static List STATUS_CHANGED_ITEMS_LIST_WHEN_NOT_TREAT_FLAG_AS_BLOCK() { @@ -59,9 +67,9 @@ public static List STATUS_CHANGED_ITEMS_LIST_WHEN_NOT_TREAT_F } public static List CYCLE_TIME_INFOS_LIST_WHEN_NOT_TREAT_FLAG_AS_BLOCK() { - return List.of(CycleTimeInfo.builder().column("DONE").day(EXPECT_DAYS).build(), - CycleTimeInfo.builder().column("BLOCK").day(EXPECT_DAYS).build(), - CycleTimeInfo.builder().column("IN PROGRESS").day(EXPECT_DAYS).build()); + return List.of(CycleTimeInfo.builder().column(DONE).day(EXPECT_DAYS).build(), + CycleTimeInfo.builder().column(BLOCK).day(EXPECT_DAYS).build(), + CycleTimeInfo.builder().column(IN_PROGRESS).day(EXPECT_DAYS).build()); } public static List STATUS_CHANGED_ITEMS_LIST_OF_ORIGIN() { @@ -73,10 +81,16 @@ public static List STATUS_CHANGED_ITEMS_LIST_OF_ORIGIN() { } public static List CYCLE_TIME_INFOS_LIST_OF_ORIGIN() { - return List.of(CycleTimeInfo.builder().column("DONE").day(EXPECT_DAYS).build(), - CycleTimeInfo.builder().column("BLOCK").day(EXPECT_DAYS).build(), - CycleTimeInfo.builder().column("IN PROGRESS").day(EXPECT_DAYS).build(), - CycleTimeInfo.builder().column("FLAG").day(EXPECT_DAYS).build()); + return List.of(CycleTimeInfo.builder().column(DONE).day(EXPECT_DAYS).build(), + CycleTimeInfo.builder().column(BLOCK).day(EXPECT_DAYS).build(), + CycleTimeInfo.builder().column(IN_PROGRESS).day(EXPECT_DAYS).build(), + CycleTimeInfo.builder().column(FLAG).day(EXPECT_DAYS).build()); + } + + public static List CYCLE_TIME_INFOS_LIST_OF_ORIGIN_WITHOUT_FLAG() { + return List.of(CycleTimeInfo.builder().column(DONE).day(EXPECT_DAYS).build(), + CycleTimeInfo.builder().column(BLOCK).day(EXPECT_DAYS).build(), + CycleTimeInfo.builder().column(IN_PROGRESS).day(EXPECT_DAYS).build()); } } diff --git a/frontend/__tests__/containers/MetricsStep/CycleTime.test.tsx b/frontend/__tests__/containers/MetricsStep/CycleTime.test.tsx index 52f70410c1..ef27fad62d 100644 --- a/frontend/__tests__/containers/MetricsStep/CycleTime.test.tsx +++ b/frontend/__tests__/containers/MetricsStep/CycleTime.test.tsx @@ -6,7 +6,7 @@ import { updateTreatFlagCardAsBlock, } from '@src/context/Metrics/metricsSlice'; import { BOARD_MAPPING, ERROR_MESSAGE_TIME_DURATION, LIST_OPEN, NO_RESULT_DASH } from '../../fixtures'; -import { CYCLE_TIME_SETTINGS_TYPES, METRICS_CONSTANTS } from '@src/constants/resources'; +import { CYCLE_TIME_SETTINGS_TYPES, MESSAGE, METRICS_CONSTANTS } from '@src/constants/resources'; import { act, render, screen, waitFor, within } from '@testing-library/react'; import { CycleTime } from '@src/containers/MetricsStep/CycleTime'; import { setupStore } from '../../utils/setupStoreUtil'; @@ -406,4 +406,23 @@ describe('CycleTime', () => { expect(mockedUseAppDispatch).not.toHaveBeenCalledWith(saveDoneColumn([])); }); }); + + [CYCLE_TIME_SETTINGS_TYPES.BY_STATUS, CYCLE_TIME_SETTINGS_TYPES.BY_COLUMN].forEach((cycleTimeSettingsType) => { + it('should show warning message given both mapping block column and add flag as block', () => { + (selectMetricsContent as jest.Mock).mockReturnValue({ + cycleTimeSettingsType, + cycleTimeSettings: [ + ...cycleTimeSettings, + { + column: 'Blocked', + status: 'BLOCKED', + value: 'Block', + }, + ], + }); + setup(); + + expect(screen.getByText(MESSAGE.FLAG_CARD_DROPPED_WARNING)).toBeVisible(); + }); + }); }); diff --git a/frontend/__tests__/containers/MetricsStep/MetricsStep.test.tsx b/frontend/__tests__/containers/MetricsStep/MetricsStep.test.tsx index 49346b1642..b2d074360d 100644 --- a/frontend/__tests__/containers/MetricsStep/MetricsStep.test.tsx +++ b/frontend/__tests__/containers/MetricsStep/MetricsStep.test.tsx @@ -217,7 +217,7 @@ describe('MetricsStep', () => { await userEvent.click(doneSelectTrigger as HTMLInputElement); - const noneOption = within(screen.getByRole('presentation')).getByText('----'); + const noneOption = within(screen.getAllByRole('presentation')[1]).getByText('----'); await userEvent.click(noneOption); expect(realDoneSettingSection).toHaveTextContent(SELECT_CONSIDER_AS_DONE_MESSAGE); diff --git a/frontend/__tests__/context/metricsSlice.test.ts b/frontend/__tests__/context/metricsSlice.test.ts index 8f9d4a80f9..8cfc3c9797 100644 --- a/frontend/__tests__/context/metricsSlice.test.ts +++ b/frontend/__tests__/context/metricsSlice.test.ts @@ -61,6 +61,7 @@ const initState = { classification: [], treatFlagCardAsBlock: true, assigneeFilter: ASSIGNEE_FILTER_TYPES.LAST_ASSIGNEE, + displayFlagCardDropWarning: true, importedData: { importedCrews: [], importedAssigneeFilter: ASSIGNEE_FILTER_TYPES.LAST_ASSIGNEE, @@ -304,6 +305,32 @@ describe('saveMetricsSetting reducer', () => { expect(savedMetricsSetting.doneColumn).toEqual(['DONE']); }); + it('should not be able to show conflict warning and check the flag card as block', () => { + const mockUpdateMetricsStateArguments = { + ...mockJiraResponse, + isProjectCreated: true, + }; + const savedMetricsSetting = saveMetricsSettingReducer( + { + ...initState, + cycleTimeSettingsType: CYCLE_TIME_SETTINGS_TYPES.BY_STATUS, + importedData: { + ...initState.importedData, + importedCrews: ['User B', 'User C'], + importedClassification: ['issuetype'], + importedCycleTime: { + importedCycleTimeSettings: [{ DOING: 'Doing' }, { TESTING: 'Testing' }, { DONE: 'Done' }], + importedTreatFlagCardAsBlock: false, + }, + importedDoneStatus: ['DONE'], + }, + }, + updateMetricsState(mockUpdateMetricsStateArguments), + ); + expect(savedMetricsSetting.displayFlagCardDropWarning).toEqual(false); + expect(savedMetricsSetting.treatFlagCardAsBlock).toEqual(true); + }); + it('should update metricsState given cycleTimeSettingsType is by status', () => { const mockUpdateMetricsStateArguments = { ...mockJiraResponse, @@ -336,6 +363,7 @@ describe('saveMetricsSetting reducer', () => { { column: 'Testing', status: 'TESTING', value: 'Testing' }, ]); expect(savedMetricsSetting.doneColumn).toEqual(['DONE']); + expect(savedMetricsSetting.displayFlagCardDropWarning).toEqual(true); }); it('should update metricsState given its value changed given isProjectCreated is false and selectedDoneColumns and cycleTimeSettingsType is byStatus', () => { diff --git a/frontend/__tests__/fixtures.ts b/frontend/__tests__/fixtures.ts index b88860ccac..4cfa77c67c 100644 --- a/frontend/__tests__/fixtures.ts +++ b/frontend/__tests__/fixtures.ts @@ -467,7 +467,6 @@ export const MOCK_REPORT_RESPONSE: ReportResponseDTO = { fromAnalysis: null, fromInDev: null, fromBlock: 111, - fromFlag: null, fromReview: 111, fromWaitingForTesting: 111, fromTesting: null, diff --git a/frontend/__tests__/hooks/reportMapper/report.test.tsx b/frontend/__tests__/hooks/reportMapper/report.test.tsx index e78629a51b..6a9b084fb3 100644 --- a/frontend/__tests__/hooks/reportMapper/report.test.tsx +++ b/frontend/__tests__/hooks/reportMapper/report.test.tsx @@ -171,7 +171,7 @@ export const EXPECTED_REPORT_VALUES = { ], }, { - id: 5, + id: 4, name: ( From review to in dev @@ -185,7 +185,7 @@ export const EXPECTED_REPORT_VALUES = { ], }, { - id: 6, + id: 5, name: ( From waiting for testing to in dev @@ -199,7 +199,7 @@ export const EXPECTED_REPORT_VALUES = { ], }, { - id: 8, + id: 7, name: ( From done to in dev @@ -213,7 +213,7 @@ export const EXPECTED_REPORT_VALUES = { ], }, { - id: 9, + id: 8, name: Total rework cards, valueList: [ { @@ -223,7 +223,7 @@ export const EXPECTED_REPORT_VALUES = { ], }, { - id: 10, + id: 9, name: Rework cards ratio, valueList: [ { diff --git a/frontend/e2e/fixtures/create-new/board-data-without-block-column.csv b/frontend/e2e/fixtures/create-new/board-data-without-block-column.csv new file mode 100644 index 0000000000..4e27e05de3 --- /dev/null +++ b/frontend/e2e/fixtures/create-new/board-data-without-block-column.csv @@ -0,0 +1,4 @@ +"Issue key","Summary","Issue Type","Status","Status Date","Story Points","assignee","Reporter","Project Key","Project Name","Priority","Parent Summary","Sprint","Labels","Cycle Time","Cycle Time / Story Points","Analysis Days","In Dev Days","Waiting Days","Testing Days","Block Days","Review Days","OriginCycleTime: TESTING","OriginCycleTime: WAITING FOR TESTING","OriginCycleTime: TO DO","OriginCycleTime: IN DEV","OriginCycleTime: REVIEW","OriginCycleTime: FLAG","Rework: total - In dev","Rework: from Block","Rework: from Waiting for testing","Rework: from Done" +"TNB-1","ADM-898-card1","Task","Done","2024-04-08","0.0","Shiqi Yuan","heartbeat user","TNB","Test-no-block","Medium",,,"","0","","0","0","0","0","0","0","0","0","0","0.01","0","0.01","1","1","0","0" +"TNB-2","ADM-898-card2","Task","Done","2024-04-08","0.0","Shiqi Yuan","heartbeat user","TNB","Test-no-block","Medium",,,"","0","","0","0","0","0","0","0","0","0","0","0.01","0","0.01","2","1","0","1" +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, diff --git a/frontend/e2e/fixtures/create-new/board-data.csv b/frontend/e2e/fixtures/create-new/board-data.csv index 9cce0e14a2..da5ffc9569 100644 --- a/frontend/e2e/fixtures/create-new/board-data.csv +++ b/frontend/e2e/fixtures/create-new/board-data.csv @@ -1,24 +1,24 @@ -"Issue key","Summary","Issue Type","Status","Status Date","Story Points","assignee","Reporter","Project Key","Project Name","Priority","Parent Summary","Sprint","Labels","Cycle Time","Story testing-1","Flagged","Fix versions","Partner","Time tracking","Story point estimate","QA","Feature/Operation","Story testing-2","Cycle Time / Story Points","Analysis Days","In Dev Days","Waiting Days","Testing Days","Block Days","Review Days","OriginCycleTime: TODO","OriginCycleTime: TESTING","OriginCycleTime: WAIT FOR TEST","OriginCycleTime: DOING","OriginCycleTime: REVIEW","OriginCycleTime: FLAG","OriginCycleTime: BLOCKED",Rework: total - In dev,Rework: from Block,Rework: from Review,Rework: from Waiting for testing,Rework: from Testing,Rework: from Done -"ADM-735","[backend]identify the source of the error when generate reports encounter exception","Task","Done","2024-01-19","1.0","Yunsong Yang","Yunsong Yang","ADM","Auto Dora Metrics","Medium","Precise on Metrics","Sprint 28","Stream2","7.70","1.0","","","","None","1.0","","","","7.70","0","2.02","1.81","0","0","3.87","3.03","0","1.81","2.02","3.87","0","0","0","0","0","0","0","0" -"ADM-708","[Backend] Verify board and obtain board data with new API","Task","Done","2024-01-19","3.0","Weiran Sun","heartbeat user","ADM","Auto Dora Metrics","Medium","easy to use","Sprint 28","Stream1","9.95","1.0","","","","None","3.0","","","","3.32","0","4.00","0.93","1.04","0.98","3.00","7.10","1.04","0.93","4.00","3.00","0","0.98","2","2","0","0","0","0" -"ADM-699","[Frontend] Optimize the 4xx&504 error display of report overview","Task","Done","2024-01-18","2.0","heartbeat user","heartbeat user","ADM","Auto Dora Metrics","Medium","Performance Improvement","Sprint 28","Stream2","10.93","1.0","","","","None","2.0","","","","5.46","0","5.14","0.04","0.78","2.01","2.96","10.75","0.78","0.04","5.14","2.96","0","2.01","2","2","0","0","0","0" -"ADM-717","[Backend] Verify github and obtain github data with new API","Task","Done","2024-01-17","2.0","Junbo Dai","Yufan Wang","ADM","Auto Dora Metrics","Medium","easy to use","Sprint 28","Stream1","8.09","1.0","","","","None","2.0","Weiran Sun","","","4.04","0","2.83","2.72","0.05","2.14","0.35","6.00","0.05","2.72","2.83","0.35","0","2.14","3","3","0","0","0","0" -"ADM-724","[Spike] redesign board verify API to meet business requirements","Spike","Done","2024-01-17","1.0","heartbeat user","Yufan Wang","ADM","Auto Dora Metrics","Medium","easy to use","Sprint 28","Stream1","12.94","","","","","None","1.0","","","","12.94","0","1.08","1.99","0","7.65","2.22","0.27","0","1.99","1.08","2.22","0","7.65","2","2","0","0","0","0" -"ADM-652","[Frontend]Generate the separate modules detail report","Task","Done","2024-01-17","3.0","Xuebing Li","heartbeat user","ADM","Auto Dora Metrics","Medium","Performance Improvement","Sprint 28","Stream2","10.15","1.0","","","","None","3.0","","","","3.38","0","5.94","1.35","1.87","0.72","0.27","22.87","1.87","1.35","5.94","0.27","0","0.72","1","1","0","0","0","0" -"ADM-683","[Frontend] UI refine for the date picker in report page","Task","Done","2024-01-17","1.0","heartbeat user","heartbeat user","ADM","Auto Dora Metrics","Medium","easy to use","Sprint 28","Stream2","8.92","1.0","","","","None","1.0","","","","8.92","0","3.00","0.10","1.84","3.00","0.98","15.05","1.84","0.10","3.00","0.98","0","3.00","1","1","0","0","0","0" -"ADM-669","[Frontend] UI refine for notification pop up change in report page","Task","Done","2024-01-17","1.0","heartbeat user","heartbeat user","ADM","Auto Dora Metrics","Medium","easy to use","Sprint 28","Stream2","7.13","1.0","","","","None","1.0","","","","7.13","0","4.22","0.02","1.16","0","1.73","17.80","1.16","0.02","4.22","1.73","0","0","0","0","0","0","0","0" -"ADM-709","[Backend] Verify buildkite and obtain buildkite data with new API","Task","Done","2024-01-15","3.0","Xinyi Wang","heartbeat user","ADM","Auto Dora Metrics","Medium","easy to use","Sprint 27","Stream1","6.85","1.0","","","","None","3.0","","","","2.28","0","2.81","0.07","0.78","0","3.19","8.03","0.78","0.07","2.81","3.19","0","0",,,,,, -,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -"ADM-806","[BE]no need to obtain pipeline data twice in backend","Bug","Review","2024-02-26","2.0","heartbeat user","Yufan Wang","ADM","Auto Dora Metrics","Medium",,"Sprint 30","Stream2,v1.1.5","0","","","","","None","2.0","","","","0","0","2.89","0","0","0","0.04","8.10","0","0","2.89","0.04","0","0",,,,,, -"ADM-813","[FE]add new field 'Advance' in metrics page","Task","Review","2024-02-26","2.0","heartbeat user","Yufan Wang","ADM","Auto Dora Metrics","Medium",,"Sprint 30","Stream2,v1.1.5","0","1.0","","","","None","2.0","","","","0","0","4.78","0","0","4.68","0.53","0.19","0","0","4.78","0.53","0","4.68",,,,,, -"ADM-677","[Spike]Investigate Github graphQL API about replacing existing REST API","Spike","Blocked","2024-02-21","2.0","Junbo Dai","Yichen Wang","ADM","Auto Dora Metrics","Medium","Performance Improvement","Sprint 30","Stream1","0","","","","","None","2.0","","","","0","0","1.05","0","0","10.17","0","38.43","0","0","1.05","0","0","10.17",,,,,, -"ADM-819","[BE]cache doesn't work in one case","Bug","Doing","2024-02-26","2.0","Shiqi Yuan","Yufan Wang","ADM","Auto Dora Metrics","Medium",,"Sprint 30","Stream2,v1.1.5","0","","","","","None","2.0","","","","0","0","3.14","0","0","1.05","0","0.84","0","0","3.14","0","0","1.05",,,,,, -"ADM-797","[BE]The add flag as block logic is not working","Bug","Doing","2024-02-26","2.0","heartbeat user","Wenting Yan","ADM","Auto Dora Metrics","High",,"Sprint 30","Stream2,v1.1.5","0","","","","","None","2.0","","","","0","0","7.13","0","0","5.00","0","2.03","0","0","7.38","0","1.05","5.80",,,,,, -"ADM-829","jump home page when user click next button in config page","Bug","Doing","2024-02-23","2.0","Junbo Dai","Yufan Wang","ADM","Auto Dora Metrics","High",,"Sprint 30","Stream1,v1.1.5","0","","","","","None","2.0","","","","0","0","1.03","0","0","0","0","1.17","0","0","1.03","0","0","0",,,,,, -"ADM-812","[FE]metrics page needs to retain the modified data","Bug","Doing","2024-02-23","2.0","heartbeat user","Yufan Wang","ADM","Auto Dora Metrics","Medium",,"Sprint 30","Stream1","0","","","","","None","2.0","","","","0","0","3.04","0","0","1.03","0","6.67","0","0","3.04","0","0","1.03",,,,,, -"ADM-809","[E2E] build ""import a new project"" scenario","Task","Doing","2024-02-22","2.0","heartbeat user","Xingmeng Tao","ADM","Auto Dora Metrics","High",,"Sprint 30","Stream1,v1.1.5","0","1.0","","","","None","2.0","","","","0","0","2.24","0","0","0","0","8.00","0","0","2.24","0","0","0",,,,,, -"ADM-808","[E2E] build ""Create a new Project"" scenario","Task","Doing","2024-02-19","3.5","heartbeat user","Xingmeng Tao","ADM","Auto Dora Metrics","High",,"Sprint 30","Stream1,v1.1.5","0","1.0","","","","None","3.5","","","","0","0","8.04","0","0","1.99","0","0.95","0","0","8.04","0","0","1.99",,,,,, -"ADM-825","[E2E] build ""page jumps"" scenario","Task","TODO",,"2.0",,"Yufan Wang","ADM","Auto Dora Metrics","High",,"Sprint 30","Stream1,v1.1.5","0","1.0","","","","None","2.0","","","","0","0","0","0","0","0","0","0","0","0","0","0","0","0",,,,,, -"ADM-820","user was misguided to home page when they want to enter metrics page","Bug","TODO",,"0.0","heartbeat user","Yufan Wang","ADM","Auto Dora Metrics","Medium",,"Sprint 30","Stream2","0","","","","","None","","","","","","0","0","0","0","0","0","0","0","0","0","0","0","0",,,,,, -"ADM-833","[E2E] build ""unhappy path"" scenario","Task","TODO",,"0.0",,"heartbeat user","ADM","Auto Dora Metrics","Medium",,"Sprint 30","Stream1","0","1.0","","","","None","","","","","","0","0","0","0","0","0","0","0","0","0","0","0","0",,,,,, -"ADM-789","refactor E2E-step2","Task","TODO",,"1.0",,"Yufan Wang","ADM","Auto Dora Metrics","High",,"Sprint 30","Stream2","0","1.0","","","","None","1.0","","","","0","0","0","0","0","0","0","0","0","0","0","0","0","0",,,,,, +Issue key,Summary,Issue Type,Status,Status Date,Story Points,assignee,Reporter,Project Key,Project Name,Priority,Parent Summary,Sprint,Labels,Cycle Time,Story testing-1,Flagged,Fix versions,Partner,Time tracking,Story point estimate,QA,Feature/Operation,Story testing-2,Cycle Time / Story Points,Analysis Days,In Dev Days,Waiting Days,Testing Days,Block Days,Review Days,OriginCycleTime: TODO,OriginCycleTime: TESTING,OriginCycleTime: WAIT FOR TEST,OriginCycleTime: DOING,OriginCycleTime: REVIEW,OriginCycleTime: BLOCKED,Rework: total - In dev,Rework: from Block,Rework: from Review,Rework: from Waiting for testing,Rework: from Testing,Rework: from Done +ADM-735,[backend]identify the source of the error when generate reports encounter exception,Task,Done,2024-01-19,1.0,Yunsong Yang,Yunsong Yang,ADM,Auto Dora Metrics,Medium,Precise on Metrics,Sprint 28,Stream2,7.70,1.0,"","","",None,1.0,"","","",7.70,0,2.02,1.81,0,0,3.87,3.03,0,1.81,2.02,3.87,0,0,0,0,0,0,0 +ADM-708,[Backend] Verify board and obtain board data with new API,Task,Done,2024-01-19,3.0,Weiran Sun,heartbeat user,ADM,Auto Dora Metrics,Medium,easy to use,Sprint 28,Stream1,9.95,1.0,"","","",None,3.0,"","","",3.32,0,4.00,0.93,1.04,0.98,3.00,7.10,1.04,0.93,4.00,3.00,0.98,2,2,0,0,0,0 +ADM-699,[Frontend] Optimize the 4xx&504 error display of report overview,Task,Done,2024-01-18,2.0,heartbeat user,heartbeat user,ADM,Auto Dora Metrics,Medium,Performance Improvement,Sprint 28,Stream2,10.93,1.0,"","","",None,2.0,"","","",5.46,0,5.14,0.04,0.78,2.01,2.96,10.75,0.78,0.04,5.14,2.96,2.01,2,2,0,0,0,0 +ADM-717,[Backend] Verify github and obtain github data with new API,Task,Done,2024-01-17,2.0,Junbo Dai,Yufan Wang,ADM,Auto Dora Metrics,Medium,easy to use,Sprint 28,Stream1,8.09,1.0,"","","",None,2.0,Weiran Sun,"","",4.04,0,2.83,2.72,0.05,2.14,0.35,6.00,0.05,2.72,2.83,0.35,2.14,3,3,0,0,0,0 +ADM-724,[Spike] redesign board verify API to meet business requirements,Spike,Done,2024-01-17,1.0,heartbeat user,Yufan Wang,ADM,Auto Dora Metrics,Medium,easy to use,Sprint 28,Stream1,12.94,"","","","",None,1.0,"","","",12.94,0,1.08,1.99,0,7.65,2.22,0.27,0,1.99,1.08,2.22,7.65,2,2,0,0,0,0 +ADM-652,[Frontend]Generate the separate modules detail report,Task,Done,2024-01-17,3.0,Xuebing Li,heartbeat user,ADM,Auto Dora Metrics,Medium,Performance Improvement,Sprint 28,Stream2,10.15,1.0,"","","",None,3.0,"","","",3.38,0,5.94,1.35,1.87,0.72,0.27,22.87,1.87,1.35,5.94,0.27,0.72,1,1,0,0,0,0 +ADM-683,[Frontend] UI refine for the date picker in report page,Task,Done,2024-01-17,1.0,heartbeat user,heartbeat user,ADM,Auto Dora Metrics,Medium,easy to use,Sprint 28,Stream2,8.92,1.0,"","","",None,1.0,"","","",8.92,0,3.00,0.10,1.84,3.00,0.98,15.05,1.84,0.10,3.00,0.98,3.00,1,1,0,0,0,0 +ADM-669,[Frontend] UI refine for notification pop up change in report page,Task,Done,2024-01-17,1.0,heartbeat user,heartbeat user,ADM,Auto Dora Metrics,Medium,easy to use,Sprint 28,Stream2,7.13,1.0,"","","",None,1.0,"","","",7.13,0,4.22,0.02,1.16,0,1.73,17.80,1.16,0.02,4.22,1.73,0,0,0,0,0,0,0 +ADM-709,[Backend] Verify buildkite and obtain buildkite data with new API,Task,Done,2024-01-15,3.0,Xinyi Wang,heartbeat user,ADM,Auto Dora Metrics,Medium,easy to use,Sprint 27,Stream1,6.85,1.0,"","","",None,3.0,"","","",2.28,0,2.81,0.07,0.78,0,3.19,8.03,0.78,0.07,2.81,3.19,0,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +ADM-806,[BE]no need to obtain pipeline data twice in backend,Bug,Review,2024-02-26,2.0,heartbeat user,Yufan Wang,ADM,Auto Dora Metrics,Medium,,Sprint 30,"Stream2,v1.1.5",0,"","","","",None,2.0,"","","",0,0,2.89,0,0,0,0.04,8.10,0,0,2.89,0.04,0,,,,,, +ADM-813,[FE]add new field 'Advance' in metrics page,Task,Review,2024-02-26,2.0,heartbeat user,Yufan Wang,ADM,Auto Dora Metrics,Medium,,Sprint 30,"Stream2,v1.1.5",0,1.0,"","","",None,2.0,"","","",0,0,4.78,0,0,4.68,0.53,0.19,0,0,4.78,0.53,4.68,,,,,, +ADM-677,[Spike]Investigate Github graphQL API about replacing existing REST API,Spike,Blocked,2024-02-21,2.0,Junbo Dai,Yichen Wang,ADM,Auto Dora Metrics,Medium,Performance Improvement,Sprint 30,Stream1,0,"","","","",None,2.0,"","","",0,0,1.05,0,0,10.17,0,38.43,0,0,1.05,0,10.17,,,,,, +ADM-819,[BE]cache doesn't work in one case,Bug,Doing,2024-02-26,2.0,Shiqi Yuan,Yufan Wang,ADM,Auto Dora Metrics,Medium,,Sprint 30,"Stream2,v1.1.5",0,"","","","",None,2.0,"","","",0,0,3.14,0,0,1.05,0,0.84,0,0,3.14,0,1.05,,,,,, +ADM-797,[BE]The add flag as block logic is not working,Bug,Doing,2024-02-26,2.0,heartbeat user,Wenting Yan,ADM,Auto Dora Metrics,High,,Sprint 30,"Stream2,v1.1.5",0,"","","","",None,2.0,"","","",0,0,7.13,0,0,5.00,0,2.03,0,0,7.38,0,5.80,,,,,, +ADM-829,jump home page when user click next button in config page,Bug,Doing,2024-02-23,2.0,Junbo Dai,Yufan Wang,ADM,Auto Dora Metrics,High,,Sprint 30,"Stream1,v1.1.5",0,"","","","",None,2.0,"","","",0,0,1.03,0,0,0,0,1.17,0,0,1.03,0,0,,,,,, +ADM-812,[FE]metrics page needs to retain the modified data,Bug,Doing,2024-02-23,2.0,heartbeat user,Yufan Wang,ADM,Auto Dora Metrics,Medium,,Sprint 30,Stream1,0,"","","","",None,2.0,"","","",0,0,3.04,0,0,1.03,0,6.67,0,0,3.04,0,1.03,,,,,, +ADM-809,"[E2E] build ""import a new project"" scenario",Task,Doing,2024-02-22,2.0,heartbeat user,Xingmeng Tao,ADM,Auto Dora Metrics,High,,Sprint 30,"Stream1,v1.1.5",0,1.0,"","","",None,2.0,"","","",0,0,2.24,0,0,0,0,8.00,0,0,2.24,0,0,,,,,, +ADM-808,"[E2E] build ""Create a new Project"" scenario",Task,Doing,2024-02-19,3.5,heartbeat user,Xingmeng Tao,ADM,Auto Dora Metrics,High,,Sprint 30,"Stream1,v1.1.5",0,1.0,"","","",None,3.5,"","","",0,0,8.04,0,0,1.99,0,0.95,0,0,8.04,0,1.99,,,,,, +ADM-825,"[E2E] build ""page jumps"" scenario",Task,TODO,,2.0,,Yufan Wang,ADM,Auto Dora Metrics,High,,Sprint 30,"Stream1,v1.1.5",0,1.0,"","","",None,2.0,"","","",0,0,0,0,0,0,0,0,0,0,0,0,0,,,,,, +ADM-820,user was misguided to home page when they want to enter metrics page,Bug,TODO,,0.0,heartbeat user,Yufan Wang,ADM,Auto Dora Metrics,Medium,,Sprint 30,Stream2,0,"","","","",None,"","","","","",0,0,0,0,0,0,0,0,0,0,0,0,,,,,, +ADM-833,"[E2E] build ""unhappy path"" scenario",Task,TODO,,0.0,,heartbeat user,ADM,Auto Dora Metrics,Medium,,Sprint 30,Stream1,0,1.0,"","","",None,"","","","","",0,0,0,0,0,0,0,0,0,0,0,0,,,,,, +ADM-789,refactor E2E-step2,Task,TODO,,1.0,,Yufan Wang,ADM,Auto Dora Metrics,High,,Sprint 30,Stream2,0,1.0,"","","",None,1.0,"","","",0,0,0,0,0,0,0,0,0,0,0,0,0,,,,,, diff --git a/frontend/e2e/fixtures/create-new/config-step.ts b/frontend/e2e/fixtures/create-new/config-step.ts index 4333ed331d..82c45c54c1 100644 --- a/frontend/e2e/fixtures/create-new/config-step.ts +++ b/frontend/e2e/fixtures/create-new/config-step.ts @@ -33,3 +33,22 @@ export const config = { token: process.env.E2E_TOKEN_GITHUB as string, }, }; + +export const configWithoutBlockColumn = { + projectName: 'Heartbeat Metrics', + dateRange: [ + { + startDate: '2024-04-07T00:00:00.000+08:00', + endDate: '2024-04-08T23:59:59.999+08:00', + }, + ], + calendarType: 'Calendar with Chinese Holiday', + metrics: ['Cycle time'], + board: { + type: 'Jira', + boardId: '33', + email: 'heartbeatuser2023@gmail.com', + site: 'dorametrics', + token: process.env.E2E_TOKEN_JIRA as string, + }, +}; diff --git a/frontend/e2e/fixtures/create-new/metrics-step.ts b/frontend/e2e/fixtures/create-new/metrics-step.ts index 9420861234..c0857167b2 100644 --- a/frontend/e2e/fixtures/create-new/metrics-step.ts +++ b/frontend/e2e/fixtures/create-new/metrics-step.ts @@ -73,7 +73,7 @@ export const config = { Done: 'Done', }, ], - treatFlagCardAsBlock: true, + treatFlagCardAsBlock: false, }, doneStatus: ['DONE'], classification: [ @@ -177,3 +177,25 @@ export const modifiedConfig = { }, ], }; + +export const configWithoutBlockColumn = { + crews: ['Shiqi Yuan'], + cycleTime: { + type: 'byColumn', + jiraColumns: [ + { + 'TO DO': 'To do', + }, + { + 'IN DEV': 'In Dev', + }, + { + 'WAITING FOR TESTING': 'Waiting for testing', + }, + { + Done: 'Done', + }, + ], + }, + reworkTimesSettings: { excludeStates: [], reworkState: 'In Dev' }, +}; diff --git a/frontend/e2e/fixtures/create-new/report-result.ts b/frontend/e2e/fixtures/create-new/report-result.ts index ed25741be1..f65517c11b 100644 --- a/frontend/e2e/fixtures/create-new/report-result.ts +++ b/frontend/e2e/fixtures/create-new/report-result.ts @@ -12,8 +12,8 @@ export const BOARD_METRICS_RESULT = { export const FLAG_AS_BLOCK_PROJECT_BOARD_METRICS_RESULT = { Velocity: '7.5', Throughput: '5', - AverageCycleTime4SP: '0.50', - AverageCycleTime4Card: '0.75', + AverageCycleTime4SP: '0.55', + AverageCycleTime4Card: '0.83', totalReworkTimes: '3', totalReworkCards: '3', reworkCardsRatio: '0.6000', diff --git a/frontend/e2e/fixtures/cycle-time-by-status/board-data-by-status.csv b/frontend/e2e/fixtures/cycle-time-by-status/board-data-by-status.csv index 29fd87d1ea..ebdbc9c4bb 100644 --- a/frontend/e2e/fixtures/cycle-time-by-status/board-data-by-status.csv +++ b/frontend/e2e/fixtures/cycle-time-by-status/board-data-by-status.csv @@ -1,5 +1,5 @@ -"Issue key","Summary","Issue Type","Status","Status Date","Story Points","assignee","Reporter","Project Key","Project Name","Priority","Parent Summary","Sprint","Labels","Cycle Time","story point","Flagged","Story point estimate","Design","Cycle Time / Story Points","Analysis Days","In Dev Days","Waiting Days","Testing Days","Block Days","Review Days","OriginCycleTime: TO DO","OriginCycleTime: IN PROGRESS","OriginCycleTime: REVIEW","OriginCycleTime: FLAG","OriginCycleTime: ANALYSIS","OriginCycleTime: READY FOR TESTING","OriginCycleTime: DOING" -"ST-5","card5","Task","done","2024-03-29","3.0","Junbo Dai","heartbeat user","ST","status-test","Medium",,,"","1.17","","","3.0","","0.39","0","1.12","0","0","0","0.05","0.78","1.12","0.05","0","0","0","0" -"ST-6","card6","Task","done","2024-03-29","2.0","Chao Wang","heartbeat user","ST","status-test","Medium",,,"","0.98","","","2.0","","0.49","0","0.93","0.05","0","0","0","0.78","0","0","0","0.93","0.05","0" -"ST-4","card4","Task","done","2024-03-29","2.0","heartbeat user","heartbeat user","ST","status-test","Medium",,,"","0.99","","","2.0","","0.49","0","0.99","0","0","0","0","0.78","0","0","0","0","0","0.99" -,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +Issue key,Summary,Issue Type,Status,Status Date,Story Points,assignee,Reporter,Project Key,Project Name,Priority,Parent Summary,Sprint,Labels,Cycle Time,story point,Flagged,Story point estimate,Design,Cycle Time / Story Points,Analysis Days,In Dev Days,Waiting Days,Testing Days,Block Days,Review Days,OriginCycleTime: TO DO,OriginCycleTime: IN PROGRESS,OriginCycleTime: REVIEW,OriginCycleTime: ANALYSIS,OriginCycleTime: READY FOR TESTING,OriginCycleTime: DOING +ST-5,card5,Task,done,2024-03-29,3.0,Junbo Dai,heartbeat user,ST,status-test,Medium,,,"",1.17,"","",3.0,"",0.39,0,1.12,0,0,0,0.05,0.78,1.12,0.05,0,0,0 +ST-6,card6,Task,done,2024-03-29,2.0,Chao Wang,heartbeat user,ST,status-test,Medium,,,"",0.98,"","",2.0,"",0.49,0,0.93,0.05,0,0,0,0.78,0,0,0.93,0.05,0 +ST-4,card4,Task,done,2024-03-29,2.0,heartbeat user,heartbeat user,ST,status-test,Medium,,,"",0.99,"","",2.0,"",0.49,0,0.99,0,0,0,0,0.78,0,0,0,0,0.99 +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, diff --git a/frontend/e2e/fixtures/cycle-time-by-status/cycle-time-by-column-fixture.ts b/frontend/e2e/fixtures/cycle-time-by-status/cycle-time-by-column-fixture.ts index a8103adeee..864ef55cf0 100644 --- a/frontend/e2e/fixtures/cycle-time-by-status/cycle-time-by-column-fixture.ts +++ b/frontend/e2e/fixtures/cycle-time-by-status/cycle-time-by-column-fixture.ts @@ -60,7 +60,7 @@ export const cycleTimeByColumnFixture = { Done: 'Done', }, ], - treatFlagCardAsBlock: true, + treatFlagCardAsBlock: false, }, doneStatus: ['DONE'], classification: [ diff --git a/frontend/e2e/fixtures/import-file/board-data-without-block-column.csv b/frontend/e2e/fixtures/import-file/board-data-without-block-column.csv new file mode 100644 index 0000000000..098a9b4e3d --- /dev/null +++ b/frontend/e2e/fixtures/import-file/board-data-without-block-column.csv @@ -0,0 +1,7 @@ +"Issue key","Summary","Issue Type","Status","Status Date","Story Points","assignee","Reporter","Project Key","Project Name","Priority","Parent Summary","Sprint","Labels","Cycle Time","Cycle Time / Story Points","Analysis Days","In Dev Days","Waiting Days","Testing Days","Block Days","Review Days","OriginCycleTime: TESTING","OriginCycleTime: TO DO","OriginCycleTime: IN PROGRESS","OriginCycleTime: REVIEW","OriginCycleTime: FLAG","Rework: total - In dev","Rework: from Block","Rework: from Review","Rework: from Testing","Rework: from Done" +"TFB-6","test - 1","Task","Done","2024-04-09","1.5","heartbeat user","heartbeat user","TFB","E2E-Test-For-Flag-As-Block","Medium",,,"","0.70","0.47","0","0.70","0","0","0","0","0","0","0.86","0","0.16","1","1","0","0","0" +"TFB-7","test - 2","Task","Done","2024-04-09","2.0","heartbeat user","heartbeat user","TFB","E2E-Test-For-Flag-As-Block","Medium",,,"","0.75","0.38","0","0.73","0","0","0","0.02","0","0","0.84","0.02","0.11","1","1","0","0","0" +"TFB-8","test - 3","Task","Done","2024-04-09","1.0","heartbeat user","heartbeat user","TFB","E2E-Test-For-Flag-As-Block","Medium",,,"","0.70","0.70","0","0.70","0","0","0","0","0","0","0.81","0","0.11","1","1","0","0","0" +"TFB-10","test - 5","Task","Done","2024-04-09","2.0","heartbeat user","heartbeat user","TFB","E2E-Test-For-Flag-As-Block","Medium",,,"","0.81","0.41","0","0.81","0","0","0","0","0","0","0.81","0","0","0","0","0","0","0" +"TFB-9","test - 4","Task","Done","2024-04-09","1.0","heartbeat user","heartbeat user","TFB","E2E-Test-For-Flag-As-Block","Medium",,,"","0.81","0.81","0","0.81","0","0","0","0","0","0","0.81","0","0","0","0","0","0","0" +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, diff --git a/frontend/e2e/fixtures/import-file/board-data.csv b/frontend/e2e/fixtures/import-file/board-data.csv index 13aca7665b..e1910f5730 100644 --- a/frontend/e2e/fixtures/import-file/board-data.csv +++ b/frontend/e2e/fixtures/import-file/board-data.csv @@ -1,4 +1,4 @@ -"Issue key","Summary","Issue Type","Status","Status Date","Story Points","assignee","Reporter","Project Key","Project Name","Priority","Parent Summary","Sprint","Labels","Cycle Time","Story testing-1","Flagged","Fix versions","Partner","Time tracking","Story point estimate","QA","Feature/Operation","Story testing-2","Cycle Time / Story Points","Analysis Days","In Dev Days","Waiting Days","Testing Days","Block Days","Review Days","OriginCycleTime: TODO","OriginCycleTime: TESTING","OriginCycleTime: WAIT FOR TEST","OriginCycleTime: DOING","OriginCycleTime: REVIEW","OriginCycleTime: FLAG","OriginCycleTime: BLOCKED" +"Issue key","Summary","Issue Type","Status","Status Date","Story Points","assignee","Reporter","Project Key","Project Name","Priority","Parent Summary","Sprint","Labels","Cycle Time","Story testing-1","Flagged","Fix versions","Partner","Time tracking","Story point estimate","QA","Feature/Operation","Story testing-2","Cycle Time / Story Points","Analysis Days","In Dev Days","Waiting Days","Testing Days","Block Days","Review Days","OriginCycleTime: TODO","OriginCycleTime: TESTING","OriginCycleTime: WAIT FOR TEST","OriginCycleTime: DOING","OriginCycleTime: REVIEW","OriginCycleTime: BLOCKED" "ADM-735","[backend]identify the source of the error when generate reports encounter exception","Task","Done","2024-01-19","1.0","Yunsong Yang","Yunsong Yang","ADM","Auto Dora Metrics","Medium","Precise on Metrics","Sprint 28","Stream2","7.70","1.0","","","","None","1.0","","","","7.70","0","2.02","1.81","0","0","3.87","3.03","0","1.81","2.02","3.87","0","0" "ADM-708","[Backend] Verify board and obtain board data with new API","Task","Done","2024-01-19","3.0","Weiran Sun","heartbeat user","ADM","Auto Dora Metrics","Medium","easy to use","Sprint 28","Stream1","9.95","1.0","","","","None","3.0","","","","3.32","0","4.00","0.93","1.04","0.98","3.00","7.10","1.04","0.93","4.00","3.00","0","0.98" "ADM-699","[Frontend] Optimize the 4xx&504 error display of report overview","Task","Done","2024-01-18","2.0","heartbeat user","heartbeat user","ADM","Auto Dora Metrics","Medium","Performance Improvement","Sprint 28","Stream2","10.93","1.0","","","","None","2.0","","","","5.46","0","5.14","0.04","0.78","2.01","2.96","10.75","0.78","0.04","5.14","2.96","0","2.01" diff --git a/frontend/e2e/pages/metrics/config-step.ts b/frontend/e2e/pages/metrics/config-step.ts index 8fe53851cf..bc03e04b3e 100644 --- a/frontend/e2e/pages/metrics/config-step.ts +++ b/frontend/e2e/pages/metrics/config-step.ts @@ -47,11 +47,11 @@ export class ConfigStep { readonly requiredMetricsVelocityOption: Locator; readonly requiredMetricsCycleTimeOption: Locator; readonly requiredMetricsClassificationOption: Locator; - readonly requiredMetricsReworkTimesOption: Locator; readonly requiredMetricsLeadTimeForChangesOption: Locator; readonly requiredMetricsDeploymentFrequencyOption: Locator; readonly requiredMetricsChangeFailureRateOption: Locator; readonly requiredMetricsMeanTimeToRecoveryOption: Locator; + readonly requiredMetricsReworkTimesOption: Locator; readonly boardContainer: Locator; readonly boardTypeSelect: Locator; readonly boardIdInput: Locator; @@ -121,6 +121,7 @@ export class ConfigStep { this.requiredMetricsDeploymentFrequencyOption = page.getByRole('option', { name: 'Deployment frequency' }); this.requiredMetricsChangeFailureRateOption = page.getByRole('option', { name: 'Change failure rate' }); this.requiredMetricsMeanTimeToRecoveryOption = page.getByRole('option', { name: 'Mean time to recovery' }); + this.requiredMetricsReworkTimesOption = page.getByRole('option', { name: 'Rework times' }); this.boardContainer = page.getByLabel('Board Config'); this.boardTypeSelect = this.boardContainer.getByLabel('Board *'); diff --git a/frontend/e2e/pages/metrics/metrics-step.ts b/frontend/e2e/pages/metrics/metrics-step.ts index 8d4b346586..cd1cad57b1 100644 --- a/frontend/e2e/pages/metrics/metrics-step.ts +++ b/frontend/e2e/pages/metrics/metrics-step.ts @@ -25,20 +25,24 @@ export class MetricsStep { readonly boardByColumnRadioBox: Locator; readonly boardByStatusRadioBox: Locator; readonly boardCycleTimeSelectForTODO: Locator; - readonly boardCycleTimeSelectForTO_DO_BYSTATUS: Locator; + readonly boardCycleTimeSelectForTO_DO: Locator; readonly boardCycleTimeSelectForDoing: Locator; + readonly boardCycleTimeSelectForIN_DEV: Locator; readonly boardCycleTimeSelectForInProgress: Locator; readonly boardCycleTimeSelectForAnalysis: Locator; readonly boardCycleTimeSelectForBlocked: Locator; readonly boardCycleTimeSelectForReview: Locator; readonly boardCycleTimeSelectForREADY: Locator; readonly boardCycleTimeSelectForWAITFORTESTING: Locator; + readonly boardCycleTimeSelectForWAIT_FOR_TESTING: Locator; readonly boardCycleTimeSelectForTesting: Locator; + readonly boardCycleTimeSelectForTESTING: Locator; readonly boardCycleTimeSelectForDone: Locator; readonly boardCycleTimeInputForTODO: Locator; readonly boardCycleTimeInputForDoing: Locator; readonly boardCycleTimeInputForBlocked: Locator; readonly boardCycleTimeInputForReview: Locator; + readonly boardCycleTimeInputForREVIEW: Locator; readonly boardCycleTimeInputForREADY: Locator; readonly boardCycleTimeInputForTesting: Locator; readonly boardCycleTimeInputForDone: Locator; @@ -102,12 +106,15 @@ export class MetricsStep { this.boardCycleTimeSelectForTODO = this.boardCycleTimeSection .getByLabel('Cycle time select for TODO') .getByLabel('Open'); - this.boardCycleTimeSelectForTO_DO_BYSTATUS = this.boardCycleTimeSection + this.boardCycleTimeSelectForTO_DO = this.boardCycleTimeSection .getByLabel('Cycle time select for TO DO') .getByLabel('Open'); this.boardCycleTimeSelectForDoing = this.boardCycleTimeSection .getByLabel('Cycle time select for Doing') .getByLabel('Open'); + this.boardCycleTimeSelectForIN_DEV = this.boardCycleTimeSection + .getByLabel('Cycle time select for IN DEV') + .getByLabel('Open'); this.boardCycleTimeSelectForInProgress = this.boardCycleTimeSection .getByLabel('Cycle time select for IN PROGRESS') .getByLabel('Open'); @@ -126,9 +133,15 @@ export class MetricsStep { this.boardCycleTimeSelectForWAITFORTESTING = this.boardCycleTimeSection .getByLabel('Cycle time select for WAIT FOR TEST') .getByLabel('Open'); + this.boardCycleTimeSelectForWAIT_FOR_TESTING = this.boardCycleTimeSection + .getByLabel('Cycle time select for WAITING FOR TESTING') + .getByLabel('Open'); this.boardCycleTimeSelectForTesting = this.boardCycleTimeSection .getByLabel('Cycle time select for Testing') .getByLabel('Open'); + this.boardCycleTimeSelectForTESTING = this.boardCycleTimeSection + .getByLabel('Cycle time select for TESTING') + .getByLabel('Open'); this.boardCycleTimeSelectForDone = this.boardCycleTimeSection .getByLabel('Cycle time select for Done') .getByLabel('Open'); @@ -144,6 +157,9 @@ export class MetricsStep { this.boardCycleTimeInputForReview = this.boardCycleTimeSection .getByLabel('Cycle time select for Review') .getByRole('combobox'); + this.boardCycleTimeInputForREVIEW = this.boardCycleTimeSection + .getByLabel('Cycle time select for REVIEW') + .getByRole('combobox'); this.boardCycleTimeInputForREADY = this.boardCycleTimeSection .getByLabel('Cycle time select for WAIT FOR TEST') .getByRole('combobox'); @@ -398,7 +414,7 @@ export class MetricsStep { [todoOption, doingOption, blockOption, reviewOption, forReadyOption, testingOption, doneOption]: string[], isByColumn: boolean, ) { - await this.boardCycleTimeSelectForTO_DO_BYSTATUS.click(); + await this.boardCycleTimeSelectForTO_DO.click(); await this.page.getByRole('option', { name: todoOption }).click(); await this.boardCycleTimeSelectForDoing.click(); @@ -428,6 +444,20 @@ export class MetricsStep { await this.page.getByRole('option', { name: doneOption }).click(); } + async selectHeartbeatStateWithoutBlock([todoOption, inDevOption, waitForTestingOption, doneOption]: string[]) { + await this.boardCycleTimeSelectForTO_DO.click(); + await this.page.getByRole('option', { name: todoOption }).click(); + + await this.boardCycleTimeSelectForIN_DEV.click(); + await this.page.getByRole('option', { name: inDevOption }).click(); + + await this.boardCycleTimeSelectForWAIT_FOR_TESTING.click(); + await this.page.getByRole('option', { name: waitForTestingOption }).click(); + + await this.boardCycleTimeSelectForDone.click(); + await this.page.getByRole('option', { name: doneOption }).click(); + } + async checkHeartbeatStateIsSet( [todoOption, doingOption, blockOption, reviewOption, forReadyOption, testingOption, doneOption]: string[], isByColumn: boolean, diff --git a/frontend/e2e/pages/metrics/report-step.ts b/frontend/e2e/pages/metrics/report-step.ts index 904c75f863..28d5c890d2 100644 --- a/frontend/e2e/pages/metrics/report-step.ts +++ b/frontend/e2e/pages/metrics/report-step.ts @@ -356,6 +356,21 @@ export class ReportStep { await this.backButton.click(); } + async checkBoardDownloadDataWithoutBlock(fileName: string) { + await downloadFileAndCheck( + this.page, + this.exportBoardData, + 'board-data-without-block-column.csv', + async (fileDataString) => { + const localCsvFile = fs.readFileSync(path.resolve(__dirname, fileName)); + const localCsv = parse(localCsvFile); + const downloadCsv = parse(fileDataString); + + expect(localCsv).toStrictEqual(downloadCsv); + }, + ); + } + async checkDoraMetrics( prLeadTime: string, pipelineLeadTime: string, diff --git a/frontend/e2e/specs/major-path/create-a-new-project.spec.ts b/frontend/e2e/specs/major-path/create-a-new-project.spec.ts index 018291b331..9784022991 100644 --- a/frontend/e2e/specs/major-path/create-a-new-project.spec.ts +++ b/frontend/e2e/specs/major-path/create-a-new-project.spec.ts @@ -1,3 +1,5 @@ +import { configWithoutBlockColumn as metricsStepWithoutBlockColumnData } from '../../fixtures/create-new/metrics-step'; +import { configWithoutBlockColumn as configWithoutBlockColumnData } from '../../fixtures/create-new/config-step'; import { cycleTimeByStatusFixture } from '../../fixtures/cycle-time-by-status/cycle-time-by-status-fixture'; import { BOARD_METRICS_RESULT, DORA_METRICS_RESULT } from '../../fixtures/create-new/report-result'; import { config as metricsStepData } from '../../fixtures/create-new/metrics-step'; @@ -50,7 +52,6 @@ test('Create a new project', async ({ homePage, configStep, metricsStep, reportS await metricsStep.checkBoardConfigurationVisible(); await metricsStep.checkPipelineConfigurationVisible(); await metricsStep.checkLastAssigneeCrewFilterChecked(); - await metricsStep.checkCycleTimeConsiderCheckboxChecked(); await metricsStep.checkCycleTimeSettingIsByColumn(); await metricsStep.waitForHiddenLoading(); await metricsStep.selectCrews(metricsStepData.crews); @@ -97,3 +98,46 @@ test('Create a new project', async ({ homePage, configStep, metricsStep, reportS await reportStep.checkDoraMetricsDetails(ProjectCreationType.CREATE_A_NEW_PROJECT); await reportStep.checkMetricDownloadData(); }); + +test('Create a new project without block column in boarding mapping', async ({ + homePage, + configStep, + metricsStep, + reportStep, +}) => { + const dateRange = { + startDate: format(configWithoutBlockColumnData.dateRange[0].startDate), + endDate: format(configWithoutBlockColumnData.dateRange[0].endDate), + }; + + await homePage.goto(); + await homePage.createANewProject(); + await configStep.waitForShown(); + await configStep.typeInProjectName(configWithoutBlockColumnData.projectName); + await configStep.selectRegularCalendar(configWithoutBlockColumnData.calendarType); + await configStep.typeInDateRange(dateRange); + await configStep.selectReworkTimesRequiredMetrics(); + await configStep.checkBoardFormVisible(); + await configStep.checkPipelineToolFormInvisible(); + await configStep.checkSourceControlFormInvisible(); + await configStep.fillAndVerifyBoardConfig(configWithoutBlockColumnData.board); + await configStep.validateNextButtonClickable(); + await configStep.goToMetrics(); + + await metricsStep.checkBoardConfigurationVisible(); + await metricsStep.checkPipelineConfigurationInvisible(); + await metricsStep.checkClassificationSettingInvisible(); + await metricsStep.selectCrews(metricsStepWithoutBlockColumnData.crews); + await metricsStep.selectCycleTimeSettingsType(metricsStepWithoutBlockColumnData.cycleTime.type); + await metricsStep.checkCycleTimeConsiderCheckboxChecked(); + await metricsStep.selectHeartbeatStateWithoutBlock( + metricsStepWithoutBlockColumnData.cycleTime.jiraColumns.map( + (jiraToHBSingleMap) => Object.values(jiraToHBSingleMap)[0], + ), + ); + await metricsStep.selectReworkSettings(metricsStepWithoutBlockColumnData.reworkTimesSettings); + + await metricsStep.goToReportPage(); + await reportStep.confirmGeneratedReport(); + await reportStep.checkBoardDownloadDataWithoutBlock('../../fixtures/create-new/board-data-without-block-column.csv'); +}); diff --git a/frontend/e2e/specs/major-path/cycle-time-by-status-test.spec.ts b/frontend/e2e/specs/major-path/cycle-time-by-status-test.spec.ts index 0bb40ef345..d75bf914a5 100644 --- a/frontend/e2e/specs/major-path/cycle-time-by-status-test.spec.ts +++ b/frontend/e2e/specs/major-path/cycle-time-by-status-test.spec.ts @@ -27,7 +27,6 @@ test('Create a new project with cycle time by status', async ({ homePage, config await metricsStep.waitForShown(); await metricsStep.validateNextButtonNotClickable(); await metricsStep.checkLastAssigneeCrewFilterChecked(); - await metricsStep.checkCycleTimeConsiderCheckboxChecked(); await metricsStep.checkCycleTimeSettingIsByColumn(); await metricsStep.waitForHiddenLoading(); await metricsStep.selectCrews(cycleTimeByStatusFixture.crews); @@ -65,7 +64,6 @@ test('Create a new project with cycle time by status', async ({ homePage, config await metricsStep.waitForShown(); await metricsStep.validateNextButtonNotClickable(); await metricsStep.checkLastAssigneeCrewFilterChecked(); - await metricsStep.checkCycleTimeConsiderCheckboxChecked(); await metricsStep.checkCycleTimeSettingIsByColumn(); await metricsStep.waitForHiddenLoading(); await metricsStep.selectCrews(cycleTimeByColumnFixture.crews); diff --git a/frontend/e2e/specs/major-path/import-project-from-file.spec.ts b/frontend/e2e/specs/major-path/import-project-from-file.spec.ts index 16cbf741a6..7f69a111eb 100644 --- a/frontend/e2e/specs/major-path/import-project-from-file.spec.ts +++ b/frontend/e2e/specs/major-path/import-project-from-file.spec.ts @@ -68,15 +68,22 @@ test('Import project from file', async ({ homePage, configStep, metricsStep, rep await reportStep.checkDownloadReports(); }); -test('Import project from flag as block', async ({ homePage, configStep, metricsStep, reportStep }) => { +test('Import project from flag as block and without block column', async ({ + homePage, + configStep, + metricsStep, + reportStep, +}) => { await homePage.goto(); await homePage.importProjectFromFile('../fixtures/input-files/add-flag-as-block-config-file.json'); await configStep.verifyBoardConfig(); await configStep.goToMetrics(); await metricsStep.waitForShown(); + await metricsStep.checkCycleTimeConsiderCheckboxChecked(); await metricsStep.goToReportPage(); + await reportStep.confirmGeneratedReport(); await reportStep.checkBoardMetrics( FLAG_AS_BLOCK_PROJECT_BOARD_METRICS_RESULT.Velocity, FLAG_AS_BLOCK_PROJECT_BOARD_METRICS_RESULT.Throughput, @@ -87,4 +94,5 @@ test('Import project from flag as block', async ({ homePage, configStep, metrics FLAG_AS_BLOCK_PROJECT_BOARD_METRICS_RESULT.reworkCardsRatio, FLAG_AS_BLOCK_PROJECT_BOARD_METRICS_RESULT.throughput, ); + await reportStep.checkBoardDownloadDataWithoutBlock('../../fixtures/import-file/board-data-without-block-column.csv'); }); diff --git a/frontend/e2e/specs/major-path/page-jumps.spec.ts b/frontend/e2e/specs/major-path/page-jumps.spec.ts index b319037ae3..08c4fc1dcb 100644 --- a/frontend/e2e/specs/major-path/page-jumps.spec.ts +++ b/frontend/e2e/specs/major-path/page-jumps.spec.ts @@ -28,7 +28,6 @@ test('Page jump for import', async ({ homePage, configStep, metricsStep, reportS await metricsStep.selectCrews(modifiedMetricsStepData.crews); await metricsStep.selectCycleTimeSettingsType(modifiedMetricsStepData.cycleTime.type); await metricsStep.selectModifiedHeartbeatState(modifiedHbStateData); - await metricsStep.selectCycleTimeConsiderAsBlockCheckbox(); await metricsStep.selectClassifications(modifiedMetricsStepData.classification); await metricsStep.selectReworkSettings(metricsStepData.reworkTimesSettings); await metricsStep.goToReportPage(); @@ -38,7 +37,6 @@ test('Page jump for import', async ({ homePage, configStep, metricsStep, reportS await metricsStep.checkCrews(modifiedMetricsStepData.crews); await metricsStep.checkBoardByStatusRadioBoxChecked(); await metricsStep.checkModifiedHeartbeatState(modifiedHbStateData); - await metricsStep.checkCycleTimeConsiderAsBlockUnchecked(); await metricsStep.checkClassifications(modifiedMetricsStepData.classification); await metricsStep.checkReworkSettings(metricsStepData.reworkTimesSettings); diff --git a/frontend/src/clients/report/ReportClient.ts b/frontend/src/clients/report/ReportClient.ts index 7d7127fc30..811352c415 100644 --- a/frontend/src/clients/report/ReportClient.ts +++ b/frontend/src/clients/report/ReportClient.ts @@ -31,7 +31,6 @@ export class ReportClient extends HttpClient { reworkState: 'Done', fromAnalysis: 0, fromInDev: 0, - fromFlag: 0, fromBlock: 0, fromWaitingForTesting: 0, fromTesting: 0, diff --git a/frontend/src/clients/report/dto/response.ts b/frontend/src/clients/report/dto/response.ts index 4219fae83c..c9b1b7e64f 100644 --- a/frontend/src/clients/report/dto/response.ts +++ b/frontend/src/clients/report/dto/response.ts @@ -49,7 +49,6 @@ export interface ReworkTimeResponse { fromAnalysis: number | null; fromInDev: number | null; fromBlock: number | null; - fromFlag: number | null; fromWaitingForTesting: number | null; fromTesting: number | null; fromReview: number | null; diff --git a/frontend/src/constants/resources.ts b/frontend/src/constants/resources.ts index 1efe24ee53..34e1041d09 100644 --- a/frontend/src/constants/resources.ts +++ b/frontend/src/constants/resources.ts @@ -218,7 +218,6 @@ export const REWORK_TIME_MAPPING = { fromAnalysis: 'analysis', fromInDev: 'in dev', fromBlock: 'block', - fromFlag: 'flag', fromReview: 'review', fromWaitingForTesting: 'waiting for testing', fromTesting: 'testing', @@ -231,7 +230,6 @@ export const REWORK_BOARD_STATUS: string[] = [ REWORK_TIME_MAPPING.fromAnalysis, REWORK_TIME_MAPPING.fromInDev, REWORK_TIME_MAPPING.fromBlock, - REWORK_TIME_MAPPING.fromFlag, REWORK_TIME_MAPPING.fromWaitingForTesting, REWORK_TIME_MAPPING.fromTesting, REWORK_TIME_MAPPING.fromReview, @@ -268,6 +266,7 @@ export const MESSAGE = { HOME_VERIFY_IMPORT_WARNING: 'The content of the imported JSON file is empty. Please confirm carefully', CONFIG_PAGE_VERIFY_IMPORT_ERROR: 'Imported data is not perfectly matched. Please review carefully before going next!', CLASSIFICATION_WARNING: 'Some classifications in import data might be removed.', + FLAG_CARD_DROPPED_WARNING: 'Please note: ’consider the “Flag” as “Block” ‘ has been dropped!', REAL_DONE_WARNING: 'Some selected doneStatus in import data might be removed', ORGANIZATION_WARNING: 'This organization in import data might be removed', PIPELINE_NAME_WARNING: 'This Pipeline in import data might be removed', @@ -427,3 +426,5 @@ export const REMOVE_BUTTON_TEXT = 'Remove'; export const MAX_TIME_RANGE_AMOUNT = 6; export const START_DATE_INVALID_TEXT = 'Start date is invalid'; export const END_DATE_INVALID_TEXT = 'End date is invalid'; + +export const BLOCK_COLUMN_NAME = ['BLOCKED', 'BLOCK']; diff --git a/frontend/src/containers/MetricsStep/CycleTime/index.tsx b/frontend/src/containers/MetricsStep/CycleTime/index.tsx index 2152dbc3e5..1fcf12999d 100644 --- a/frontend/src/containers/MetricsStep/CycleTime/index.tsx +++ b/frontend/src/containers/MetricsStep/CycleTime/index.tsx @@ -1,20 +1,50 @@ +import { + selectCycleTimeWarningMessage, + selectDisplayFlagCardDropWarning, + selectMetricsContent, + selectTreatFlagCardAsBlock, + updateDisplayFlagCardDropWarning, + updateTreatFlagCardAsBlock, +} from '@src/context/Metrics/metricsSlice'; import SectionTitleWithTooltip from '@src/components/Common/SectionTitleWithTooltip'; -import { selectCycleTimeWarningMessage } from '@src/context/Metrics/metricsSlice'; import { WarningNotification } from '@src/components/Common/WarningNotification'; import CycleTimeTable from '@src/containers/MetricsStep/CycleTime/Table'; import FlagCard from '@src/containers/MetricsStep/CycleTime/FlagCard'; -import { TIPS } from '@src/constants/resources'; +import { useAppDispatch } from '@src/hooks/useAppDispatch'; +import { MESSAGE, TIPS } from '@src/constants/resources'; +import { useEffect, useMemo, useState } from 'react'; +import { existBlockColumn } from '@src/utils/util'; import { useAppSelector } from '@src/hooks'; export const CycleTime = () => { + const dispatch = useAppDispatch(); + const flagCardAsBlock = useAppSelector(selectTreatFlagCardAsBlock); + const displayFlagCardDropWarning = useAppSelector(selectDisplayFlagCardDropWarning); const warningMessage = useAppSelector(selectCycleTimeWarningMessage); + const { cycleTimeSettings, cycleTimeSettingsType } = useAppSelector(selectMetricsContent); + const hasBlockColumn = useMemo(() => { + return existBlockColumn(cycleTimeSettingsType, cycleTimeSettings); + }, [cycleTimeSettingsType, cycleTimeSettings]); + const [shouldShowConflictMessage, setShouldShowConflictMessage] = useState(false); + + useEffect(() => { + if (hasBlockColumn && displayFlagCardDropWarning) { + setShouldShowConflictMessage(true); + dispatch(updateDisplayFlagCardDropWarning(false)); + } + + if (hasBlockColumn && flagCardAsBlock) { + dispatch(updateTreatFlagCardAsBlock(false)); + } + }, [dispatch, flagCardAsBlock, displayFlagCardDropWarning, hasBlockColumn]); return (
+ {shouldShowConflictMessage && } {warningMessage && } - + {hasBlockColumn || }
); }; diff --git a/frontend/src/context/Metrics/metricsSlice.ts b/frontend/src/context/Metrics/metricsSlice.ts index 2b6316b564..9fb44e60fb 100644 --- a/frontend/src/context/Metrics/metricsSlice.ts +++ b/frontend/src/context/Metrics/metricsSlice.ts @@ -5,7 +5,7 @@ import { MESSAGE, METRICS_CONSTANTS, } from '@src/constants/resources'; -import { convertCycleTimeSettings, getSortedAndDeduplicationBoardingMapping } from '@src/utils/util'; +import { convertCycleTimeSettings, existBlockColumn, getSortedAndDeduplicationBoardingMapping } from '@src/utils/util'; import { pipeline } from '@src/context/config/pipelineTool/verifyResponseSlice'; import { createSlice } from '@reduxjs/toolkit'; import camelCase from 'lodash.camelcase'; @@ -51,6 +51,7 @@ export interface ISavedMetricsSettingState { deploymentFrequencySettings: IPipelineConfig[]; leadTimeForChanges: IPipelineConfig[]; treatFlagCardAsBlock: boolean; + displayFlagCardDropWarning: boolean; assigneeFilter: string; firstTimeRoadMetricData: boolean; importedData: { @@ -86,6 +87,7 @@ const initialState: ISavedMetricsSettingState = { deploymentFrequencySettings: [], leadTimeForChanges: [{ id: 0, organization: '', pipelineName: '', step: '', branches: [] }], treatFlagCardAsBlock: true, + displayFlagCardDropWarning: true, assigneeFilter: ASSIGNEE_FILTER_TYPES.LAST_ASSIGNEE, firstTimeRoadMetricData: true, importedData: { @@ -290,6 +292,20 @@ function resetReworkTimeSettingWhenMappingModified(preJiraColumnsValue: string[] }; } +function initTreatFlagCardAsBlock( + preTreatFlagCardAsBlock: boolean, + preHasBlockColumn: boolean, + state: ISavedMetricsSettingState, +) { + if ( + !preTreatFlagCardAsBlock && + preHasBlockColumn && + !existBlockColumn(state.cycleTimeSettingsType, state.cycleTimeSettings) + ) { + state.treatFlagCardAsBlock = true; + } +} + export const metricsSlice = createSlice({ name: 'metrics', initialState, @@ -380,6 +396,11 @@ export const metricsSlice = createSlice({ const preJiraColumnsValue = getSortedAndDeduplicationBoardingMapping(state.cycleTimeSettings).filter( (item) => item !== METRICS_CONSTANTS.cycleTimeEmptyStr, ); + const preHasBlockColumn = existBlockColumn(state.cycleTimeSettingsType, state.cycleTimeSettings); + const preTreatFlagCardAsBlock = state.treatFlagCardAsBlock; + + state.displayFlagCardDropWarning = + state.displayFlagCardDropWarning && !isProjectCreated && importedCycleTime.importedTreatFlagCardAsBlock; state.users = isProjectCreated ? setCreateSelectUsers(state, users) : setImportSelectUsers(state, users, importedCrews); @@ -442,6 +463,7 @@ export const metricsSlice = createSlice({ ? getCycleTimeSettingsByColumn(state, jiraColumns) : getCycleTimeSettingsByStatus(state, jiraColumns); } + initTreatFlagCardAsBlock(preTreatFlagCardAsBlock, preHasBlockColumn, state); resetReworkTimeSettingWhenMappingModified(preJiraColumnsValue, state); if (!isProjectCreated && importedDoneStatus.length > 0) { @@ -457,11 +479,6 @@ export const metricsSlice = createSlice({ importedAssigneeFilter === ASSIGNEE_FILTER_TYPES.HISTORICAL_ASSIGNEE ? importedAssigneeFilter : ASSIGNEE_FILTER_TYPES.LAST_ASSIGNEE; - - state.treatFlagCardAsBlock = - typeof importedCycleTime.importedTreatFlagCardAsBlock === 'boolean' - ? importedCycleTime.importedTreatFlagCardAsBlock - : true; }, updatePipelineSettings: (state, action) => { @@ -575,6 +592,10 @@ export const metricsSlice = createSlice({ state.treatFlagCardAsBlock = action.payload; }, + updateDisplayFlagCardDropWarning: (state, action) => { + state.displayFlagCardDropWarning = action.payload; + }, + updateAssigneeFilter: (state, action) => { state.assigneeFilter = action.payload; }, @@ -607,6 +628,7 @@ export const { updateMetricsImportedData, initDeploymentFrequencySettings, updateTreatFlagCardAsBlock, + updateDisplayFlagCardDropWarning, updateAssigneeFilter, updateMetricsState, updatePipelineSettings, @@ -630,6 +652,7 @@ export const selectCycleTimeSettings = (state: RootState) => state.metrics.cycle export const selectMetricsContent = (state: RootState) => state.metrics; export const selectAdvancedSettings = (state: RootState) => state.metrics.importedData.importedAdvancedSettings; export const selectTreatFlagCardAsBlock = (state: RootState) => state.metrics.treatFlagCardAsBlock; +export const selectDisplayFlagCardDropWarning = (state: RootState) => state.metrics.displayFlagCardDropWarning; export const selectAssigneeFilter = (state: RootState) => state.metrics.assigneeFilter; export const selectCycleTimeWarningMessage = (state: RootState) => state.metrics.cycleTimeWarningMessage; export const selectClassificationWarningMessage = (state: RootState) => state.metrics.classificationWarningMessage; diff --git a/frontend/src/hooks/useVerifyBoardEffect.ts b/frontend/src/hooks/useVerifyBoardEffect.ts index d97a3a6d17..d44643a4f2 100644 --- a/frontend/src/hooks/useVerifyBoardEffect.ts +++ b/frontend/src/hooks/useVerifyBoardEffect.ts @@ -1,6 +1,5 @@ import { BOARD_TYPES, AXIOS_REQUEST_ERROR_CODE, MESSAGE, UNKNOWN_ERROR_TITLE } from '@src/constants/resources'; import { selectBoard, updateBoard, updateBoardVerifyState } from '@src/context/config/configSlice'; -import { updateTreatFlagCardAsBlock } from '@src/context/Metrics/metricsSlice'; import { findCaseInsensitiveType, getJiraBoardToken } from '@src/utils/util'; import { useAppDispatch, useAppSelector } from '@src/hooks/useAppDispatch'; import { DEFAULT_HELPER_TEXT, EMPTY_STRING } from '@src/constants/commons'; @@ -187,7 +186,6 @@ export const useVerifyBoardEffect = (): useVerifyBoardStateInterface => { const verifyJira = async () => { setIsLoading(true); - dispatch(updateTreatFlagCardAsBlock(true)); const boardInfo = getBoardInfo(fields) as BoardRequestDTO; try { const res: { response: Record } = await boardClient.getVerifyBoard({ diff --git a/frontend/src/utils/util.ts b/frontend/src/utils/util.ts index 0d62c6c58e..65f08103a5 100644 --- a/frontend/src/utils/util.ts +++ b/frontend/src/utils/util.ts @@ -1,4 +1,9 @@ -import { CYCLE_TIME_LIST, CYCLE_TIME_SETTINGS_TYPES, METRICS_CONSTANTS } from '@src/constants/resources'; +import { + BLOCK_COLUMN_NAME, + CYCLE_TIME_LIST, + CYCLE_TIME_SETTINGS_TYPES, + METRICS_CONSTANTS, +} from '@src/constants/resources'; import { CleanedBuildKiteEmoji, OriginBuildKiteEmoji } from '@src/constants/emojis/emoji'; import { ICycleTimeSetting, IPipelineConfig } from '@src/context/Metrics/metricsSlice'; import { ITargetFieldType } from '@src/components/Common/MultiAutoComplete/styles'; @@ -156,3 +161,12 @@ export function convertCycleTimeSettings( } return cycleTimeSettings?.map(({ status, value }: ICycleTimeSetting) => ({ [status]: value })); } + +export function existBlockColumn( + cycleTimeSettingsType: CYCLE_TIME_SETTINGS_TYPES, + cycleTimeSettings: ICycleTimeSetting[], +) { + return cycleTimeSettingsType === CYCLE_TIME_SETTINGS_TYPES.BY_COLUMN + ? cycleTimeSettings.some(({ column }) => BLOCK_COLUMN_NAME.includes(column.toUpperCase())) + : cycleTimeSettings.some(({ status }) => BLOCK_COLUMN_NAME.includes(status.toUpperCase())); +} From 6b43c85fc41dfba195835b41d69e69ffb4b3b3ca Mon Sep 17 00:00:00 2001 From: yulongcai <141199398+yulongcai@users.noreply.github.com> Date: Fri, 12 Apr 2024 14:00:15 +0800 Subject: [PATCH 02/81] ADM-919[backend] : Speed up the generating of pipeline data in report page and add foru column in csv (#1361) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * ADM-919:[backend] feat: Speed up the generating of pipeline data in report page * ADM-919:[backend] feat: fix e2e test * fix(e2e): fix env * Adm 920[backend] feat: Support to retrieve multiple pages of pipelines in metrics page (#1359) * ADM-920:[backend] feat: can get all pipeline info * ADM-920:[backend] fix: change Cache type * ADM-873:[frontend]fix: fix notification logic (#1356) Co-authored-by: yulongcai <141199398+yulongcai@users.noreply.github.com> * ADM-898[backend][frontend]: feat: block' in board mapping is mutually exclusive with 'flag as block' (#1350) * ADM-898:[backend] feat: should not export cycle time flag on table header when not consider flag as block * ADM-898:[frontend]feat: not show flagCard when board mapping table has ‘block’ column * ADM-898:[frontend]feat: warning pop-up when conflict * ADM-898:[frontend]refactor: refactor codes * ADM-898:[frontend]refactor: remove fromFlag * ADM-898:[frontend]feat: not show flagCard when board mapping table has ‘block’ column * ADM-873-bug:[backend] feat: add test for as flag is block is false * ADM-898:[frontend]feat: add status logic * ADM-898:[frontend]refactor: refactor code * ADM-898:[backend] fix: fix bug for not calculate flag block to cycle when consider flag as block * ADM-886:[docs]docs: refactor chart API docs sequence diagram (#1339) * ADM-886:[docs]docs: update chart API image size * ADM-886:[docs]docs: update chart API docs content * ADM-886:[docs]docs: refactor chart API docs * ADM-886:[docs]docs: refactor chart API docs sequence diagram * ADM 834 add frontend validation to board Id (#1338) * ADM-834:[frontend]feat: fix rebase * ADM-834:[backend]feat: added api for domain url check * ADM-834:[backend]feat: add dashboard api for site check * ADM-834:[backend]feat: added api for domain url check * ADM-834:[frontend]fix: fix rebase * ADM-834:[frontend]fix: add regex validation to board id * ADM-834:[frontend]fix: fix lint * ADM 751 [docs]docs: fix readme in board mappings part (#1334) * ADM-751:[frontend]feat: add by status e2e test flow into import test * ADM-751:[frontend]feat: add more flow in create test * ADM-751:[frontend]feat: fix lint and refactor fixture file * ADM-751:[frontend]feat: fix by state flow and add new test * ADM-751:[frontend]feat: refactored file strcture and implemented new e2e test for cycle time status testing, just need to fix the data then * ADM-751:[frontend]feat: rework the by status flow e2e test, remove unnecessary steps * ADM-751:[frontend]feat: fix test flow again * ADM-751:[frontend]feat: fix type check * ADM-751:[frontend]feat: add status flow e2e test in import test * ADM-751:[frontend]fix: fix lint * ADM-882:[backend]feat: add import json file * ADM-751:[frontend]fix: refactor code * ADM-751:[frontend]fix: refactor code fix type * ADM-751:[docs]docs: fix readme in board mappings * ADM-751:[docs]docs: remove conflicted rework part * ADM-751 refactor --------- Co-authored-by: guzhongren * chore(sbom): generate sbom when releasing (#1340) * ADM-833:[frontend]feat:add e2e unhappy path scenarios (#1328) * ADM-833:[frontend]feat:add e2e unhappy path scenarios ADM-833: [frontend] add e2e test scenarios ADM-833: [frontend] fix: fix code style error ADM-833: [frontend] feat: add unhappy path scenoria ADM-833: [frontend] feat: optimize add and remove new pipeline,add unhappy path template ADM-833: [frontend] feat: optimize remove new pipeline,unhappy path template ADM-833: [frontend] feat: optimize remove new pipeline,unhappy path template ADM-833:[frontend]feat:merge unhappy path scenario ADM-833: [frontend] update: update e2e test scenarios ADM-833: [frontend] fix: fix code style error ADM-833: [frontend] update: update e2e test scenarios ADM-833: [frontend] update: update e2e test scenarios ADM-833: [frontend] fix: fix e2e test error ADM-833:[frontend]feat:distinguish major and unhappy path test in local environment ADM-833: [frontend] feat: sperate major and all ADM-833[frontend]feat:change branch invalid error message ADM-833: [frontend] fix: fix index.ts error ADM-833: [frontend] fix: remove the log file ADM-833: [frontend] fix: fix conflict with main branch ADM-833: [frontend] fix: revert readme ADM-833: [frontend] fix: remove log file ADM-833: [frontend] fix: modify .gitignore, add omit logs * ADM-833 fix path * ADM-833: [frontend] fix: update the spec location * ADM-833: [frontend] fix: fix daterange error * ADM-833: [frontend] fix: fix review error * ADM-833: [frontend] fix: fix review error --------- Co-authored-by: YaoZhang-Daniel Co-authored-by: guzhongren * ADM-833: [frontend] fix: fix env error (#1341) * ADM-833:[frontend]feat:add e2e unhappy path scenarios ADM-833: [frontend] add e2e test scenarios ADM-833: [frontend] fix: fix code style error ADM-833: [frontend] feat: add unhappy path scenoria ADM-833: [frontend] feat: optimize add and remove new pipeline,add unhappy path template ADM-833: [frontend] feat: optimize remove new pipeline,unhappy path template ADM-833: [frontend] feat: optimize remove new pipeline,unhappy path template ADM-833:[frontend]feat:merge unhappy path scenario ADM-833: [frontend] update: update e2e test scenarios ADM-833: [frontend] fix: fix code style error ADM-833: [frontend] update: update e2e test scenarios ADM-833: [frontend] update: update e2e test scenarios ADM-833: [frontend] fix: fix e2e test error ADM-833:[frontend]feat:distinguish major and unhappy path test in local environment ADM-833: [frontend] feat: sperate major and all ADM-833[frontend]feat:change branch invalid error message ADM-833: [frontend] fix: fix index.ts error ADM-833: [frontend] fix: remove the log file ADM-833: [frontend] fix: fix conflict with main branch ADM-833: [frontend] fix: revert readme ADM-833: [frontend] fix: remove log file ADM-833: [frontend] fix: modify .gitignore, add omit logs * ADM-833 fix path * ADM-833: [frontend] fix: update the spec location * ADM-833: [frontend] fix: fix daterange error * ADM-833: [frontend] fix: fix review error * ADM-833: [frontend] fix: fix review error * ADM-833: [frontend] fix: fix env error --------- Co-authored-by: YaoZhang-Daniel Co-authored-by: guzhongren * Revert "ADM-833: [frontend] fix: fix env error (#1341)" (#1344) This reverts commit eed90dc2ee055d2b0601db4ddfb22877effbf7a7. * [ADM-833][frontend]: chore: fix the e2e env injection error. (#1345) * refactor(e2e): name conversion[frontend] * fix(e2e): fix type check[frontend] * ADM-898:[frontend]fix: fix test * ADM-898:[frontend]feat: add test for CycleTime * ADM-898:[frontend]fix: fix UpperCase error * ADM-898:[frontend]fix: fix default value * ADM-898:[frontend]fix: fix import treatFlagCardAsBlock value * ADM-898:[backend] fix: repair e2e test * ADM-898:[backend] fix: repair e2e test to delete check consider flag as block * ADM-898:[backend] fix: sonar issue * [ADM-877][frontend]: feat: remove the limit of start-date & end-date selection. (#1342) * [ADM-877][frontend]: feat: remove the limit of start-date & end-date selection. * [ADM-877][frontend]: chore: refine code. * ADM-873:[frontend][backend] fix: fix success notification (#1327) * ADM-873-bug:[docx] docx: fix docx * ADM-873:[frontend]fix: fix error notification * ADM-873:[frontend]refactor: refactor code * ADM-873-bug:[backend] feat: return flag for whether it has file create by this invoke * Revert "ADM-873:[frontend]refactor: refactor code" This reverts commit e2fe52fc2c1b41dd0c2743daed78a6ff08a98f56. * Revert "ADM-873:[frontend]fix: fix error notification" This reverts commit b659c63af9143eecc97ae83f322f61885b9ad447. * ADM-873:[frontend]fix: use hasCsvFileCreateSuccessful to handle success notification * ADM-873-bug:[backend] feat: return has csv create successful when get completed * ADM-873-bug:[backend] fix: rename * ADM-873:[frontend]fix: fix test * ADM-873:[frontend]refactor: rename hasCsvFileCreateSuccessful to isSuccessfulCreateCsvFile * ADM-873:[backend]refactor: modify test info * ADM-873:[backend]refactor: format code --------- Co-authored-by: yulongcai Co-authored-by: Rui7ing <129819182+Rui7ing@users.noreply.github.com> * [frontend] feat/adm 811: Do not clear the configuration settings when returning from the metric page to the configuration page. (#1343) * [feat][adm-811]: remove GoCD option * [frontend][adm-811]: feat: remove clear config data trigger when back to config page * [frontend][adm-811]: refact: refact unit test * [frontend][adm-811]: replace fireEvent use userEvent * [frontend][adm-811]: fix failed case * Adm 910[docs] feat: add Github graghQL rate limit issue (#1348) * ADM-910[docs] feat: add Node and Rate limits and calculate * ADM-910[docs] feat: add flew chart for get data by github api * Adm 912[frontend]: ui refine date picker in metrics page (#1349) * ADM-912 feat: display date ranges * ADM-912 test: add unit test * ADM-912 fix: fix css * ADM-912 fix: fix color * ADM-912 fix: fix hex color * ADM-912 fix: use color from theme * ADM-898:[frontend]feat: add block case * ADM-898:[frontend]fix: fix test for treatFlagCardAsBlock * ADM-898:[frontend]fix: fix bug * ADM-898 fix: fix treat flag card as block when import * ADM-898 fix: fix treat flag card as block when create * ADM-898 refactor: rename * ADM-898:[frontend]fix: remove unnecessary cycleTimeSettings * ADM-898 fix: fix test * ADM-898:[backend] refactor: refactor code * ADM-898 test: add unit test * ADM-898 test: add e2e test for no block column board when create project * ADM-898 test: add e2e test for no block column board when import project * ADM-898:[frontend]refactor: iterate over test data and run tests using forEach * ADM-898:[frontend]refactor: export BLOCK_COLUMN_NAME * ADM-898:[frontend]refactor: fix prettier error * ADM-898:[frontend]fix: fix the error from merge --------- Co-authored-by: Tingyu Dong Co-authored-by: Steveay <907221539@qq.com> Co-authored-by: PengxiWPix <113176309+PengxiWPix@users.noreply.github.com> Co-authored-by: guzhongren Co-authored-by: YaoZhang87 <162096287+YaoZhang87@users.noreply.github.com> Co-authored-by: YaoZhang-Daniel Co-authored-by: Chao <89126516+mrcuriosity-tw@users.noreply.github.com> Co-authored-by: TingyuDong <113588395+TingyuDong@users.noreply.github.com> Co-authored-by: Rui7ing <129819182+Rui7ing@users.noreply.github.com> Co-authored-by: K Chow Co-authored-by: junbo dai Co-authored-by: Leiqiuhong <141199516+Leiqiuhong@users.noreply.github.com> Co-authored-by: Leiqiuhong * ADM-919:[backend] feat: add revert column in csv * ADM-919:[backend] feat: add job start time and pipeline start time and no pr commit time in csv * ADM-919:[backend] feat: fix e2e expect csv * ADM-919:[backend] feat: fix sonar error * ADM-919:[backend] fix: delete no use code * ADM-919:[backend] fix: add test for when build kite data info have author * ADM-919:[backend] fix: fix sonar error for eq * ADM-919:[backend] fix: update check error * ADM-919:[backend] fix: repair sonar issue * ADM-919:[backend] fix: format code * ADM-919:[backend] fix: add Nullable for field --------- Co-authored-by: guzhongren Co-authored-by: junbo dai Co-authored-by: TingyuDong <113588395+TingyuDong@users.noreply.github.com> Co-authored-by: Tingyu Dong Co-authored-by: Steveay <907221539@qq.com> Co-authored-by: PengxiWPix <113176309+PengxiWPix@users.noreply.github.com> Co-authored-by: YaoZhang87 <162096287+YaoZhang87@users.noreply.github.com> Co-authored-by: YaoZhang-Daniel Co-authored-by: Chao <89126516+mrcuriosity-tw@users.noreply.github.com> Co-authored-by: Rui7ing <129819182+Rui7ing@users.noreply.github.com> Co-authored-by: K Chow Co-authored-by: Leiqiuhong <141199516+Leiqiuhong@users.noreply.github.com> Co-authored-by: Leiqiuhong --- .../client/dto/codebase/github/LeadTime.java | 11 ++ .../report/dto/response/LeadTimeInfo.java | 55 +++--- .../service/report/CSVFileGenerator.java | 31 ++-- .../service/report/PipelineService.java | 13 +- .../service/source/github/GitHubService.java | 34 +++- .../report/dto/response/LeadTimeInfoTest.java | 16 +- .../service/report/CSVFileGeneratorTest.java | 80 +++++++-- .../service/report/PipelineCsvFixture.java | 156 +++++++++++++++--- .../service/report/PipelineServiceTest.java | 57 ++++++- .../source/github/GithubServiceTest.java | 93 ++++++++++- .../e2e/fixtures/create-new/pipeline-data.csv | 96 +++++------ .../fixtures/import-file/pipeline-data.csv | 96 +++++------ 12 files changed, 537 insertions(+), 201 deletions(-) diff --git a/backend/src/main/java/heartbeat/client/dto/codebase/github/LeadTime.java b/backend/src/main/java/heartbeat/client/dto/codebase/github/LeadTime.java index 92a45843b2..167d6b48c4 100644 --- a/backend/src/main/java/heartbeat/client/dto/codebase/github/LeadTime.java +++ b/backend/src/main/java/heartbeat/client/dto/codebase/github/LeadTime.java @@ -25,8 +25,19 @@ public class LeadTime { private long jobFinishTime; + private long jobStartTime; + + @Nullable + private Long noPRCommitTime; + + @Nullable + private Long firstCommitTime; + private long pipelineCreateTime; + @Nullable + private Boolean isRevert; + @Nullable private Long prLeadTime; diff --git a/backend/src/main/java/heartbeat/controller/report/dto/response/LeadTimeInfo.java b/backend/src/main/java/heartbeat/controller/report/dto/response/LeadTimeInfo.java index e1572895b8..d88154e880 100644 --- a/backend/src/main/java/heartbeat/controller/report/dto/response/LeadTimeInfo.java +++ b/backend/src/main/java/heartbeat/controller/report/dto/response/LeadTimeInfo.java @@ -25,6 +25,12 @@ public class LeadTimeInfo { private String jobFinishTime; + private String jobStartTime; + + private String noPRCommitTime; + + private String firstCommitTime; + @Nullable private String prLeadTime; @@ -33,33 +39,34 @@ public class LeadTimeInfo { @Nullable private String totalTime; - public LeadTimeInfo(LeadTime leadTime) { - if (leadTime != null) { - if (leadTime.getFirstCommitTimeInPr() != null) { - this.firstCommitTimeInPr = TimeUtil - .convertToISOFormat(String.valueOf(leadTime.getFirstCommitTimeInPr())); - } - - if (leadTime.getPrCreatedTime() != null) { - this.prCreatedTime = TimeUtil.convertToISOFormat(String.valueOf(leadTime.getPrCreatedTime())); - } - - if (leadTime.getPrMergedTime() != null) { - this.prMergedTime = TimeUtil.convertToISOFormat(String.valueOf(leadTime.getPrMergedTime())); - } - - this.jobFinishTime = TimeUtil.convertToISOFormat(String.valueOf(leadTime.getJobFinishTime())); + private Boolean isRevert; - this.pipelineLeadTime = TimeUtil.msToHMS(leadTime.getPipelineLeadTime()); - - if (leadTime.getPrLeadTime() != null) { - this.prLeadTime = TimeUtil.msToHMS(leadTime.getPrLeadTime()); - } + public LeadTimeInfo(LeadTime leadTime) { + if (leadTime == null) { + return; + } + this.firstCommitTimeInPr = convertToISOFormat(leadTime.getFirstCommitTimeInPr()); + this.prCreatedTime = convertToISOFormat(leadTime.getPrCreatedTime()); + this.prMergedTime = convertToISOFormat(leadTime.getPrMergedTime()); + this.jobFinishTime = convertToISOFormat(leadTime.getJobFinishTime()); + this.jobStartTime = convertToISOFormat(leadTime.getJobStartTime()); + this.firstCommitTime = convertToISOFormat(leadTime.getFirstCommitTime()); + this.noPRCommitTime = convertToISOFormat(leadTime.getNoPRCommitTime()); + + this.pipelineLeadTime = TimeUtil.msToHMS(leadTime.getPipelineLeadTime()); + this.isRevert = leadTime.getIsRevert(); + + if (leadTime.getPrLeadTime() != null) { + this.prLeadTime = TimeUtil.msToHMS(leadTime.getPrLeadTime()); + } - if (leadTime.getTotalTime() != 0) { - this.totalTime = TimeUtil.msToHMS(leadTime.getTotalTime()); - } + if (leadTime.getTotalTime() != 0) { + this.totalTime = TimeUtil.msToHMS(leadTime.getTotalTime()); } } + private String convertToISOFormat(Long time) { + return time != null ? TimeUtil.convertToISOFormat(String.valueOf(time)) : null; + } + } diff --git a/backend/src/main/java/heartbeat/service/report/CSVFileGenerator.java b/backend/src/main/java/heartbeat/service/report/CSVFileGenerator.java index cf7788abec..0f6552d4f1 100644 --- a/backend/src/main/java/heartbeat/service/report/CSVFileGenerator.java +++ b/backend/src/main/java/heartbeat/service/report/CSVFileGenerator.java @@ -43,8 +43,6 @@ import java.io.FileWriter; import java.io.IOException; import java.io.InputStream; -import java.math.BigDecimal; -import java.math.RoundingMode; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -101,9 +99,10 @@ public void convertPipelineDataToCSV(List leadTimeData, String File file = new File(fileName); try (CSVWriter csvWriter = new CSVWriter(new FileWriter(file))) { String[] headers = { "Organization", "Pipeline Name", "Pipeline Step", "Valid", "Build Number", - "Code Committer", "Pipeline Creator", "First Code Committed Time In PR", "Code Committed Time", - "PR Created Time", "PR Merged Time", "Deployment Completed Time", "Total Lead Time (HH:mm:ss)", - "PR Lead Time (HH:mm:ss)", "Pipeline Lead Time (HH:mm:ss)", "Status", "Branch" }; + "Code Committer", "Pipeline Creator", "First Code Committed Time In PR", "PR Created Time", + "PR Merged Time", "No PR Committed Time", "Job Start Time", "Pipeline Start Time", + "Pipeline Finish Time", "Total Lead Time (HH:mm:ss)", "PR Lead Time (HH:mm:ss)", + "Pipeline Lead Time (HH:mm:ss)", "Status", "Branch", "Revert" }; csvWriter.writeNext(headers); @@ -120,23 +119,21 @@ public void convertPipelineDataToCSV(List leadTimeData, String } private String[] getRowData(PipelineCSVInfo csvInfo) { - String committerName = null; - String commitDate = null; - if (csvInfo.getCommitInfo() != null) { - committerName = csvInfo.getCommitInfo().getCommit().getAuthor().getName(); - commitDate = csvInfo.getCommitInfo().getCommit().getAuthor().getDate(); - } - String creatorName = null; if (csvInfo.getBuildInfo().getCreator() != null && csvInfo.getBuildInfo().getCreator().getName() != null) { creatorName = csvInfo.getBuildInfo().getCreator().getName(); } + String committerName = null; + if (csvInfo.getBuildInfo().getAuthor() != null && csvInfo.getBuildInfo().getAuthor().getName() != null) { + committerName = String.valueOf(csvInfo.getBuildInfo().getAuthor().getName()); + } String organization = csvInfo.getOrganizationName(); String pipelineName = csvInfo.getPipeLineName(); String stepName = csvInfo.getStepName(); String valid = String.valueOf(csvInfo.getValid()).toLowerCase(); String buildNumber = String.valueOf(csvInfo.getBuildInfo().getNumber()); + String state = csvInfo.getPiplineStatus().equals(CANCELED_STATUS) ? CANCELED_STATUS : csvInfo.getDeployInfo().getState(); String branch = csvInfo.getBuildInfo().getBranch(); @@ -145,14 +142,18 @@ private String[] getRowData(PipelineCSVInfo csvInfo) { String firstCommitTimeInPr = leadTimeInfo.getFirstCommitTimeInPr(); String prCreatedTime = leadTimeInfo.getPrCreatedTime(); String prMergedTime = leadTimeInfo.getPrMergedTime(); - String jobFinishTime = csvInfo.getDeployInfo().getJobFinishTime(); + String noPRCommitTime = leadTimeInfo.getNoPRCommitTime(); + String jobStartTime = leadTimeInfo.getJobStartTime(); + String pipelineStartTime = leadTimeInfo.getFirstCommitTime(); + String pipelineFinishTime = csvInfo.getDeployInfo().getJobFinishTime(); String totalTime = leadTimeInfo.getTotalTime(); String prLeadTime = leadTimeInfo.getPrLeadTime(); String pipelineLeadTime = leadTimeInfo.getPipelineLeadTime(); + String isRevert = leadTimeInfo.getIsRevert() == null ? "" : String.valueOf(leadTimeInfo.getIsRevert()); return new String[] { organization, pipelineName, stepName, valid, buildNumber, committerName, creatorName, - firstCommitTimeInPr, commitDate, prCreatedTime, prMergedTime, jobFinishTime, totalTime, prLeadTime, - pipelineLeadTime, state, branch }; + firstCommitTimeInPr, prCreatedTime, prMergedTime, noPRCommitTime, jobStartTime, pipelineStartTime, + pipelineFinishTime, totalTime, prLeadTime, pipelineLeadTime, state, branch, isRevert }; } public InputStreamResource getDataFromCSV(ReportType reportDataType, long csvTimeStamp) { diff --git a/backend/src/main/java/heartbeat/service/report/PipelineService.java b/backend/src/main/java/heartbeat/service/report/PipelineService.java index 7ba6350cbe..08dca92425 100644 --- a/backend/src/main/java/heartbeat/service/report/PipelineService.java +++ b/backend/src/main/java/heartbeat/service/report/PipelineService.java @@ -1,5 +1,6 @@ package heartbeat.service.report; +import heartbeat.client.dto.codebase.github.Author; import heartbeat.client.dto.codebase.github.CommitInfo; import heartbeat.client.dto.codebase.github.LeadTime; import heartbeat.client.dto.codebase.github.PipelineLeadTime; @@ -56,7 +57,7 @@ public FetchedData.BuildKiteData fetchBuildKiteInfo(GenerateReportRequest reques String endTime = request.getEndTime(); FetchedData.BuildKiteData result = new FetchedData.BuildKiteData(); - request.getBuildKiteSetting().getDeploymentEnvList().stream().forEach(deploymentEnvironment -> { + request.getBuildKiteSetting().getDeploymentEnvList().forEach(deploymentEnvironment -> { List buildKiteBuildInfo = getBuildKiteBuildInfo(startTime, endTime, deploymentEnvironment, request.getBuildKiteSetting().getToken(), request.getBuildKiteSetting().getPipelineCrews()); @@ -97,12 +98,15 @@ private PipelineCSVInfo getPipelineCSVInfo(CodebaseSetting codebaseSetting, Stri BuildKiteBuildInfo buildInfo, List pipelineSteps) { DeployInfo deployInfo = buildKiteService.mapToDeployInfo(buildInfo, pipelineSteps, REQUIRED_STATES, startTime, endTime); - CommitInfo commitInfo = null; if (Objects.nonNull(codebaseSetting) && StringUtils.hasLength(codebaseSetting.getToken()) - && Objects.nonNull(deployInfo.getCommitId())) { - commitInfo = gitHubService.fetchCommitInfo(deployInfo.getCommitId(), + && Objects.nonNull(deployInfo.getCommitId()) && Objects.isNull(buildInfo.getAuthor())) { + CommitInfo commitInfo = gitHubService.fetchCommitInfo(deployInfo.getCommitId(), GithubUtil.getGithubUrlFullName(deploymentEnvironment.getRepository()), codebaseSetting.getToken()); + Author author = commitInfo.getCommit().getAuthor(); + buildInfo + .setAuthor(BuildKiteBuildInfo.Author.builder().name(author.getName()).email(author.getEmail()).build()); } + return PipelineCSVInfo.builder() .organizationName(deploymentEnvironment.getOrgName()) .pipeLineName(deploymentEnvironment.getName()) @@ -111,7 +115,6 @@ private PipelineCSVInfo getPipelineCSVInfo(CodebaseSetting codebaseSetting, Stri .piplineStatus(buildInfo.getState()) .buildInfo(buildInfo) .deployInfo(deployInfo) - .commitInfo(commitInfo) .leadTimeInfo(new LeadTimeInfo(filterLeadTime(buildKiteData, deploymentEnvironment, deployInfo))) .build(); } diff --git a/backend/src/main/java/heartbeat/service/source/github/GitHubService.java b/backend/src/main/java/heartbeat/service/source/github/GitHubService.java index 526483e948..27a51d55a8 100644 --- a/backend/src/main/java/heartbeat/service/source/github/GitHubService.java +++ b/backend/src/main/java/heartbeat/service/source/github/GitHubService.java @@ -205,9 +205,11 @@ private LeadTime parseNoMergeLeadTime(DeployInfo deployInfo, PipelineInfoOfRepos deployInfo.getCommitId(), e.getMessage()); } + Long noPRCommitTime = null; if (commitInfo.getCommit() != null && commitInfo.getCommit().getCommitter() != null && commitInfo.getCommit().getCommitter().getDate() != null) { - firstCommitTime = Instant.parse(commitInfo.getCommit().getCommitter().getDate()).toEpochMilli(); + noPRCommitTime = Instant.parse(commitInfo.getCommit().getCommitter().getDate()).toEpochMilli(); + firstCommitTime = noPRCommitTime; } else { firstCommitTime = jobStartTime; @@ -217,12 +219,24 @@ private LeadTime parseNoMergeLeadTime(DeployInfo deployInfo, PipelineInfoOfRepos .commitId(deployInfo.getCommitId()) .pipelineCreateTime(pipelineCreateTime) .jobFinishTime(jobFinishTime) + .jobStartTime(jobStartTime) + .noPRCommitTime(noPRCommitTime) + .firstCommitTime(firstCommitTime) .pipelineLeadTime(jobFinishTime - firstCommitTime) .totalTime(jobFinishTime - firstCommitTime) .prLeadTime(prLeadTime) + .isRevert(isRevert(commitInfo)) .build(); } + private Boolean isRevert(CommitInfo commitInfo) { + Boolean isRevert = null; + if (commitInfo.getCommit() != null && commitInfo.getCommit().getMessage() != null) { + isRevert = commitInfo.getCommit().getMessage().toLowerCase().startsWith("revert"); + } + return isRevert; + } + public LeadTime mapLeadTimeWithInfo(PullRequestInfo pullRequestInfo, DeployInfo deployInfo, CommitInfo commitInfo) { if (pullRequestInfo.getMergedAt() == null) { return null; @@ -230,6 +244,7 @@ public LeadTime mapLeadTimeWithInfo(PullRequestInfo pullRequestInfo, DeployInfo long prCreatedTime = Instant.parse(pullRequestInfo.getCreatedAt()).toEpochMilli(); long prMergedTime = Instant.parse(pullRequestInfo.getMergedAt()).toEpochMilli(); long jobFinishTime = Instant.parse(deployInfo.getJobFinishTime()).toEpochMilli(); + long jobStartTime = Instant.parse(deployInfo.getJobStartTime()).toEpochMilli(); long pipelineCreateTime = Instant.parse(deployInfo.getPipelineCreateTime()).toEpochMilli(); long firstCommitTimeInPr; if (commitInfo.getCommit() != null && commitInfo.getCommit().getCommitter() != null @@ -243,16 +258,12 @@ public LeadTime mapLeadTimeWithInfo(PullRequestInfo pullRequestInfo, DeployInfo long pipelineLeadTime = jobFinishTime - prMergedTime; long prLeadTime; long totalTime; - if (commitInfo.getCommit().getMessage().toLowerCase().startsWith("revert")) { + Boolean isRevert = isRevert(commitInfo); + if (Boolean.TRUE.equals(isRevert) || isNoFirstCommitTimeInPr(firstCommitTimeInPr)) { prLeadTime = 0; } else { - if (firstCommitTimeInPr > 0) { - prLeadTime = prMergedTime - firstCommitTimeInPr; - } - else { - prLeadTime = prMergedTime - prCreatedTime; - } + prLeadTime = prMergedTime - firstCommitTimeInPr; } totalTime = prLeadTime + pipelineLeadTime; @@ -265,10 +276,17 @@ public LeadTime mapLeadTimeWithInfo(PullRequestInfo pullRequestInfo, DeployInfo .prCreatedTime(prCreatedTime) .commitId(deployInfo.getCommitId()) .jobFinishTime(jobFinishTime) + .jobStartTime(jobStartTime) + .firstCommitTime(prMergedTime) .pipelineCreateTime(pipelineCreateTime) + .isRevert(isRevert) .build(); } + private static boolean isNoFirstCommitTimeInPr(long firstCommitTimeInPr) { + return firstCommitTimeInPr == 0; + } + public CommitInfo fetchCommitInfo(String commitId, String repositoryId, String token) { try { String realToken = BEARER_TITLE + token; diff --git a/backend/src/test/java/heartbeat/controller/report/dto/response/LeadTimeInfoTest.java b/backend/src/test/java/heartbeat/controller/report/dto/response/LeadTimeInfoTest.java index 690d16df6a..25a045ba49 100644 --- a/backend/src/test/java/heartbeat/controller/report/dto/response/LeadTimeInfoTest.java +++ b/backend/src/test/java/heartbeat/controller/report/dto/response/LeadTimeInfoTest.java @@ -10,18 +10,24 @@ public class LeadTimeInfoTest { @Test void shouldCreateLeadTimeInfoWithLeadTime() { LeadTimeInfo info = new LeadTimeInfo(LeadTime.builder() - .prLeadTime(47255635l) - .firstCommitTimeInPr(1672556350000l) - .prCreatedTime(1706067997l) - .prMergedTime(1706067997l) - .totalTime(57255635l) + .prLeadTime(47255635L) + .firstCommitTimeInPr(1672556350000L) + .prCreatedTime(1706067997L) + .prMergedTime(1706067997L) + .firstCommitTime(1706067997L) + .noPRCommitTime(1706067997L) + .totalTime(57255635L) + .isRevert(Boolean.FALSE) .build()); assertEquals("13:7:35", info.getPrLeadTime()); assertEquals("2023-01-01T06:59:10Z", info.getFirstCommitTimeInPr()); assertEquals("1970-01-20T17:54:27Z", info.getPrMergedTime()); assertEquals("1970-01-20T17:54:27Z", info.getPrCreatedTime()); + assertEquals("1970-01-20T17:54:27Z", info.getFirstCommitTime()); + assertEquals("1970-01-20T17:54:27Z", info.getNoPRCommitTime()); assertEquals("15:54:15", info.getTotalTime()); + assertEquals(Boolean.FALSE, info.getIsRevert()); } } diff --git a/backend/src/test/java/heartbeat/service/report/CSVFileGeneratorTest.java b/backend/src/test/java/heartbeat/service/report/CSVFileGeneratorTest.java index 839316fc7b..a81b8a6edb 100644 --- a/backend/src/test/java/heartbeat/service/report/CSVFileGeneratorTest.java +++ b/backend/src/test/java/heartbeat/service/report/CSVFileGeneratorTest.java @@ -72,11 +72,11 @@ void shouldConvertPipelineDataToCsvGivenCommitInfoNotNull() throws IOException { BufferedReader reader = new BufferedReader(new InputStreamReader(fileInputStream)); String headers = reader.readLine(); assertEquals( - "\"Organization\",\"Pipeline Name\",\"Pipeline Step\",\"Valid\",\"Build Number\",\"Code Committer\",\"Pipeline Creator\",\"First Code Committed Time In PR\",\"Code Committed Time\",\"PR Created Time\",\"PR Merged Time\",\"Deployment Completed Time\",\"Total Lead Time (HH:mm:ss)\",\"PR Lead Time (HH:mm:ss)\",\"Pipeline Lead Time (HH:mm:ss)\",\"Status\",\"Branch\"", + "\"Organization\",\"Pipeline Name\",\"Pipeline Step\",\"Valid\",\"Build Number\",\"Code Committer\",\"Pipeline Creator\",\"First Code Committed Time In PR\",\"PR Created Time\",\"PR Merged Time\",\"No PR Committed Time\",\"Job Start Time\",\"Pipeline Start Time\",\"Pipeline Finish Time\",\"Total Lead Time (HH:mm:ss)\",\"PR Lead Time (HH:mm:ss)\",\"Pipeline Lead Time (HH:mm:ss)\",\"Status\",\"Branch\",\"Revert\"", headers); String firstLine = reader.readLine(); assertEquals( - "\"Thoughtworks-Heartbeat\",\"Heartbeat\",\":rocket: Deploy prod\",\"true\",\"880\",\"XXXX\",\"XXXX\",\"2023-05-08T07:18:18Z\",\"2023-05-10T06:43:02.653Z\",\"168369327000\",\"1683793037000\",\"1684793037000\",\"8379303\",\"16837\",\"653037000\",\"passed\",\"branch\"", + "\"Thoughtworks-Heartbeat\",\"Heartbeat\",\":rocket: Deploy prod\",\"true\",\"880\",\"XXXX\",\"XXXX\",\"2023-05-08T07:18:18Z\",\"168369327000\",\"1683793037000\",,\"168369327000\",\"168369327000\",\"1684793037000\",\"8379303\",\"16837\",\"653037000\",\"passed\",\"branch\",\"\"", firstLine); reader.close(); fileInputStream.close(); @@ -98,11 +98,11 @@ void shouldConvertPipelineDataToCsvGivenCommitInfoNotNullAndPipelineStateIsCance BufferedReader reader = new BufferedReader(new InputStreamReader(fileInputStream)); String headers = reader.readLine(); assertEquals( - "\"Organization\",\"Pipeline Name\",\"Pipeline Step\",\"Valid\",\"Build Number\",\"Code Committer\",\"Pipeline Creator\",\"First Code Committed Time In PR\",\"Code Committed Time\",\"PR Created Time\",\"PR Merged Time\",\"Deployment Completed Time\",\"Total Lead Time (HH:mm:ss)\",\"PR Lead Time (HH:mm:ss)\",\"Pipeline Lead Time (HH:mm:ss)\",\"Status\",\"Branch\"", + "\"Organization\",\"Pipeline Name\",\"Pipeline Step\",\"Valid\",\"Build Number\",\"Code Committer\",\"Pipeline Creator\",\"First Code Committed Time In PR\",\"PR Created Time\",\"PR Merged Time\",\"No PR Committed Time\",\"Job Start Time\",\"Pipeline Start Time\",\"Pipeline Finish Time\",\"Total Lead Time (HH:mm:ss)\",\"PR Lead Time (HH:mm:ss)\",\"Pipeline Lead Time (HH:mm:ss)\",\"Status\",\"Branch\",\"Revert\"", headers); String firstLine = reader.readLine(); assertEquals( - "\"Thoughtworks-Heartbeat\",\"Heartbeat\",\":rocket: Deploy prod\",\"true\",\"880\",\"XXXX\",\"XXXX\",\"2023-05-08T07:18:18Z\",\"2023-05-10T06:43:02.653Z\",\"168369327000\",\"1683793037000\",\"1684793037000\",\"8379303\",\"16837\",\"653037000\",\"canceled\",\"branch\"", + "\"Thoughtworks-Heartbeat\",\"Heartbeat\",\":rocket: Deploy prod\",\"true\",\"880\",\"XXXX\",\"XXXX\",\"2023-05-08T07:18:18Z\",\"168369327000\",\"1683793037000\",,\"168369327000\",\"168369327000\",\"1684793037000\",\"8379303\",\"16837\",\"653037000\",\"canceled\",\"branch\",\"\"", firstLine); reader.close(); fileInputStream.close(); @@ -123,10 +123,10 @@ void shouldConvertPipelineDataToCsvWithoutCreator() throws IOException { assertTrue(file.exists()); assertEquals( - "\"Organization\",\"Pipeline Name\",\"Pipeline Step\",\"Valid\",\"Build Number\",\"Code Committer\",\"Pipeline Creator\",\"First Code Committed Time In PR\",\"Code Committed Time\",\"PR Created Time\",\"PR Merged Time\",\"Deployment Completed Time\",\"Total Lead Time (HH:mm:ss)\",\"PR Lead Time (HH:mm:ss)\",\"Pipeline Lead Time (HH:mm:ss)\",\"Status\",\"Branch\"", + "\"Organization\",\"Pipeline Name\",\"Pipeline Step\",\"Valid\",\"Build Number\",\"Code Committer\",\"Pipeline Creator\",\"First Code Committed Time In PR\",\"PR Created Time\",\"PR Merged Time\",\"No PR Committed Time\",\"Job Start Time\",\"Pipeline Start Time\",\"Pipeline Finish Time\",\"Total Lead Time (HH:mm:ss)\",\"PR Lead Time (HH:mm:ss)\",\"Pipeline Lead Time (HH:mm:ss)\",\"Status\",\"Branch\",\"Revert\"", headers); assertEquals( - "\"Thoughtworks-Heartbeat\",\"Heartbeat\",\":rocket: Deploy prod\",\"null\",\"880\",\"XXXX\",,\"2023-05-08T07:18:18Z\",\"2023-05-10T06:43:02.653Z\",\"168369327000\",\"1683793037000\",\"1684793037000\",\"8379303\",\"16837\",\"653037000\",\"passed\",\"branch\"", + "\"Thoughtworks-Heartbeat\",\"Heartbeat\",\":rocket: Deploy prod\",\"null\",\"880\",\"XXXX\",,\"2023-05-08T07:18:18Z\",\"168369327000\",\"1683793037000\",,\"1683793037000\",\"168369327000\",\"1684793037000\",\"8379303\",\"16837\",\"653037000\",\"passed\",\"branch\",\"\"", firstLine); reader.close(); fileInputStream.close(); @@ -147,10 +147,10 @@ void shouldConvertPipelineDataToCsvWithoutCreatorName() throws IOException { assertTrue(file.exists()); assertEquals( - "\"Organization\",\"Pipeline Name\",\"Pipeline Step\",\"Valid\",\"Build Number\",\"Code Committer\",\"Pipeline Creator\",\"First Code Committed Time In PR\",\"Code Committed Time\",\"PR Created Time\",\"PR Merged Time\",\"Deployment Completed Time\",\"Total Lead Time (HH:mm:ss)\",\"PR Lead Time (HH:mm:ss)\",\"Pipeline Lead Time (HH:mm:ss)\",\"Status\",\"Branch\"", + "\"Organization\",\"Pipeline Name\",\"Pipeline Step\",\"Valid\",\"Build Number\",\"Code Committer\",\"Pipeline Creator\",\"First Code Committed Time In PR\",\"PR Created Time\",\"PR Merged Time\",\"No PR Committed Time\",\"Job Start Time\",\"Pipeline Start Time\",\"Pipeline Finish Time\",\"Total Lead Time (HH:mm:ss)\",\"PR Lead Time (HH:mm:ss)\",\"Pipeline Lead Time (HH:mm:ss)\",\"Status\",\"Branch\",\"Revert\"", headers); assertEquals( - "\"Thoughtworks-Heartbeat\",\"Heartbeat\",\":rocket: Deploy prod\",\"null\",\"880\",\"XXXX\",,\"2023-05-08T07:18:18Z\",\"2023-05-10T06:43:02.653Z\",\"168369327000\",\"1683793037000\",\"1684793037000\",\"8379303\",\"16837\",\"653037000\",\"passed\",\"branch\"", + "\"Thoughtworks-Heartbeat\",\"Heartbeat\",\":rocket: Deploy prod\",\"null\",\"880\",,,\"2023-05-08T07:18:18Z\",\"168369327000\",\"1683793037000\",,\"168369327000\",\"168369327000\",\"1684793037000\",\"8379303\",\"16837\",\"653037000\",\"passed\",\"branch\",\"\"", firstLine); reader.close(); fileInputStream.close(); @@ -171,11 +171,59 @@ void shouldConvertPipelineDataToCsvGivenNullCommitInfo() throws IOException { BufferedReader reader = new BufferedReader(new InputStreamReader(fileInputStream)); String headers = reader.readLine(); assertEquals( - "\"Organization\",\"Pipeline Name\",\"Pipeline Step\",\"Valid\",\"Build Number\",\"Code Committer\",\"Pipeline Creator\",\"First Code Committed Time In PR\",\"Code Committed Time\",\"PR Created Time\",\"PR Merged Time\",\"Deployment Completed Time\",\"Total Lead Time (HH:mm:ss)\",\"PR Lead Time (HH:mm:ss)\",\"Pipeline Lead Time (HH:mm:ss)\",\"Status\",\"Branch\"", + "\"Organization\",\"Pipeline Name\",\"Pipeline Step\",\"Valid\",\"Build Number\",\"Code Committer\",\"Pipeline Creator\",\"First Code Committed Time In PR\",\"PR Created Time\",\"PR Merged Time\",\"No PR Committed Time\",\"Job Start Time\",\"Pipeline Start Time\",\"Pipeline Finish Time\",\"Total Lead Time (HH:mm:ss)\",\"PR Lead Time (HH:mm:ss)\",\"Pipeline Lead Time (HH:mm:ss)\",\"Status\",\"Branch\",\"Revert\"", headers); String firstLine = reader.readLine(); assertEquals( - "\"Thoughtworks-Heartbeat\",\"Heartbeat\",\":rocket: Deploy prod\",\"true\",\"880\",,,\"2023-05-08T07:18:18Z\",,\"168369327000\",\"1683793037000\",\"1684793037000\",\"8379303\",\"16837\",\"653037000\",\"passed\",\"branch\"", + "\"Thoughtworks-Heartbeat\",\"Heartbeat\",\":rocket: Deploy prod\",\"true\",\"880\",\"XXXX\",,\"2023-05-08T07:18:18Z\",\"168369327000\",\"1683793037000\",,\"168369327000\",\"168369327000\",\"1684793037000\",\"8379303\",\"16837\",\"653037000\",\"passed\",\"branch\",\"\"", + firstLine); + reader.close(); + fileInputStream.close(); + file.delete(); + } + + @Test + void shouldConvertPipelineDataToCsvGivenCommitMessageIsRevert() throws IOException { + List pipelineCSVInfos = PipelineCsvFixture.MOCK_PIPELINE_CSV_DATA_WITH_MESSAGE_IS_REVERT(); + String fileName = CSVFileNameEnum.PIPELINE.getValue() + "-" + mockTimeStamp + ".csv"; + File file = new File(fileName); + + csvFileGenerator.convertPipelineDataToCSV(pipelineCSVInfos, mockTimeStamp); + FileInputStream fileInputStream = new FileInputStream(file); + BufferedReader reader = new BufferedReader(new InputStreamReader(fileInputStream)); + String headers = reader.readLine(); + String firstLine = reader.readLine(); + + assertTrue(file.exists()); + assertEquals( + "\"Organization\",\"Pipeline Name\",\"Pipeline Step\",\"Valid\",\"Build Number\",\"Code Committer\",\"Pipeline Creator\",\"First Code Committed Time In PR\",\"PR Created Time\",\"PR Merged Time\",\"No PR Committed Time\",\"Job Start Time\",\"Pipeline Start Time\",\"Pipeline Finish Time\",\"Total Lead Time (HH:mm:ss)\",\"PR Lead Time (HH:mm:ss)\",\"Pipeline Lead Time (HH:mm:ss)\",\"Status\",\"Branch\",\"Revert\"", + headers); + assertEquals( + "\"Thoughtworks-Heartbeat\",\"Heartbeat\",\":rocket: Deploy prod\",\"null\",\"880\",\"XXXX\",,\"2023-05-08T07:18:18Z\",\"168369327000\",\"1683793037000\",,\"168369327000\",\"168369327000\",\"1684793037000\",\"8379303\",\"16837\",\"653037000\",\"passed\",\"branch\",\"true\"", + firstLine); + reader.close(); + fileInputStream.close(); + file.delete(); + } + + @Test + void shouldConvertPipelineDataToCsvGivenAuthorIsNull() throws IOException { + List pipelineCSVInfos = PipelineCsvFixture.MOCK_PIPELINE_CSV_DATA_WITHOUT_Author_NAME(); + String fileName = CSVFileNameEnum.PIPELINE.getValue() + "-" + mockTimeStamp + ".csv"; + File file = new File(fileName); + + csvFileGenerator.convertPipelineDataToCSV(pipelineCSVInfos, mockTimeStamp); + FileInputStream fileInputStream = new FileInputStream(file); + BufferedReader reader = new BufferedReader(new InputStreamReader(fileInputStream)); + String headers = reader.readLine(); + String firstLine = reader.readLine(); + + assertTrue(file.exists()); + assertEquals( + "\"Organization\",\"Pipeline Name\",\"Pipeline Step\",\"Valid\",\"Build Number\",\"Code Committer\",\"Pipeline Creator\",\"First Code Committed Time In PR\",\"PR Created Time\",\"PR Merged Time\",\"No PR Committed Time\",\"Job Start Time\",\"Pipeline Start Time\",\"Pipeline Finish Time\",\"Total Lead Time (HH:mm:ss)\",\"PR Lead Time (HH:mm:ss)\",\"Pipeline Lead Time (HH:mm:ss)\",\"Status\",\"Branch\",\"Revert\"", + headers); + assertEquals( + "\"Thoughtworks-Heartbeat\",\"Heartbeat\",\":rocket: Deploy prod\",\"null\",\"880\",,,\"2023-05-08T07:18:18Z\",\"168369327000\",\"1683793037000\",,\"168369327000\",\"168369327000\",\"1684793037000\",\"8379303\",\"16837\",\"653037000\",\"passed\",\"branch\",\"\"", firstLine); reader.close(); fileInputStream.close(); @@ -209,8 +257,8 @@ void shouldHasContentWhenGetDataFromCsvGivenDataTypeIsPipeline() throws IOExcept .collect(Collectors.joining("\n")); Assertions.assertEquals( - "\"Organization\",\"Pipeline Name\",\"Pipeline Step\",\"Valid\",\"Build Number\",\"Code Committer\",\"Pipeline Creator\",\"First Code Committed Time In PR\",\"Code Committed Time\",\"PR Created Time\",\"PR Merged Time\",\"Deployment Completed Time\",\"Total Lead Time (HH:mm:ss)\",\"PR Lead Time (HH:mm:ss)\",\"Pipeline Lead Time (HH:mm:ss)\",\"Status\",\"Branch\"\n" - + "\"Thoughtworks-Heartbeat\",\"Heartbeat\",\":rocket: Deploy prod\",\"true\",\"880\",\"XXXX\",\"XXXX\",\"2023-05-08T07:18:18Z\",\"2023-05-10T06:43:02.653Z\",\"168369327000\",\"1683793037000\",\"1684793037000\",\"8379303\",\"16837\",\"653037000\",\"passed\",\"branch\"", + "\"Organization\",\"Pipeline Name\",\"Pipeline Step\",\"Valid\",\"Build Number\",\"Code Committer\",\"Pipeline Creator\",\"First Code Committed Time In PR\",\"PR Created Time\",\"PR Merged Time\",\"No PR Committed Time\",\"Job Start Time\",\"Pipeline Start Time\",\"Pipeline Finish Time\",\"Total Lead Time (HH:mm:ss)\",\"PR Lead Time (HH:mm:ss)\",\"Pipeline Lead Time (HH:mm:ss)\",\"Status\",\"Branch\",\"Revert\"\n" + + "\"Thoughtworks-Heartbeat\",\"Heartbeat\",\":rocket: Deploy prod\",\"true\",\"880\",\"XXXX\",\"XXXX\",\"2023-05-08T07:18:18Z\",\"168369327000\",\"1683793037000\",,\"168369327000\",\"168369327000\",\"1684793037000\",\"8379303\",\"16837\",\"653037000\",\"passed\",\"branch\",\"\"", csvPipelineData); String fileName = CSVFileNameEnum.PIPELINE.getValue() + "-" + mockTimeStamp + ".csv"; @@ -233,22 +281,22 @@ void shouldConvertPipelineDataToCsvGivenTwoOrganizationsPipeline() throws IOExce BufferedReader reader = new BufferedReader(new InputStreamReader(fileInputStream)); String headers = reader.readLine(); assertEquals( - "\"Organization\",\"Pipeline Name\",\"Pipeline Step\",\"Valid\",\"Build Number\",\"Code Committer\",\"Pipeline Creator\",\"First Code Committed Time In PR\",\"Code Committed Time\",\"PR Created Time\",\"PR Merged Time\",\"Deployment Completed Time\",\"Total Lead Time (HH:mm:ss)\",\"PR Lead Time (HH:mm:ss)\",\"Pipeline Lead Time (HH:mm:ss)\",\"Status\",\"Branch\"", + "\"Organization\",\"Pipeline Name\",\"Pipeline Step\",\"Valid\",\"Build Number\",\"Code Committer\",\"Pipeline Creator\",\"First Code Committed Time In PR\",\"PR Created Time\",\"PR Merged Time\",\"No PR Committed Time\",\"Job Start Time\",\"Pipeline Start Time\",\"Pipeline Finish Time\",\"Total Lead Time (HH:mm:ss)\",\"PR Lead Time (HH:mm:ss)\",\"Pipeline Lead Time (HH:mm:ss)\",\"Status\",\"Branch\",\"Revert\"", headers); String firstLine = reader.readLine(); assertEquals( - "\"Thoughtworks-Heartbeat\",\"Heartbeat\",\":rocket: Deploy prod\",\"true\",\"880\",\"XXXX\",\"XXXX\",\"2023-05-08T07:18:18Z\",\"2023-05-10T06:43:02.653Z\",\"168369327000\",\"1683793037000\",\"1684793037000\",\"8379303\",\"16837\",\"653037000\",\"passed\",\"branch\"", + "\"Thoughtworks-Heartbeat\",\"Heartbeat\",\":rocket: Deploy prod\",\"true\",\"880\",\"yulong\",\"XXXX\",\"2023-05-08T07:18:18Z\",\"168369327000\",\"1683793037000\",,\"168369327000\",\"168369327000\",\"1684793037000\",\"8379303\",\"16837\",\"653037000\",\"passed\",\"branch\",\"\"", firstLine); String secondLine = reader.readLine(); assertEquals( - "\"Thoughtworks-Heartbeat\",\"Heartbeat\",\":rocket: Deploy prod\",\"true\",\"880\",\"XXXX\",\"XXXX\",\"2023-05-08T07:18:18Z\",\"2023-05-10T06:43:02.653Z\",\"168369327000\",\"1683793037000\",\"1684793037000\",\"8379303\",\"16837\",\"653037000\",\"passed\",\"branch\"", + "\"Thoughtworks-Heartbeat\",\"Heartbeat\",\":rocket: Deploy prod\",\"true\",\"880\",\"yulong\",\"XXXX\",\"2023-05-08T07:18:18Z\",\"168369327000\",\"1683793037000\",,\"168369327000\",\"168369327000\",\"1684793037000\",\"8379303\",\"16837\",\"653037000\",\"passed\",\"branch\",\"\"", secondLine); String thirdLine = reader.readLine(); assertEquals( - "\"Thoughtworks-Foxtel\",\"Heartbeat1\",\":rocket: Deploy prod\",\"true\",\"880\",\"XXXX\",\"XXXX\",\"2023-05-08T07:18:18Z\",\"2023-05-10T06:43:02.653Z\",\"168369327000\",\"1683793037000\",\"1684793037000\",\"8379303\",\"16837\",\"653037000\",\"passed\",\"branch\"", + "\"Thoughtworks-Foxtel\",\"Heartbeat1\",\":rocket: Deploy prod\",\"true\",\"880\",\"yulong\",\"XXXX\",\"2023-05-08T07:18:18Z\",\"168369327000\",\"1683793037000\",,\"168369327000\",\"168369327000\",\"1684793037000\",\"8379303\",\"16837\",\"653037000\",\"passed\",\"branch\",\"\"", thirdLine); reader.close(); diff --git a/backend/src/test/java/heartbeat/service/report/PipelineCsvFixture.java b/backend/src/test/java/heartbeat/service/report/PipelineCsvFixture.java index 32fbda18ac..c51db7b273 100644 --- a/backend/src/test/java/heartbeat/service/report/PipelineCsvFixture.java +++ b/backend/src/test/java/heartbeat/service/report/PipelineCsvFixture.java @@ -4,8 +4,6 @@ import heartbeat.client.dto.codebase.github.Commit; import heartbeat.client.dto.codebase.github.CommitInfo; import heartbeat.client.dto.codebase.github.Committer; -import heartbeat.client.dto.codebase.github.LeadTime; -import heartbeat.client.dto.codebase.github.PipelineLeadTime; import heartbeat.client.dto.pipeline.buildkite.BuildKiteBuildInfo; import heartbeat.client.dto.pipeline.buildkite.BuildKiteJob; import heartbeat.client.dto.pipeline.buildkite.DeployInfo; @@ -36,6 +34,7 @@ public static List MOCK_PIPELINE_CSV_DATA() { .finishedAt("2023-05-10T06:43:02.653Z") .build())) .branch("branch") + .author(BuildKiteBuildInfo.Author.builder().name("XXXX").build()) .build()) .commitInfo(CommitInfo.builder() .commit(Commit.builder() @@ -57,7 +56,9 @@ public static List MOCK_PIPELINE_CSV_DATA() { .prMergedTime("1683793037000") .prLeadTime("16837") .prCreatedTime("168369327000") + .jobStartTime("168369327000") .jobFinishTime("1684793037000") + .firstCommitTime("168369327000") .pipelineLeadTime("653037000") .build()) .deployInfo(DeployInfo.builder() @@ -88,6 +89,7 @@ public static List MOCK_PIPELINE_CSV_DATA_WITHOUT_CREATOR() { .finishedAt("2023-05-10T06:43:02.653Z") .build())) .branch("branch") + .author(BuildKiteBuildInfo.Author.builder().name("XXXX").build()) .build()) .commitInfo(CommitInfo.builder() .commit(Commit.builder() @@ -109,8 +111,10 @@ public static List MOCK_PIPELINE_CSV_DATA_WITHOUT_CREATOR() { .prMergedTime("1683793037000") .prLeadTime("16837") .prCreatedTime("168369327000") + .jobStartTime("1683793037000") .jobFinishTime("1684793037000") .pipelineLeadTime("653037000") + .firstCommitTime("168369327000") .build()) .deployInfo(DeployInfo.builder() .state("passed") @@ -161,7 +165,121 @@ public static List MOCK_PIPELINE_CSV_DATA_WITHOUT_CREATOR_NAME( .prMergedTime("1683793037000") .prLeadTime("16837") .prCreatedTime("168369327000") + .jobStartTime("168369327000") + .jobFinishTime("1684793037000") + .firstCommitTime("168369327000") + .pipelineLeadTime("653037000") + .build()) + .deployInfo(DeployInfo.builder() + .state("passed") + .jobFinishTime("1684793037000") + .jobStartTime("168369327000") + .build()) + .build(); + return List.of(pipelineCsvInfo); + } + + public static List MOCK_PIPELINE_CSV_DATA_WITH_MESSAGE_IS_REVERT() { + PipelineCSVInfo pipelineCsvInfo = PipelineCSVInfo.builder() + .organizationName("Thoughtworks-Heartbeat") + .pipeLineName("Heartbeat") + .piplineStatus("passed") + .stepName(":rocket: Deploy prod") + .buildInfo(BuildKiteBuildInfo.builder() + .commit("713b31878c756c205a6c03eac5be3ac7c7e6a227") + .creator(BuildKiteBuildInfo.Creator.builder().name(null).email("XXX@test.com").build()) + .pipelineCreateTime("2023-05-10T06:17:21.844Z") + .state("passed") + .number(880) + .jobs(List.of(BuildKiteJob.builder() + .name(":rocket: Deploy prod") + .state("passed") + .startedAt("2023-05-10T06:42:47.498Z") + .finishedAt("2023-05-10T06:43:02.653Z") + .build())) + .branch("branch") + .author(BuildKiteBuildInfo.Author.builder().name("XXXX").build()) + .build()) + .commitInfo(CommitInfo.builder() + .commit(Commit.builder() + .author(Author.builder() + .name("XXXX") + .email("XXX@test.com") + .date("2023-05-10T06:43:02.653Z") + .build()) + .committer(Committer.builder() + .name("XXXX") + .email("XXX@test.com") + .date("2023-05-10T06:43:02.653Z") + .build()) + .message("Revert:xxxx") + .build()) + .build()) + .leadTimeInfo(LeadTimeInfo.builder() + .firstCommitTimeInPr("2023-05-08T07:18:18Z") + .totalTime("8379303") + .prMergedTime("1683793037000") + .prLeadTime("16837") + .prCreatedTime("168369327000") + .jobStartTime("168369327000") .jobFinishTime("1684793037000") + .firstCommitTime("168369327000") + .pipelineLeadTime("653037000") + .isRevert(Boolean.TRUE) + .build()) + .deployInfo(DeployInfo.builder() + .state("passed") + .jobFinishTime("1684793037000") + .jobStartTime("168369327000") + .build()) + .build(); + return List.of(pipelineCsvInfo); + } + + public static List MOCK_PIPELINE_CSV_DATA_WITHOUT_Author_NAME() { + PipelineCSVInfo pipelineCsvInfo = PipelineCSVInfo.builder() + .organizationName("Thoughtworks-Heartbeat") + .pipeLineName("Heartbeat") + .piplineStatus("passed") + .stepName(":rocket: Deploy prod") + .buildInfo(BuildKiteBuildInfo.builder() + .commit("713b31878c756c205a6c03eac5be3ac7c7e6a227") + .creator(BuildKiteBuildInfo.Creator.builder().name(null).email("XXX@test.com").build()) + .pipelineCreateTime("2023-05-10T06:17:21.844Z") + .state("passed") + .number(880) + .jobs(List.of(BuildKiteJob.builder() + .name(":rocket: Deploy prod") + .state("passed") + .startedAt("2023-05-10T06:42:47.498Z") + .finishedAt("2023-05-10T06:43:02.653Z") + .build())) + .branch("branch") + .author(BuildKiteBuildInfo.Author.builder().build()) + .build()) + .commitInfo(CommitInfo.builder() + .commit(Commit.builder() + .author(Author.builder() + .name("XXXX") + .email("XXX@test.com") + .date("2023-05-10T06:43:02.653Z") + .build()) + .committer(Committer.builder() + .name("XXXX") + .email("XXX@test.com") + .date("2023-05-10T06:43:02.653Z") + .build()) + .build()) + .build()) + .leadTimeInfo(LeadTimeInfo.builder() + .firstCommitTimeInPr("2023-05-08T07:18:18Z") + .totalTime("8379303") + .prMergedTime("1683793037000") + .prLeadTime("16837") + .prCreatedTime("168369327000") + .jobStartTime("168369327000") + .jobFinishTime("1684793037000") + .firstCommitTime("168369327000") .pipelineLeadTime("653037000") .build()) .deployInfo(DeployInfo.builder() @@ -193,6 +311,7 @@ public static List MOCK_PIPELINE_CSV_DATA_WITH_PIPELINE_STATUS_ .finishedAt("2023-05-10T06:43:02.653Z") .build())) .branch("branch") + .author(BuildKiteBuildInfo.Author.builder().name("XXXX").build()) .build()) .commitInfo(CommitInfo.builder() .commit(Commit.builder() @@ -214,7 +333,9 @@ public static List MOCK_PIPELINE_CSV_DATA_WITH_PIPELINE_STATUS_ .prMergedTime("1683793037000") .prLeadTime("16837") .prCreatedTime("168369327000") + .jobStartTime("168369327000") .jobFinishTime("1684793037000") + .firstCommitTime("168369327000") .pipelineLeadTime("653037000") .build()) .deployInfo(DeployInfo.builder() @@ -245,6 +366,7 @@ public static List MOCK_PIPELINE_CSV_DATA_WITH_NULL_COMMIT_INFO .finishedAt("2023-05-10T06:43:02.653Z") .build())) .branch("branch") + .author(BuildKiteBuildInfo.Author.builder().name("XXXX").build()) .build()) .leadTimeInfo(LeadTimeInfo.builder() .firstCommitTimeInPr("2023-05-08T07:18:18Z") @@ -252,7 +374,9 @@ public static List MOCK_PIPELINE_CSV_DATA_WITH_NULL_COMMIT_INFO .prMergedTime("1683793037000") .prLeadTime("16837") .prCreatedTime("168369327000") + .jobStartTime("168369327000") .jobFinishTime("1684793037000") + .firstCommitTime("168369327000") .pipelineLeadTime("653037000") .build()) .deployInfo(DeployInfo.builder() @@ -264,25 +388,6 @@ public static List MOCK_PIPELINE_CSV_DATA_WITH_NULL_COMMIT_INFO return List.of(pipelineCsvInfo); } - public static PipelineLeadTime MOCK_PIPELINE_LEAD_TIME_DATA() { - return PipelineLeadTime.builder() - .pipelineStep("xx") - .pipelineName("xx") - .leadTimes(List.of(LeadTime.builder() - .commitId("xx") - .prCreatedTime(1658549100000L) - .prMergedTime(1658549160000L) - .firstCommitTimeInPr(1658549100000L) - .jobFinishTime(1658549160000L) - .pipelineCreateTime(1658549100000L) - .prLeadTime(60000L) - .pipelineLeadTime(60000) - .totalTime(120000) - .build())) - .build(); - - } - public static List MOCK_TWO_ORGANIZATIONS_PIPELINE_CSV_DATA() { PipelineCSVInfo pipelineCsvInfo1 = PipelineCSVInfo.builder() .organizationName("Thoughtworks-Heartbeat") @@ -303,6 +408,7 @@ public static List MOCK_TWO_ORGANIZATIONS_PIPELINE_CSV_DATA() { .finishedAt("2023-05-10T06:43:02.653Z") .build())) .branch("branch") + .author(BuildKiteBuildInfo.Author.builder().name("yulong").build()) .build()) .commitInfo(CommitInfo.builder() .commit(Commit.builder() @@ -324,7 +430,9 @@ public static List MOCK_TWO_ORGANIZATIONS_PIPELINE_CSV_DATA() { .prMergedTime("1683793037000") .prLeadTime("16837") .prCreatedTime("168369327000") + .jobStartTime("168369327000") .jobFinishTime("1684793037000") + .firstCommitTime("168369327000") .pipelineLeadTime("653037000") .build()) .deployInfo(DeployInfo.builder() @@ -352,6 +460,7 @@ public static List MOCK_TWO_ORGANIZATIONS_PIPELINE_CSV_DATA() { .finishedAt("2023-05-10T06:43:02.653Z") .build())) .branch("branch") + .author(BuildKiteBuildInfo.Author.builder().name("yulong").build()) .build()) .commitInfo(CommitInfo.builder() .commit(Commit.builder() @@ -373,7 +482,9 @@ public static List MOCK_TWO_ORGANIZATIONS_PIPELINE_CSV_DATA() { .prMergedTime("1683793037000") .prLeadTime("16837") .prCreatedTime("168369327000") + .jobStartTime("168369327000") .jobFinishTime("1684793037000") + .firstCommitTime("168369327000") .pipelineLeadTime("653037000") .build()) .deployInfo(DeployInfo.builder() @@ -401,6 +512,7 @@ public static List MOCK_TWO_ORGANIZATIONS_PIPELINE_CSV_DATA() { .finishedAt("2023-05-10T06:43:02.653Z") .build())) .branch("branch") + .author(BuildKiteBuildInfo.Author.builder().name("yulong").build()) .build()) .commitInfo(CommitInfo.builder() .commit(Commit.builder() @@ -422,7 +534,9 @@ public static List MOCK_TWO_ORGANIZATIONS_PIPELINE_CSV_DATA() { .prMergedTime("1683793037000") .prLeadTime("16837") .prCreatedTime("168369327000") + .jobStartTime("168369327000") .jobFinishTime("1684793037000") + .firstCommitTime("168369327000") .pipelineLeadTime("653037000") .build()) .deployInfo(DeployInfo.builder() diff --git a/backend/src/test/java/heartbeat/service/report/PipelineServiceTest.java b/backend/src/test/java/heartbeat/service/report/PipelineServiceTest.java index 29b6cb172b..206e0138de 100644 --- a/backend/src/test/java/heartbeat/service/report/PipelineServiceTest.java +++ b/backend/src/test/java/heartbeat/service/report/PipelineServiceTest.java @@ -1,5 +1,7 @@ package heartbeat.service.report; +import heartbeat.client.dto.codebase.github.Author; +import heartbeat.client.dto.codebase.github.Commit; import heartbeat.client.dto.codebase.github.CommitInfo; import heartbeat.client.dto.codebase.github.LeadTime; import heartbeat.client.dto.codebase.github.PipelineLeadTime; @@ -430,7 +432,9 @@ void shouldGenerateValueWithoutCommitWhenCommitIdIsEmpty() { @Test void shouldGenerateValueHasCommit() { List kiteBuildInfos = List.of(BuildKiteBuildInfo.builder().commit("commit").build()); - CommitInfo fakeCommitInfo = CommitInfo.builder().build(); + CommitInfo fakeCommitInfo = CommitInfo.builder() + .commit(Commit.builder().author(Author.builder().name("xxxx").build()).build()) + .build(); when(buildKiteService.getPipelineStepNames(eq(kiteBuildInfos))).thenReturn(List.of("check")); when(buildKiteService.getStepsBeforeEndStep(any(), any())).thenReturn(List.of("check")); when(buildKiteService.getBuildKiteJob(any(), any(), any(), eq(MOCK_START_TIME), eq(MOCK_END_TIME))) @@ -449,7 +453,7 @@ void shouldGenerateValueHasCommit() { assertEquals(1, result.size()); PipelineCSVInfo pipelineCSVInfo = result.get(0); assertEquals("env-name", pipelineCSVInfo.getPipeLineName()); - assertEquals(fakeCommitInfo, pipelineCSVInfo.getCommitInfo()); + assertEquals("xxxx", pipelineCSVInfo.getBuildInfo().getAuthor().getName()); assertEquals(fakeDeploy, pipelineCSVInfo.getDeployInfo()); verify(buildKiteService, times(1)).getPipelineStepNames(any()); verify(buildKiteService, times(1)).getBuildKiteJob(any(), any(), any(), any(), any()); @@ -458,7 +462,9 @@ void shouldGenerateValueHasCommit() { @Test void shouldGenerateValueWithLeadTimeWhenLeadTimeExisting() { List kiteBuildInfos = List.of(BuildKiteBuildInfo.builder().commit("commit").build()); - CommitInfo fakeCommitInfo = CommitInfo.builder().build(); + CommitInfo fakeCommitInfo = CommitInfo.builder() + .commit(Commit.builder().author(Author.builder().name("xxxx").build()).build()) + .build(); when(buildKiteService.getPipelineStepNames(eq(kiteBuildInfos))).thenReturn(List.of("check")); when(buildKiteService.getStepsBeforeEndStep(any(), any())).thenReturn(List.of("check")); when(buildKiteService.getBuildKiteJob(any(), any(), any(), eq(MOCK_START_TIME), eq(MOCK_END_TIME))) @@ -481,7 +487,7 @@ void shouldGenerateValueWithLeadTimeWhenLeadTimeExisting() { assertEquals(1, result.size()); PipelineCSVInfo pipelineCSVInfo = result.get(0); assertEquals("env-name", pipelineCSVInfo.getPipeLineName()); - assertEquals(fakeCommitInfo, pipelineCSVInfo.getCommitInfo()); + assertEquals("xxxx", pipelineCSVInfo.getBuildInfo().getAuthor().getName()); assertEquals(fakeDeploy, pipelineCSVInfo.getDeployInfo()); verify(buildKiteService, times(1)).getPipelineStepNames(any()); verify(buildKiteService, times(1)).getBuildKiteJob(any(), any(), any(), any(), any()); @@ -490,7 +496,9 @@ void shouldGenerateValueWithLeadTimeWhenLeadTimeExisting() { @Test void shouldGenerateValueWithOrganizationWhenDeployHasOrganization() { List kiteBuildInfos = List.of(BuildKiteBuildInfo.builder().commit("commit").build()); - CommitInfo fakeCommitInfo = CommitInfo.builder().build(); + CommitInfo fakeCommitInfo = CommitInfo.builder() + .commit(Commit.builder().author(Author.builder().name("xxxx").build()).build()) + .build(); when(buildKiteService.getPipelineStepNames(eq(kiteBuildInfos))).thenReturn(List.of("check")); when(buildKiteService.getStepsBeforeEndStep(any(), any())).thenReturn(List.of("check")); when(buildKiteService.getBuildKiteJob(any(), any(), any(), eq(MOCK_START_TIME), eq(MOCK_END_TIME))) @@ -517,7 +525,44 @@ void shouldGenerateValueWithOrganizationWhenDeployHasOrganization() { assertEquals(1, result.size()); PipelineCSVInfo pipelineCSVInfo = result.get(0); assertEquals("Thoughtworks-Heartbeat", pipelineCSVInfo.getOrganizationName()); - assertEquals(fakeCommitInfo, pipelineCSVInfo.getCommitInfo()); + assertEquals("xxxx", pipelineCSVInfo.getBuildInfo().getAuthor().getName()); + assertEquals(fakeDeploy, pipelineCSVInfo.getDeployInfo()); + verify(buildKiteService, times(1)).getPipelineStepNames(any()); + verify(buildKiteService, times(1)).getBuildKiteJob(any(), any(), any(), any(), any()); + } + + @Test + void shouldGenerateValueWhenBuildKiteDataAuthorIsNotNull() { + List kiteBuildInfos = List.of(BuildKiteBuildInfo.builder() + .commit("commit") + .author(BuildKiteBuildInfo.Author.builder().name("xxxx").build()) + .build()); + when(buildKiteService.getPipelineStepNames(kiteBuildInfos)).thenReturn(List.of("check")); + when(buildKiteService.getStepsBeforeEndStep(any(), any())).thenReturn(List.of("check")); + when(buildKiteService.getBuildKiteJob(any(), any(), any(), eq(MOCK_START_TIME), eq(MOCK_END_TIME))) + .thenReturn(BuildKiteJob.builder().build()); + DeployInfo fakeDeploy = DeployInfo.builder().commitId("commitId").jobName("test").build(); + when(buildKiteService.mapToDeployInfo(any(), any(), any(), any(), any())).thenReturn(fakeDeploy); + + List result = pipelineService.generateCSVForPipelineWithCodebase( + CodebaseSetting.builder().token("token").build(), MOCK_START_TIME, MOCK_END_TIME, + FetchedData.BuildKiteData.builder() + .pipelineLeadTimes(List.of(PipelineLeadTime.builder() + .leadTimes(List.of(LeadTime.builder().commitId("commitId").build())) + .pipelineName("env-name") + .build())) + .buildInfosList(List.of(Map.entry("env1", kiteBuildInfos))) + .build(), + List.of(DeploymentEnvironment.builder() + .id("env1") + .name("env-name") + .orgName("Thoughtworks-Heartbeat") + .build())); + + assertEquals(1, result.size()); + PipelineCSVInfo pipelineCSVInfo = result.get(0); + assertEquals("Thoughtworks-Heartbeat", pipelineCSVInfo.getOrganizationName()); + assertEquals("xxxx", pipelineCSVInfo.getBuildInfo().getAuthor().getName()); assertEquals(fakeDeploy, pipelineCSVInfo.getDeployInfo()); verify(buildKiteService, times(1)).getPipelineStepNames(any()); verify(buildKiteService, times(1)).getBuildKiteJob(any(), any(), any(), any(), any()); diff --git a/backend/src/test/java/heartbeat/service/source/github/GithubServiceTest.java b/backend/src/test/java/heartbeat/service/source/github/GithubServiceTest.java index de611d50fe..aa7b23d095 100644 --- a/backend/src/test/java/heartbeat/service/source/github/GithubServiceTest.java +++ b/backend/src/test/java/heartbeat/service/source/github/GithubServiceTest.java @@ -127,12 +127,15 @@ public void setUp() { .prCreatedTime(1658548980000L) .prMergedTime(1658549040000L) .firstCommitTimeInPr(1658548980000L) + .jobStartTime(1658549040000L) .jobFinishTime(1658549160000L) .pipelineLeadTime(1658549100000L) .pipelineCreateTime(1658549100000L) .prLeadTime(60000L) .pipelineLeadTime(120000) + .firstCommitTime(1658549040000L) .totalTime(180000) + .isRevert(Boolean.FALSE) .build())) .build()); @@ -267,12 +270,15 @@ void shouldReturnLeadTimeWhenMergedTimeIsNotNull() { .prCreatedTime(1658548980000L) .prMergedTime(1658549040000L) .firstCommitTimeInPr(1658548980000L) + .jobStartTime(1658549040000L) .jobFinishTime(1658549160000L) .pipelineLeadTime(1658549100000L) .pipelineCreateTime(1658549100000L) .prLeadTime(60000L) .pipelineLeadTime(120000) + .firstCommitTime(1658549040000L) .totalTime(180000) + .isRevert(Boolean.FALSE) .build(); LeadTime result = githubService.mapLeadTimeWithInfo(pullRequestInfo, deployInfo, commitInfo); @@ -288,12 +294,15 @@ void CommitTimeInPrShouldBeZeroWhenCommitInfoIsNull() { .prCreatedTime(1658548980000L) .prMergedTime(1658549040000L) .firstCommitTimeInPr(0L) + .jobStartTime(1658549040000L) .jobFinishTime(1658549160000L) .pipelineLeadTime(1658549100000L) .pipelineCreateTime(1658549100000L) - .prLeadTime(60000L) + .prLeadTime(0L) .pipelineLeadTime(120000) - .totalTime(180000) + .firstCommitTime(1658549040000L) + .totalTime(120000) + .isRevert(Boolean.FALSE) .build(); LeadTime result = githubService.mapLeadTimeWithInfo(pullRequestInfo, deployInfo, commitInfo); @@ -309,12 +318,15 @@ void CommitTimeInPrLeadTimeShouldBeZeroWhenCommitInfoIsNotNullGivenCommitIsRever .prCreatedTime(1658548980000L) .prMergedTime(1658549040000L) .firstCommitTimeInPr(0L) + .jobStartTime(1658549040000L) .jobFinishTime(1658549160000L) .pipelineLeadTime(1658549100000L) .pipelineCreateTime(1658549100000L) .prLeadTime(0L) .pipelineLeadTime(120000) + .firstCommitTime(1658549040000L) .totalTime(120000) + .isRevert(Boolean.TRUE) .build(); LeadTime result = githubService.mapLeadTimeWithInfo(pullRequestInfo, deployInfo, commitInfo); @@ -330,11 +342,14 @@ void CommitTimeInPrLeadTimeShouldBeZeroWhenCommitInfoIsInLowerCaseGivenCommitIsR .prCreatedTime(1658548980000L) .prMergedTime(1658549040000L) .firstCommitTimeInPr(0L) + .jobStartTime(1658549040000L) .jobFinishTime(1658549160000L) .pipelineLeadTime(1658549100000L) .pipelineCreateTime(1658549100000L) .prLeadTime(0L) .pipelineLeadTime(120000) + .firstCommitTime(1658549040000L) + .isRevert(Boolean.TRUE) .totalTime(120000) .build(); @@ -343,6 +358,54 @@ void CommitTimeInPrLeadTimeShouldBeZeroWhenCommitInfoIsInLowerCaseGivenCommitIsR assertEquals(expect, result); } + @Test + void shouldReturnIsRevertIsNullWhenCommitInfoCommitIsNull() { + commitInfo = CommitInfo.builder().build(); + LeadTime expect = LeadTime.builder() + .commitId("111") + .prCreatedTime(1658548980000L) + .prMergedTime(1658549040000L) + .firstCommitTimeInPr(0L) + .jobStartTime(1658549040000L) + .jobFinishTime(1658549160000L) + .pipelineLeadTime(1658549100000L) + .pipelineCreateTime(1658549100000L) + .prLeadTime(0L) + .pipelineLeadTime(120000) + .firstCommitTime(1658549040000L) + .totalTime(120000L) + .isRevert(null) + .build(); + + LeadTime result = githubService.mapLeadTimeWithInfo(pullRequestInfo, deployInfo, commitInfo); + + assertEquals(expect, result); + } + + @Test + void shouldReturnIsRevertIsNullWhenCommitInfoCommitMessageIsNull() { + commitInfo = CommitInfo.builder().commit(Commit.builder().build()).build(); + LeadTime expect = LeadTime.builder() + .commitId("111") + .prCreatedTime(1658548980000L) + .prMergedTime(1658549040000L) + .firstCommitTimeInPr(0L) + .jobStartTime(1658549040000L) + .jobFinishTime(1658549160000L) + .pipelineLeadTime(1658549100000L) + .pipelineCreateTime(1658549100000L) + .prLeadTime(0L) + .pipelineLeadTime(120000) + .firstCommitTime(1658549040000L) + .totalTime(120000L) + .isRevert(null) + .build(); + + LeadTime result = githubService.mapLeadTimeWithInfo(pullRequestInfo, deployInfo, commitInfo); + + assertEquals(expect, result); + } + @Test void shouldReturnFirstCommitTimeInPrZeroWhenCommitInfoIsNull() { commitInfo = CommitInfo.builder().commit(Commit.builder().message("mock commit message").build()).build(); @@ -351,12 +414,15 @@ void shouldReturnFirstCommitTimeInPrZeroWhenCommitInfoIsNull() { .prCreatedTime(1658548980000L) .prMergedTime(1658549040000L) .firstCommitTimeInPr(0L) + .jobStartTime(1658549040000L) .jobFinishTime(1658549160000L) .pipelineLeadTime(1658549100000L) .pipelineCreateTime(1658549100000L) - .prLeadTime(60000L) + .prLeadTime(0L) .pipelineLeadTime(120000) - .totalTime(180000L) + .firstCommitTime(1658549040000L) + .totalTime(120000L) + .isRevert(Boolean.FALSE) .build(); LeadTime result = githubService.mapLeadTimeWithInfo(pullRequestInfo, deployInfo, commitInfo); @@ -398,11 +464,15 @@ void shouldReturnEmptyLeadTimeGithubShaIsDifferent() { .pipelineName("Name") .leadTimes(List.of(LeadTime.builder() .commitId("111") + .noPRCommitTime(1658548980000L) + .jobStartTime(1658549040000L) .jobFinishTime(1658549160000L) .pipelineCreateTime(1658549100000L) .prLeadTime(0L) .pipelineLeadTime(180000) + .firstCommitTime(1658548980000L) .totalTime(180000) + .isRevert(Boolean.FALSE) .build())) .build()); var pullRequestInfoWithDifferentSha = PullRequestInfo.builder() @@ -430,11 +500,14 @@ void shouldReturnEmptyMergeLeadTimeWhenPullRequestInfoIsEmpty() { .pipelineName("Name") .leadTimes(List.of(LeadTime.builder() .commitId("111") + .jobStartTime(1658549040000L) .jobFinishTime(1658549160000L) .pipelineCreateTime(1658549100000L) .prLeadTime(0L) .pipelineLeadTime(120000) .totalTime(120000) + .firstCommitTime(1658549040000L) + .isRevert(null) .build())) .build()); when(gitHubFeignClient.getPullRequestListInfo(any(), any(), any())).thenReturn(List.of()); @@ -454,16 +527,20 @@ void shouldReturnEmptyMergeLeadTimeWhenPullRequestInfoGot404Error() { .pipelineName("Name") .leadTimes(List.of(LeadTime.builder() .commitId("111") + .jobStartTime(1658549040000L) .jobFinishTime(1658549160000L) .pipelineCreateTime(1658549100000L) .prLeadTime(0L) .pipelineLeadTime(120000) + .firstCommitTime(1658549040000L) .totalTime(120000) + .isRevert(Boolean.FALSE) .build())) .build()); when(gitHubFeignClient.getPullRequestListInfo(any(), any(), any())).thenThrow(new NotFoundException("")); when(gitHubFeignClient.getPullRequestCommitInfo(any(), any(), any())).thenReturn(List.of()); - when(gitHubFeignClient.getCommitInfo(any(), any(), any())).thenReturn(new CommitInfo()); + when(gitHubFeignClient.getCommitInfo(any(), any(), any())) + .thenReturn(CommitInfo.builder().commit(Commit.builder().message("").build()).build()); List result = githubService.fetchPipelinesLeadTime(deployTimes, repositoryMap, mockToken); @@ -479,11 +556,14 @@ void shouldReturnEmptyMergeLeadTimeWhenMergeTimeIsEmpty() { .pipelineName("Name") .leadTimes(List.of(LeadTime.builder() .commitId("111") + .jobStartTime(1658549040000L) .jobFinishTime(1658549160000L) .pipelineCreateTime(1658549100000L) .prLeadTime(0L) .pipelineLeadTime(120000) + .firstCommitTime(1658549040000L) .totalTime(120000) + .isRevert(null) .build())) .build()); when(gitHubFeignClient.getPullRequestListInfo(any(), any(), any())).thenReturn(List.of(pullRequestInfo)); @@ -591,12 +671,15 @@ void shouldReturnPipeLineLeadTimeWhenDeployCommitShaIsDifferent() { .pipelineStep(PIPELINE_STEP) .leadTimes(List.of(LeadTime.builder() .commitId("111") + .jobStartTime(1658549040000L) .jobFinishTime(1658549160000L) .pipelineLeadTime(1658549100000L) .pipelineCreateTime(1658549100000L) .prLeadTime(0L) .pipelineLeadTime(120000) + .firstCommitTime(1658549040000L) .totalTime(120000) + .isRevert(null) .build())) .build()); when(gitHubFeignClient.getPullRequestListInfo(any(), any(), any())).thenReturn(List.of(pullRequestInfo)); diff --git a/frontend/e2e/fixtures/create-new/pipeline-data.csv b/frontend/e2e/fixtures/create-new/pipeline-data.csv index b3bab67630..2716056019 100644 --- a/frontend/e2e/fixtures/create-new/pipeline-data.csv +++ b/frontend/e2e/fixtures/create-new/pipeline-data.csv @@ -1,48 +1,48 @@ -"Organization","Pipeline Name","Pipeline Step","Valid","Build Number","Code Committer","Pipeline Creator","First Code Committed Time In PR","Code Committed Time","PR Created Time","PR Merged Time","Deployment Completed Time","Total Lead Time (HH:mm:ss)","PR Lead Time (HH:mm:ss)","Pipeline Lead Time (HH:mm:ss)","Status","Branch" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4210","guzhongren","guzhongren","2024-01-19T14:58:27Z","2024-01-19T15:02:47Z","2024-01-19T14:59:15Z","2024-01-19T15:02:47Z","2024-01-19T15:27:32.983Z","0:24:45","0:0:0","0:24:45","passed","main" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Run e2e","false","4208","Steveay","guzhongren",,"2024-01-19T09:51:14Z",,,"2024-01-19T15:09:15.439Z",,,,"failed","main" -"Thoughtworks-Heartbeat","Heartbeat",":mag: Check Frontend License","false","4204","Steveay",,,"2024-01-19T09:51:14Z",,,"2024-01-19T11:16:12.025Z",,,,"canceled","main" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4187","sqsq5566",,"2024-01-19T04:01:30Z","2024-01-19T06:18:27Z","2024-01-19T06:07:51Z","2024-01-19T06:18:27Z","2024-01-19T06:37:42.885Z","2:36:12","2:16:57","0:19:15","passed","main" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4185","neomgb",,"2024-01-18T09:08:32Z","2024-01-19T05:47:23Z","2024-01-19T02:59:59Z","2024-01-19T05:47:24Z","2024-01-19T06:14:32.418Z","21:6:0","20:38:52","0:27:8","passed","main" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4178","guzhongren","guzhongren",,"2024-01-18T15:51:58Z",,,"2024-01-18T16:56:25.673Z","1:4:27","0:0:0","1:4:27","passed","main" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Run e2e","false","4177","guzhongren","guzhongren",,"2024-01-18T15:49:45Z",,,"2024-01-18T16:18:32.089Z",,,,"failed","main" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Run e2e","false","4176","guzhongren","guzhongren",,"2024-01-18T15:37:47Z",,,"2024-01-18T16:06:41.439Z",,,,"passed","main" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4175","guzhongren","guzhongren",,"2024-01-18T15:16:05Z",,,"2024-01-18T15:53:58.280Z","0:37:53","0:0:0","0:37:53","passed","main" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4174","guzhongren","guzhongren",,"2024-01-18T15:00:53Z",,,"2024-01-18T15:28:06.427Z","0:27:13","0:0:0","0:27:13","passed","main" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4173","Chao",,"2024-01-18T09:54:35Z","2024-01-18T10:08:17Z","2024-01-18T05:47:24Z","2024-01-18T10:08:17Z","2024-01-18T10:33:46.039Z","0:39:11","0:13:42","0:25:29","passed","main" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4171","neomgb",,"2024-01-18T02:33:54Z","2024-01-18T09:41:40Z","2024-01-18T02:54:05Z","2024-01-18T09:41:40Z","2024-01-18T10:07:29.676Z","7:33:35","7:7:46","0:25:49","passed","main" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4166","junbo dai",,"2024-01-18T08:28:22Z","2024-01-18T08:56:52Z","2024-01-18T08:27:11Z","2024-01-18T08:56:52Z","2024-01-18T09:15:44.306Z","0:47:22","0:28:30","0:18:52","passed","main" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4162","李雪冰",,"2024-01-18T05:45:03Z","2024-01-18T08:28:08Z","2024-01-18T06:34:30Z","2024-01-18T08:28:09Z","2024-01-18T08:52:58.699Z","3:7:55","2:43:6","0:24:49","passed","main" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4151","yichen.wang","heartbeat-user",,"2024-01-18T05:35:15Z",,,"2024-01-18T05:56:34.575Z","0:21:19","0:0:0","0:21:19","passed","main" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Run e2e","false","4148","yichen.wang","heartbeat-user",,"2024-01-17T15:54:45Z",,,"2024-01-18T03:01:41.593Z",,,,"failed","main" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4147","Steveay",,"2024-01-17T07:43:29Z","2024-01-17T10:47:00Z","2024-01-17T09:42:52Z","2024-01-17T10:47:01Z","2024-01-17T11:22:02.967Z","3:38:33","3:3:32","0:35:1","passed","main" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4146","李雪冰",,"2024-01-17T08:06:19Z","2024-01-17T09:48:38Z","2024-01-17T09:34:27Z","2024-01-17T09:48:38Z","2024-01-17T10:13:39.473Z","2:7:20","1:42:19","0:25:1","passed","main" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4137","neomgb","heartbeat-user","2024-01-17T03:05:11Z","2024-01-17T06:46:34Z","2024-01-17T04:01:00Z","2024-01-17T06:46:34Z","2024-01-17T07:22:40.087Z","4:17:29","3:41:23","0:36:6","passed","main" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4133","junbo dai",,"2024-01-17T03:54:13Z","2024-01-17T06:15:16Z","2024-01-17T03:59:41Z","2024-01-17T06:15:16Z","2024-01-17T06:34:03.987Z","2:39:50","2:21:3","0:18:47","passed","main" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Run e2e","false","4123","junbo dai",,,"2024-01-17T03:17:10Z",,,"2024-01-17T03:28:28.520Z",,,,"passed","main" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4119","sqsq5566",,"2024-01-17T02:26:10Z","2024-01-17T02:55:54Z","2024-01-17T02:31:10Z","2024-01-17T02:55:54Z","2024-01-17T03:14:48.671Z","0:48:38","0:29:44","0:18:54","passed","main" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4117","junbo dai",,"2024-01-17T02:27:23Z","2024-01-17T02:34:10Z","2024-01-17T02:30:48Z","2024-01-17T02:34:10Z","2024-01-17T02:53:37.896Z","0:26:14","0:6:47","0:19:27","passed","main" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4114","mjx20045912",,"2024-01-16T08:44:22Z","2024-01-16T16:27:23Z","2024-01-16T08:46:04Z","2024-01-16T16:27:24Z","2024-01-16T16:46:52.588Z","8:2:30","7:43:2","0:19:28","passed","main" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4109","Steveay",,"2024-01-16T09:35:48Z","2024-01-16T15:24:35Z","2024-01-16T10:42:42Z","2024-01-16T15:24:36Z","2024-01-16T15:44:39.934Z","6:8:51","5:48:48","0:20:3","passed","main" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4104","sqsq5566",,"2024-01-16T08:55:43Z","2024-01-16T13:49:22Z","2024-01-16T09:33:36Z","2024-01-16T13:49:23Z","2024-01-16T14:10:20.523Z","5:14:37","4:53:40","0:20:57","passed","main" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4094","xuebing",,"2024-01-16T08:20:20Z","2024-01-16T08:15:29Z","2024-01-16T08:42:05Z","2024-01-16T09:03:42Z","2024-01-16T09:30:16.889Z","1:9:56","0:43:22","0:26:34","passed","main" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4087","Yunsong",,"2024-01-16T08:42:19Z","2024-01-16T08:42:19Z","2024-01-16T08:43:18Z","2024-01-16T08:43:45Z","2024-01-16T09:02:46.685Z","0:20:27","0:1:26","0:19:1","passed","main" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4078","GuangbinMa","heartbeat-user","2024-01-16T06:33:44Z","2024-01-16T07:03:48Z","2024-01-16T07:25:34Z","2024-01-16T07:58:33Z","2024-01-16T08:32:28.349Z","1:58:44","1:24:49","0:33:55","passed","main" -"Thoughtworks-Heartbeat","Heartbeat",":pipeline: Upload pipeline.yml","false","4075","Yunsong",,,"2024-01-16T07:51:58Z",,,"2024-01-16T07:58:17.589Z",,,,"canceled","main" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4070","Yunsong",,"2024-01-16T07:06:35Z","2024-01-16T07:06:35Z","2024-01-16T07:11:17Z","2024-01-16T07:31:50Z","2024-01-16T07:50:58.369Z","0:44:23","0:25:15","0:19:8","passed","main" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4065","Nathan Wang",,"2024-01-16T03:51:04Z","2024-01-16T03:30:16Z","2024-01-10T07:48:39Z","2024-01-16T05:44:17Z","2024-01-16T06:36:44.984Z","2:45:40","1:53:13","0:52:27","passed","main" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4064","Simon Tal","heartbeat-user","2024-01-16T03:35:20Z","2024-01-16T03:24:08Z","2024-01-16T03:38:26Z","2024-01-16T03:47:27Z","2024-01-16T06:11:26.201Z","2:36:6","0:12:7","2:23:59","passed","main" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4056","weiran.sun",,"2024-01-16T02:27:37Z","2024-01-16T02:22:01Z","2024-01-16T02:38:02Z","2024-01-16T02:41:35Z","2024-01-16T03:01:19.266Z","0:33:42","0:13:58","0:19:44","passed","main" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Run e2e","false","4054","Jianxun.Ma",,,"2024-01-15T02:07:43Z",,,"2024-01-16T02:22:28.775Z",,,,"passed","main" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4050","junbo.dai",,"2024-01-16T01:14:24Z","2024-01-15T15:01:57Z","2024-01-16T01:13:59Z","2024-01-16T01:36:23Z","2024-01-16T01:57:13.241Z","0:42:49","0:21:59","0:20:50","passed","main" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4047","guzhongren","guzhongren",,"2024-01-15T15:41:49Z",,,"2024-01-15T16:10:04.028Z","0:28:15","0:0:0","0:28:15","passed","main" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy e2e","false","4046","guzhongren","guzhongren",,"2024-01-15T15:18:39Z",,,"2024-01-15T15:40:09.332Z",,,,"passed","main" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4045","guzhongren","guzhongren",,"2024-01-15T14:30:35Z",,,"2024-01-15T14:59:21.298Z","0:28:46","0:0:0","0:28:46","passed","main" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4044","GuangbinMa",,"2024-01-15T09:00:10Z","2024-01-15T09:53:15Z","2024-01-15T09:55:27Z","2024-01-15T10:06:21Z","2024-01-15T10:33:54.045Z","1:33:44","1:6:11","0:27:33","passed","main" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Run e2e","false","4034","JiangRu1",,,"2024-01-15T07:20:09Z",,,"2024-01-15T08:49:47.422Z",,,,"failed","main" -"Thoughtworks-Heartbeat","Heartbeat",":mag: Check Backend License","false","4033","Jianxun.Ma","heartbeat-user",,"2024-01-15T07:34:00Z",,,"2024-01-15T08:14:07.027Z",,,,"canceled","main" -"Thoughtworks-Heartbeat","Heartbeat",":pipeline: Upload pipeline.yml","false","4031","Jianxun.Ma","heartbeat-user",,"2024-01-15T07:34:00Z",,,"2024-01-15T07:58:40.203Z",,,,"canceled","main" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Run e2e","false","4027","Jianxun.Ma",,,"2024-01-15T07:34:00Z",,,"2024-01-15T08:25:40.681Z",,,,"failed","main" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Run e2e","false","4018","GuangbinMa",,,"2024-01-15T06:16:33Z",,,"2024-01-15T06:49:24.921Z",,,,"failed","main" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4012","Steveay",,"2024-01-12T08:02:24Z","2024-01-15T03:45:40Z","2024-01-15T01:27:53Z","2024-01-15T03:45:41Z","2024-01-15T04:05:06.398Z","68:2:42","67:43:17","0:19:25","passed","main" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4001","andrea999",,"2024-01-12T09:06:51Z","2024-01-15T01:37:21Z","2024-01-12T09:23:06Z","2024-01-15T01:37:22Z","2024-01-15T01:57:54.756Z","64:51:3","64:30:31","0:20:32","passed","main" +"Organization","Pipeline Name","Pipeline Step","Valid","Build Number","Code Committer","Pipeline Creator","First Code Committed Time In PR","PR Created Time","PR Merged Time","No PR Committed Time","Job Start Time","Pipeline Start Time","Pipeline Finish Time","Total Lead Time (HH:mm:ss)","PR Lead Time (HH:mm:ss)","Pipeline Lead Time (HH:mm:ss)","Status","Branch","Revert" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4210","guzhongren","guzhongren","2024-01-19T14:58:27Z","2024-01-19T14:59:15Z","2024-01-19T15:02:47Z",,"2024-01-19T15:26:59Z","2024-01-19T15:02:47Z","2024-01-19T15:27:32.983Z","0:24:45","0:0:0","0:24:45","passed","main","true" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Run e2e","false","4208","Steveay","guzhongren",,,,,,,"2024-01-19T15:09:15.439Z",,,,"failed","main","" +"Thoughtworks-Heartbeat","Heartbeat",":mag: Check Frontend License","false","4204","Steveay",,,,,,,,"2024-01-19T11:16:12.025Z",,,,"canceled","main","" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4187","sqsq5566",,"2024-01-19T04:01:30Z","2024-01-19T06:07:51Z","2024-01-19T06:18:27Z",,"2024-01-19T06:37:09Z","2024-01-19T06:18:27Z","2024-01-19T06:37:42.885Z","2:36:12","2:16:57","0:19:15","passed","main","false" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4185","neomgb",,"2024-01-18T09:08:32Z","2024-01-19T02:59:59Z","2024-01-19T05:47:24Z",,"2024-01-19T06:14:02Z","2024-01-19T05:47:24Z","2024-01-19T06:14:32.418Z","21:6:0","20:38:52","0:27:8","passed","main","false" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4178","guzhongren","guzhongren",,,,"2024-01-18T15:51:58Z","2024-01-18T16:55:57Z","2024-01-18T15:51:58Z","2024-01-18T16:56:25.673Z","1:4:27","0:0:0","1:4:27","passed","main","false" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Run e2e","false","4177","guzhongren","guzhongren",,,,,,,"2024-01-18T16:18:32.089Z",,,,"failed","main","" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Run e2e","false","4176","guzhongren","guzhongren",,,,,,,"2024-01-18T16:06:41.439Z",,,,"passed","main","" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4175","guzhongren","guzhongren",,,,"2024-01-18T15:16:05Z","2024-01-18T15:53:30Z","2024-01-18T15:16:05Z","2024-01-18T15:53:58.280Z","0:37:53","0:0:0","0:37:53","passed","main","false" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4174","guzhongren","guzhongren",,,,"2024-01-18T15:00:53Z","2024-01-18T15:27:37Z","2024-01-18T15:00:53Z","2024-01-18T15:28:06.427Z","0:27:13","0:0:0","0:27:13","passed","main","false" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4173","Chao",,"2024-01-18T09:54:35Z","2024-01-18T05:47:24Z","2024-01-18T10:08:17Z",,"2024-01-18T10:33:18Z","2024-01-18T10:08:17Z","2024-01-18T10:33:46.039Z","0:39:11","0:13:42","0:25:29","passed","main","false" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4171","neomgb",,"2024-01-18T02:33:54Z","2024-01-18T02:54:05Z","2024-01-18T09:41:40Z",,"2024-01-18T10:07:00Z","2024-01-18T09:41:40Z","2024-01-18T10:07:29.676Z","7:33:35","7:7:46","0:25:49","passed","main","false" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4166","junbo dai",,"2024-01-18T08:28:22Z","2024-01-18T08:27:11Z","2024-01-18T08:56:52Z",,"2024-01-18T09:15:09Z","2024-01-18T08:56:52Z","2024-01-18T09:15:44.306Z","0:47:22","0:28:30","0:18:52","passed","main","false" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4162","李雪冰",,"2024-01-18T05:45:03Z","2024-01-18T06:34:30Z","2024-01-18T08:28:09Z",,"2024-01-18T08:52:29Z","2024-01-18T08:28:09Z","2024-01-18T08:52:58.699Z","3:7:55","2:43:6","0:24:49","passed","main","false" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4151","yichen.wang","heartbeat-user",,,,"2024-01-18T05:35:15Z","2024-01-18T05:55:59Z","2024-01-18T05:35:15Z","2024-01-18T05:56:34.575Z","0:21:19","0:0:0","0:21:19","passed","main","true" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Run e2e","false","4148","yichen.wang","heartbeat-user",,,,,,,"2024-01-18T03:01:41.593Z",,,,"failed","main","" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4147","Steveay",,"2024-01-17T07:43:29Z","2024-01-17T09:42:52Z","2024-01-17T10:47:01Z",,"2024-01-17T11:21:20Z","2024-01-17T10:47:01Z","2024-01-17T11:22:02.967Z","3:38:33","3:3:32","0:35:1","passed","main","false" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4146","李雪冰",,"2024-01-17T08:06:19Z","2024-01-17T09:34:27Z","2024-01-17T09:48:38Z",,"2024-01-17T10:13:10Z","2024-01-17T09:48:38Z","2024-01-17T10:13:39.473Z","2:7:20","1:42:19","0:25:1","passed","main","false" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4137","neomgb","heartbeat-user","2024-01-17T03:05:11Z","2024-01-17T04:01:00Z","2024-01-17T06:46:34Z",,"2024-01-17T07:22:06Z","2024-01-17T06:46:34Z","2024-01-17T07:22:40.087Z","4:17:29","3:41:23","0:36:6","passed","main","false" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4133","junbo dai",,"2024-01-17T03:54:13Z","2024-01-17T03:59:41Z","2024-01-17T06:15:16Z",,"2024-01-17T06:33:32Z","2024-01-17T06:15:16Z","2024-01-17T06:34:03.987Z","2:39:50","2:21:3","0:18:47","passed","main","false" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Run e2e","false","4123","junbo dai",,,,,,,,"2024-01-17T03:28:28.520Z",,,,"passed","main","" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4119","sqsq5566",,"2024-01-17T02:26:10Z","2024-01-17T02:31:10Z","2024-01-17T02:55:54Z",,"2024-01-17T03:14:17Z","2024-01-17T02:55:54Z","2024-01-17T03:14:48.671Z","0:48:38","0:29:44","0:18:54","passed","main","false" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4117","junbo dai",,"2024-01-17T02:27:23Z","2024-01-17T02:30:48Z","2024-01-17T02:34:10Z",,"2024-01-17T02:53:05Z","2024-01-17T02:34:10Z","2024-01-17T02:53:37.896Z","0:26:14","0:6:47","0:19:27","passed","main","false" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4114","mjx20045912",,"2024-01-16T08:44:22Z","2024-01-16T08:46:04Z","2024-01-16T16:27:24Z",,"2024-01-16T16:46:22Z","2024-01-16T16:27:24Z","2024-01-16T16:46:52.588Z","8:2:30","7:43:2","0:19:28","passed","main","false" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4109","Steveay",,"2024-01-16T09:35:48Z","2024-01-16T10:42:42Z","2024-01-16T15:24:36Z",,"2024-01-16T15:44:09Z","2024-01-16T15:24:36Z","2024-01-16T15:44:39.934Z","6:8:51","5:48:48","0:20:3","passed","main","false" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4104","sqsq5566",,"2024-01-16T08:55:43Z","2024-01-16T09:33:36Z","2024-01-16T13:49:23Z",,"2024-01-16T14:09:48Z","2024-01-16T13:49:23Z","2024-01-16T14:10:20.523Z","5:14:37","4:53:40","0:20:57","passed","main","false" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4094","xuebing",,"2024-01-16T08:20:20Z","2024-01-16T08:42:05Z","2024-01-16T09:03:42Z",,"2024-01-16T09:29:48Z","2024-01-16T09:03:42Z","2024-01-16T09:30:16.889Z","1:9:56","0:43:22","0:26:34","passed","main","false" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4087","Yunsong",,"2024-01-16T08:42:19Z","2024-01-16T08:43:18Z","2024-01-16T08:43:45Z",,"2024-01-16T09:02:16Z","2024-01-16T08:43:45Z","2024-01-16T09:02:46.685Z","0:20:27","0:1:26","0:19:1","passed","main","false" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4078","GuangbinMa","heartbeat-user","2024-01-16T06:33:44Z","2024-01-16T07:25:34Z","2024-01-16T07:58:33Z",,"2024-01-16T08:31:57Z","2024-01-16T07:58:33Z","2024-01-16T08:32:28.349Z","1:58:44","1:24:49","0:33:55","passed","main","false" +"Thoughtworks-Heartbeat","Heartbeat",":pipeline: Upload pipeline.yml","false","4075","Yunsong",,,,,,,,"2024-01-16T07:58:17.589Z",,,,"canceled","main","" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4070","Yunsong",,"2024-01-16T07:06:35Z","2024-01-16T07:11:17Z","2024-01-16T07:31:50Z",,"2024-01-16T07:50:18Z","2024-01-16T07:31:50Z","2024-01-16T07:50:58.369Z","0:44:23","0:25:15","0:19:8","passed","main","false" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4065","Nathan Wang",,"2024-01-16T03:51:04Z","2024-01-10T07:48:39Z","2024-01-16T05:44:17Z",,"2024-01-16T06:36:15Z","2024-01-16T05:44:17Z","2024-01-16T06:36:44.984Z","2:45:40","1:53:13","0:52:27","passed","main","false" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4064","Simon Tal","heartbeat-user","2024-01-16T03:35:20Z","2024-01-16T03:38:26Z","2024-01-16T03:47:27Z",,"2024-01-16T06:10:58Z","2024-01-16T03:47:27Z","2024-01-16T06:11:26.201Z","2:36:6","0:12:7","2:23:59","passed","main","false" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4056","weiran.sun",,"2024-01-16T02:27:37Z","2024-01-16T02:38:02Z","2024-01-16T02:41:35Z",,"2024-01-16T03:00:48Z","2024-01-16T02:41:35Z","2024-01-16T03:01:19.266Z","0:33:42","0:13:58","0:19:44","passed","main","false" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Run e2e","false","4054","Jianxun.Ma",,,,,,,,"2024-01-16T02:22:28.775Z",,,,"passed","main","" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4050","junbo.dai",,"2024-01-16T01:14:24Z","2024-01-16T01:13:59Z","2024-01-16T01:36:23Z",,"2024-01-16T01:56:42Z","2024-01-16T01:36:23Z","2024-01-16T01:57:13.241Z","0:42:49","0:21:59","0:20:50","passed","main","false" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4047","guzhongren","guzhongren",,,,"2024-01-15T15:41:49Z","2024-01-15T16:09:35Z","2024-01-15T15:41:49Z","2024-01-15T16:10:04.028Z","0:28:15","0:0:0","0:28:15","passed","main","false" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy e2e","false","4046","guzhongren","guzhongren",,,,,,,"2024-01-15T15:40:09.332Z",,,,"passed","main","" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4045","guzhongren","guzhongren",,,,"2024-01-15T14:30:35Z","2024-01-15T14:58:51Z","2024-01-15T14:30:35Z","2024-01-15T14:59:21.298Z","0:28:46","0:0:0","0:28:46","passed","main","false" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4044","GuangbinMa",,"2024-01-15T09:00:10Z","2024-01-15T09:55:27Z","2024-01-15T10:06:21Z",,"2024-01-15T10:33:21Z","2024-01-15T10:06:21Z","2024-01-15T10:33:54.045Z","1:33:44","1:6:11","0:27:33","passed","main","false" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Run e2e","false","4034","JiangRu1",,,,,,,,"2024-01-15T08:49:47.422Z",,,,"failed","main","" +"Thoughtworks-Heartbeat","Heartbeat",":mag: Check Backend License","false","4033","Jianxun.Ma","heartbeat-user",,,,,,,"2024-01-15T08:14:07.027Z",,,,"canceled","main","" +"Thoughtworks-Heartbeat","Heartbeat",":pipeline: Upload pipeline.yml","false","4031","Jianxun.Ma","heartbeat-user",,,,,,,"2024-01-15T07:58:40.203Z",,,,"canceled","main","" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Run e2e","false","4027","Jianxun.Ma",,,,,,,,"2024-01-15T08:25:40.681Z",,,,"failed","main","" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Run e2e","false","4018","GuangbinMa",,,,,,,,"2024-01-15T06:49:24.921Z",,,,"failed","main","" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4012","Steveay",,"2024-01-12T08:02:24Z","2024-01-15T01:27:53Z","2024-01-15T03:45:41Z",,"2024-01-15T04:04:34Z","2024-01-15T03:45:41Z","2024-01-15T04:05:06.398Z","68:2:42","67:43:17","0:19:25","passed","main","false" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4001","andrea999",,"2024-01-12T09:06:51Z","2024-01-12T09:23:06Z","2024-01-15T01:37:22Z",,"2024-01-15T01:57:23Z","2024-01-15T01:37:22Z","2024-01-15T01:57:54.756Z","64:51:3","64:30:31","0:20:32","passed","main","false" diff --git a/frontend/e2e/fixtures/import-file/pipeline-data.csv b/frontend/e2e/fixtures/import-file/pipeline-data.csv index b3bab67630..2716056019 100644 --- a/frontend/e2e/fixtures/import-file/pipeline-data.csv +++ b/frontend/e2e/fixtures/import-file/pipeline-data.csv @@ -1,48 +1,48 @@ -"Organization","Pipeline Name","Pipeline Step","Valid","Build Number","Code Committer","Pipeline Creator","First Code Committed Time In PR","Code Committed Time","PR Created Time","PR Merged Time","Deployment Completed Time","Total Lead Time (HH:mm:ss)","PR Lead Time (HH:mm:ss)","Pipeline Lead Time (HH:mm:ss)","Status","Branch" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4210","guzhongren","guzhongren","2024-01-19T14:58:27Z","2024-01-19T15:02:47Z","2024-01-19T14:59:15Z","2024-01-19T15:02:47Z","2024-01-19T15:27:32.983Z","0:24:45","0:0:0","0:24:45","passed","main" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Run e2e","false","4208","Steveay","guzhongren",,"2024-01-19T09:51:14Z",,,"2024-01-19T15:09:15.439Z",,,,"failed","main" -"Thoughtworks-Heartbeat","Heartbeat",":mag: Check Frontend License","false","4204","Steveay",,,"2024-01-19T09:51:14Z",,,"2024-01-19T11:16:12.025Z",,,,"canceled","main" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4187","sqsq5566",,"2024-01-19T04:01:30Z","2024-01-19T06:18:27Z","2024-01-19T06:07:51Z","2024-01-19T06:18:27Z","2024-01-19T06:37:42.885Z","2:36:12","2:16:57","0:19:15","passed","main" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4185","neomgb",,"2024-01-18T09:08:32Z","2024-01-19T05:47:23Z","2024-01-19T02:59:59Z","2024-01-19T05:47:24Z","2024-01-19T06:14:32.418Z","21:6:0","20:38:52","0:27:8","passed","main" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4178","guzhongren","guzhongren",,"2024-01-18T15:51:58Z",,,"2024-01-18T16:56:25.673Z","1:4:27","0:0:0","1:4:27","passed","main" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Run e2e","false","4177","guzhongren","guzhongren",,"2024-01-18T15:49:45Z",,,"2024-01-18T16:18:32.089Z",,,,"failed","main" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Run e2e","false","4176","guzhongren","guzhongren",,"2024-01-18T15:37:47Z",,,"2024-01-18T16:06:41.439Z",,,,"passed","main" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4175","guzhongren","guzhongren",,"2024-01-18T15:16:05Z",,,"2024-01-18T15:53:58.280Z","0:37:53","0:0:0","0:37:53","passed","main" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4174","guzhongren","guzhongren",,"2024-01-18T15:00:53Z",,,"2024-01-18T15:28:06.427Z","0:27:13","0:0:0","0:27:13","passed","main" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4173","Chao",,"2024-01-18T09:54:35Z","2024-01-18T10:08:17Z","2024-01-18T05:47:24Z","2024-01-18T10:08:17Z","2024-01-18T10:33:46.039Z","0:39:11","0:13:42","0:25:29","passed","main" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4171","neomgb",,"2024-01-18T02:33:54Z","2024-01-18T09:41:40Z","2024-01-18T02:54:05Z","2024-01-18T09:41:40Z","2024-01-18T10:07:29.676Z","7:33:35","7:7:46","0:25:49","passed","main" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4166","junbo dai",,"2024-01-18T08:28:22Z","2024-01-18T08:56:52Z","2024-01-18T08:27:11Z","2024-01-18T08:56:52Z","2024-01-18T09:15:44.306Z","0:47:22","0:28:30","0:18:52","passed","main" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4162","李雪冰",,"2024-01-18T05:45:03Z","2024-01-18T08:28:08Z","2024-01-18T06:34:30Z","2024-01-18T08:28:09Z","2024-01-18T08:52:58.699Z","3:7:55","2:43:6","0:24:49","passed","main" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4151","yichen.wang","heartbeat-user",,"2024-01-18T05:35:15Z",,,"2024-01-18T05:56:34.575Z","0:21:19","0:0:0","0:21:19","passed","main" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Run e2e","false","4148","yichen.wang","heartbeat-user",,"2024-01-17T15:54:45Z",,,"2024-01-18T03:01:41.593Z",,,,"failed","main" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4147","Steveay",,"2024-01-17T07:43:29Z","2024-01-17T10:47:00Z","2024-01-17T09:42:52Z","2024-01-17T10:47:01Z","2024-01-17T11:22:02.967Z","3:38:33","3:3:32","0:35:1","passed","main" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4146","李雪冰",,"2024-01-17T08:06:19Z","2024-01-17T09:48:38Z","2024-01-17T09:34:27Z","2024-01-17T09:48:38Z","2024-01-17T10:13:39.473Z","2:7:20","1:42:19","0:25:1","passed","main" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4137","neomgb","heartbeat-user","2024-01-17T03:05:11Z","2024-01-17T06:46:34Z","2024-01-17T04:01:00Z","2024-01-17T06:46:34Z","2024-01-17T07:22:40.087Z","4:17:29","3:41:23","0:36:6","passed","main" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4133","junbo dai",,"2024-01-17T03:54:13Z","2024-01-17T06:15:16Z","2024-01-17T03:59:41Z","2024-01-17T06:15:16Z","2024-01-17T06:34:03.987Z","2:39:50","2:21:3","0:18:47","passed","main" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Run e2e","false","4123","junbo dai",,,"2024-01-17T03:17:10Z",,,"2024-01-17T03:28:28.520Z",,,,"passed","main" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4119","sqsq5566",,"2024-01-17T02:26:10Z","2024-01-17T02:55:54Z","2024-01-17T02:31:10Z","2024-01-17T02:55:54Z","2024-01-17T03:14:48.671Z","0:48:38","0:29:44","0:18:54","passed","main" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4117","junbo dai",,"2024-01-17T02:27:23Z","2024-01-17T02:34:10Z","2024-01-17T02:30:48Z","2024-01-17T02:34:10Z","2024-01-17T02:53:37.896Z","0:26:14","0:6:47","0:19:27","passed","main" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4114","mjx20045912",,"2024-01-16T08:44:22Z","2024-01-16T16:27:23Z","2024-01-16T08:46:04Z","2024-01-16T16:27:24Z","2024-01-16T16:46:52.588Z","8:2:30","7:43:2","0:19:28","passed","main" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4109","Steveay",,"2024-01-16T09:35:48Z","2024-01-16T15:24:35Z","2024-01-16T10:42:42Z","2024-01-16T15:24:36Z","2024-01-16T15:44:39.934Z","6:8:51","5:48:48","0:20:3","passed","main" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4104","sqsq5566",,"2024-01-16T08:55:43Z","2024-01-16T13:49:22Z","2024-01-16T09:33:36Z","2024-01-16T13:49:23Z","2024-01-16T14:10:20.523Z","5:14:37","4:53:40","0:20:57","passed","main" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4094","xuebing",,"2024-01-16T08:20:20Z","2024-01-16T08:15:29Z","2024-01-16T08:42:05Z","2024-01-16T09:03:42Z","2024-01-16T09:30:16.889Z","1:9:56","0:43:22","0:26:34","passed","main" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4087","Yunsong",,"2024-01-16T08:42:19Z","2024-01-16T08:42:19Z","2024-01-16T08:43:18Z","2024-01-16T08:43:45Z","2024-01-16T09:02:46.685Z","0:20:27","0:1:26","0:19:1","passed","main" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4078","GuangbinMa","heartbeat-user","2024-01-16T06:33:44Z","2024-01-16T07:03:48Z","2024-01-16T07:25:34Z","2024-01-16T07:58:33Z","2024-01-16T08:32:28.349Z","1:58:44","1:24:49","0:33:55","passed","main" -"Thoughtworks-Heartbeat","Heartbeat",":pipeline: Upload pipeline.yml","false","4075","Yunsong",,,"2024-01-16T07:51:58Z",,,"2024-01-16T07:58:17.589Z",,,,"canceled","main" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4070","Yunsong",,"2024-01-16T07:06:35Z","2024-01-16T07:06:35Z","2024-01-16T07:11:17Z","2024-01-16T07:31:50Z","2024-01-16T07:50:58.369Z","0:44:23","0:25:15","0:19:8","passed","main" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4065","Nathan Wang",,"2024-01-16T03:51:04Z","2024-01-16T03:30:16Z","2024-01-10T07:48:39Z","2024-01-16T05:44:17Z","2024-01-16T06:36:44.984Z","2:45:40","1:53:13","0:52:27","passed","main" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4064","Simon Tal","heartbeat-user","2024-01-16T03:35:20Z","2024-01-16T03:24:08Z","2024-01-16T03:38:26Z","2024-01-16T03:47:27Z","2024-01-16T06:11:26.201Z","2:36:6","0:12:7","2:23:59","passed","main" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4056","weiran.sun",,"2024-01-16T02:27:37Z","2024-01-16T02:22:01Z","2024-01-16T02:38:02Z","2024-01-16T02:41:35Z","2024-01-16T03:01:19.266Z","0:33:42","0:13:58","0:19:44","passed","main" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Run e2e","false","4054","Jianxun.Ma",,,"2024-01-15T02:07:43Z",,,"2024-01-16T02:22:28.775Z",,,,"passed","main" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4050","junbo.dai",,"2024-01-16T01:14:24Z","2024-01-15T15:01:57Z","2024-01-16T01:13:59Z","2024-01-16T01:36:23Z","2024-01-16T01:57:13.241Z","0:42:49","0:21:59","0:20:50","passed","main" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4047","guzhongren","guzhongren",,"2024-01-15T15:41:49Z",,,"2024-01-15T16:10:04.028Z","0:28:15","0:0:0","0:28:15","passed","main" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy e2e","false","4046","guzhongren","guzhongren",,"2024-01-15T15:18:39Z",,,"2024-01-15T15:40:09.332Z",,,,"passed","main" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4045","guzhongren","guzhongren",,"2024-01-15T14:30:35Z",,,"2024-01-15T14:59:21.298Z","0:28:46","0:0:0","0:28:46","passed","main" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4044","GuangbinMa",,"2024-01-15T09:00:10Z","2024-01-15T09:53:15Z","2024-01-15T09:55:27Z","2024-01-15T10:06:21Z","2024-01-15T10:33:54.045Z","1:33:44","1:6:11","0:27:33","passed","main" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Run e2e","false","4034","JiangRu1",,,"2024-01-15T07:20:09Z",,,"2024-01-15T08:49:47.422Z",,,,"failed","main" -"Thoughtworks-Heartbeat","Heartbeat",":mag: Check Backend License","false","4033","Jianxun.Ma","heartbeat-user",,"2024-01-15T07:34:00Z",,,"2024-01-15T08:14:07.027Z",,,,"canceled","main" -"Thoughtworks-Heartbeat","Heartbeat",":pipeline: Upload pipeline.yml","false","4031","Jianxun.Ma","heartbeat-user",,"2024-01-15T07:34:00Z",,,"2024-01-15T07:58:40.203Z",,,,"canceled","main" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Run e2e","false","4027","Jianxun.Ma",,,"2024-01-15T07:34:00Z",,,"2024-01-15T08:25:40.681Z",,,,"failed","main" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Run e2e","false","4018","GuangbinMa",,,"2024-01-15T06:16:33Z",,,"2024-01-15T06:49:24.921Z",,,,"failed","main" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4012","Steveay",,"2024-01-12T08:02:24Z","2024-01-15T03:45:40Z","2024-01-15T01:27:53Z","2024-01-15T03:45:41Z","2024-01-15T04:05:06.398Z","68:2:42","67:43:17","0:19:25","passed","main" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4001","andrea999",,"2024-01-12T09:06:51Z","2024-01-15T01:37:21Z","2024-01-12T09:23:06Z","2024-01-15T01:37:22Z","2024-01-15T01:57:54.756Z","64:51:3","64:30:31","0:20:32","passed","main" +"Organization","Pipeline Name","Pipeline Step","Valid","Build Number","Code Committer","Pipeline Creator","First Code Committed Time In PR","PR Created Time","PR Merged Time","No PR Committed Time","Job Start Time","Pipeline Start Time","Pipeline Finish Time","Total Lead Time (HH:mm:ss)","PR Lead Time (HH:mm:ss)","Pipeline Lead Time (HH:mm:ss)","Status","Branch","Revert" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4210","guzhongren","guzhongren","2024-01-19T14:58:27Z","2024-01-19T14:59:15Z","2024-01-19T15:02:47Z",,"2024-01-19T15:26:59Z","2024-01-19T15:02:47Z","2024-01-19T15:27:32.983Z","0:24:45","0:0:0","0:24:45","passed","main","true" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Run e2e","false","4208","Steveay","guzhongren",,,,,,,"2024-01-19T15:09:15.439Z",,,,"failed","main","" +"Thoughtworks-Heartbeat","Heartbeat",":mag: Check Frontend License","false","4204","Steveay",,,,,,,,"2024-01-19T11:16:12.025Z",,,,"canceled","main","" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4187","sqsq5566",,"2024-01-19T04:01:30Z","2024-01-19T06:07:51Z","2024-01-19T06:18:27Z",,"2024-01-19T06:37:09Z","2024-01-19T06:18:27Z","2024-01-19T06:37:42.885Z","2:36:12","2:16:57","0:19:15","passed","main","false" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4185","neomgb",,"2024-01-18T09:08:32Z","2024-01-19T02:59:59Z","2024-01-19T05:47:24Z",,"2024-01-19T06:14:02Z","2024-01-19T05:47:24Z","2024-01-19T06:14:32.418Z","21:6:0","20:38:52","0:27:8","passed","main","false" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4178","guzhongren","guzhongren",,,,"2024-01-18T15:51:58Z","2024-01-18T16:55:57Z","2024-01-18T15:51:58Z","2024-01-18T16:56:25.673Z","1:4:27","0:0:0","1:4:27","passed","main","false" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Run e2e","false","4177","guzhongren","guzhongren",,,,,,,"2024-01-18T16:18:32.089Z",,,,"failed","main","" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Run e2e","false","4176","guzhongren","guzhongren",,,,,,,"2024-01-18T16:06:41.439Z",,,,"passed","main","" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4175","guzhongren","guzhongren",,,,"2024-01-18T15:16:05Z","2024-01-18T15:53:30Z","2024-01-18T15:16:05Z","2024-01-18T15:53:58.280Z","0:37:53","0:0:0","0:37:53","passed","main","false" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4174","guzhongren","guzhongren",,,,"2024-01-18T15:00:53Z","2024-01-18T15:27:37Z","2024-01-18T15:00:53Z","2024-01-18T15:28:06.427Z","0:27:13","0:0:0","0:27:13","passed","main","false" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4173","Chao",,"2024-01-18T09:54:35Z","2024-01-18T05:47:24Z","2024-01-18T10:08:17Z",,"2024-01-18T10:33:18Z","2024-01-18T10:08:17Z","2024-01-18T10:33:46.039Z","0:39:11","0:13:42","0:25:29","passed","main","false" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4171","neomgb",,"2024-01-18T02:33:54Z","2024-01-18T02:54:05Z","2024-01-18T09:41:40Z",,"2024-01-18T10:07:00Z","2024-01-18T09:41:40Z","2024-01-18T10:07:29.676Z","7:33:35","7:7:46","0:25:49","passed","main","false" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4166","junbo dai",,"2024-01-18T08:28:22Z","2024-01-18T08:27:11Z","2024-01-18T08:56:52Z",,"2024-01-18T09:15:09Z","2024-01-18T08:56:52Z","2024-01-18T09:15:44.306Z","0:47:22","0:28:30","0:18:52","passed","main","false" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4162","李雪冰",,"2024-01-18T05:45:03Z","2024-01-18T06:34:30Z","2024-01-18T08:28:09Z",,"2024-01-18T08:52:29Z","2024-01-18T08:28:09Z","2024-01-18T08:52:58.699Z","3:7:55","2:43:6","0:24:49","passed","main","false" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4151","yichen.wang","heartbeat-user",,,,"2024-01-18T05:35:15Z","2024-01-18T05:55:59Z","2024-01-18T05:35:15Z","2024-01-18T05:56:34.575Z","0:21:19","0:0:0","0:21:19","passed","main","true" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Run e2e","false","4148","yichen.wang","heartbeat-user",,,,,,,"2024-01-18T03:01:41.593Z",,,,"failed","main","" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4147","Steveay",,"2024-01-17T07:43:29Z","2024-01-17T09:42:52Z","2024-01-17T10:47:01Z",,"2024-01-17T11:21:20Z","2024-01-17T10:47:01Z","2024-01-17T11:22:02.967Z","3:38:33","3:3:32","0:35:1","passed","main","false" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4146","李雪冰",,"2024-01-17T08:06:19Z","2024-01-17T09:34:27Z","2024-01-17T09:48:38Z",,"2024-01-17T10:13:10Z","2024-01-17T09:48:38Z","2024-01-17T10:13:39.473Z","2:7:20","1:42:19","0:25:1","passed","main","false" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4137","neomgb","heartbeat-user","2024-01-17T03:05:11Z","2024-01-17T04:01:00Z","2024-01-17T06:46:34Z",,"2024-01-17T07:22:06Z","2024-01-17T06:46:34Z","2024-01-17T07:22:40.087Z","4:17:29","3:41:23","0:36:6","passed","main","false" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4133","junbo dai",,"2024-01-17T03:54:13Z","2024-01-17T03:59:41Z","2024-01-17T06:15:16Z",,"2024-01-17T06:33:32Z","2024-01-17T06:15:16Z","2024-01-17T06:34:03.987Z","2:39:50","2:21:3","0:18:47","passed","main","false" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Run e2e","false","4123","junbo dai",,,,,,,,"2024-01-17T03:28:28.520Z",,,,"passed","main","" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4119","sqsq5566",,"2024-01-17T02:26:10Z","2024-01-17T02:31:10Z","2024-01-17T02:55:54Z",,"2024-01-17T03:14:17Z","2024-01-17T02:55:54Z","2024-01-17T03:14:48.671Z","0:48:38","0:29:44","0:18:54","passed","main","false" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4117","junbo dai",,"2024-01-17T02:27:23Z","2024-01-17T02:30:48Z","2024-01-17T02:34:10Z",,"2024-01-17T02:53:05Z","2024-01-17T02:34:10Z","2024-01-17T02:53:37.896Z","0:26:14","0:6:47","0:19:27","passed","main","false" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4114","mjx20045912",,"2024-01-16T08:44:22Z","2024-01-16T08:46:04Z","2024-01-16T16:27:24Z",,"2024-01-16T16:46:22Z","2024-01-16T16:27:24Z","2024-01-16T16:46:52.588Z","8:2:30","7:43:2","0:19:28","passed","main","false" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4109","Steveay",,"2024-01-16T09:35:48Z","2024-01-16T10:42:42Z","2024-01-16T15:24:36Z",,"2024-01-16T15:44:09Z","2024-01-16T15:24:36Z","2024-01-16T15:44:39.934Z","6:8:51","5:48:48","0:20:3","passed","main","false" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4104","sqsq5566",,"2024-01-16T08:55:43Z","2024-01-16T09:33:36Z","2024-01-16T13:49:23Z",,"2024-01-16T14:09:48Z","2024-01-16T13:49:23Z","2024-01-16T14:10:20.523Z","5:14:37","4:53:40","0:20:57","passed","main","false" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4094","xuebing",,"2024-01-16T08:20:20Z","2024-01-16T08:42:05Z","2024-01-16T09:03:42Z",,"2024-01-16T09:29:48Z","2024-01-16T09:03:42Z","2024-01-16T09:30:16.889Z","1:9:56","0:43:22","0:26:34","passed","main","false" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4087","Yunsong",,"2024-01-16T08:42:19Z","2024-01-16T08:43:18Z","2024-01-16T08:43:45Z",,"2024-01-16T09:02:16Z","2024-01-16T08:43:45Z","2024-01-16T09:02:46.685Z","0:20:27","0:1:26","0:19:1","passed","main","false" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4078","GuangbinMa","heartbeat-user","2024-01-16T06:33:44Z","2024-01-16T07:25:34Z","2024-01-16T07:58:33Z",,"2024-01-16T08:31:57Z","2024-01-16T07:58:33Z","2024-01-16T08:32:28.349Z","1:58:44","1:24:49","0:33:55","passed","main","false" +"Thoughtworks-Heartbeat","Heartbeat",":pipeline: Upload pipeline.yml","false","4075","Yunsong",,,,,,,,"2024-01-16T07:58:17.589Z",,,,"canceled","main","" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4070","Yunsong",,"2024-01-16T07:06:35Z","2024-01-16T07:11:17Z","2024-01-16T07:31:50Z",,"2024-01-16T07:50:18Z","2024-01-16T07:31:50Z","2024-01-16T07:50:58.369Z","0:44:23","0:25:15","0:19:8","passed","main","false" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4065","Nathan Wang",,"2024-01-16T03:51:04Z","2024-01-10T07:48:39Z","2024-01-16T05:44:17Z",,"2024-01-16T06:36:15Z","2024-01-16T05:44:17Z","2024-01-16T06:36:44.984Z","2:45:40","1:53:13","0:52:27","passed","main","false" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4064","Simon Tal","heartbeat-user","2024-01-16T03:35:20Z","2024-01-16T03:38:26Z","2024-01-16T03:47:27Z",,"2024-01-16T06:10:58Z","2024-01-16T03:47:27Z","2024-01-16T06:11:26.201Z","2:36:6","0:12:7","2:23:59","passed","main","false" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4056","weiran.sun",,"2024-01-16T02:27:37Z","2024-01-16T02:38:02Z","2024-01-16T02:41:35Z",,"2024-01-16T03:00:48Z","2024-01-16T02:41:35Z","2024-01-16T03:01:19.266Z","0:33:42","0:13:58","0:19:44","passed","main","false" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Run e2e","false","4054","Jianxun.Ma",,,,,,,,"2024-01-16T02:22:28.775Z",,,,"passed","main","" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4050","junbo.dai",,"2024-01-16T01:14:24Z","2024-01-16T01:13:59Z","2024-01-16T01:36:23Z",,"2024-01-16T01:56:42Z","2024-01-16T01:36:23Z","2024-01-16T01:57:13.241Z","0:42:49","0:21:59","0:20:50","passed","main","false" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4047","guzhongren","guzhongren",,,,"2024-01-15T15:41:49Z","2024-01-15T16:09:35Z","2024-01-15T15:41:49Z","2024-01-15T16:10:04.028Z","0:28:15","0:0:0","0:28:15","passed","main","false" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy e2e","false","4046","guzhongren","guzhongren",,,,,,,"2024-01-15T15:40:09.332Z",,,,"passed","main","" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4045","guzhongren","guzhongren",,,,"2024-01-15T14:30:35Z","2024-01-15T14:58:51Z","2024-01-15T14:30:35Z","2024-01-15T14:59:21.298Z","0:28:46","0:0:0","0:28:46","passed","main","false" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4044","GuangbinMa",,"2024-01-15T09:00:10Z","2024-01-15T09:55:27Z","2024-01-15T10:06:21Z",,"2024-01-15T10:33:21Z","2024-01-15T10:06:21Z","2024-01-15T10:33:54.045Z","1:33:44","1:6:11","0:27:33","passed","main","false" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Run e2e","false","4034","JiangRu1",,,,,,,,"2024-01-15T08:49:47.422Z",,,,"failed","main","" +"Thoughtworks-Heartbeat","Heartbeat",":mag: Check Backend License","false","4033","Jianxun.Ma","heartbeat-user",,,,,,,"2024-01-15T08:14:07.027Z",,,,"canceled","main","" +"Thoughtworks-Heartbeat","Heartbeat",":pipeline: Upload pipeline.yml","false","4031","Jianxun.Ma","heartbeat-user",,,,,,,"2024-01-15T07:58:40.203Z",,,,"canceled","main","" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Run e2e","false","4027","Jianxun.Ma",,,,,,,,"2024-01-15T08:25:40.681Z",,,,"failed","main","" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Run e2e","false","4018","GuangbinMa",,,,,,,,"2024-01-15T06:49:24.921Z",,,,"failed","main","" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4012","Steveay",,"2024-01-12T08:02:24Z","2024-01-15T01:27:53Z","2024-01-15T03:45:41Z",,"2024-01-15T04:04:34Z","2024-01-15T03:45:41Z","2024-01-15T04:05:06.398Z","68:2:42","67:43:17","0:19:25","passed","main","false" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4001","andrea999",,"2024-01-12T09:06:51Z","2024-01-12T09:23:06Z","2024-01-15T01:37:22Z",,"2024-01-15T01:57:23Z","2024-01-15T01:37:22Z","2024-01-15T01:57:54.756Z","64:51:3","64:30:31","0:20:32","passed","main","false" From 26a2bbb3333a83535c7999fc5ca6a3925b10c375 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 14 Apr 2024 21:46:18 +0800 Subject: [PATCH 03/81] chore(deps): update dependency node to v20 (#1375)[docs] Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- docs/.nvmrc | 2 +- docs/package.json | 2 +- docs/pnpm-lock.yaml | 44 ++++++++++++++++++++++---------------------- 3 files changed, 24 insertions(+), 24 deletions(-) diff --git a/docs/.nvmrc b/docs/.nvmrc index 617bcf916b..87834047a6 100644 --- a/docs/.nvmrc +++ b/docs/.nvmrc @@ -1 +1 @@ -18.14.1 +20.12.2 diff --git a/docs/package.json b/docs/package.json index 58df912566..b019d98741 100644 --- a/docs/package.json +++ b/docs/package.json @@ -45,7 +45,7 @@ "@types/hast": "^3.0.4", "@types/html-escaper": "^3.0.2", "@types/mdast": "^4.0.3", - "@types/node": "20.11.30", + "@types/node": "20.12.7", "@typescript-eslint/eslint-plugin": "^7.3.1", "@typescript-eslint/parser": "^7.3.1", "algoliasearch": "^4.22.1", diff --git a/docs/pnpm-lock.yaml b/docs/pnpm-lock.yaml index 9441904971..8ffcf047af 100644 --- a/docs/pnpm-lock.yaml +++ b/docs/pnpm-lock.yaml @@ -83,8 +83,8 @@ devDependencies: specifier: ^4.0.3 version: 4.0.3 '@types/node': - specifier: 20.11.30 - version: 20.11.30 + specifier: 20.12.7 + version: 20.12.7 '@typescript-eslint/eslint-plugin': specifier: ^7.3.1 version: 7.4.0(@typescript-eslint/parser@7.4.0)(eslint@8.57.0)(typescript@5.4.2) @@ -96,7 +96,7 @@ devDependencies: version: 4.22.1 astro: specifier: ^4.5.7 - version: 4.5.7(@types/node@20.11.30)(sass@1.72.0)(typescript@5.4.2) + version: 4.5.7(@types/node@20.12.7)(sass@1.72.0)(typescript@5.4.2) astro-auto-import: specifier: ^0.4.2 version: 0.4.2(astro@4.5.7) @@ -243,7 +243,7 @@ devDependencies: version: 6.0.1 vitest: specifier: ^1.4.0 - version: 1.4.0(@types/node@20.11.30)(sass@1.72.0) + version: 1.4.0(@types/node@20.12.7)(sass@1.72.0) packages: @@ -583,7 +583,7 @@ packages: '@astrojs/markdown-remark': 4.3.2 '@mdx-js/mdx': 3.0.1 acorn: 8.11.3 - astro: 4.5.7(@types/node@20.11.30)(sass@1.72.0)(typescript@5.4.2) + astro: 4.5.7(@types/node@20.12.7)(sass@1.72.0)(typescript@5.4.2) es-module-lexer: 1.5.0 estree-util-visit: 2.0.0 github-slugger: 2.0.0 @@ -1931,8 +1931,8 @@ packages: undici-types: 5.26.5 dev: true - /@types/node@20.11.30: - resolution: {integrity: sha512-dHM6ZxwlmuZaRmUPfv1p+KrdD1Dci04FbdEm/9wEMouFqxYoFl5aMkt0VMAUtYRQDyYvD41WJLukhq/ha3YuTw==} + /@types/node@20.12.7: + resolution: {integrity: sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==} dependencies: undici-types: 5.26.5 dev: true @@ -1948,7 +1948,7 @@ packages: /@types/sax@1.2.7: resolution: {integrity: sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==} dependencies: - '@types/node': 20.11.30 + '@types/node': 20.12.7 dev: true /@types/semver@7.5.8: @@ -2498,7 +2498,7 @@ packages: dependencies: '@types/node': 18.19.26 acorn: 8.11.3 - astro: 4.5.7(@types/node@20.11.30)(sass@1.72.0)(typescript@5.4.2) + astro: 4.5.7(@types/node@20.12.7)(sass@1.72.0)(typescript@5.4.2) dev: true /astro-eslint-parser@0.16.3: @@ -2523,7 +2523,7 @@ packages: peerDependencies: astro: ^4.0.0-beta || ^3.3.0 dependencies: - astro: 4.5.7(@types/node@20.11.30)(sass@1.72.0)(typescript@5.4.2) + astro: 4.5.7(@types/node@20.12.7)(sass@1.72.0)(typescript@5.4.2) hast-util-to-html: 8.0.4 remark-expressive-code: 0.33.5 dev: true @@ -2534,13 +2534,13 @@ packages: peerDependencies: astro: ^3.0.0 || ^4.0.0 dependencies: - astro: 4.5.7(@types/node@20.11.30)(sass@1.72.0)(typescript@5.4.2) + astro: 4.5.7(@types/node@20.12.7)(sass@1.72.0)(typescript@5.4.2) canvaskit-wasm: 0.37.2 deterministic-object-hash: 2.0.2 entities: 4.5.0 dev: true - /astro@4.5.7(@types/node@20.11.30)(sass@1.72.0)(typescript@5.4.2): + /astro@4.5.7(@types/node@20.12.7)(sass@1.72.0)(typescript@5.4.2): resolution: {integrity: sha512-Ioeg3TV42dOJvf6GlmykeR3EKZ8+JcnZyJ/X9qDPzVf2OREmtvW0182YCDXQBqwXFRHndZRcHLqinAWjzZYh/A==} engines: {node: '>=18.14.1', npm: '>=6.14.0'} hasBin: true @@ -2601,7 +2601,7 @@ packages: tsconfck: 3.0.3(typescript@5.4.2) unist-util-visit: 5.0.0 vfile: 6.0.1 - vite: 5.2.8(@types/node@20.11.30)(sass@1.72.0) + vite: 5.2.8(@types/node@20.12.7)(sass@1.72.0) vitefu: 0.2.5(vite@5.2.8) which-pm: 2.1.1 yargs-parser: 21.1.1 @@ -7890,7 +7890,7 @@ packages: unist-util-stringify-position: 4.0.0 vfile-message: 4.0.2 - /vite-node@1.4.0(@types/node@20.11.30)(sass@1.72.0): + /vite-node@1.4.0(@types/node@20.12.7)(sass@1.72.0): resolution: {integrity: sha512-VZDAseqjrHgNd4Kh8icYHWzTKSCZMhia7GyHfhtzLW33fZlG9SwsB6CEhgyVOWkJfJ2pFLrp/Gj1FSfAiqH9Lw==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true @@ -7899,7 +7899,7 @@ packages: debug: 4.3.4 pathe: 1.1.2 picocolors: 1.0.0 - vite: 5.2.8(@types/node@20.11.30)(sass@1.72.0) + vite: 5.2.8(@types/node@20.12.7)(sass@1.72.0) transitivePeerDependencies: - '@types/node' - less @@ -7911,7 +7911,7 @@ packages: - terser dev: true - /vite@5.2.8(@types/node@20.11.30)(sass@1.72.0): + /vite@5.2.8(@types/node@20.12.7)(sass@1.72.0): resolution: {integrity: sha512-OyZR+c1CE8yeHw5V5t59aXsUPPVTHMDjEZz8MgguLL/Q7NblxhZUlTu9xSPqlsUO/y+X7dlU05jdhvyycD55DA==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true @@ -7939,7 +7939,7 @@ packages: terser: optional: true dependencies: - '@types/node': 20.11.30 + '@types/node': 20.12.7 esbuild: 0.20.2 postcss: 8.4.38 rollup: 4.13.0 @@ -7956,10 +7956,10 @@ packages: vite: optional: true dependencies: - vite: 5.2.8(@types/node@20.11.30)(sass@1.72.0) + vite: 5.2.8(@types/node@20.12.7)(sass@1.72.0) dev: true - /vitest@1.4.0(@types/node@20.11.30)(sass@1.72.0): + /vitest@1.4.0(@types/node@20.12.7)(sass@1.72.0): resolution: {integrity: sha512-gujzn0g7fmwf83/WzrDTnncZt2UiXP41mHuFYFrdwaLRVQ6JYQEiME2IfEjU3vcFL3VKa75XhI3lFgn+hfVsQw==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true @@ -7984,7 +7984,7 @@ packages: jsdom: optional: true dependencies: - '@types/node': 20.11.30 + '@types/node': 20.12.7 '@vitest/expect': 1.4.0 '@vitest/runner': 1.4.0 '@vitest/snapshot': 1.4.0 @@ -8002,8 +8002,8 @@ packages: strip-literal: 2.0.0 tinybench: 2.6.0 tinypool: 0.8.2 - vite: 5.2.8(@types/node@20.11.30)(sass@1.72.0) - vite-node: 1.4.0(@types/node@20.11.30)(sass@1.72.0) + vite: 5.2.8(@types/node@20.12.7)(sass@1.72.0) + vite-node: 1.4.0(@types/node@20.12.7)(sass@1.72.0) why-is-node-running: 2.2.2 transitivePeerDependencies: - less From 598975eea4a5d930db75b10f0520ac7618925d7e Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 14 Apr 2024 15:26:51 +0000 Subject: [PATCH 04/81] fix(deps): update dependency @emotion/styled to v11.11.5 (#1363) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- frontend/pnpm-lock.yaml | 85 ++++++++++++++++++++++++++--------------- 1 file changed, 54 insertions(+), 31 deletions(-) diff --git a/frontend/pnpm-lock.yaml b/frontend/pnpm-lock.yaml index 15c12aa7db..81568a3885 100644 --- a/frontend/pnpm-lock.yaml +++ b/frontend/pnpm-lock.yaml @@ -10,7 +10,7 @@ dependencies: version: 11.11.4(@types/react@18.2.67)(react@18.2.0) '@emotion/styled': specifier: ^11.11.0 - version: 11.11.0(@emotion/react@11.11.4)(@types/react@18.2.67)(react@18.2.0) + version: 11.11.5(@emotion/react@11.11.4)(@types/react@18.2.67)(react@18.2.0) '@fontsource/roboto': specifier: ^5.0.12 version: 5.0.12 @@ -19,10 +19,10 @@ dependencies: version: 5.15.14(@mui/material@5.15.14)(@types/react@18.2.67)(react@18.2.0) '@mui/material': specifier: ^5.15.14 - version: 5.15.14(@emotion/react@11.11.4)(@emotion/styled@11.11.0)(@types/react@18.2.67)(react-dom@18.2.0)(react@18.2.0) + version: 5.15.14(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.2.67)(react-dom@18.2.0)(react@18.2.0) '@mui/x-date-pickers': specifier: ^7.0.0 - version: 7.0.0(@emotion/react@11.11.4)(@emotion/styled@11.11.0)(@mui/material@5.15.14)(@types/react@18.2.67)(dayjs@1.11.10)(react-dom@18.2.0)(react@18.2.0) + version: 7.0.0(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@mui/material@5.15.14)(@types/react@18.2.67)(dayjs@1.11.10)(react-dom@18.2.0)(react@18.2.0) '@reduxjs/toolkit': specifier: ^2.2.2 version: 2.2.2(react-redux@9.1.0)(react@18.2.0) @@ -78,7 +78,7 @@ devDependencies: version: 14.2.2(react-dom@18.2.0)(react@18.2.0) '@testing-library/user-event': specifier: ^14.5.2 - version: 14.5.2(@testing-library/dom@9.3.4) + version: 14.5.2(@testing-library/dom@10.0.0) '@types/jest': specifier: ^29.5.12 version: 29.5.12 @@ -1547,7 +1547,6 @@ packages: engines: {node: '>=6.9.0'} dependencies: regenerator-runtime: 0.14.1 - dev: false /@babel/template@7.24.0: resolution: {integrity: sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==} @@ -1715,12 +1714,22 @@ packages: csstype: 3.1.3 dev: false + /@emotion/serialize@1.1.4: + resolution: {integrity: sha512-RIN04MBT8g+FnDwgvIUi8czvr1LU1alUMI05LekWB5DGyTm8cCBMCRpq3GqaiyEDRptEXOyXnvZ58GZYu4kBxQ==} + dependencies: + '@emotion/hash': 0.9.1 + '@emotion/memoize': 0.8.1 + '@emotion/unitless': 0.8.1 + '@emotion/utils': 1.2.1 + csstype: 3.1.3 + dev: false + /@emotion/sheet@1.2.2: resolution: {integrity: sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==} dev: false - /@emotion/styled@11.11.0(@emotion/react@11.11.4)(@types/react@18.2.67)(react@18.2.0): - resolution: {integrity: sha512-hM5Nnvu9P3midq5aaXj4I+lnSfNi7Pmd4EWk1fOZ3pxookaQTNew6bp4JaCBYM4HVFZF9g7UjJmsUmC2JlxOng==} + /@emotion/styled@11.11.5(@emotion/react@11.11.4)(@types/react@18.2.67)(react@18.2.0): + resolution: {integrity: sha512-/ZjjnaNKvuMPxcIiUkf/9SHoG4Q196DRl1w82hQ3WCsjo1IUR8uaGWrC6a87CrYAW0Kb/pK7hk8BnLgLRi9KoQ==} peerDependencies: '@emotion/react': ^11.0.0-rc.0 '@types/react': '*' @@ -1729,11 +1738,11 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.4 '@emotion/babel-plugin': 11.11.0 '@emotion/is-prop-valid': 1.2.2 '@emotion/react': 11.11.4(@types/react@18.2.67)(react@18.2.0) - '@emotion/serialize': 1.1.3 + '@emotion/serialize': 1.1.4 '@emotion/use-insertion-effect-with-fallbacks': 1.0.1(react@18.2.0) '@emotion/utils': 1.2.1 '@types/react': 18.2.67 @@ -2511,12 +2520,12 @@ packages: optional: true dependencies: '@babel/runtime': 7.24.1 - '@mui/material': 5.15.14(@emotion/react@11.11.4)(@emotion/styled@11.11.0)(@types/react@18.2.67)(react-dom@18.2.0)(react@18.2.0) + '@mui/material': 5.15.14(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.2.67)(react-dom@18.2.0)(react@18.2.0) '@types/react': 18.2.67 react: 18.2.0 dev: false - /@mui/material@5.15.14(@emotion/react@11.11.4)(@emotion/styled@11.11.0)(@types/react@18.2.67)(react-dom@18.2.0)(react@18.2.0): + /@mui/material@5.15.14(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.2.67)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-kEbRw6fASdQ1SQ7LVdWR5OlWV3y7Y54ZxkLzd6LV5tmz+NpO3MJKZXSfgR0LHMP7meKsPiMm4AuzV0pXDpk/BQ==} engines: {node: '>=12.0.0'} peerDependencies: @@ -2535,10 +2544,10 @@ packages: dependencies: '@babel/runtime': 7.24.1 '@emotion/react': 11.11.4(@types/react@18.2.67)(react@18.2.0) - '@emotion/styled': 11.11.0(@emotion/react@11.11.4)(@types/react@18.2.67)(react@18.2.0) + '@emotion/styled': 11.11.5(@emotion/react@11.11.4)(@types/react@18.2.67)(react@18.2.0) '@mui/base': 5.0.0-beta.40(@types/react@18.2.67)(react-dom@18.2.0)(react@18.2.0) '@mui/core-downloads-tracker': 5.15.14 - '@mui/system': 5.15.14(@emotion/react@11.11.4)(@emotion/styled@11.11.0)(@types/react@18.2.67)(react@18.2.0) + '@mui/system': 5.15.14(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.2.67)(react@18.2.0) '@mui/types': 7.2.14(@types/react@18.2.67) '@mui/utils': 5.15.14(@types/react@18.2.67)(react@18.2.0) '@types/react': 18.2.67 @@ -2569,7 +2578,7 @@ packages: react: 18.2.0 dev: false - /@mui/styled-engine@5.15.14(@emotion/react@11.11.4)(@emotion/styled@11.11.0)(react@18.2.0): + /@mui/styled-engine@5.15.14(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(react@18.2.0): resolution: {integrity: sha512-RILkuVD8gY6PvjZjqnWhz8fu68dVkqhM5+jYWfB5yhlSQKg+2rHkmEwm75XIeAqI3qwOndK6zELK5H6Zxn4NHw==} engines: {node: '>=12.0.0'} peerDependencies: @@ -2585,13 +2594,13 @@ packages: '@babel/runtime': 7.24.1 '@emotion/cache': 11.11.0 '@emotion/react': 11.11.4(@types/react@18.2.67)(react@18.2.0) - '@emotion/styled': 11.11.0(@emotion/react@11.11.4)(@types/react@18.2.67)(react@18.2.0) + '@emotion/styled': 11.11.5(@emotion/react@11.11.4)(@types/react@18.2.67)(react@18.2.0) csstype: 3.1.3 prop-types: 15.8.1 react: 18.2.0 dev: false - /@mui/system@5.15.14(@emotion/react@11.11.4)(@emotion/styled@11.11.0)(@types/react@18.2.67)(react@18.2.0): + /@mui/system@5.15.14(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.2.67)(react@18.2.0): resolution: {integrity: sha512-auXLXzUaCSSOLqJXmsAaq7P96VPRXg2Rrz6OHNV7lr+kB8lobUF+/N84Vd9C4G/wvCXYPs5TYuuGBRhcGbiBGg==} engines: {node: '>=12.0.0'} peerDependencies: @@ -2609,9 +2618,9 @@ packages: dependencies: '@babel/runtime': 7.24.1 '@emotion/react': 11.11.4(@types/react@18.2.67)(react@18.2.0) - '@emotion/styled': 11.11.0(@emotion/react@11.11.4)(@types/react@18.2.67)(react@18.2.0) + '@emotion/styled': 11.11.5(@emotion/react@11.11.4)(@types/react@18.2.67)(react@18.2.0) '@mui/private-theming': 5.15.14(@types/react@18.2.67)(react@18.2.0) - '@mui/styled-engine': 5.15.14(@emotion/react@11.11.4)(@emotion/styled@11.11.0)(react@18.2.0) + '@mui/styled-engine': 5.15.14(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(react@18.2.0) '@mui/types': 7.2.14(@types/react@18.2.67) '@mui/utils': 5.15.14(@types/react@18.2.67)(react@18.2.0) '@types/react': 18.2.67 @@ -2650,7 +2659,7 @@ packages: react-is: 18.2.0 dev: false - /@mui/x-date-pickers@7.0.0(@emotion/react@11.11.4)(@emotion/styled@11.11.0)(@mui/material@5.15.14)(@types/react@18.2.67)(dayjs@1.11.10)(react-dom@18.2.0)(react@18.2.0): + /@mui/x-date-pickers@7.0.0(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@mui/material@5.15.14)(@types/react@18.2.67)(dayjs@1.11.10)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-/9mp4O2WMixHOso63DBoZVfJVYGrzOHF5voheV2tYQ4XqDdTKp2AdWS3oh8PGwrsvCzqkvb3quzTqhKoEsJUwA==} engines: {node: '>=14.0.0'} peerDependencies: @@ -2688,10 +2697,10 @@ packages: dependencies: '@babel/runtime': 7.24.1 '@emotion/react': 11.11.4(@types/react@18.2.67)(react@18.2.0) - '@emotion/styled': 11.11.0(@emotion/react@11.11.4)(@types/react@18.2.67)(react@18.2.0) + '@emotion/styled': 11.11.5(@emotion/react@11.11.4)(@types/react@18.2.67)(react@18.2.0) '@mui/base': 5.0.0-beta.40(@types/react@18.2.67)(react-dom@18.2.0)(react@18.2.0) - '@mui/material': 5.15.14(@emotion/react@11.11.4)(@emotion/styled@11.11.0)(@types/react@18.2.67)(react-dom@18.2.0)(react@18.2.0) - '@mui/system': 5.15.14(@emotion/react@11.11.4)(@emotion/styled@11.11.0)(@types/react@18.2.67)(react@18.2.0) + '@mui/material': 5.15.14(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.2.67)(react-dom@18.2.0)(react@18.2.0) + '@mui/system': 5.15.14(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.2.67)(react@18.2.0) '@mui/utils': 5.15.14(@types/react@18.2.67)(react@18.2.0) '@types/react-transition-group': 4.4.10 clsx: 2.1.0 @@ -2971,7 +2980,7 @@ packages: /@surma/rollup-plugin-off-main-thread@2.2.3: resolution: {integrity: sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==} dependencies: - ejs: 3.1.9 + ejs: 3.1.10 json5: 2.2.3 magic-string: 0.25.9 string.prototype.matchall: 4.0.11 @@ -3109,6 +3118,20 @@ packages: defer-to-connect: 2.0.1 dev: true + /@testing-library/dom@10.0.0: + resolution: {integrity: sha512-PmJPnogldqoVFf+EwbHvbBJ98MmqASV8kLrBYgsDNxQcFMeIS7JFL48sfyXvuMtgmWO/wMhh25odr+8VhDmn4g==} + engines: {node: '>=18'} + dependencies: + '@babel/code-frame': 7.24.2 + '@babel/runtime': 7.24.4 + '@types/aria-query': 5.0.4 + aria-query: 5.3.0 + chalk: 4.1.2 + dom-accessibility-api: 0.5.16 + lz-string: 1.5.0 + pretty-format: 27.5.1 + dev: true + /@testing-library/dom@9.3.4: resolution: {integrity: sha512-FlS4ZWlp97iiNWig0Muq8p+3rVDjRiYE+YKGbAqXOu9nwJFFOdL00kFpz42M+4huzYi86vAK1sOOfyOG45muIQ==} engines: {node: '>=14'} @@ -3170,13 +3193,13 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: true - /@testing-library/user-event@14.5.2(@testing-library/dom@9.3.4): + /@testing-library/user-event@14.5.2(@testing-library/dom@10.0.0): resolution: {integrity: sha512-YAh82Wh4TIrxYLmfGcixwD18oIjyC1pFQC2Y01F2lzV2HTMiYrI0nze0FD0ocB//CKS/7jIUgae+adPqxK5yCQ==} engines: {node: '>=12', npm: '>=6'} peerDependencies: '@testing-library/dom': '>=7.21.4' dependencies: - '@testing-library/dom': 9.3.4 + '@testing-library/dom': 10.0.0 dev: true /@tootallnate/once@2.0.0: @@ -3357,8 +3380,8 @@ packages: dependencies: undici-types: 5.26.5 - /@types/node@20.12.3: - resolution: {integrity: sha512-sD+ia2ubTeWrOu+YMF+MTAB7E+O7qsMqAbMfW7DG3K1URwhZ5hN1pLlRVGbf4wDFzSfikL05M17EyorS86jShw==} + /@types/node@20.12.7: + resolution: {integrity: sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==} dependencies: undici-types: 5.26.5 dev: false @@ -3401,7 +3424,7 @@ packages: /@types/resolve@1.17.1: resolution: {integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==} dependencies: - '@types/node': 20.12.3 + '@types/node': 20.12.7 dev: false /@types/responselike@1.0.3: @@ -4810,8 +4833,8 @@ packages: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} dev: true - /ejs@3.1.9: - resolution: {integrity: sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==} + /ejs@3.1.10: + resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} engines: {node: '>=0.10.0'} hasBin: true dependencies: @@ -6863,7 +6886,7 @@ packages: resolution: {integrity: sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==} engines: {node: '>= 10.13.0'} dependencies: - '@types/node': 20.12.3 + '@types/node': 20.12.7 merge-stream: 2.0.0 supports-color: 7.2.0 dev: false From c6f64b176cdd335f84a3c72e9201f149b75fd57c Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 14 Apr 2024 18:39:27 +0000 Subject: [PATCH 05/81] fix(deps): update dependency @reduxjs/toolkit to v2.2.3 (#1364) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- frontend/pnpm-lock.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/frontend/pnpm-lock.yaml b/frontend/pnpm-lock.yaml index 81568a3885..319087c0c4 100644 --- a/frontend/pnpm-lock.yaml +++ b/frontend/pnpm-lock.yaml @@ -25,7 +25,7 @@ dependencies: version: 7.0.0(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@mui/material@5.15.14)(@types/react@18.2.67)(dayjs@1.11.10)(react-dom@18.2.0)(react@18.2.0) '@reduxjs/toolkit': specifier: ^2.2.2 - version: 2.2.2(react-redux@9.1.0)(react@18.2.0) + version: 2.2.3(react-redux@9.1.0)(react@18.2.0) axios: specifier: ^1.6.8 version: 1.6.8 @@ -2759,8 +2759,8 @@ packages: resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} dev: false - /@reduxjs/toolkit@2.2.2(react-redux@9.1.0)(react@18.2.0): - resolution: {integrity: sha512-454GZrEx3G6QSYwIx9ROaso1HR6sTH8qyZBe3KEsdWVGU3ayV8jYCwdaEJV3vl9V6+pi3GRl+7Xl7AeDna6qwQ==} + /@reduxjs/toolkit@2.2.3(react-redux@9.1.0)(react@18.2.0): + resolution: {integrity: sha512-76dll9EnJXg4EVcI5YNxZA/9hSAmZsFqzMmNRHvIlzw2WS/twfcVX3ysYrWGJMClwEmChQFC4yRq74tn6fdzRA==} peerDependencies: react: ^16.9.0 || ^17.0.0 || ^18 react-redux: ^7.2.1 || ^8.1.3 || ^9.0.0 From 578e1c49c0a60cff8c3d0667b15a353d802ccda9 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 14 Apr 2024 22:01:49 +0000 Subject: [PATCH 06/81] fix(deps): update dependency org.springframework:spring-core to v6.1.6 (#1365) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- backend/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/build.gradle b/backend/build.gradle index 25fe3a9b70..92f14b788f 100644 --- a/backend/build.gradle +++ b/backend/build.gradle @@ -29,7 +29,7 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-actuator' implementation 'org.springframework.boot:spring-boot-starter-log4j2' implementation 'org.springframework.boot:spring-boot-starter-validation' - implementation 'org.springframework:spring-core:6.1.5' + implementation 'org.springframework:spring-core:6.1.6' implementation("org.springframework.cloud:spring-cloud-starter-openfeign:4.0.2") { exclude group: 'commons-fileupload', module: 'commons-fileupload' } From 26af590ca55508272bc3364b386c5eb2d300eb7f Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 15 Apr 2024 00:53:31 +0000 Subject: [PATCH 07/81] fix(deps): update dependency typescript to v5.4.5 (#1366) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- docs/pnpm-lock.yaml | 169 ++++++++++++++++++++-------------------- frontend/pnpm-lock.yaml | 98 +++++++++++------------ 2 files changed, 133 insertions(+), 134 deletions(-) diff --git a/docs/pnpm-lock.yaml b/docs/pnpm-lock.yaml index 8ffcf047af..0db8152027 100644 --- a/docs/pnpm-lock.yaml +++ b/docs/pnpm-lock.yaml @@ -10,7 +10,7 @@ dependencies: version: 1.0.2 '@astrojs/check': specifier: ^0.5.9 - version: 0.5.9(prettier-plugin-astro@0.13.0)(prettier@3.2.5)(typescript@5.4.2) + version: 0.5.9(prettier-plugin-astro@0.13.0)(prettier@3.2.5)(typescript@5.4.5) '@fontsource/ibm-plex-mono': specifier: 5.0.12 version: 5.0.12 @@ -69,7 +69,7 @@ devDependencies: version: 3.6.0 '@docsearch/react': specifier: ^3.6.0 - version: 3.6.0(@algolia/client-search@4.23.2)(search-insights@2.13.0) + version: 3.6.0(@algolia/client-search@4.23.3)(search-insights@2.13.0) '@types/canvas-confetti': specifier: ^1.6.4 version: 1.6.4 @@ -87,16 +87,16 @@ devDependencies: version: 20.12.7 '@typescript-eslint/eslint-plugin': specifier: ^7.3.1 - version: 7.4.0(@typescript-eslint/parser@7.4.0)(eslint@8.57.0)(typescript@5.4.2) + version: 7.4.0(@typescript-eslint/parser@7.4.0)(eslint@8.57.0)(typescript@5.4.5) '@typescript-eslint/parser': specifier: ^7.3.1 - version: 7.4.0(eslint@8.57.0)(typescript@5.4.2) + version: 7.4.0(eslint@8.57.0)(typescript@5.4.5) algoliasearch: specifier: ^4.22.1 version: 4.22.1 astro: specifier: ^4.5.7 - version: 4.5.7(@types/node@20.12.7)(sass@1.72.0)(typescript@5.4.2) + version: 4.5.7(@types/node@20.12.7)(sass@1.72.0)(typescript@5.4.5) astro-auto-import: specifier: ^0.4.2 version: 0.4.2(astro@4.5.7) @@ -225,7 +225,7 @@ devDependencies: version: 2.3.0 typescript: specifier: ^5.4.2 - version: 5.4.2 + version: 5.4.5 unified: specifier: ^11.0.4 version: 11.0.4 @@ -286,47 +286,47 @@ packages: unist-util-visit: 2.0.3 dev: false - /@algolia/autocomplete-core@1.9.3(@algolia/client-search@4.23.2)(algoliasearch@4.22.1)(search-insights@2.13.0): + /@algolia/autocomplete-core@1.9.3(@algolia/client-search@4.23.3)(algoliasearch@4.22.1)(search-insights@2.13.0): resolution: {integrity: sha512-009HdfugtGCdC4JdXUbVJClA0q0zh24yyePn+KUGk3rP7j8FEe/m5Yo/z65gn6nP/cM39PxpzqKrL7A6fP6PPw==} dependencies: - '@algolia/autocomplete-plugin-algolia-insights': 1.9.3(@algolia/client-search@4.23.2)(algoliasearch@4.22.1)(search-insights@2.13.0) - '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@4.23.2)(algoliasearch@4.22.1) + '@algolia/autocomplete-plugin-algolia-insights': 1.9.3(@algolia/client-search@4.23.3)(algoliasearch@4.22.1)(search-insights@2.13.0) + '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@4.23.3)(algoliasearch@4.22.1) transitivePeerDependencies: - '@algolia/client-search' - algoliasearch - search-insights dev: true - /@algolia/autocomplete-plugin-algolia-insights@1.9.3(@algolia/client-search@4.23.2)(algoliasearch@4.22.1)(search-insights@2.13.0): + /@algolia/autocomplete-plugin-algolia-insights@1.9.3(@algolia/client-search@4.23.3)(algoliasearch@4.22.1)(search-insights@2.13.0): resolution: {integrity: sha512-a/yTUkcO/Vyy+JffmAnTWbr4/90cLzw+CC3bRbhnULr/EM0fGNvM13oQQ14f2moLMcVDyAx/leczLlAOovhSZg==} peerDependencies: search-insights: '>= 1 < 3' dependencies: - '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@4.23.2)(algoliasearch@4.22.1) + '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@4.23.3)(algoliasearch@4.22.1) search-insights: 2.13.0 transitivePeerDependencies: - '@algolia/client-search' - algoliasearch dev: true - /@algolia/autocomplete-preset-algolia@1.9.3(@algolia/client-search@4.23.2)(algoliasearch@4.22.1): + /@algolia/autocomplete-preset-algolia@1.9.3(@algolia/client-search@4.23.3)(algoliasearch@4.22.1): resolution: {integrity: sha512-d4qlt6YmrLMYy95n5TB52wtNDr6EgAIPH81dvvvW8UmuWRgxEtY0NJiPwl/h95JtG2vmRM804M0DSwMCNZlzRA==} peerDependencies: '@algolia/client-search': '>= 4.9.1 < 6' algoliasearch: '>= 4.9.1 < 6' dependencies: - '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@4.23.2)(algoliasearch@4.22.1) - '@algolia/client-search': 4.23.2 + '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@4.23.3)(algoliasearch@4.22.1) + '@algolia/client-search': 4.23.3 algoliasearch: 4.22.1 dev: true - /@algolia/autocomplete-shared@1.9.3(@algolia/client-search@4.23.2)(algoliasearch@4.22.1): + /@algolia/autocomplete-shared@1.9.3(@algolia/client-search@4.23.3)(algoliasearch@4.22.1): resolution: {integrity: sha512-Wnm9E4Ye6Rl6sTTqjoymD+l8DjSTHsHboVRYrKgEt8Q7UHm9nYbqhN/i0fhUYA3OAEH7WA8x3jfpnmJm3rKvaQ==} peerDependencies: '@algolia/client-search': '>= 4.9.1 < 6' algoliasearch: '>= 4.9.1 < 6' dependencies: - '@algolia/client-search': 4.23.2 + '@algolia/client-search': 4.23.3 algoliasearch: 4.22.1 dev: true @@ -340,8 +340,8 @@ packages: resolution: {integrity: sha512-TJMBKqZNKYB9TptRRjSUtevJeQVXRmg6rk9qgFKWvOy8jhCPdyNZV1nB3SKGufzvTVbomAukFR8guu/8NRKBTA==} dev: true - /@algolia/cache-common@4.23.2: - resolution: {integrity: sha512-OUK/6mqr6CQWxzl/QY0/mwhlGvS6fMtvEPyn/7AHUx96NjqDA4X4+Ju7aXFQKh+m3jW9VPB0B9xvEQgyAnRPNw==} + /@algolia/cache-common@4.23.3: + resolution: {integrity: sha512-h9XcNI6lxYStaw32pHpB1TMm0RuxphF+Ik4o7tcQiodEdpKK+wKufY6QXtba7t3k8eseirEMVB83uFFF3Nu54A==} dev: true /@algolia/cache-in-memory@4.22.1: @@ -374,11 +374,11 @@ packages: '@algolia/transporter': 4.22.1 dev: true - /@algolia/client-common@4.23.2: - resolution: {integrity: sha512-Q2K1FRJBern8kIfZ0EqPvUr3V29ICxCm/q42zInV+VJRjldAD9oTsMGwqUQ26GFMdFYmqkEfCbY4VGAiQhh22g==} + /@algolia/client-common@4.23.3: + resolution: {integrity: sha512-l6EiPxdAlg8CYhroqS5ybfIczsGUIAC47slLPOMDeKSVXYG1n0qGiz4RjAHLw2aD0xzh2EXZ7aRguPfz7UKDKw==} dependencies: - '@algolia/requester-common': 4.23.2 - '@algolia/transporter': 4.23.2 + '@algolia/requester-common': 4.23.3 + '@algolia/transporter': 4.23.3 dev: true /@algolia/client-personalization@4.22.1: @@ -397,20 +397,20 @@ packages: '@algolia/transporter': 4.22.1 dev: true - /@algolia/client-search@4.23.2: - resolution: {integrity: sha512-CxSB29OVGSE7l/iyoHvamMonzq7Ev8lnk/OkzleODZ1iBcCs3JC/XgTIKzN/4RSTrJ9QybsnlrN/bYCGufo7qw==} + /@algolia/client-search@4.23.3: + resolution: {integrity: sha512-P4VAKFHqU0wx9O+q29Q8YVuaowaZ5EM77rxfmGnkHUJggh28useXQdopokgwMeYw2XUht49WX5RcTQ40rZIabw==} dependencies: - '@algolia/client-common': 4.23.2 - '@algolia/requester-common': 4.23.2 - '@algolia/transporter': 4.23.2 + '@algolia/client-common': 4.23.3 + '@algolia/requester-common': 4.23.3 + '@algolia/transporter': 4.23.3 dev: true /@algolia/logger-common@4.22.1: resolution: {integrity: sha512-OnTFymd2odHSO39r4DSWRFETkBufnY2iGUZNrMXpIhF5cmFE8pGoINNPzwg02QLBlGSaLqdKy0bM8S0GyqPLBg==} dev: true - /@algolia/logger-common@4.23.2: - resolution: {integrity: sha512-jGM49Q7626cXZ7qRAWXn0jDlzvoA1FvN4rKTi1g0hxKsTTSReyYk0i1ADWjChDPl3Q+nSDhJuosM2bBUAay7xw==} + /@algolia/logger-common@4.23.3: + resolution: {integrity: sha512-y9kBtmJwiZ9ZZ+1Ek66P0M68mHQzKRxkW5kAAXYN/rdzgDN0d2COsViEFufxJ0pb45K4FRcfC7+33YB4BLrZ+g==} dev: true /@algolia/logger-console@4.22.1: @@ -429,8 +429,8 @@ packages: resolution: {integrity: sha512-dgvhSAtg2MJnR+BxrIFqlLtkLlVVhas9HgYKMk2Uxiy5m6/8HZBL40JVAMb2LovoPFs9I/EWIoFVjOrFwzn5Qg==} dev: true - /@algolia/requester-common@4.23.2: - resolution: {integrity: sha512-3EfpBS0Hri0lGDB5H/BocLt7Vkop0bTTLVUBB844HH6tVycwShmsV6bDR7yXbQvFP1uNpgePRD3cdBCjeHmk6Q==} + /@algolia/requester-common@4.23.3: + resolution: {integrity: sha512-xloIdr/bedtYEGcXCiF2muajyvRhwop4cMZo+K2qzNht0CMzlRkm8YsDdj5IaBhshqfgmBb3rTg4sL4/PpvLYw==} dev: true /@algolia/requester-node-http@4.22.1: @@ -447,12 +447,12 @@ packages: '@algolia/requester-common': 4.22.1 dev: true - /@algolia/transporter@4.23.2: - resolution: {integrity: sha512-GY3aGKBy+8AK4vZh8sfkatDciDVKad5rTY2S10Aefyjh7e7UGBP4zigf42qVXwU8VOPwi7l/L7OACGMOFcjB0Q==} + /@algolia/transporter@4.23.3: + resolution: {integrity: sha512-Wjl5gttqnf/gQKJA+dafnD0Y6Yw97yvfY8R9h0dQltX1GXTgNs1zWgvtWW0tHl1EgMdhAyw189uWiZMnL3QebQ==} dependencies: - '@algolia/cache-common': 4.23.2 - '@algolia/logger-common': 4.23.2 - '@algolia/requester-common': 4.23.2 + '@algolia/cache-common': 4.23.3 + '@algolia/logger-common': 4.23.3 + '@algolia/requester-common': 4.23.3 dev: true /@ampproject/remapping@2.3.0: @@ -463,17 +463,17 @@ packages: '@jridgewell/trace-mapping': 0.3.25 dev: true - /@astrojs/check@0.5.9(prettier-plugin-astro@0.13.0)(prettier@3.2.5)(typescript@5.4.2): + /@astrojs/check@0.5.9(prettier-plugin-astro@0.13.0)(prettier@3.2.5)(typescript@5.4.5): resolution: {integrity: sha512-+QsQMtYq4oso+gmilJC9HLmdi0glZ+04V/VyyTTPry7n21jqjX9SfgDpLGxMk5cwPC/vwZMkn6ORGPnkZS/L5w==} hasBin: true peerDependencies: typescript: ^5.0.0 dependencies: - '@astrojs/language-server': 2.8.3(prettier-plugin-astro@0.13.0)(prettier@3.2.5)(typescript@5.4.2) + '@astrojs/language-server': 2.8.3(prettier-plugin-astro@0.13.0)(prettier@3.2.5)(typescript@5.4.5) chokidar: 3.6.0 fast-glob: 3.3.2 kleur: 4.1.5 - typescript: 5.4.2 + typescript: 5.4.5 yargs: 17.7.2 transitivePeerDependencies: - prettier @@ -490,7 +490,7 @@ packages: resolution: {integrity: sha512-tGmHvrhpzuz0JBHaJX8GywN9g4rldVNHtkoVDC3m/DdzBO70jGoVuc0uuNVglRYnsdwkbG0K02Iw3nOOR3/Y4g==} dev: true - /@astrojs/language-server@2.8.3(prettier-plugin-astro@0.13.0)(prettier@3.2.5)(typescript@5.4.2): + /@astrojs/language-server@2.8.3(prettier-plugin-astro@0.13.0)(prettier@3.2.5)(typescript@5.4.5): resolution: {integrity: sha512-tO47Lcue7OPXfIDbKVDcshwpC13yaWaTVLyiSOnQ2Yng2Z2SgcJf06Cj4xMpJqGp6s7/o/gcQWYUTl2bpkWKig==} hasBin: true peerDependencies: @@ -504,7 +504,7 @@ packages: dependencies: '@astrojs/compiler': 2.7.0 '@jridgewell/sourcemap-codec': 1.4.15 - '@volar/kit': 2.1.2(typescript@5.4.2) + '@volar/kit': 2.1.2(typescript@5.4.5) '@volar/language-core': 2.1.2 '@volar/language-server': 2.1.2 '@volar/language-service': 2.1.2 @@ -583,7 +583,7 @@ packages: '@astrojs/markdown-remark': 4.3.2 '@mdx-js/mdx': 3.0.1 acorn: 8.11.3 - astro: 4.5.7(@types/node@20.12.7)(sass@1.72.0)(typescript@5.4.2) + astro: 4.5.7(@types/node@20.12.7)(sass@1.72.0)(typescript@5.4.5) es-module-lexer: 1.5.0 estree-util-visit: 2.0.0 github-slugger: 2.0.0 @@ -917,7 +917,7 @@ packages: resolution: {integrity: sha512-+sbxb71sWre+PwDK7X2T8+bhS6clcVMLwBPznX45Qu6opJcgRjAp7gYSDzVFp187J+feSj5dNBN1mJoi6ckkUQ==} dev: true - /@docsearch/react@3.6.0(@algolia/client-search@4.23.2)(search-insights@2.13.0): + /@docsearch/react@3.6.0(@algolia/client-search@4.23.3)(search-insights@2.13.0): resolution: {integrity: sha512-HUFut4ztcVNmqy9gp/wxNbC7pTOHhgVVkHVGCACTuLhUKUhKAF9KYHJtMiLUJxEqiFLQiuri1fWF8zqwM/cu1w==} peerDependencies: '@types/react': '>= 16.8.0 < 19.0.0' @@ -934,8 +934,8 @@ packages: search-insights: optional: true dependencies: - '@algolia/autocomplete-core': 1.9.3(@algolia/client-search@4.23.2)(algoliasearch@4.22.1)(search-insights@2.13.0) - '@algolia/autocomplete-preset-algolia': 1.9.3(@algolia/client-search@4.23.2)(algoliasearch@4.22.1) + '@algolia/autocomplete-core': 1.9.3(@algolia/client-search@4.23.3)(algoliasearch@4.22.1)(search-insights@2.13.0) + '@algolia/autocomplete-preset-algolia': 1.9.3(@algolia/client-search@4.23.3)(algoliasearch@4.22.1) '@docsearch/css': 3.6.0 algoliasearch: 4.22.1 search-insights: 2.13.0 @@ -1969,7 +1969,7 @@ packages: /@types/unist@3.0.2: resolution: {integrity: sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==} - /@typescript-eslint/eslint-plugin@7.4.0(@typescript-eslint/parser@7.4.0)(eslint@8.57.0)(typescript@5.4.2): + /@typescript-eslint/eslint-plugin@7.4.0(@typescript-eslint/parser@7.4.0)(eslint@8.57.0)(typescript@5.4.5): resolution: {integrity: sha512-yHMQ/oFaM7HZdVrVm/M2WHaNPgyuJH4WelkSVEWSSsir34kxW2kDJCxlXRhhGWEsMN0WAW/vLpKfKVcm8k+MPw==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: @@ -1981,10 +1981,10 @@ packages: optional: true dependencies: '@eslint-community/regexpp': 4.10.0 - '@typescript-eslint/parser': 7.4.0(eslint@8.57.0)(typescript@5.4.2) + '@typescript-eslint/parser': 7.4.0(eslint@8.57.0)(typescript@5.4.5) '@typescript-eslint/scope-manager': 7.4.0 - '@typescript-eslint/type-utils': 7.4.0(eslint@8.57.0)(typescript@5.4.2) - '@typescript-eslint/utils': 7.4.0(eslint@8.57.0)(typescript@5.4.2) + '@typescript-eslint/type-utils': 7.4.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/utils': 7.4.0(eslint@8.57.0)(typescript@5.4.5) '@typescript-eslint/visitor-keys': 7.4.0 debug: 4.3.4 eslint: 8.57.0 @@ -1992,13 +1992,13 @@ packages: ignore: 5.3.1 natural-compare: 1.4.0 semver: 7.6.0 - ts-api-utils: 1.3.0(typescript@5.4.2) - typescript: 5.4.2 + ts-api-utils: 1.3.0(typescript@5.4.5) + typescript: 5.4.5 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/parser@7.4.0(eslint@8.57.0)(typescript@5.4.2): + /@typescript-eslint/parser@7.4.0(eslint@8.57.0)(typescript@5.4.5): resolution: {integrity: sha512-ZvKHxHLusweEUVwrGRXXUVzFgnWhigo4JurEj0dGF1tbcGh6buL+ejDdjxOQxv6ytcY1uhun1p2sm8iWStlgLQ==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: @@ -2010,11 +2010,11 @@ packages: dependencies: '@typescript-eslint/scope-manager': 7.4.0 '@typescript-eslint/types': 7.4.0 - '@typescript-eslint/typescript-estree': 7.4.0(typescript@5.4.2) + '@typescript-eslint/typescript-estree': 7.4.0(typescript@5.4.5) '@typescript-eslint/visitor-keys': 7.4.0 debug: 4.3.4 eslint: 8.57.0 - typescript: 5.4.2 + typescript: 5.4.5 transitivePeerDependencies: - supports-color dev: true @@ -2035,7 +2035,7 @@ packages: '@typescript-eslint/visitor-keys': 7.4.0 dev: true - /@typescript-eslint/type-utils@7.4.0(eslint@8.57.0)(typescript@5.4.2): + /@typescript-eslint/type-utils@7.4.0(eslint@8.57.0)(typescript@5.4.5): resolution: {integrity: sha512-247ETeHgr9WTRMqHbbQdzwzhuyaJ8dPTuyuUEMANqzMRB1rj/9qFIuIXK7l0FX9i9FXbHeBQl/4uz6mYuCE7Aw==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: @@ -2045,12 +2045,12 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': 7.4.0(typescript@5.4.2) - '@typescript-eslint/utils': 7.4.0(eslint@8.57.0)(typescript@5.4.2) + '@typescript-eslint/typescript-estree': 7.4.0(typescript@5.4.5) + '@typescript-eslint/utils': 7.4.0(eslint@8.57.0)(typescript@5.4.5) debug: 4.3.4 eslint: 8.57.0 - ts-api-utils: 1.3.0(typescript@5.4.2) - typescript: 5.4.2 + ts-api-utils: 1.3.0(typescript@5.4.5) + typescript: 5.4.5 transitivePeerDependencies: - supports-color dev: true @@ -2065,7 +2065,7 @@ packages: engines: {node: ^18.18.0 || >=20.0.0} dev: true - /@typescript-eslint/typescript-estree@7.4.0(typescript@5.4.2): + /@typescript-eslint/typescript-estree@7.4.0(typescript@5.4.5): resolution: {integrity: sha512-A99j5AYoME/UBQ1ucEbbMEmGkN7SE0BvZFreSnTd1luq7yulcHdyGamZKizU7canpGDWGJ+Q6ZA9SyQobipePg==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: @@ -2081,13 +2081,13 @@ packages: is-glob: 4.0.3 minimatch: 9.0.3 semver: 7.6.0 - ts-api-utils: 1.3.0(typescript@5.4.2) - typescript: 5.4.2 + ts-api-utils: 1.3.0(typescript@5.4.5) + typescript: 5.4.5 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/utils@7.4.0(eslint@8.57.0)(typescript@5.4.2): + /@typescript-eslint/utils@7.4.0(eslint@8.57.0)(typescript@5.4.5): resolution: {integrity: sha512-NQt9QLM4Tt8qrlBVY9lkMYzfYtNz8/6qwZg8pI3cMGlPnj6mOpRxxAm7BMJN9K0AiY+1BwJ5lVC650YJqYOuNg==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: @@ -2098,7 +2098,7 @@ packages: '@types/semver': 7.5.8 '@typescript-eslint/scope-manager': 7.4.0 '@typescript-eslint/types': 7.4.0 - '@typescript-eslint/typescript-estree': 7.4.0(typescript@5.4.2) + '@typescript-eslint/typescript-estree': 7.4.0(typescript@5.4.5) eslint: 8.57.0 semver: 7.6.0 transitivePeerDependencies: @@ -2164,7 +2164,7 @@ packages: pretty-format: 29.7.0 dev: true - /@volar/kit@2.1.2(typescript@5.4.2): + /@volar/kit@2.1.2(typescript@5.4.5): resolution: {integrity: sha512-u20R1lCWCgFYBCHC+FR/e9J+P61vUNQpyWt4keAY+zpVHEHsSXVA2xWMJV1l1Iq5Dd0jBUSqrb1zsEya455AzA==} peerDependencies: typescript: '*' @@ -2172,7 +2172,7 @@ packages: '@volar/language-service': 2.1.2 '@volar/typescript': 2.1.2 typesafe-path: 0.2.2 - typescript: 5.4.2 + typescript: 5.4.5 vscode-languageserver-textdocument: 1.0.11 vscode-uri: 3.0.8 dev: false @@ -2498,7 +2498,7 @@ packages: dependencies: '@types/node': 18.19.26 acorn: 8.11.3 - astro: 4.5.7(@types/node@20.12.7)(sass@1.72.0)(typescript@5.4.2) + astro: 4.5.7(@types/node@20.12.7)(sass@1.72.0)(typescript@5.4.5) dev: true /astro-eslint-parser@0.16.3: @@ -2523,7 +2523,7 @@ packages: peerDependencies: astro: ^4.0.0-beta || ^3.3.0 dependencies: - astro: 4.5.7(@types/node@20.12.7)(sass@1.72.0)(typescript@5.4.2) + astro: 4.5.7(@types/node@20.12.7)(sass@1.72.0)(typescript@5.4.5) hast-util-to-html: 8.0.4 remark-expressive-code: 0.33.5 dev: true @@ -2534,13 +2534,13 @@ packages: peerDependencies: astro: ^3.0.0 || ^4.0.0 dependencies: - astro: 4.5.7(@types/node@20.12.7)(sass@1.72.0)(typescript@5.4.2) + astro: 4.5.7(@types/node@20.12.7)(sass@1.72.0)(typescript@5.4.5) canvaskit-wasm: 0.37.2 deterministic-object-hash: 2.0.2 entities: 4.5.0 dev: true - /astro@4.5.7(@types/node@20.12.7)(sass@1.72.0)(typescript@5.4.2): + /astro@4.5.7(@types/node@20.12.7)(sass@1.72.0)(typescript@5.4.5): resolution: {integrity: sha512-Ioeg3TV42dOJvf6GlmykeR3EKZ8+JcnZyJ/X9qDPzVf2OREmtvW0182YCDXQBqwXFRHndZRcHLqinAWjzZYh/A==} engines: {node: '>=18.14.1', npm: '>=6.14.0'} hasBin: true @@ -2598,7 +2598,7 @@ packages: shiki: 1.2.0 string-width: 7.1.0 strip-ansi: 7.1.0 - tsconfck: 3.0.3(typescript@5.4.2) + tsconfck: 3.0.3(typescript@5.4.5) unist-util-visit: 5.0.0 vfile: 6.0.1 vite: 5.2.8(@types/node@20.12.7)(sass@1.72.0) @@ -2670,13 +2670,12 @@ packages: dev: true optional: true - /bare-fs@2.2.2: - resolution: {integrity: sha512-X9IqgvyB0/VA5OZJyb5ZstoN62AzD7YxVGog13kkfYWYqJYcK0kcqLZ6TrmH5qr4/8//ejVcX4x/a0UvaogXmA==} + /bare-fs@2.2.3: + resolution: {integrity: sha512-amG72llr9pstfXOBOHve1WjiuKKAMnebcmMbPWDZ7BCevAoJLpugjuAPRsDINEyjT0a6tbaVx3DctkXIRbLuJw==} requiresBuild: true dependencies: bare-events: 2.2.1 - bare-os: 2.2.1 - bare-path: 2.1.0 + bare-path: 2.1.1 streamx: 2.16.1 dev: true optional: true @@ -2687,8 +2686,8 @@ packages: dev: true optional: true - /bare-path@2.1.0: - resolution: {integrity: sha512-DIIg7ts8bdRKwJRJrUMy/PICEaQZaPGZ26lsSx9MJSwIhSrcdHn7/C8W+XmnG/rKi6BaRcz+JO00CjZteybDtw==} + /bare-path@2.1.1: + resolution: {integrity: sha512-OHM+iwRDRMDBsSW7kl3dO62JyHdBKO3B25FB9vNQBPcGHMo4+eA8Yj41Lfbk3pS/seDY+siNge0LdRTulAau/A==} requiresBuild: true dependencies: bare-os: 2.2.1 @@ -7419,8 +7418,8 @@ packages: pump: 3.0.0 tar-stream: 3.1.7 optionalDependencies: - bare-fs: 2.2.2 - bare-path: 2.1.0 + bare-fs: 2.2.3 + bare-path: 2.1.1 dev: true optional: true @@ -7490,13 +7489,13 @@ packages: /trough@2.2.0: resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} - /ts-api-utils@1.3.0(typescript@5.4.2): + /ts-api-utils@1.3.0(typescript@5.4.5): resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} engines: {node: '>=16'} peerDependencies: typescript: '>=4.2.0' dependencies: - typescript: 5.4.2 + typescript: 5.4.5 dev: true /ts-morph@15.1.0: @@ -7506,7 +7505,7 @@ packages: code-block-writer: 11.0.3 dev: true - /tsconfck@3.0.3(typescript@5.4.2): + /tsconfck@3.0.3(typescript@5.4.5): resolution: {integrity: sha512-4t0noZX9t6GcPTfBAbIbbIU4pfpCwh0ueq3S4O/5qXI1VwK1outmxhe9dOiEWqMz3MW2LKgDTpqWV+37IWuVbA==} engines: {node: ^18 || >=20} hasBin: true @@ -7516,7 +7515,7 @@ packages: typescript: optional: true dependencies: - typescript: 5.4.2 + typescript: 5.4.5 dev: true /tsconfig@7.0.0: @@ -7634,8 +7633,8 @@ packages: semver: 7.6.0 dev: false - /typescript@5.4.2: - resolution: {integrity: sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==} + /typescript@5.4.5: + resolution: {integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==} engines: {node: '>=14.17'} hasBin: true diff --git a/frontend/pnpm-lock.yaml b/frontend/pnpm-lock.yaml index 319087c0c4..db21d63f98 100644 --- a/frontend/pnpm-lock.yaml +++ b/frontend/pnpm-lock.yaml @@ -55,7 +55,7 @@ dependencies: version: 6.22.3(react-dom@18.2.0)(react@18.2.0) typescript: specifier: ^5.4.2 - version: 5.4.2 + version: 5.4.5 vite: specifier: ^5.2.2 version: 5.2.6(@types/node@20.11.30) @@ -105,10 +105,10 @@ devDependencies: version: 7.1.33 '@typescript-eslint/eslint-plugin': specifier: ^7.3.1 - version: 7.4.0(@typescript-eslint/parser@7.4.0)(eslint@8.57.0)(typescript@5.4.2) + version: 7.4.0(@typescript-eslint/parser@7.4.0)(eslint@8.57.0)(typescript@5.4.5) '@typescript-eslint/parser': specifier: ^7.3.1 - version: 7.4.0(eslint@8.57.0)(typescript@5.4.2) + version: 7.4.0(eslint@8.57.0)(typescript@5.4.5) '@vitejs/plugin-react-swc': specifier: ^3.6.0 version: 3.6.0(vite@5.2.6) @@ -162,13 +162,13 @@ devDependencies: version: 29.7.0 license-compliance: specifier: ^2.0.1 - version: 2.0.1(typescript@5.4.2) + version: 2.0.1(typescript@5.4.5) lint-staged: specifier: ^15.2.2 version: 15.2.2 msw: specifier: ^1.3.3 - version: 1.3.3(typescript@5.4.2) + version: 1.3.3(typescript@5.4.5) node-fetch: specifier: ^3.3.2 version: 3.3.2 @@ -177,16 +177,16 @@ devDependencies: version: 3.2.5 prettier-plugin-sort-imports: specifier: ^1.8.4 - version: 1.8.4(typescript@5.4.2) + version: 1.8.4(typescript@5.4.5) ts-jest: specifier: ^29.1.2 - version: 29.1.2(@babel/core@7.24.3)(jest@29.7.0)(typescript@5.4.2) + version: 29.1.2(@babel/core@7.24.3)(jest@29.7.0)(typescript@5.4.5) ts-node: specifier: ^10.9.2 - version: 10.9.2(@types/node@20.11.30)(typescript@5.4.2) + version: 10.9.2(@types/node@20.11.30)(typescript@5.4.5) tsc-files: specifier: ^1.1.4 - version: 1.1.4(typescript@5.4.2) + version: 1.1.4(typescript@5.4.5) packages: @@ -3480,7 +3480,7 @@ packages: '@types/yargs-parser': 21.0.3 dev: true - /@typescript-eslint/eslint-plugin@7.4.0(@typescript-eslint/parser@7.4.0)(eslint@8.57.0)(typescript@5.4.2): + /@typescript-eslint/eslint-plugin@7.4.0(@typescript-eslint/parser@7.4.0)(eslint@8.57.0)(typescript@5.4.5): resolution: {integrity: sha512-yHMQ/oFaM7HZdVrVm/M2WHaNPgyuJH4WelkSVEWSSsir34kxW2kDJCxlXRhhGWEsMN0WAW/vLpKfKVcm8k+MPw==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: @@ -3492,10 +3492,10 @@ packages: optional: true dependencies: '@eslint-community/regexpp': 4.10.0 - '@typescript-eslint/parser': 7.4.0(eslint@8.57.0)(typescript@5.4.2) + '@typescript-eslint/parser': 7.4.0(eslint@8.57.0)(typescript@5.4.5) '@typescript-eslint/scope-manager': 7.4.0 - '@typescript-eslint/type-utils': 7.4.0(eslint@8.57.0)(typescript@5.4.2) - '@typescript-eslint/utils': 7.4.0(eslint@8.57.0)(typescript@5.4.2) + '@typescript-eslint/type-utils': 7.4.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/utils': 7.4.0(eslint@8.57.0)(typescript@5.4.5) '@typescript-eslint/visitor-keys': 7.4.0 debug: 4.3.4 eslint: 8.57.0 @@ -3503,13 +3503,13 @@ packages: ignore: 5.3.1 natural-compare: 1.4.0 semver: 7.6.0 - ts-api-utils: 1.3.0(typescript@5.4.2) - typescript: 5.4.2 + ts-api-utils: 1.3.0(typescript@5.4.5) + typescript: 5.4.5 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/parser@7.4.0(eslint@8.57.0)(typescript@5.4.2): + /@typescript-eslint/parser@7.4.0(eslint@8.57.0)(typescript@5.4.5): resolution: {integrity: sha512-ZvKHxHLusweEUVwrGRXXUVzFgnWhigo4JurEj0dGF1tbcGh6buL+ejDdjxOQxv6ytcY1uhun1p2sm8iWStlgLQ==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: @@ -3521,11 +3521,11 @@ packages: dependencies: '@typescript-eslint/scope-manager': 7.4.0 '@typescript-eslint/types': 7.4.0 - '@typescript-eslint/typescript-estree': 7.4.0(typescript@5.4.2) + '@typescript-eslint/typescript-estree': 7.4.0(typescript@5.4.5) '@typescript-eslint/visitor-keys': 7.4.0 debug: 4.3.4 eslint: 8.57.0 - typescript: 5.4.2 + typescript: 5.4.5 transitivePeerDependencies: - supports-color dev: true @@ -3538,7 +3538,7 @@ packages: '@typescript-eslint/visitor-keys': 7.4.0 dev: true - /@typescript-eslint/type-utils@7.4.0(eslint@8.57.0)(typescript@5.4.2): + /@typescript-eslint/type-utils@7.4.0(eslint@8.57.0)(typescript@5.4.5): resolution: {integrity: sha512-247ETeHgr9WTRMqHbbQdzwzhuyaJ8dPTuyuUEMANqzMRB1rj/9qFIuIXK7l0FX9i9FXbHeBQl/4uz6mYuCE7Aw==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: @@ -3548,12 +3548,12 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': 7.4.0(typescript@5.4.2) - '@typescript-eslint/utils': 7.4.0(eslint@8.57.0)(typescript@5.4.2) + '@typescript-eslint/typescript-estree': 7.4.0(typescript@5.4.5) + '@typescript-eslint/utils': 7.4.0(eslint@8.57.0)(typescript@5.4.5) debug: 4.3.4 eslint: 8.57.0 - ts-api-utils: 1.3.0(typescript@5.4.2) - typescript: 5.4.2 + ts-api-utils: 1.3.0(typescript@5.4.5) + typescript: 5.4.5 transitivePeerDependencies: - supports-color dev: true @@ -3563,7 +3563,7 @@ packages: engines: {node: ^18.18.0 || >=20.0.0} dev: true - /@typescript-eslint/typescript-estree@7.4.0(typescript@5.4.2): + /@typescript-eslint/typescript-estree@7.4.0(typescript@5.4.5): resolution: {integrity: sha512-A99j5AYoME/UBQ1ucEbbMEmGkN7SE0BvZFreSnTd1luq7yulcHdyGamZKizU7canpGDWGJ+Q6ZA9SyQobipePg==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: @@ -3579,13 +3579,13 @@ packages: is-glob: 4.0.3 minimatch: 9.0.3 semver: 7.6.0 - ts-api-utils: 1.3.0(typescript@5.4.2) - typescript: 5.4.2 + ts-api-utils: 1.3.0(typescript@5.4.5) + typescript: 5.4.5 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/utils@7.4.0(eslint@8.57.0)(typescript@5.4.2): + /@typescript-eslint/utils@7.4.0(eslint@8.57.0)(typescript@5.4.5): resolution: {integrity: sha512-NQt9QLM4Tt8qrlBVY9lkMYzfYtNz8/6qwZg8pI3cMGlPnj6mOpRxxAm7BMJN9K0AiY+1BwJ5lVC650YJqYOuNg==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: @@ -3596,7 +3596,7 @@ packages: '@types/semver': 7.5.8 '@typescript-eslint/scope-manager': 7.4.0 '@typescript-eslint/types': 7.4.0 - '@typescript-eslint/typescript-estree': 7.4.0(typescript@5.4.2) + '@typescript-eslint/typescript-estree': 7.4.0(typescript@5.4.5) eslint: 8.57.0 semver: 7.6.0 transitivePeerDependencies: @@ -4489,7 +4489,7 @@ packages: yaml: 1.10.2 dev: false - /cosmiconfig@8.3.6(typescript@5.4.2): + /cosmiconfig@8.3.6(typescript@5.4.5): resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} engines: {node: '>=14'} peerDependencies: @@ -4502,7 +4502,7 @@ packages: js-yaml: 4.1.0 parse-json: 5.2.0 path-type: 4.0.0 - typescript: 5.4.2 + typescript: 5.4.5 dev: true /create-jest@29.7.0(@types/node@20.11.30)(ts-node@10.9.2): @@ -5168,7 +5168,7 @@ packages: eslint-import-resolver-webpack: optional: true dependencies: - '@typescript-eslint/parser': 7.4.0(eslint@8.57.0)(typescript@5.4.2) + '@typescript-eslint/parser': 7.4.0(eslint@8.57.0)(typescript@5.4.5) debug: 3.2.7 eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 @@ -5198,7 +5198,7 @@ packages: '@typescript-eslint/parser': optional: true dependencies: - '@typescript-eslint/parser': 7.4.0(eslint@8.57.0)(typescript@5.4.2) + '@typescript-eslint/parser': 7.4.0(eslint@8.57.0)(typescript@5.4.5) array-includes: 3.1.7 array.prototype.findlastindex: 1.2.5 array.prototype.flat: 1.3.2 @@ -6580,7 +6580,7 @@ packages: pretty-format: 29.7.0 slash: 3.0.0 strip-json-comments: 3.1.1 - ts-node: 10.9.2(@types/node@20.11.30)(typescript@5.4.2) + ts-node: 10.9.2(@types/node@20.11.30)(typescript@5.4.5) transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -7103,14 +7103,14 @@ packages: type-check: 0.4.0 dev: true - /license-compliance@2.0.1(typescript@5.4.2): + /license-compliance@2.0.1(typescript@5.4.5): resolution: {integrity: sha512-c6w74uKnDgvbW3opy8NFMeX1pgWsHl8dLOu7Bc85s9eurXYCzF5x+Sj7gvZJIjtsYu3vQ7aYYpjc23ru+4onPA==} engines: {node: '>=14.17.0'} hasBin: true dependencies: chalk: 4.1.2 commander: 11.1.0 - cosmiconfig: 8.3.6(typescript@5.4.2) + cosmiconfig: 8.3.6(typescript@5.4.5) debug: 4.3.4 joi: 17.11.0 spdx-expression-parse: 3.0.1 @@ -7393,7 +7393,7 @@ packages: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} dev: true - /msw@1.3.3(typescript@5.4.2): + /msw@1.3.3(typescript@5.4.5): resolution: {integrity: sha512-CiPyRFiYJCXYyH/vwxT7m+sa4VZHuUH6cGwRBj0kaTjBGpsk4EnL47YzhoA859htVCF2vzqZuOsomIUlFqg9GQ==} engines: {node: '>=14'} hasBin: true @@ -7422,7 +7422,7 @@ packages: path-to-regexp: 6.2.1 strict-event-emitter: 0.4.6 type-fest: 2.19.0 - typescript: 5.4.2 + typescript: 5.4.5 yargs: 17.7.2 transitivePeerDependencies: - encoding @@ -7861,13 +7861,13 @@ packages: fast-diff: 1.3.0 dev: true - /prettier-plugin-sort-imports@1.8.4(typescript@5.4.2): + /prettier-plugin-sort-imports@1.8.4(typescript@5.4.5): resolution: {integrity: sha512-3Y5TK68TXdP+ViIzRNp4bvjjjPZ0MULL96ImBVTwWtKiIOIcuBIzFmtfPEzOVHaX0tJa3MGChrzmJAsyObvPbA==} peerDependencies: typescript: '>4.0.0' dependencies: prettier: 3.2.5 - typescript: 5.4.2 + typescript: 5.4.5 dev: true /prettier@3.2.5: @@ -8918,16 +8918,16 @@ packages: engines: {node: '>= 14.0.0'} dev: true - /ts-api-utils@1.3.0(typescript@5.4.2): + /ts-api-utils@1.3.0(typescript@5.4.5): resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} engines: {node: '>=16'} peerDependencies: typescript: '>=4.2.0' dependencies: - typescript: 5.4.2 + typescript: 5.4.5 dev: true - /ts-jest@29.1.2(@babel/core@7.24.3)(jest@29.7.0)(typescript@5.4.2): + /ts-jest@29.1.2(@babel/core@7.24.3)(jest@29.7.0)(typescript@5.4.5): resolution: {integrity: sha512-br6GJoH/WUX4pu7FbZXuWGKGNDuU7b8Uj77g/Sp7puZV6EXzuByl6JrECvm0MzVzSTkSHWTihsXt+5XYER5b+g==} engines: {node: ^16.10.0 || ^18.0.0 || >=20.0.0} hasBin: true @@ -8957,11 +8957,11 @@ packages: lodash.memoize: 4.1.2 make-error: 1.3.6 semver: 7.6.0 - typescript: 5.4.2 + typescript: 5.4.5 yargs-parser: 21.1.1 dev: true - /ts-node@10.9.2(@types/node@20.11.30)(typescript@5.4.2): + /ts-node@10.9.2(@types/node@20.11.30)(typescript@5.4.5): resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} hasBin: true peerDependencies: @@ -8987,18 +8987,18 @@ packages: create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 5.4.2 + typescript: 5.4.5 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 dev: true - /tsc-files@1.1.4(typescript@5.4.2): + /tsc-files@1.1.4(typescript@5.4.5): resolution: {integrity: sha512-RePsRsOLru3BPpnf237y1Xe1oCGta8rmSYzM76kYo5tLGsv5R2r3s64yapYorGTPuuLyfS9NVbh9ydzmvNie2w==} hasBin: true peerDependencies: typescript: '>=3' dependencies: - typescript: 5.4.2 + typescript: 5.4.5 dev: true /tsconfig-paths@3.15.0: @@ -9097,8 +9097,8 @@ packages: is-typedarray: 1.0.0 dev: true - /typescript@5.4.2: - resolution: {integrity: sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==} + /typescript@5.4.5: + resolution: {integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==} engines: {node: '>=14.17'} hasBin: true From 221a06250befb8ba7eaea52df965ed8ba2a16f89 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 15 Apr 2024 03:58:33 +0000 Subject: [PATCH 08/81] fix(deps): update dependency vite to v5.2.8 (#1367) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- frontend/pnpm-lock.yaml | 116 ++++++++++++++++++++-------------------- 1 file changed, 58 insertions(+), 58 deletions(-) diff --git a/frontend/pnpm-lock.yaml b/frontend/pnpm-lock.yaml index db21d63f98..ea4b1fab3b 100644 --- a/frontend/pnpm-lock.yaml +++ b/frontend/pnpm-lock.yaml @@ -58,10 +58,10 @@ dependencies: version: 5.4.5 vite: specifier: ^5.2.2 - version: 5.2.6(@types/node@20.11.30) + version: 5.2.8(@types/node@20.11.30) vite-plugin-pwa: specifier: ^0.19.5 - version: 0.19.5(vite@5.2.6)(workbox-build@7.0.0)(workbox-window@7.0.0) + version: 0.19.5(vite@5.2.8)(workbox-build@7.0.0)(workbox-window@7.0.0) devDependencies: '@dotenvx/dotenvx': @@ -111,7 +111,7 @@ devDependencies: version: 7.4.0(eslint@8.57.0)(typescript@5.4.5) '@vitejs/plugin-react-swc': specifier: ^3.6.0 - version: 3.6.0(vite@5.2.6) + version: 3.6.0(vite@5.2.8) audit-ci: specifier: ^6.6.1 version: 6.6.1 @@ -2837,106 +2837,106 @@ packages: rollup: 2.79.1 dev: false - /@rollup/rollup-android-arm-eabi@4.14.0: - resolution: {integrity: sha512-jwXtxYbRt1V+CdQSy6Z+uZti7JF5irRKF8hlKfEnF/xJpcNGuuiZMBvuoYM+x9sr9iWGnzrlM0+9hvQ1kgkf1w==} + /@rollup/rollup-android-arm-eabi@4.14.2: + resolution: {integrity: sha512-ahxSgCkAEk+P/AVO0vYr7DxOD3CwAQrT0Go9BJyGQ9Ef0QxVOfjDZMiF4Y2s3mLyPrjonchIMH/tbWHucJMykQ==} cpu: [arm] os: [android] requiresBuild: true optional: true - /@rollup/rollup-android-arm64@4.14.0: - resolution: {integrity: sha512-fI9nduZhCccjzlsA/OuAwtFGWocxA4gqXGTLvOyiF8d+8o0fZUeSztixkYjcGq1fGZY3Tkq4yRvHPFxU+jdZ9Q==} + /@rollup/rollup-android-arm64@4.14.2: + resolution: {integrity: sha512-lAarIdxZWbFSHFSDao9+I/F5jDaKyCqAPMq5HqnfpBw8dKDiCaaqM0lq5h1pQTLeIqueeay4PieGR5jGZMWprw==} cpu: [arm64] os: [android] requiresBuild: true optional: true - /@rollup/rollup-darwin-arm64@4.14.0: - resolution: {integrity: sha512-BcnSPRM76/cD2gQC+rQNGBN6GStBs2pl/FpweW8JYuz5J/IEa0Fr4AtrPv766DB/6b2MZ/AfSIOSGw3nEIP8SA==} + /@rollup/rollup-darwin-arm64@4.14.2: + resolution: {integrity: sha512-SWsr8zEUk82KSqquIMgZEg2GE5mCSfr9sE/thDROkX6pb3QQWPp8Vw8zOq2GyxZ2t0XoSIUlvHDkrf5Gmf7x3Q==} cpu: [arm64] os: [darwin] requiresBuild: true optional: true - /@rollup/rollup-darwin-x64@4.14.0: - resolution: {integrity: sha512-LDyFB9GRolGN7XI6955aFeI3wCdCUszFWumWU0deHA8VpR3nWRrjG6GtGjBrQxQKFevnUTHKCfPR4IvrW3kCgQ==} + /@rollup/rollup-darwin-x64@4.14.2: + resolution: {integrity: sha512-o/HAIrQq0jIxJAhgtIvV5FWviYK4WB0WwV91SLUnsliw1lSAoLsmgEEgRWzDguAFeUEUUoIWXiJrPqU7vGiVkA==} cpu: [x64] os: [darwin] requiresBuild: true optional: true - /@rollup/rollup-linux-arm-gnueabihf@4.14.0: - resolution: {integrity: sha512-ygrGVhQP47mRh0AAD0zl6QqCbNsf0eTo+vgwkY6LunBcg0f2Jv365GXlDUECIyoXp1kKwL5WW6rsO429DBY/bA==} + /@rollup/rollup-linux-arm-gnueabihf@4.14.2: + resolution: {integrity: sha512-nwlJ65UY9eGq91cBi6VyDfArUJSKOYt5dJQBq8xyLhvS23qO+4Nr/RreibFHjP6t+5ap2ohZrUJcHv5zk5ju/g==} cpu: [arm] os: [linux] requiresBuild: true optional: true - /@rollup/rollup-linux-arm64-gnu@4.14.0: - resolution: {integrity: sha512-x+uJ6MAYRlHGe9wi4HQjxpaKHPM3d3JjqqCkeC5gpnnI6OWovLdXTpfa8trjxPLnWKyBsSi5kne+146GAxFt4A==} + /@rollup/rollup-linux-arm64-gnu@4.14.2: + resolution: {integrity: sha512-Pg5TxxO2IVlMj79+c/9G0LREC9SY3HM+pfAwX7zj5/cAuwrbfj2Wv9JbMHIdPCfQpYsI4g9mE+2Bw/3aeSs2rQ==} cpu: [arm64] os: [linux] requiresBuild: true optional: true - /@rollup/rollup-linux-arm64-musl@4.14.0: - resolution: {integrity: sha512-nrRw8ZTQKg6+Lttwqo6a2VxR9tOroa2m91XbdQ2sUUzHoedXlsyvY1fN4xWdqz8PKmf4orDwejxXHjh7YBGUCA==} + /@rollup/rollup-linux-arm64-musl@4.14.2: + resolution: {integrity: sha512-cAOTjGNm84gc6tS02D1EXtG7tDRsVSDTBVXOLbj31DkwfZwgTPYZ6aafSU7rD/4R2a34JOwlF9fQayuTSkoclA==} cpu: [arm64] os: [linux] requiresBuild: true optional: true - /@rollup/rollup-linux-powerpc64le-gnu@4.14.0: - resolution: {integrity: sha512-xV0d5jDb4aFu84XKr+lcUJ9y3qpIWhttO3Qev97z8DKLXR62LC3cXT/bMZXrjLF9X+P5oSmJTzAhqwUbY96PnA==} - cpu: [ppc64le] + /@rollup/rollup-linux-powerpc64le-gnu@4.14.2: + resolution: {integrity: sha512-4RyT6v1kXb7C0fn6zV33rvaX05P0zHoNzaXI/5oFHklfKm602j+N4mn2YvoezQViRLPnxP8M1NaY4s/5kXO5cw==} + cpu: [ppc64] os: [linux] requiresBuild: true optional: true - /@rollup/rollup-linux-riscv64-gnu@4.14.0: - resolution: {integrity: sha512-SDDhBQwZX6LPRoPYjAZWyL27LbcBo7WdBFWJi5PI9RPCzU8ijzkQn7tt8NXiXRiFMJCVpkuMkBf4OxSxVMizAw==} + /@rollup/rollup-linux-riscv64-gnu@4.14.2: + resolution: {integrity: sha512-KNUH6jC/vRGAKSorySTyc/yRYlCwN/5pnMjXylfBniwtJx5O7X17KG/0efj8XM3TZU7raYRXJFFReOzNmL1n1w==} cpu: [riscv64] os: [linux] requiresBuild: true optional: true - /@rollup/rollup-linux-s390x-gnu@4.14.0: - resolution: {integrity: sha512-RxB/qez8zIDshNJDufYlTT0ZTVut5eCpAZ3bdXDU9yTxBzui3KhbGjROK2OYTTor7alM7XBhssgoO3CZ0XD3qA==} + /@rollup/rollup-linux-s390x-gnu@4.14.2: + resolution: {integrity: sha512-xPV4y73IBEXToNPa3h5lbgXOi/v0NcvKxU0xejiFw6DtIYQqOTMhZ2DN18/HrrP0PmiL3rGtRG9gz1QE8vFKXQ==} cpu: [s390x] os: [linux] requiresBuild: true optional: true - /@rollup/rollup-linux-x64-gnu@4.14.0: - resolution: {integrity: sha512-C6y6z2eCNCfhZxT9u+jAM2Fup89ZjiG5pIzZIDycs1IwESviLxwkQcFRGLjnDrP+PT+v5i4YFvlcfAs+LnreXg==} + /@rollup/rollup-linux-x64-gnu@4.14.2: + resolution: {integrity: sha512-QBhtr07iFGmF9egrPOWyO5wciwgtzKkYPNLVCFZTmr4TWmY0oY2Dm/bmhHjKRwZoGiaKdNcKhFtUMBKvlchH+Q==} cpu: [x64] os: [linux] requiresBuild: true optional: true - /@rollup/rollup-linux-x64-musl@4.14.0: - resolution: {integrity: sha512-i0QwbHYfnOMYsBEyjxcwGu5SMIi9sImDVjDg087hpzXqhBSosxkE7gyIYFHgfFl4mr7RrXksIBZ4DoLoP4FhJg==} + /@rollup/rollup-linux-x64-musl@4.14.2: + resolution: {integrity: sha512-8zfsQRQGH23O6qazZSFY5jP5gt4cFvRuKTpuBsC1ZnSWxV8ZKQpPqOZIUtdfMOugCcBvFGRa1pDC/tkf19EgBw==} cpu: [x64] os: [linux] requiresBuild: true optional: true - /@rollup/rollup-win32-arm64-msvc@4.14.0: - resolution: {integrity: sha512-Fq52EYb0riNHLBTAcL0cun+rRwyZ10S9vKzhGKKgeD+XbwunszSY0rVMco5KbOsTlwovP2rTOkiII/fQ4ih/zQ==} + /@rollup/rollup-win32-arm64-msvc@4.14.2: + resolution: {integrity: sha512-H4s8UjgkPnlChl6JF5empNvFHp77Jx+Wfy2EtmYPe9G22XV+PMuCinZVHurNe8ggtwoaohxARJZbaH/3xjB/FA==} cpu: [arm64] os: [win32] requiresBuild: true optional: true - /@rollup/rollup-win32-ia32-msvc@4.14.0: - resolution: {integrity: sha512-e/PBHxPdJ00O9p5Ui43+vixSgVf4NlLsmV6QneGERJ3lnjIua/kim6PRFe3iDueT1rQcgSkYP8ZBBXa/h4iPvw==} + /@rollup/rollup-win32-ia32-msvc@4.14.2: + resolution: {integrity: sha512-djqpAjm/i8erWYF0K6UY4kRO3X5+T4TypIqw60Q8MTqSBaQNpNXDhxdjpZ3ikgb+wn99svA7jxcXpiyg9MUsdw==} cpu: [ia32] os: [win32] requiresBuild: true optional: true - /@rollup/rollup-win32-x64-msvc@4.14.0: - resolution: {integrity: sha512-aGg7iToJjdklmxlUlJh/PaPNa4PmqHfyRMLunbL3eaMO0gp656+q1zOKkpJ/CVe9CryJv6tAN1HDoR8cNGzkag==} + /@rollup/rollup-win32-x64-msvc@4.14.2: + resolution: {integrity: sha512-teAqzLT0yTYZa8ZP7zhFKEx4cotS8Tkk5XiqNMJhD4CpaWB1BHARE4Qy+RzwnXvSAYv+Q3jAqCVBS+PS+Yee8Q==} cpu: [x64] os: [win32] requiresBuild: true @@ -3616,13 +3616,13 @@ packages: resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} dev: true - /@vitejs/plugin-react-swc@3.6.0(vite@5.2.6): + /@vitejs/plugin-react-swc@3.6.0(vite@5.2.8): resolution: {integrity: sha512-XFRbsGgpGxGzEV5i5+vRiro1bwcIaZDIdBRP16qwm+jP68ue/S8FJTBEgOeojtVDYrbSua3XFp71kC8VJE6v+g==} peerDependencies: vite: ^4 || ^5 dependencies: '@swc/core': 1.4.8 - vite: 5.2.6(@types/node@20.11.30) + vite: 5.2.8(@types/node@20.11.30) transitivePeerDependencies: - '@swc/helpers' dev: true @@ -8313,28 +8313,28 @@ packages: fsevents: 2.3.3 dev: false - /rollup@4.14.0: - resolution: {integrity: sha512-Qe7w62TyawbDzB4yt32R0+AbIo6m1/sqO7UPzFS8Z/ksL5mrfhA0v4CavfdmFav3D+ub4QeAgsGEe84DoWe/nQ==} + /rollup@4.14.2: + resolution: {integrity: sha512-WkeoTWvuBoFjFAhsEOHKRoZ3r9GfTyhh7Vff1zwebEFLEFjT1lG3784xEgKiTa7E+e70vsC81roVL2MP4tgEEQ==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true dependencies: '@types/estree': 1.0.5 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.14.0 - '@rollup/rollup-android-arm64': 4.14.0 - '@rollup/rollup-darwin-arm64': 4.14.0 - '@rollup/rollup-darwin-x64': 4.14.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.14.0 - '@rollup/rollup-linux-arm64-gnu': 4.14.0 - '@rollup/rollup-linux-arm64-musl': 4.14.0 - '@rollup/rollup-linux-powerpc64le-gnu': 4.14.0 - '@rollup/rollup-linux-riscv64-gnu': 4.14.0 - '@rollup/rollup-linux-s390x-gnu': 4.14.0 - '@rollup/rollup-linux-x64-gnu': 4.14.0 - '@rollup/rollup-linux-x64-musl': 4.14.0 - '@rollup/rollup-win32-arm64-msvc': 4.14.0 - '@rollup/rollup-win32-ia32-msvc': 4.14.0 - '@rollup/rollup-win32-x64-msvc': 4.14.0 + '@rollup/rollup-android-arm-eabi': 4.14.2 + '@rollup/rollup-android-arm64': 4.14.2 + '@rollup/rollup-darwin-arm64': 4.14.2 + '@rollup/rollup-darwin-x64': 4.14.2 + '@rollup/rollup-linux-arm-gnueabihf': 4.14.2 + '@rollup/rollup-linux-arm64-gnu': 4.14.2 + '@rollup/rollup-linux-arm64-musl': 4.14.2 + '@rollup/rollup-linux-powerpc64le-gnu': 4.14.2 + '@rollup/rollup-linux-riscv64-gnu': 4.14.2 + '@rollup/rollup-linux-s390x-gnu': 4.14.2 + '@rollup/rollup-linux-x64-gnu': 4.14.2 + '@rollup/rollup-linux-x64-musl': 4.14.2 + '@rollup/rollup-win32-arm64-msvc': 4.14.2 + '@rollup/rollup-win32-ia32-msvc': 4.14.2 + '@rollup/rollup-win32-x64-msvc': 4.14.2 fsevents: 2.3.3 /run-async@2.4.1: @@ -9221,7 +9221,7 @@ packages: convert-source-map: 2.0.0 dev: true - /vite-plugin-pwa@0.19.5(vite@5.2.6)(workbox-build@7.0.0)(workbox-window@7.0.0): + /vite-plugin-pwa@0.19.5(vite@5.2.8)(workbox-build@7.0.0)(workbox-window@7.0.0): resolution: {integrity: sha512-3xJEc2Gmq6SBf730UAV1N2/MqOm+MiyvaLToSTglg+pH9b9qm666yPVxrBBlcOhGoJJWjJpu+Z9tROKek2CODg==} engines: {node: '>=16.0.0'} peerDependencies: @@ -9236,15 +9236,15 @@ packages: debug: 4.3.4 fast-glob: 3.3.2 pretty-bytes: 6.1.1 - vite: 5.2.6(@types/node@20.11.30) + vite: 5.2.8(@types/node@20.11.30) workbox-build: 7.0.0 workbox-window: 7.0.0 transitivePeerDependencies: - supports-color dev: false - /vite@5.2.6(@types/node@20.11.30): - resolution: {integrity: sha512-FPtnxFlSIKYjZ2eosBQamz4CbyrTizbZ3hnGJlh/wMtCrlp1Hah6AzBLjGI5I2urTfNnpovpHdrL6YRuBOPnCA==} + /vite@5.2.8(@types/node@20.11.30): + resolution: {integrity: sha512-OyZR+c1CE8yeHw5V5t59aXsUPPVTHMDjEZz8MgguLL/Q7NblxhZUlTu9xSPqlsUO/y+X7dlU05jdhvyycD55DA==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: @@ -9274,7 +9274,7 @@ packages: '@types/node': 20.11.30 esbuild: 0.20.2 postcss: 8.4.38 - rollup: 4.14.0 + rollup: 4.14.2 optionalDependencies: fsevents: 2.3.3 From d2236721286fe04144d7e5f0723467e109569ee5 Mon Sep 17 00:00:00 2001 From: TingyuDong <113588395+TingyuDong@users.noreply.github.com> Date: Mon, 15 Apr 2024 12:27:43 +0800 Subject: [PATCH 09/81] ADM-898: [frontend] fix: fix flag card logic (#1377) * ADM-898-fix fix: fix flag card logic * ADM-898-fix fix: init flag as block state when boarding mapping changed * ADM-898-fix fix: remove useless code * ADM-898-fix fix: fix flag logic * ADM-898-fix fix: fix eslint * ADM-898-fix fix: fix eslint * ADM-898:[frontend]fix: fix flagCardAsBlock in toggle case * ADM-898-fix test: add test * ADM-898-fix fix: fix logic --------- Co-authored-by: Leiqiuhong --- .../containers/MetricsStep/CycleTime.test.tsx | 3 +- .../MetricsStep/CycleTime/Table/index.tsx | 33 ++++++++++++++----- .../MetricsStep/CycleTime/index.tsx | 19 +++++------ frontend/src/context/Metrics/metricsSlice.ts | 19 +---------- frontend/src/utils/util.ts | 16 ++------- 5 files changed, 40 insertions(+), 50 deletions(-) diff --git a/frontend/__tests__/containers/MetricsStep/CycleTime.test.tsx b/frontend/__tests__/containers/MetricsStep/CycleTime.test.tsx index ef27fad62d..363e4cb1a0 100644 --- a/frontend/__tests__/containers/MetricsStep/CycleTime.test.tsx +++ b/frontend/__tests__/containers/MetricsStep/CycleTime.test.tsx @@ -320,7 +320,7 @@ describe('CycleTime', () => { setup(); await userEvent.click(screen.getByRole('radio', { name: cycleTimeTypeLabels[1] })); - expect(mockedUseAppDispatch).toHaveBeenCalledTimes(3); + expect(mockedUseAppDispatch).toHaveBeenCalledTimes(4); expect(mockedUseAppDispatch).toHaveBeenCalledWith(setCycleTimeSettingsType(CYCLE_TIME_SETTINGS_TYPES.BY_STATUS)); expect(mockedUseAppDispatch).toHaveBeenCalledWith( updateCycleTimeSettings( @@ -331,6 +331,7 @@ describe('CycleTime', () => { ), ); expect(mockedUseAppDispatch).toHaveBeenCalledWith(saveDoneColumn([])); + expect(mockedUseAppDispatch).toHaveBeenCalledWith(updateTreatFlagCardAsBlock(true)); }); describe('cycle time by status', () => { diff --git a/frontend/src/containers/MetricsStep/CycleTime/Table/index.tsx b/frontend/src/containers/MetricsStep/CycleTime/Table/index.tsx index b53e8533c8..56f6aa7eda 100644 --- a/frontend/src/containers/MetricsStep/CycleTime/Table/index.tsx +++ b/frontend/src/containers/MetricsStep/CycleTime/Table/index.tsx @@ -1,17 +1,19 @@ -import { - CYCLE_TIME_SETTINGS_TYPES, - DONE, - METRICS_CONSTANTS, - METRICS_CYCLE_SETTING_TABLE_HEADER_BY_COLUMN, - METRICS_CYCLE_SETTING_TABLE_HEADER_BY_STATUS, -} from '@src/constants/resources'; import { updateCycleTimeSettings, saveDoneColumn, selectMetricsContent, setCycleTimeSettingsType, updateReworkTimesSettings, + updateTreatFlagCardAsBlock, + ICycleTimeSetting, } from '@src/context/Metrics/metricsSlice'; +import { + CYCLE_TIME_SETTINGS_TYPES, + DONE, + METRICS_CONSTANTS, + METRICS_CYCLE_SETTING_TABLE_HEADER_BY_COLUMN, + METRICS_CYCLE_SETTING_TABLE_HEADER_BY_STATUS, +} from '@src/constants/resources'; import { StyledRadioGroup, StyledTableHeaderCell, @@ -21,6 +23,7 @@ import { FormControlLabel, Radio, Table, TableBody, TableContainer, TableHead, T import CellAutoComplete from '@src/containers/MetricsStep/CycleTime/Table/CellAutoComplete'; import EllipsisText from '@src/components/Common/EllipsisText'; import { useAppDispatch } from '@src/hooks/useAppDispatch'; +import { existBlockState } from '@src/utils/util'; import { useAppSelector } from '@src/hooks'; import React, { useCallback } from 'react'; import { theme } from '@src/theme'; @@ -45,8 +48,18 @@ const CycleTimeTable = () => { [cycleTimeSettings, dispatch], ); + const updateTreatFlagCardAsBlockByCycleTimeSetting = useCallback( + (newCycleTimeSettings: ICycleTimeSetting[], preHasBlockState: boolean) => { + if (!existBlockState(newCycleTimeSettings) && preHasBlockState) { + dispatch(updateTreatFlagCardAsBlock(true)); + } + }, + [dispatch], + ); + const saveCycleTimeOptions = useCallback( (name: string, value: string) => { + const preHasBlockState = existBlockState(cycleTimeSettings); const newCycleTimeSettings = cycleTimeSettings.map((item) => (isColumnAsKey ? item.column === name : item.status === name) ? { @@ -56,10 +69,11 @@ const CycleTimeTable = () => { : item, ); isColumnAsKey && resetRealDoneColumn(name, value); + updateTreatFlagCardAsBlockByCycleTimeSetting(newCycleTimeSettings, preHasBlockState); dispatch(updateCycleTimeSettings(newCycleTimeSettings)); dispatch(updateReworkTimesSettings({ excludeStates: [], reworkState: null })); }, - [cycleTimeSettings, dispatch, isColumnAsKey, resetRealDoneColumn], + [updateTreatFlagCardAsBlockByCycleTimeSetting, cycleTimeSettings, dispatch, isColumnAsKey, resetRealDoneColumn], ); const header = isColumnAsKey @@ -89,6 +103,9 @@ const CycleTimeTable = () => { ), ); dispatch(saveDoneColumn([])); + if (!existBlockState(cycleTimeSettings)) { + dispatch(updateTreatFlagCardAsBlock(true)); + } }; return ( diff --git a/frontend/src/containers/MetricsStep/CycleTime/index.tsx b/frontend/src/containers/MetricsStep/CycleTime/index.tsx index 1fcf12999d..53683d4a93 100644 --- a/frontend/src/containers/MetricsStep/CycleTime/index.tsx +++ b/frontend/src/containers/MetricsStep/CycleTime/index.tsx @@ -13,7 +13,7 @@ import FlagCard from '@src/containers/MetricsStep/CycleTime/FlagCard'; import { useAppDispatch } from '@src/hooks/useAppDispatch'; import { MESSAGE, TIPS } from '@src/constants/resources'; import { useEffect, useMemo, useState } from 'react'; -import { existBlockColumn } from '@src/utils/util'; +import { existBlockState } from '@src/utils/util'; import { useAppSelector } from '@src/hooks'; export const CycleTime = () => { @@ -21,22 +21,21 @@ export const CycleTime = () => { const flagCardAsBlock = useAppSelector(selectTreatFlagCardAsBlock); const displayFlagCardDropWarning = useAppSelector(selectDisplayFlagCardDropWarning); const warningMessage = useAppSelector(selectCycleTimeWarningMessage); - const { cycleTimeSettings, cycleTimeSettingsType } = useAppSelector(selectMetricsContent); - const hasBlockColumn = useMemo(() => { - return existBlockColumn(cycleTimeSettingsType, cycleTimeSettings); - }, [cycleTimeSettingsType, cycleTimeSettings]); + const { cycleTimeSettings } = useAppSelector(selectMetricsContent); + const hasBlockState = useMemo(() => { + return existBlockState(cycleTimeSettings); + }, [cycleTimeSettings]); const [shouldShowConflictMessage, setShouldShowConflictMessage] = useState(false); useEffect(() => { - if (hasBlockColumn && displayFlagCardDropWarning) { + if (hasBlockState && displayFlagCardDropWarning) { setShouldShowConflictMessage(true); dispatch(updateDisplayFlagCardDropWarning(false)); } - - if (hasBlockColumn && flagCardAsBlock) { + if (hasBlockState && flagCardAsBlock) { dispatch(updateTreatFlagCardAsBlock(false)); } - }, [dispatch, flagCardAsBlock, displayFlagCardDropWarning, hasBlockColumn]); + }, [dispatch, flagCardAsBlock, displayFlagCardDropWarning, hasBlockState]); return (
@@ -44,7 +43,7 @@ export const CycleTime = () => { {warningMessage && } - {hasBlockColumn || } + {hasBlockState || }
); }; diff --git a/frontend/src/context/Metrics/metricsSlice.ts b/frontend/src/context/Metrics/metricsSlice.ts index 9fb44e60fb..5dc1a73cdd 100644 --- a/frontend/src/context/Metrics/metricsSlice.ts +++ b/frontend/src/context/Metrics/metricsSlice.ts @@ -5,7 +5,7 @@ import { MESSAGE, METRICS_CONSTANTS, } from '@src/constants/resources'; -import { convertCycleTimeSettings, existBlockColumn, getSortedAndDeduplicationBoardingMapping } from '@src/utils/util'; +import { convertCycleTimeSettings, getSortedAndDeduplicationBoardingMapping } from '@src/utils/util'; import { pipeline } from '@src/context/config/pipelineTool/verifyResponseSlice'; import { createSlice } from '@reduxjs/toolkit'; import camelCase from 'lodash.camelcase'; @@ -292,20 +292,6 @@ function resetReworkTimeSettingWhenMappingModified(preJiraColumnsValue: string[] }; } -function initTreatFlagCardAsBlock( - preTreatFlagCardAsBlock: boolean, - preHasBlockColumn: boolean, - state: ISavedMetricsSettingState, -) { - if ( - !preTreatFlagCardAsBlock && - preHasBlockColumn && - !existBlockColumn(state.cycleTimeSettingsType, state.cycleTimeSettings) - ) { - state.treatFlagCardAsBlock = true; - } -} - export const metricsSlice = createSlice({ name: 'metrics', initialState, @@ -396,8 +382,6 @@ export const metricsSlice = createSlice({ const preJiraColumnsValue = getSortedAndDeduplicationBoardingMapping(state.cycleTimeSettings).filter( (item) => item !== METRICS_CONSTANTS.cycleTimeEmptyStr, ); - const preHasBlockColumn = existBlockColumn(state.cycleTimeSettingsType, state.cycleTimeSettings); - const preTreatFlagCardAsBlock = state.treatFlagCardAsBlock; state.displayFlagCardDropWarning = state.displayFlagCardDropWarning && !isProjectCreated && importedCycleTime.importedTreatFlagCardAsBlock; @@ -463,7 +447,6 @@ export const metricsSlice = createSlice({ ? getCycleTimeSettingsByColumn(state, jiraColumns) : getCycleTimeSettingsByStatus(state, jiraColumns); } - initTreatFlagCardAsBlock(preTreatFlagCardAsBlock, preHasBlockColumn, state); resetReworkTimeSettingWhenMappingModified(preJiraColumnsValue, state); if (!isProjectCreated && importedDoneStatus.length > 0) { diff --git a/frontend/src/utils/util.ts b/frontend/src/utils/util.ts index 65f08103a5..657f2119ed 100644 --- a/frontend/src/utils/util.ts +++ b/frontend/src/utils/util.ts @@ -1,9 +1,4 @@ -import { - BLOCK_COLUMN_NAME, - CYCLE_TIME_LIST, - CYCLE_TIME_SETTINGS_TYPES, - METRICS_CONSTANTS, -} from '@src/constants/resources'; +import { CYCLE_TIME_LIST, CYCLE_TIME_SETTINGS_TYPES, METRICS_CONSTANTS } from '@src/constants/resources'; import { CleanedBuildKiteEmoji, OriginBuildKiteEmoji } from '@src/constants/emojis/emoji'; import { ICycleTimeSetting, IPipelineConfig } from '@src/context/Metrics/metricsSlice'; import { ITargetFieldType } from '@src/components/Common/MultiAutoComplete/styles'; @@ -162,11 +157,6 @@ export function convertCycleTimeSettings( return cycleTimeSettings?.map(({ status, value }: ICycleTimeSetting) => ({ [status]: value })); } -export function existBlockColumn( - cycleTimeSettingsType: CYCLE_TIME_SETTINGS_TYPES, - cycleTimeSettings: ICycleTimeSetting[], -) { - return cycleTimeSettingsType === CYCLE_TIME_SETTINGS_TYPES.BY_COLUMN - ? cycleTimeSettings.some(({ column }) => BLOCK_COLUMN_NAME.includes(column.toUpperCase())) - : cycleTimeSettings.some(({ status }) => BLOCK_COLUMN_NAME.includes(status.toUpperCase())); +export function existBlockState(cycleTimeSettings: ICycleTimeSetting[]) { + return cycleTimeSettings.some(({ value }) => METRICS_CONSTANTS.blockValue === value); } From 2e9711d88842f3404985e19949944a689f368126 Mon Sep 17 00:00:00 2001 From: Steveay <907221539@qq.com> Date: Mon, 15 Apr 2024 15:51:12 +0800 Subject: [PATCH 10/81] ADM-878:[frontend]feature: add chart API ability for metrics board configuration (#1362) * ADM-878:[frontend]feat: fix error message when board info gets error code * ADM-878:[frontend]feat: add metrics board info multiple fetch and combine * ADM-878:[frontend]feat: update board info combine logic * ADM-878:[frontend]fix: code style fix * ADM-878:[frontend]feat: handle board mappings logic * ADM-878:[frontend]refactor: extract combine logic * ADM-878:[frontend]refactor: move combine and dispatch logic for use-callback * ADM-878:[frontend]refactor: order the board info list * ADM-878:[frontend]feat: refactored ordering into hook * ADM-878:[frontend]feat: refactor data structure and fix UT * ADM-878:[frontend]fix: fix UT and lint * ADM-878:[frontend]refactor: remove a code annotation * ADM-878:[frontend]refactor: refactor loading state timing after board info request * ADM-878:[frontend]fix: fix code style * ADM-878:[frontend]fix: fix prettier * ADM-878:[frontend]fix: fix test coverage * ADM-878:[frontend]refactor: extract combine board info to utils * ADM-878:[frontend]refactor: update some code style --------- Co-authored-by: PengxiWPix --- .../MetricsStep/MetricsStep.test.tsx | 54 ++++++- frontend/__tests__/fixtures.ts | 10 ++ .../__tests__/hooks/useGetBoardInfo.test.tsx | 35 +++-- frontend/__tests__/utils/Util.test.tsx | 141 ++++++++++++++++++ frontend/src/clients/board/dto/request.ts | 7 + frontend/src/constants/resources.ts | 2 + frontend/src/containers/MetricsStep/index.tsx | 36 ++--- frontend/src/hooks/useGetBoardInfo.ts | 84 +++++++---- frontend/src/utils/util.ts | 24 ++- 9 files changed, 334 insertions(+), 59 deletions(-) diff --git a/frontend/__tests__/containers/MetricsStep/MetricsStep.test.tsx b/frontend/__tests__/containers/MetricsStep/MetricsStep.test.tsx index b2d074360d..73383b92fa 100644 --- a/frontend/__tests__/containers/MetricsStep/MetricsStep.test.tsx +++ b/frontend/__tests__/containers/MetricsStep/MetricsStep.test.tsx @@ -310,10 +310,56 @@ describe('MetricsStep', () => { return res( ctx.status(HttpStatusCode.Ok), ctx.json({ - ignoredTargetFields: [], - jiraColumns: [], - targetFields: [], - users: [], + ignoredTargetFields: [ + { + key: 'description', + name: 'Description', + flag: false, + }, + { + key: 'customfield_10015', + name: 'Start date', + flag: false, + }, + ], + jiraColumns: [ + { + key: 'To Do', + value: { + name: 'TODO', + statuses: ['TODO'], + }, + }, + { + key: 'In Progress', + value: { + name: 'Doing', + statuses: ['DOING'], + }, + }, + ], + targetFields: [ + { + key: 'issuetype', + name: 'Issue Type', + flag: false, + }, + { + key: 'parent', + name: 'Parent', + flag: false, + }, + ], + users: [ + 'heartbeat user', + 'Yunsong Yang', + 'Yufan Wang', + 'Weiran Sun', + 'Xuebing Li', + 'Junbo Dai', + 'Wenting Yan', + 'Xingmeng Tao', + ], }), ); }), diff --git a/frontend/__tests__/fixtures.ts b/frontend/__tests__/fixtures.ts index 4cfa77c67c..ea347d4c83 100644 --- a/frontend/__tests__/fixtures.ts +++ b/frontend/__tests__/fixtures.ts @@ -642,6 +642,16 @@ export const MOCK_PIPELINE_VERIFY_FORBIDDEN_ERROR_TEXT = export const FAKE_TOKEN = 'fake-token'; +export const FAKE_DATE_EARLIER = { + startDate: '2024-02-01T00:00:00.000+08:00', + endDate: '2024-02-14T23:59:59.999+08:00', +}; + +export const FAKE_DATE_LATER = { + startDate: '2024-03-01T00:00:00.000+08:00', + endDate: '2024-03-14T23:59:59.999+08:00', +}; + export const FAKE_PIPELINE_TOKEN = 'bkua_mockTokenMockTokenMockTokenMockToken1234'; export const ADVANCED_SETTINGS_TITLE = 'Advanced settings'; diff --git a/frontend/__tests__/hooks/useGetBoardInfo.test.tsx b/frontend/__tests__/hooks/useGetBoardInfo.test.tsx index 700ea171af..0430c7a6fe 100644 --- a/frontend/__tests__/hooks/useGetBoardInfo.test.tsx +++ b/frontend/__tests__/hooks/useGetBoardInfo.test.tsx @@ -1,6 +1,6 @@ +import { MOCK_BOARD_INFO_URL, FAKE_TOKEN, FAKE_DATE_EARLIER, FAKE_DATE_LATER } from '@test/fixtures'; import { useGetBoardInfoEffect } from '@src/hooks/useGetBoardInfo'; import { renderHook, act, waitFor } from '@testing-library/react'; -import { MOCK_BOARD_INFO_URL, FAKE_TOKEN } from '@test/fixtures'; import { setupServer } from 'msw/node'; import { HttpStatusCode } from 'axios'; import { rest } from 'msw'; @@ -14,9 +14,18 @@ const mockBoardConfig = { site: 'fake', email: 'fake@fake.com', token: FAKE_TOKEN, - startTime: null, - endTime: null, + dateRanges: [ + { + startDate: FAKE_DATE_LATER.startDate, + endDate: FAKE_DATE_LATER.endDate, + }, + { + startDate: FAKE_DATE_EARLIER.startDate, + endDate: FAKE_DATE_EARLIER.endDate, + }, + ], }; + describe('use get board info', () => { beforeAll(() => server.listen()); afterAll(() => { @@ -35,18 +44,26 @@ describe('use get board info', () => { 'No card within selected date range!', 'Please go back to the previous page and change your collection date, or check your board info!', ], - [HttpStatusCode.BadRequest, 'Invalid input!', 'Please go back to the previous page and check your board info!'], + [ + HttpStatusCode.BadRequest, + 'Failed to get the board configuration!', + 'Please go back to the previous page to check your board info, or change your time range!', + ], [ HttpStatusCode.Unauthorized, - 'Unauthorized request!', - 'Please go back to the previous page and check your board info!', + 'Failed to get the board configuration!', + 'Please go back to the previous page to check your board info, or change your time range!', ], [ HttpStatusCode.Forbidden, - 'Forbidden request!', - 'Please go back to the previous page and change your board token with correct access permission.', + 'Failed to get the board configuration!', + 'Please go back to the previous page to check your board info, or change your time range!', + ], + [ + HttpStatusCode.NotFound, + 'Failed to get the board configuration!', + 'Please go back to the previous page to check your board info, or change your time range!', ], - [HttpStatusCode.NotFound, 'Not found!', 'Please go back to the previous page and check your board info!'], ])('should got error message when got code is %s', async (code, title, message) => { server.use( rest.post(MOCK_BOARD_INFO_URL, (_, res, ctx) => { diff --git a/frontend/__tests__/utils/Util.test.tsx b/frontend/__tests__/utils/Util.test.tsx index 87a04b3dd6..bd250764e2 100644 --- a/frontend/__tests__/utils/Util.test.tsx +++ b/frontend/__tests__/utils/Util.test.tsx @@ -1,4 +1,5 @@ import { + combineBoardInfo, convertCycleTimeSettings, exportToJsonFile, filterAndMapCycleTimeSettings, @@ -17,6 +18,7 @@ import { import { CleanedBuildKiteEmoji, OriginBuildKiteEmoji } from '@src/constants/emojis/emoji'; import { CYCLE_TIME_SETTINGS_TYPES, METRICS_CONSTANTS } from '@src/constants/resources'; import { ICycleTimeSetting, IPipelineConfig } from '@src/context/Metrics/metricsSlice'; +import { BoardInfoResponse } from '@src/hooks/useGetBoardInfo'; import { EMPTY_STRING } from '@src/constants/commons'; import { PIPELINE_TOOL_TYPES } from '../fixtures'; @@ -429,3 +431,142 @@ describe('sortDateRanges function', () => { expect(sortedDateRanges).toStrictEqual(expectResult.reverse()); }); }); + +describe('combineBoardInfo function', () => { + const boardInfoResponses: BoardInfoResponse[] = [ + { + ignoredTargetFields: [ + { + key: 'description', + name: 'Description', + flag: 'false', + }, + { + key: 'customfield_10015', + name: 'Start date', + flag: 'false', + }, + ], + jiraColumns: [ + { + key: 'To Do', + value: '{ name: TODO, statuses: [TODO]}', + }, + { + key: 'In Progress', + value: '{ name: DOING, statuses: [DOING]}', + }, + ], + targetFields: [ + { + key: 'issuetype', + name: 'Issue Type', + flag: 'false', + }, + { + key: 'parent', + name: 'Parent', + flag: 'false', + }, + ], + users: ['heartbeat user', 'Yunsong Yang'], + }, + { + ignoredTargetFields: [ + { + key: 'description', + name: 'Description', + flag: 'false', + }, + { + key: 'customfield_10015', + name: 'Start date', + flag: 'false', + }, + ], + jiraColumns: [ + { + key: 'To Do', + value: '{ name: TODO, statuses: [TODO]}', + }, + { + key: 'In Progress', + value: '{ name: DOING, statuses: [DOING]}', + }, + ], + targetFields: [ + { + key: 'issuetype', + name: 'Issue Type', + flag: 'false', + }, + { + key: 'parent', + name: 'Parent', + flag: 'false', + }, + ], + users: [ + 'heartbeat user', + 'Yunsong Yang', + 'Yufan Wang', + 'Weiran Sun', + 'Xuebing Li', + 'Junbo Dai', + 'Wenting Yan', + 'Xingmeng Tao', + ], + }, + ]; + const expectResults = { + ignoredTargetFields: [ + { + key: 'description', + name: 'Description', + flag: 'false', + }, + { + key: 'customfield_10015', + name: 'Start date', + flag: 'false', + }, + ], + jiraColumns: [ + { + key: 'To Do', + value: '{ name: TODO, statuses: [TODO]}', + }, + { + key: 'In Progress', + value: '{ name: DOING, statuses: [DOING]}', + }, + ], + targetFields: [ + { + key: 'issuetype', + name: 'Issue Type', + flag: 'false', + }, + { + key: 'parent', + name: 'Parent', + flag: 'false', + }, + ], + users: [ + 'heartbeat user', + 'Yunsong Yang', + 'Yufan Wang', + 'Weiran Sun', + 'Xuebing Li', + 'Junbo Dai', + 'Wenting Yan', + 'Xingmeng Tao', + ], + }; + + it('should combine board info', () => { + const combineBoardData = combineBoardInfo(boardInfoResponses); + expect(combineBoardData).toStrictEqual(expectResults); + }); +}); diff --git a/frontend/src/clients/board/dto/request.ts b/frontend/src/clients/board/dto/request.ts index 9d04365139..ddc96f82ec 100644 --- a/frontend/src/clients/board/dto/request.ts +++ b/frontend/src/clients/board/dto/request.ts @@ -1,3 +1,5 @@ +import { TDateRange } from '@src/context/config/configSlice'; + export interface BoardRequestDTO { token: string; type: string; @@ -16,3 +18,8 @@ export interface BoardInfoRequestDTO { boardId: string; projectKey: string; } + +export interface BoardInfoConfigDTO extends BoardRequestDTO { + dateRanges: TDateRange | null; + projectKey: string; +} diff --git a/frontend/src/constants/resources.ts b/frontend/src/constants/resources.ts index 34e1041d09..f2ede0d95c 100644 --- a/frontend/src/constants/resources.ts +++ b/frontend/src/constants/resources.ts @@ -342,6 +342,7 @@ export const BOARD_CONFIG_INFO_TITLE = { UNAUTHORIZED_REQUEST: 'Unauthorized request!', NOT_FOUND: 'Not found!', NO_CONTENT: 'No card within selected date range!', + GENERAL_ERROR: 'Failed to get the board configuration!', EMPTY: '', }; @@ -349,6 +350,7 @@ export const BOARD_CONFIG_INFO_ERROR = { FORBIDDEN: 'Please go back to the previous page and change your board token with correct access permission.', NOT_FOUND: 'Please go back to the previous page and check your board info!', NOT_CONTENT: 'Please go back to the previous page and change your collection date, or check your board info!', + GENERAL_ERROR: 'Please go back to the previous page to check your board info, or change your time range!', RETRY: 'Data loading failed, please', }; diff --git a/frontend/src/containers/MetricsStep/index.tsx b/frontend/src/containers/MetricsStep/index.tsx index edcee57411..dbddd57045 100644 --- a/frontend/src/containers/MetricsStep/index.tsx +++ b/frontend/src/containers/MetricsStep/index.tsx @@ -1,47 +1,47 @@ import { + selectBoard, selectDateRange, selectIsProjectCreated, + selectJiraColumns, selectMetrics, + selectUsers, updateBoardVerifyState, - selectBoard, updateJiraVerifyResponse, - selectUsers, - selectJiraColumns, } from '@src/context/config/configSlice'; import { selectMetricsContent, - updateMetricsState, selectShouldGetBoardConfig, - updateShouldGetBoardConfig, updateFirstTimeRoadMetricsBoardData, + updateMetricsState, + updateShouldGetBoardConfig, } from '@src/context/Metrics/metricsSlice'; import { MetricSelectionHeader, MetricSelectionWrapper, MetricsSelectionTitle, + StyledErrorMessage, + StyledRetryButton, } from '@src/containers/MetricsStep/style'; -import { CYCLE_TIME_SETTINGS_TYPES, DONE, REQUIRED_DATA, AXIOS_REQUEST_ERROR_CODE } from '@src/constants/resources'; +import { AXIOS_REQUEST_ERROR_CODE, CYCLE_TIME_SETTINGS_TYPES, DONE, REQUIRED_DATA } from '@src/constants/resources'; import { DeploymentFrequencySettings } from '@src/containers/MetricsStep/DeploymentFrequencySettings'; -import { StyledRetryButton, StyledErrorMessage } from '@src/containers/MetricsStep/style'; import { closeAllNotifications } from '@src/context/notification/NotificationSlice'; import { Classification } from '@src/containers/MetricsStep/Classification'; import { shouldMetricsLoad } from '@src/context/stepper/StepperSlice'; import DateRangeViewer from '@src/components/Common/DateRangeViewer'; import { useGetBoardInfoEffect } from '@src/hooks/useGetBoardInfo'; +import { combineBoardInfo, sortDateRanges } from '@src/utils/util'; import { CycleTime } from '@src/containers/MetricsStep/CycleTime'; import { RealDone } from '@src/containers/MetricsStep/RealDone'; import EmptyContent from '@src/components/Common/EmptyContent'; -import { useAppSelector, useAppDispatch } from '@src/hooks'; +import { useAppDispatch, useAppSelector } from '@src/hooks'; import { Crews } from '@src/containers/MetricsStep/Crews'; import { useCallback, useLayoutEffect } from 'react'; import { Loading } from '@src/components/Loading'; -import { sortDateRanges } from '@src/utils/util'; import ReworkSettings from './ReworkSettings'; import { Advance } from './Advance/Advance'; import isEmpty from 'lodash/isEmpty'; import { theme } from '@src/theme'; import merge from 'lodash/merge'; -import dayjs from 'dayjs'; const MetricsStep = () => { const boardConfig = useAppSelector(selectBoard); @@ -68,20 +68,22 @@ const MetricsStep = () => { const shouldGetBoardConfig = useAppSelector(selectShouldGetBoardConfig); const getInfo = useCallback( - () => + async () => { getBoardInfo({ ...boardConfig, - startTime: dayjs(startDate).valueOf().toString(), - endTime: dayjs(endDate).valueOf().toString(), + dateRanges, }).then((res) => { - if (res.data) { + if (res && res[0].data) { + const boardInfo = res?.map((r) => r.data); + const commonPayload = combineBoardInfo(boardInfo!); dispatch(updateBoardVerifyState(true)); - dispatch(updateJiraVerifyResponse(res.data)); - dispatch(updateMetricsState(merge(res.data, { isProjectCreated: isProjectCreated }))); + dispatch(updateJiraVerifyResponse(commonPayload)); + dispatch(updateMetricsState(merge(commonPayload, { isProjectCreated: isProjectCreated }))); dispatch(updateShouldGetBoardConfig(false)); dispatch(updateFirstTimeRoadMetricsBoardData(false)); } - }), + }); + }, // eslint-disable-next-line react-hooks/exhaustive-deps [], ); diff --git a/frontend/src/hooks/useGetBoardInfo.ts b/frontend/src/hooks/useGetBoardInfo.ts index 9990f245c2..bf31629aa2 100644 --- a/frontend/src/hooks/useGetBoardInfo.ts +++ b/frontend/src/hooks/useGetBoardInfo.ts @@ -1,10 +1,11 @@ import { BOARD_CONFIG_INFO_ERROR, BOARD_CONFIG_INFO_TITLE } from '@src/constants/resources'; import { boardInfoClient } from '@src/clients/board/BoardInfoClient'; -import { BoardInfoRequestDTO } from '@src/clients/board/dto/request'; +import { BoardInfoConfigDTO } from '@src/clients/board/dto/request'; import { AXIOS_REQUEST_ERROR_CODE } from '@src/constants/resources'; import { AxiosResponse, HttpStatusCode } from 'axios'; import { ReactNode, useState } from 'react'; import get from 'lodash/get'; +import dayjs from 'dayjs'; export type JiraColumns = Record[]; export type TargetFields = Record[]; @@ -12,10 +13,11 @@ export type Users = string[]; export interface BoardInfoResponse { jiraColumns: JiraColumns; targetFields: TargetFields; + ignoredTargetFields: TargetFields; users: Users; } export interface useGetBoardInfoInterface { - getBoardInfo: (data: BoardInfoRequestDTO) => Promise>; + getBoardInfo: (data: BoardInfoConfigDTO) => Promise[]> | undefined>; isLoading: boolean; errorMessage: Record; } @@ -23,23 +25,23 @@ export interface useGetBoardInfoInterface { const codeMapping = (code: string | number) => { const codes = { [HttpStatusCode.BadRequest]: { - title: BOARD_CONFIG_INFO_TITLE.INVALID_INPUT, - message: BOARD_CONFIG_INFO_ERROR.NOT_FOUND, + title: BOARD_CONFIG_INFO_TITLE.GENERAL_ERROR, + message: BOARD_CONFIG_INFO_ERROR.GENERAL_ERROR, code: HttpStatusCode.BadRequest, }, [HttpStatusCode.Unauthorized]: { - title: BOARD_CONFIG_INFO_TITLE.UNAUTHORIZED_REQUEST, - message: BOARD_CONFIG_INFO_ERROR.NOT_FOUND, + title: BOARD_CONFIG_INFO_TITLE.GENERAL_ERROR, + message: BOARD_CONFIG_INFO_ERROR.GENERAL_ERROR, code: HttpStatusCode.Unauthorized, }, [HttpStatusCode.Forbidden]: { - title: BOARD_CONFIG_INFO_TITLE.FORBIDDEN_REQUEST, - message: BOARD_CONFIG_INFO_ERROR.FORBIDDEN, + title: BOARD_CONFIG_INFO_TITLE.GENERAL_ERROR, + message: BOARD_CONFIG_INFO_ERROR.GENERAL_ERROR, code: HttpStatusCode.Forbidden, }, [HttpStatusCode.NotFound]: { - title: BOARD_CONFIG_INFO_TITLE.NOT_FOUND, - message: BOARD_CONFIG_INFO_ERROR.NOT_FOUND, + title: BOARD_CONFIG_INFO_TITLE.GENERAL_ERROR, + message: BOARD_CONFIG_INFO_ERROR.GENERAL_ERROR, code: HttpStatusCode.NotFound, }, [AXIOS_REQUEST_ERROR_CODE.TIMEOUT]: { @@ -55,27 +57,53 @@ export const useGetBoardInfoEffect = (): useGetBoardInfoInterface => { const [isLoading, setIsLoading] = useState(false); const [errorMessage, setErrorMessage] = useState({}); - const getBoardInfo = (data: BoardInfoRequestDTO) => { + const getBoardInfo = async (data: BoardInfoConfigDTO) => { setIsLoading(true); setErrorMessage({}); - return boardInfoClient - .getBoardInfo(data) - .then((res) => { - if (!res.data) { - setErrorMessage({ - title: BOARD_CONFIG_INFO_TITLE.NO_CONTENT, - message: BOARD_CONFIG_INFO_ERROR.NOT_CONTENT, - code: HttpStatusCode.NoContent, + + if (data.dateRanges) { + const dateRangeCopy = Array.from(data.dateRanges); + dateRangeCopy.sort((a, b) => dayjs(a.startDate).valueOf() - dayjs(b.startDate).valueOf()); + const allBoardData = dateRangeCopy.map((info) => { + const request = { + token: data.token, + type: data.type, + site: data.site, + email: data.email, + boardId: data.boardId, + projectKey: data.projectKey, + }; + const boardInfoRequest = { + ...request, + startTime: dayjs(info.startDate).valueOf().toString(), + endTime: dayjs(info.endDate).valueOf().toString(), + }; + + return boardInfoClient + .getBoardInfo(boardInfoRequest) + .then((res) => { + if (!res.data) { + setErrorMessage({ + title: BOARD_CONFIG_INFO_TITLE.NO_CONTENT, + message: BOARD_CONFIG_INFO_ERROR.NOT_CONTENT, + code: HttpStatusCode.NoContent, + }); + } + return res; + }) + .catch((err) => { + const { code } = err; + setErrorMessage(codeMapping(code)); + return err; }); - } - return res; - }) - .catch((err) => { - const { code } = err; - setErrorMessage(codeMapping(code)); - return err; - }) - .finally(() => setIsLoading(false)); + }); + + return Promise.all(allBoardData) + .then((res) => { + return res; + }) + .finally(() => setIsLoading(false)); + } }; return { getBoardInfo, diff --git a/frontend/src/utils/util.ts b/frontend/src/utils/util.ts index 657f2119ed..3541cae1b0 100644 --- a/frontend/src/utils/util.ts +++ b/frontend/src/utils/util.ts @@ -2,9 +2,10 @@ import { CYCLE_TIME_LIST, CYCLE_TIME_SETTINGS_TYPES, METRICS_CONSTANTS } from '@ import { CleanedBuildKiteEmoji, OriginBuildKiteEmoji } from '@src/constants/emojis/emoji'; import { ICycleTimeSetting, IPipelineConfig } from '@src/context/Metrics/metricsSlice'; import { ITargetFieldType } from '@src/components/Common/MultiAutoComplete/styles'; +import { BoardInfoResponse } from '@src/hooks/useGetBoardInfo'; import { DATE_FORMAT_TEMPLATE } from '@src/constants/template'; import { TDateRange } from '@src/context/config/configSlice'; -import { includes, isEqual, sortBy } from 'lodash'; +import { includes, isEqual, sortBy, uniqBy } from 'lodash'; import duration from 'dayjs/plugin/duration'; import dayjs from 'dayjs'; @@ -160,3 +161,24 @@ export function convertCycleTimeSettings( export function existBlockState(cycleTimeSettings: ICycleTimeSetting[]) { return cycleTimeSettings.some(({ value }) => METRICS_CONSTANTS.blockValue === value); } + +export function combineBoardInfo(boardInfoResponses: BoardInfoResponse[]) { + if (boardInfoResponses) { + const allUsers = [...new Set(boardInfoResponses.flatMap((result) => result.users))]; + const allTargetFields = uniqBy( + boardInfoResponses.flatMap((result) => result.targetFields), + (elem) => [elem.key, elem.name, elem.flag].join(), + ); + const allJiraColumns = boardInfoResponses[boardInfoResponses.length - 1].jiraColumns; + const allIgnoredTargetFields = uniqBy( + boardInfoResponses.flatMap((result) => result.ignoredTargetFields), + (elem) => [elem.key, elem.name, elem.flag].join(), + ); + return { + users: allUsers, + targetFields: allTargetFields, + ignoredTargetFields: allIgnoredTargetFields, + jiraColumns: allJiraColumns, + }; + } +} From 9411cd95f059c34513197b79c6be115edc7d9cd0 Mon Sep 17 00:00:00 2001 From: yulongcai <141199398+yulongcai@users.noreply.github.com> Date: Mon, 15 Apr 2024 16:13:36 +0800 Subject: [PATCH 11/81] ADM-919:[backend] feat: delete fetch author from GitHub (#1379) * ADM-919:[backend] feat: delete fetch author from GitHub * ADM-919:[backend] fix: delete some no use test --- .../service/report/CSVFileGenerator.java | 12 +- .../report/GenerateReporterService.java | 5 +- .../service/report/PipelineService.java | 23 +--- .../service/report/CSVFileGeneratorTest.java | 14 +- .../report/GenerateReporterServiceTest.java | 24 ++-- .../service/report/PipelineCsvFixture.java | 10 +- .../service/report/PipelineServiceTest.java | 127 +++--------------- .../e2e/fixtures/create-new/pipeline-data.csv | 45 ++++--- .../fixtures/import-file/pipeline-data.csv | 45 ++++--- 9 files changed, 110 insertions(+), 195 deletions(-) diff --git a/backend/src/main/java/heartbeat/service/report/CSVFileGenerator.java b/backend/src/main/java/heartbeat/service/report/CSVFileGenerator.java index 0f6552d4f1..7b42b868ef 100644 --- a/backend/src/main/java/heartbeat/service/report/CSVFileGenerator.java +++ b/backend/src/main/java/heartbeat/service/report/CSVFileGenerator.java @@ -119,15 +119,19 @@ public void convertPipelineDataToCSV(List leadTimeData, String } private String[] getRowData(PipelineCSVInfo csvInfo) { + List committerNames = new ArrayList<>(); + if (csvInfo.getBuildInfo().getAuthor() != null && csvInfo.getBuildInfo().getAuthor().getName() != null) { + String authorName = String.valueOf(csvInfo.getBuildInfo().getAuthor().getName()); + committerNames.add(authorName); + } + String creatorName = null; if (csvInfo.getBuildInfo().getCreator() != null && csvInfo.getBuildInfo().getCreator().getName() != null) { creatorName = csvInfo.getBuildInfo().getCreator().getName(); - } - String committerName = null; - if (csvInfo.getBuildInfo().getAuthor() != null && csvInfo.getBuildInfo().getAuthor().getName() != null) { - committerName = String.valueOf(csvInfo.getBuildInfo().getAuthor().getName()); + committerNames.add(creatorName); } + String committerName = committerNames.isEmpty() ? null : String.join("\n", committerNames); String organization = csvInfo.getOrganizationName(); String pipelineName = csvInfo.getPipeLineName(); String stepName = csvInfo.getStepName(); diff --git a/backend/src/main/java/heartbeat/service/report/GenerateReporterService.java b/backend/src/main/java/heartbeat/service/report/GenerateReporterService.java index ca2a75f973..c8dbfce5f0 100644 --- a/backend/src/main/java/heartbeat/service/report/GenerateReporterService.java +++ b/backend/src/main/java/heartbeat/service/report/GenerateReporterService.java @@ -297,9 +297,8 @@ private FetchedData fetchJiraBoardData(GenerateReportRequest request, FetchedDat } private void generateCSVForPipeline(GenerateReportRequest request, BuildKiteData buildKiteData) { - List pipelineData = pipelineService.generateCSVForPipelineWithCodebase( - request.getCodebaseSetting(), request.getStartTime(), request.getEndTime(), buildKiteData, - request.getBuildKiteSetting().getDeploymentEnvList()); + List pipelineData = pipelineService.generateCSVForPipeline(request.getStartTime(), + request.getEndTime(), buildKiteData, request.getBuildKiteSetting().getDeploymentEnvList()); csvFileGenerator.convertPipelineDataToCSV(pipelineData, request.getCsvTimeStamp()); asyncMetricsDataHandler diff --git a/backend/src/main/java/heartbeat/service/report/PipelineService.java b/backend/src/main/java/heartbeat/service/report/PipelineService.java index 08dca92425..a60bb92429 100644 --- a/backend/src/main/java/heartbeat/service/report/PipelineService.java +++ b/backend/src/main/java/heartbeat/service/report/PipelineService.java @@ -1,7 +1,5 @@ package heartbeat.service.report; -import heartbeat.client.dto.codebase.github.Author; -import heartbeat.client.dto.codebase.github.CommitInfo; import heartbeat.client.dto.codebase.github.LeadTime; import heartbeat.client.dto.codebase.github.PipelineLeadTime; import heartbeat.client.dto.pipeline.buildkite.BuildKiteBuildInfo; @@ -9,14 +7,12 @@ import heartbeat.client.dto.pipeline.buildkite.DeployInfo; import heartbeat.client.dto.pipeline.buildkite.DeployTimes; import heartbeat.controller.pipeline.dto.request.DeploymentEnvironment; -import heartbeat.controller.report.dto.request.CodebaseSetting; import heartbeat.controller.report.dto.request.GenerateReportRequest; import heartbeat.controller.report.dto.response.LeadTimeInfo; import heartbeat.controller.report.dto.response.PipelineCSVInfo; import heartbeat.service.pipeline.buildkite.BuildKiteService; import heartbeat.service.report.calculator.model.FetchedData; import heartbeat.service.source.github.GitHubService; -import heartbeat.util.GithubUtil; import lombok.AllArgsConstructor; import org.apache.commons.collections.CollectionUtils; import org.springframework.stereotype.Service; @@ -69,9 +65,8 @@ public FetchedData.BuildKiteData fetchBuildKiteInfo(GenerateReportRequest reques return result; } - public List generateCSVForPipelineWithCodebase(CodebaseSetting codebaseSetting, String startTime, - String endTime, FetchedData.BuildKiteData buildKiteData, - List deploymentEnvironments) { + public List generateCSVForPipeline(String startTime, String endTime, + FetchedData.BuildKiteData buildKiteData, List deploymentEnvironments) { List pipelineCSVInfos = new ArrayList<>(); deploymentEnvironments.parallelStream().forEach(deploymentEnvironment -> { List buildInfos = getBuildInfos(buildKiteData.getBuildInfosList(), @@ -83,8 +78,8 @@ public List generateCSVForPipelineWithCodebase(CodebaseSetting pipelineSteps); List pipelineCSVInfoList = buildInfos.stream() .filter(buildInfo -> isValidBuildInfo(buildInfo, validSteps, startTime, endTime)) - .map(buildInfo -> getPipelineCSVInfo(codebaseSetting, startTime, endTime, buildKiteData, - deploymentEnvironment, buildInfo, validSteps)) + .map(buildInfo -> getPipelineCSVInfo(startTime, endTime, buildKiteData, deploymentEnvironment, + buildInfo, validSteps)) .toList(); pipelineCSVInfos.addAll(pipelineCSVInfoList); } @@ -93,19 +88,11 @@ public List generateCSVForPipelineWithCodebase(CodebaseSetting return pipelineCSVInfos; } - private PipelineCSVInfo getPipelineCSVInfo(CodebaseSetting codebaseSetting, String startTime, String endTime, + private PipelineCSVInfo getPipelineCSVInfo(String startTime, String endTime, FetchedData.BuildKiteData buildKiteData, DeploymentEnvironment deploymentEnvironment, BuildKiteBuildInfo buildInfo, List pipelineSteps) { DeployInfo deployInfo = buildKiteService.mapToDeployInfo(buildInfo, pipelineSteps, REQUIRED_STATES, startTime, endTime); - if (Objects.nonNull(codebaseSetting) && StringUtils.hasLength(codebaseSetting.getToken()) - && Objects.nonNull(deployInfo.getCommitId()) && Objects.isNull(buildInfo.getAuthor())) { - CommitInfo commitInfo = gitHubService.fetchCommitInfo(deployInfo.getCommitId(), - GithubUtil.getGithubUrlFullName(deploymentEnvironment.getRepository()), codebaseSetting.getToken()); - Author author = commitInfo.getCommit().getAuthor(); - buildInfo - .setAuthor(BuildKiteBuildInfo.Author.builder().name(author.getName()).email(author.getEmail()).build()); - } return PipelineCSVInfo.builder() .organizationName(deploymentEnvironment.getOrgName()) diff --git a/backend/src/test/java/heartbeat/service/report/CSVFileGeneratorTest.java b/backend/src/test/java/heartbeat/service/report/CSVFileGeneratorTest.java index a81b8a6edb..64cfdc4570 100644 --- a/backend/src/test/java/heartbeat/service/report/CSVFileGeneratorTest.java +++ b/backend/src/test/java/heartbeat/service/report/CSVFileGeneratorTest.java @@ -76,7 +76,7 @@ void shouldConvertPipelineDataToCsvGivenCommitInfoNotNull() throws IOException { headers); String firstLine = reader.readLine(); assertEquals( - "\"Thoughtworks-Heartbeat\",\"Heartbeat\",\":rocket: Deploy prod\",\"true\",\"880\",\"XXXX\",\"XXXX\",\"2023-05-08T07:18:18Z\",\"168369327000\",\"1683793037000\",,\"168369327000\",\"168369327000\",\"1684793037000\",\"8379303\",\"16837\",\"653037000\",\"passed\",\"branch\",\"\"", + "\"Thoughtworks-Heartbeat\",\"Heartbeat\",\":rocket: Deploy prod\",\"true\",\"880\",\"XXXX\",,\"2023-05-08T07:18:18Z\",\"168369327000\",\"1683793037000\",,\"168369327000\",\"168369327000\",\"1684793037000\",\"8379303\",\"16837\",\"653037000\",\"passed\",\"branch\",\"\"", firstLine); reader.close(); fileInputStream.close(); @@ -102,7 +102,7 @@ void shouldConvertPipelineDataToCsvGivenCommitInfoNotNullAndPipelineStateIsCance headers); String firstLine = reader.readLine(); assertEquals( - "\"Thoughtworks-Heartbeat\",\"Heartbeat\",\":rocket: Deploy prod\",\"true\",\"880\",\"XXXX\",\"XXXX\",\"2023-05-08T07:18:18Z\",\"168369327000\",\"1683793037000\",,\"168369327000\",\"168369327000\",\"1684793037000\",\"8379303\",\"16837\",\"653037000\",\"canceled\",\"branch\",\"\"", + "\"Thoughtworks-Heartbeat\",\"Heartbeat\",\":rocket: Deploy prod\",\"true\",\"880\",\"XXXX\",,\"2023-05-08T07:18:18Z\",\"168369327000\",\"1683793037000\",,\"168369327000\",\"168369327000\",\"1684793037000\",\"8379303\",\"16837\",\"653037000\",\"canceled\",\"branch\",\"\"", firstLine); reader.close(); fileInputStream.close(); @@ -223,7 +223,7 @@ void shouldConvertPipelineDataToCsvGivenAuthorIsNull() throws IOException { "\"Organization\",\"Pipeline Name\",\"Pipeline Step\",\"Valid\",\"Build Number\",\"Code Committer\",\"Pipeline Creator\",\"First Code Committed Time In PR\",\"PR Created Time\",\"PR Merged Time\",\"No PR Committed Time\",\"Job Start Time\",\"Pipeline Start Time\",\"Pipeline Finish Time\",\"Total Lead Time (HH:mm:ss)\",\"PR Lead Time (HH:mm:ss)\",\"Pipeline Lead Time (HH:mm:ss)\",\"Status\",\"Branch\",\"Revert\"", headers); assertEquals( - "\"Thoughtworks-Heartbeat\",\"Heartbeat\",\":rocket: Deploy prod\",\"null\",\"880\",,,\"2023-05-08T07:18:18Z\",\"168369327000\",\"1683793037000\",,\"168369327000\",\"168369327000\",\"1684793037000\",\"8379303\",\"16837\",\"653037000\",\"passed\",\"branch\",\"\"", + "\"Thoughtworks-Heartbeat\",\"Heartbeat\",\":rocket: Deploy prod\",\"null\",\"880\",\"XXX\",\"XXX\",\"2023-05-08T07:18:18Z\",\"168369327000\",\"1683793037000\",,\"168369327000\",\"168369327000\",\"1684793037000\",\"8379303\",\"16837\",\"653037000\",\"passed\",\"branch\",\"\"", firstLine); reader.close(); fileInputStream.close(); @@ -258,7 +258,7 @@ void shouldHasContentWhenGetDataFromCsvGivenDataTypeIsPipeline() throws IOExcept Assertions.assertEquals( "\"Organization\",\"Pipeline Name\",\"Pipeline Step\",\"Valid\",\"Build Number\",\"Code Committer\",\"Pipeline Creator\",\"First Code Committed Time In PR\",\"PR Created Time\",\"PR Merged Time\",\"No PR Committed Time\",\"Job Start Time\",\"Pipeline Start Time\",\"Pipeline Finish Time\",\"Total Lead Time (HH:mm:ss)\",\"PR Lead Time (HH:mm:ss)\",\"Pipeline Lead Time (HH:mm:ss)\",\"Status\",\"Branch\",\"Revert\"\n" - + "\"Thoughtworks-Heartbeat\",\"Heartbeat\",\":rocket: Deploy prod\",\"true\",\"880\",\"XXXX\",\"XXXX\",\"2023-05-08T07:18:18Z\",\"168369327000\",\"1683793037000\",,\"168369327000\",\"168369327000\",\"1684793037000\",\"8379303\",\"16837\",\"653037000\",\"passed\",\"branch\",\"\"", + + "\"Thoughtworks-Heartbeat\",\"Heartbeat\",\":rocket: Deploy prod\",\"true\",\"880\",\"XXXX\",,\"2023-05-08T07:18:18Z\",\"168369327000\",\"1683793037000\",,\"168369327000\",\"168369327000\",\"1684793037000\",\"8379303\",\"16837\",\"653037000\",\"passed\",\"branch\",\"\"", csvPipelineData); String fileName = CSVFileNameEnum.PIPELINE.getValue() + "-" + mockTimeStamp + ".csv"; @@ -286,17 +286,17 @@ void shouldConvertPipelineDataToCsvGivenTwoOrganizationsPipeline() throws IOExce String firstLine = reader.readLine(); assertEquals( - "\"Thoughtworks-Heartbeat\",\"Heartbeat\",\":rocket: Deploy prod\",\"true\",\"880\",\"yulong\",\"XXXX\",\"2023-05-08T07:18:18Z\",\"168369327000\",\"1683793037000\",,\"168369327000\",\"168369327000\",\"1684793037000\",\"8379303\",\"16837\",\"653037000\",\"passed\",\"branch\",\"\"", + "\"Thoughtworks-Heartbeat\",\"Heartbeat\",\":rocket: Deploy prod\",\"true\",\"880\",\"XXXX\",\"XXXX\",\"2023-05-08T07:18:18Z\",\"168369327000\",\"1683793037000\",,\"168369327000\",\"168369327000\",\"1684793037000\",\"8379303\",\"16837\",\"653037000\",\"passed\",\"branch\",\"\"", firstLine); String secondLine = reader.readLine(); assertEquals( - "\"Thoughtworks-Heartbeat\",\"Heartbeat\",\":rocket: Deploy prod\",\"true\",\"880\",\"yulong\",\"XXXX\",\"2023-05-08T07:18:18Z\",\"168369327000\",\"1683793037000\",,\"168369327000\",\"168369327000\",\"1684793037000\",\"8379303\",\"16837\",\"653037000\",\"passed\",\"branch\",\"\"", + "\"Thoughtworks-Heartbeat\",\"Heartbeat\",\":rocket: Deploy prod\",\"true\",\"880\",\"XXXX\",,\"2023-05-08T07:18:18Z\",\"168369327000\",\"1683793037000\",,\"168369327000\",\"168369327000\",\"1684793037000\",\"8379303\",\"16837\",\"653037000\",\"passed\",\"branch\",\"\"", secondLine); String thirdLine = reader.readLine(); assertEquals( - "\"Thoughtworks-Foxtel\",\"Heartbeat1\",\":rocket: Deploy prod\",\"true\",\"880\",\"yulong\",\"XXXX\",\"2023-05-08T07:18:18Z\",\"168369327000\",\"1683793037000\",,\"168369327000\",\"168369327000\",\"1684793037000\",\"8379303\",\"16837\",\"653037000\",\"passed\",\"branch\",\"\"", + "\"Thoughtworks-Foxtel\",\"Heartbeat1\",\":rocket: Deploy prod\",\"true\",\"880\",\"XXXX\",\"XXXX\",\"2023-05-08T07:18:18Z\",\"168369327000\",\"1683793037000\",,\"168369327000\",\"168369327000\",\"1684793037000\",\"8379303\",\"16837\",\"653037000\",\"passed\",\"branch\",\"\"", thirdLine); reader.close(); diff --git a/backend/src/test/java/heartbeat/service/report/GenerateReporterServiceTest.java b/backend/src/test/java/heartbeat/service/report/GenerateReporterServiceTest.java index 07fec71249..d7c691e987 100644 --- a/backend/src/test/java/heartbeat/service/report/GenerateReporterServiceTest.java +++ b/backend/src/test/java/heartbeat/service/report/GenerateReporterServiceTest.java @@ -459,8 +459,7 @@ void shouldGenerateCsvFile() { doAnswer(invocation -> null).when(asyncMetricsDataHandler) .updateMetricsDataCompletedInHandler(TIMESTAMP, MetricType.DORA, true); List pipelineCSVInfos = List.of(); - when(pipelineService.generateCSVForPipelineWithCodebase(any(), any(), any(), any(), any())) - .thenReturn(pipelineCSVInfos); + when(pipelineService.generateCSVForPipeline(any(), any(), any(), any())).thenReturn(pipelineCSVInfos); generateReporterService.generateDoraReport(request); @@ -486,8 +485,7 @@ void shouldThrowErrorWhenCodeSettingIsNullButSourceControlMetricsIsNotEmpty() { doAnswer(invocation -> null).when(asyncMetricsDataHandler) .updateMetricsDataCompletedInHandler(TIMESTAMP, MetricType.DORA, true); List pipelineCSVInfos = List.of(); - when(pipelineService.generateCSVForPipelineWithCodebase(any(), any(), any(), any(), any())) - .thenReturn(pipelineCSVInfos); + when(pipelineService.generateCSVForPipeline(any(), any(), any(), any())).thenReturn(pipelineCSVInfos); try { generateReporterService.generateDoraReport(request); @@ -515,8 +513,7 @@ void shouldThrowErrorWhenBuildKiteSettingIsNullButPipelineMetricsIsNotEmpty() { doAnswer(invocation -> null).when(asyncMetricsDataHandler) .updateMetricsDataCompletedInHandler(TIMESTAMP, MetricType.DORA, true); List pipelineCSVInfos = List.of(); - when(pipelineService.generateCSVForPipelineWithCodebase(any(), any(), any(), any(), any())) - .thenReturn(pipelineCSVInfos); + when(pipelineService.generateCSVForPipeline(any(), any(), any(), any())).thenReturn(pipelineCSVInfos); try { generateReporterService.generateDoraReport(request); @@ -548,8 +545,7 @@ void shouldGenerateCsvWithPipelineReportWhenPipeLineMetricIsNotEmpty() { doAnswer(invocation -> null).when(asyncMetricsDataHandler) .updateMetricsDataCompletedInHandler(TIMESTAMP, MetricType.DORA, true); List pipelineCSVInfos = List.of(); - when(pipelineService.generateCSVForPipelineWithCodebase(any(), any(), any(), any(), any())) - .thenReturn(pipelineCSVInfos); + when(pipelineService.generateCSVForPipeline(any(), any(), any(), any())).thenReturn(pipelineCSVInfos); when(pipelineService.fetchBuildKiteInfo(request)) .thenReturn(FetchedData.BuildKiteData.builder().buildInfosList(List.of()).build()); DeploymentFrequency fakeDeploymentFrequency = DeploymentFrequency.builder().build(); @@ -594,8 +590,7 @@ void shouldUpdateMetricCompletedWhenGenerateCsvWithPipelineReportFailed() { doAnswer(invocation -> null).when(asyncMetricsDataHandler) .updateMetricsDataCompletedInHandler(TIMESTAMP, MetricType.DORA, false); List pipelineCSVInfos = List.of(); - when(pipelineService.generateCSVForPipelineWithCodebase(any(), any(), any(), any(), any())) - .thenReturn(pipelineCSVInfos); + when(pipelineService.generateCSVForPipeline(any(), any(), any(), any())).thenReturn(pipelineCSVInfos); when(pipelineService.fetchBuildKiteInfo(request)) .thenReturn(FetchedData.BuildKiteData.builder().buildInfosList(List.of()).build()); when(devChangeFailureRate.calculate(any())).thenThrow(new NotFoundException("")); @@ -623,8 +618,7 @@ void shouldGenerateCsvWithSourceControlReportWhenSourceControlMetricIsNotEmpty() doAnswer(invocation -> null).when(asyncMetricsDataHandler) .updateMetricsDataCompletedInHandler(TIMESTAMP, MetricType.DORA, true); List pipelineCSVInfos = List.of(); - when(pipelineService.generateCSVForPipelineWithCodebase(any(), any(), any(), any(), any())) - .thenReturn(pipelineCSVInfos); + when(pipelineService.generateCSVForPipeline(any(), any(), any(), any())).thenReturn(pipelineCSVInfos); when(pipelineService.fetchGitHubData(request)) .thenReturn(FetchedData.BuildKiteData.builder().buildInfosList(List.of()).build()); LeadTimeForChanges fakeLeadTimeForChange = LeadTimeForChanges.builder().build(); @@ -662,8 +656,7 @@ void shouldGenerateCsvWithCachedDataWhenBuildKiteDataAlreadyExisted() { doAnswer(invocation -> null).when(asyncMetricsDataHandler) .updateMetricsDataCompletedInHandler(TIMESTAMP, MetricType.DORA, true); List pipelineCSVInfos = List.of(); - when(pipelineService.generateCSVForPipelineWithCodebase(any(), any(), any(), any(), any())) - .thenReturn(pipelineCSVInfos); + when(pipelineService.generateCSVForPipeline(any(), any(), any(), any())).thenReturn(pipelineCSVInfos); when(pipelineService.fetchGitHubData(any())) .thenReturn(FetchedData.BuildKiteData.builder().buildInfosList(List.of()).build()); when(pipelineService.fetchBuildKiteInfo(any())) @@ -701,8 +694,7 @@ void shouldUpdateMetricCompletedWhenGenerateCsvWithSourceControlReportFailed() { doAnswer(invocation -> null).when(asyncMetricsDataHandler) .updateMetricsDataCompletedInHandler(TIMESTAMP, MetricType.DORA, true); List pipelineCSVInfos = List.of(); - when(pipelineService.generateCSVForPipelineWithCodebase(any(), any(), any(), any(), any())) - .thenReturn(pipelineCSVInfos); + when(pipelineService.generateCSVForPipeline(any(), any(), any(), any())).thenReturn(pipelineCSVInfos); when(pipelineService.fetchGitHubData(request)).thenReturn( FetchedData.BuildKiteData.builder().pipelineLeadTimes(List.of()).buildInfosList(List.of()).build()); doThrow(new NotFoundException("")).when(leadTimeForChangesCalculator).calculate(any()); diff --git a/backend/src/test/java/heartbeat/service/report/PipelineCsvFixture.java b/backend/src/test/java/heartbeat/service/report/PipelineCsvFixture.java index c51db7b273..35ed249efc 100644 --- a/backend/src/test/java/heartbeat/service/report/PipelineCsvFixture.java +++ b/backend/src/test/java/heartbeat/service/report/PipelineCsvFixture.java @@ -26,7 +26,6 @@ public static List MOCK_PIPELINE_CSV_DATA() { .pipelineCreateTime("2023-05-10T06:17:21.844Z") .state("passed") .number(880) - .creator(BuildKiteBuildInfo.Creator.builder().name("XXXX").email("XXX@test.com").build()) .jobs(List.of(BuildKiteJob.builder() .name(":rocket: Deploy prod") .state("passed") @@ -244,7 +243,7 @@ public static List MOCK_PIPELINE_CSV_DATA_WITHOUT_Author_NAME() .stepName(":rocket: Deploy prod") .buildInfo(BuildKiteBuildInfo.builder() .commit("713b31878c756c205a6c03eac5be3ac7c7e6a227") - .creator(BuildKiteBuildInfo.Creator.builder().name(null).email("XXX@test.com").build()) + .creator(BuildKiteBuildInfo.Creator.builder().name("XXX").email("XXX@test.com").build()) .pipelineCreateTime("2023-05-10T06:17:21.844Z") .state("passed") .number(880) @@ -303,7 +302,6 @@ public static List MOCK_PIPELINE_CSV_DATA_WITH_PIPELINE_STATUS_ .pipelineCreateTime("2023-05-10T06:17:21.844Z") .state("canceled") .number(880) - .creator(BuildKiteBuildInfo.Creator.builder().name("XXXX").email("XXX@test.com").build()) .jobs(List.of(BuildKiteJob.builder() .name(":rocket: Deploy prod") .state("passed") @@ -408,7 +406,7 @@ public static List MOCK_TWO_ORGANIZATIONS_PIPELINE_CSV_DATA() { .finishedAt("2023-05-10T06:43:02.653Z") .build())) .branch("branch") - .author(BuildKiteBuildInfo.Author.builder().name("yulong").build()) + .author(BuildKiteBuildInfo.Author.builder().build()) .build()) .commitInfo(CommitInfo.builder() .commit(Commit.builder() @@ -452,7 +450,6 @@ public static List MOCK_TWO_ORGANIZATIONS_PIPELINE_CSV_DATA() { .pipelineCreateTime("2023-05-10T06:17:21.844Z") .state("passed") .number(880) - .creator(BuildKiteBuildInfo.Creator.builder().name("XXXX").email("XXX@test.com").build()) .jobs(List.of(BuildKiteJob.builder() .name(":rocket: Deploy prod") .state("passed") @@ -460,7 +457,7 @@ public static List MOCK_TWO_ORGANIZATIONS_PIPELINE_CSV_DATA() { .finishedAt("2023-05-10T06:43:02.653Z") .build())) .branch("branch") - .author(BuildKiteBuildInfo.Author.builder().name("yulong").build()) + .author(BuildKiteBuildInfo.Author.builder().name("XXXX").build()) .build()) .commitInfo(CommitInfo.builder() .commit(Commit.builder() @@ -512,7 +509,6 @@ public static List MOCK_TWO_ORGANIZATIONS_PIPELINE_CSV_DATA() { .finishedAt("2023-05-10T06:43:02.653Z") .build())) .branch("branch") - .author(BuildKiteBuildInfo.Author.builder().name("yulong").build()) .build()) .commitInfo(CommitInfo.builder() .commit(Commit.builder() diff --git a/backend/src/test/java/heartbeat/service/report/PipelineServiceTest.java b/backend/src/test/java/heartbeat/service/report/PipelineServiceTest.java index 206e0138de..73b8b980a1 100644 --- a/backend/src/test/java/heartbeat/service/report/PipelineServiceTest.java +++ b/backend/src/test/java/heartbeat/service/report/PipelineServiceTest.java @@ -1,8 +1,5 @@ package heartbeat.service.report; -import heartbeat.client.dto.codebase.github.Author; -import heartbeat.client.dto.codebase.github.Commit; -import heartbeat.client.dto.codebase.github.CommitInfo; import heartbeat.client.dto.codebase.github.LeadTime; import heartbeat.client.dto.codebase.github.PipelineLeadTime; import heartbeat.client.dto.pipeline.buildkite.BuildKiteBuildInfo; @@ -35,7 +32,6 @@ import java.util.Map; import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNull; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.never; @@ -285,8 +281,7 @@ class GenerateCSVForPipelineWithCodebase { @Test void shouldReturnEmptyWhenDeploymentEnvironmentsIsEmpty() { - List result = pipelineService.generateCSVForPipelineWithCodebase( - CodebaseSetting.builder().build(), MOCK_START_TIME, MOCK_END_TIME, + List result = pipelineService.generateCSVForPipeline(MOCK_START_TIME, MOCK_END_TIME, FetchedData.BuildKiteData.builder().build(), Lists.list()); assertEquals(0, result.size()); @@ -295,8 +290,7 @@ void shouldReturnEmptyWhenDeploymentEnvironmentsIsEmpty() { @Test void shouldReturnEmptyWhenNoBuildInfoFoundForDeploymentEnvironment() { - List result = pipelineService.generateCSVForPipelineWithCodebase( - CodebaseSetting.builder().build(), MOCK_START_TIME, MOCK_END_TIME, + List result = pipelineService.generateCSVForPipeline(MOCK_START_TIME, MOCK_END_TIME, FetchedData.BuildKiteData.builder().buildInfosList(List.of(Map.entry("env1", List.of()))).build(), List.of(DeploymentEnvironment.builder().id("env1").build())); @@ -309,8 +303,7 @@ void shouldReturnEmptyWhenPipelineStepsIsEmpty() { List kiteBuildInfos = List.of(BuildKiteBuildInfo.builder().build()); when(buildKiteService.getPipelineStepNames(eq(kiteBuildInfos))).thenReturn(List.of()); - List result = pipelineService.generateCSVForPipelineWithCodebase( - CodebaseSetting.builder().build(), MOCK_START_TIME, MOCK_END_TIME, + List result = pipelineService.generateCSVForPipeline(MOCK_START_TIME, MOCK_END_TIME, FetchedData.BuildKiteData.builder() .buildInfosList(List.of(Map.entry("env1", kiteBuildInfos))) .build(), @@ -327,8 +320,7 @@ void shouldReturnEmptyWhenBuildJobIsEmpty() { when(buildKiteService.getBuildKiteJob(any(), any(), any(), eq(MOCK_START_TIME), eq(MOCK_END_TIME))) .thenReturn(null); when(buildKiteService.getStepsBeforeEndStep(any(), any())).thenReturn(List.of("check")); - List result = pipelineService.generateCSVForPipelineWithCodebase( - CodebaseSetting.builder().build(), MOCK_START_TIME, MOCK_END_TIME, + List result = pipelineService.generateCSVForPipeline(MOCK_START_TIME, MOCK_END_TIME, FetchedData.BuildKiteData.builder() .buildInfosList(List.of(Map.entry("env1", kiteBuildInfos))) .build(), @@ -348,8 +340,7 @@ void shouldFilterOutInvalidBuildOfCommentIsEmtpy() { when(buildKiteService.getBuildKiteJob(any(), any(), any(), eq(MOCK_START_TIME), eq(MOCK_END_TIME))) .thenReturn(BuildKiteJob.builder().build()); - List result = pipelineService.generateCSVForPipelineWithCodebase( - CodebaseSetting.builder().build(), MOCK_START_TIME, MOCK_END_TIME, + List result = pipelineService.generateCSVForPipeline(MOCK_START_TIME, MOCK_END_TIME, FetchedData.BuildKiteData.builder() .buildInfosList(List.of(Map.entry("env1", kiteBuildInfos))) .build(), @@ -360,91 +351,20 @@ void shouldFilterOutInvalidBuildOfCommentIsEmtpy() { verify(buildKiteService, times(1)).getBuildKiteJob(any(), any(), any(), any(), any()); } - @Test - void shouldGenerateValueWithoutCommitWhenCodebaseSettingIsEmpty() { - List kiteBuildInfos = List.of(BuildKiteBuildInfo.builder().commit("commit").build()); - when(buildKiteService.getPipelineStepNames(eq(kiteBuildInfos))).thenReturn(List.of("check")); - when(buildKiteService.getStepsBeforeEndStep(any(), any())).thenReturn(List.of("check")); - when(buildKiteService.getBuildKiteJob(any(), any(), any(), eq(MOCK_START_TIME), eq(MOCK_END_TIME))) - .thenReturn(BuildKiteJob.builder().build()); - when(buildKiteService.mapToDeployInfo(any(), any(), any(), eq(MOCK_START_TIME), eq(MOCK_END_TIME))) - .thenReturn(DeployInfo.builder().jobName("test").build()); - - List result = pipelineService.generateCSVForPipelineWithCodebase(null, MOCK_START_TIME, - MOCK_END_TIME, - FetchedData.BuildKiteData.builder() - .buildInfosList(List.of(Map.entry("env1", kiteBuildInfos))) - .build(), - List.of(DeploymentEnvironment.builder().id("env1").build())); - - assertEquals(1, result.size()); - assertNull(result.get(0).getCommitInfo()); - verify(buildKiteService, times(1)).getPipelineStepNames(any()); - verify(buildKiteService, times(1)).getBuildKiteJob(any(), any(), any(), any(), any()); - } - - @Test - void shouldGenerateValueWithoutCommitWhenCodebaseSettingTokenIsEmpty() { - List kiteBuildInfos = List.of(BuildKiteBuildInfo.builder().commit("commit").build()); - when(buildKiteService.getPipelineStepNames(eq(kiteBuildInfos))).thenReturn(List.of("check")); - when(buildKiteService.getStepsBeforeEndStep(any(), any())).thenReturn(List.of("check")); - when(buildKiteService.getBuildKiteJob(any(), any(), any(), eq(MOCK_START_TIME), eq(MOCK_END_TIME))) - .thenReturn(BuildKiteJob.builder().build()); - when(buildKiteService.mapToDeployInfo(any(), any(), any(), eq(MOCK_START_TIME), eq(MOCK_END_TIME))) - .thenReturn(DeployInfo.builder().jobName("test").build()); - - List result = pipelineService.generateCSVForPipelineWithCodebase( - CodebaseSetting.builder().build(), MOCK_START_TIME, MOCK_END_TIME, - FetchedData.BuildKiteData.builder() - .buildInfosList(List.of(Map.entry("env1", kiteBuildInfos))) - .build(), - List.of(DeploymentEnvironment.builder().id("env1").build())); - - assertEquals(1, result.size()); - assertNull(result.get(0).getCommitInfo()); - verify(buildKiteService, times(1)).getPipelineStepNames(any()); - verify(buildKiteService, times(1)).getBuildKiteJob(any(), any(), any(), any(), any()); - } - - @Test - void shouldGenerateValueWithoutCommitWhenCommitIdIsEmpty() { - List kiteBuildInfos = List.of(BuildKiteBuildInfo.builder().commit("commit").build()); - when(buildKiteService.getPipelineStepNames(eq(kiteBuildInfos))).thenReturn(List.of("check")); - when(buildKiteService.getStepsBeforeEndStep(any(), any())).thenReturn(List.of("check")); - when(buildKiteService.getBuildKiteJob(any(), any(), any(), eq(MOCK_START_TIME), eq(MOCK_END_TIME))) - .thenReturn(BuildKiteJob.builder().build()); - when(buildKiteService.mapToDeployInfo(any(), any(), any(), eq(MOCK_START_TIME), eq(MOCK_END_TIME))) - .thenReturn(DeployInfo.builder().jobName("test").build()); - - List result = pipelineService.generateCSVForPipelineWithCodebase( - CodebaseSetting.builder().token("token").build(), MOCK_START_TIME, MOCK_END_TIME, - FetchedData.BuildKiteData.builder() - .buildInfosList(List.of(Map.entry("env1", kiteBuildInfos))) - .build(), - List.of(DeploymentEnvironment.builder().id("env1").build())); - - assertEquals(1, result.size()); - assertNull(result.get(0).getCommitInfo()); - verify(buildKiteService, times(1)).getPipelineStepNames(any()); - verify(buildKiteService, times(1)).getBuildKiteJob(any(), any(), any(), any(), any()); - } - @Test void shouldGenerateValueHasCommit() { - List kiteBuildInfos = List.of(BuildKiteBuildInfo.builder().commit("commit").build()); - CommitInfo fakeCommitInfo = CommitInfo.builder() - .commit(Commit.builder().author(Author.builder().name("xxxx").build()).build()) - .build(); + List kiteBuildInfos = List.of(BuildKiteBuildInfo.builder() + .commit("commit") + .author(BuildKiteBuildInfo.Author.builder().name("xxxx").build()) + .build()); when(buildKiteService.getPipelineStepNames(eq(kiteBuildInfos))).thenReturn(List.of("check")); when(buildKiteService.getStepsBeforeEndStep(any(), any())).thenReturn(List.of("check")); when(buildKiteService.getBuildKiteJob(any(), any(), any(), eq(MOCK_START_TIME), eq(MOCK_END_TIME))) .thenReturn(BuildKiteJob.builder().build()); DeployInfo fakeDeploy = DeployInfo.builder().commitId("commitId").jobName("test").build(); when(buildKiteService.mapToDeployInfo(any(), any(), any(), any(), any())).thenReturn(fakeDeploy); - when(gitHubService.fetchCommitInfo(any(), any(), any())).thenReturn(fakeCommitInfo); - List result = pipelineService.generateCSVForPipelineWithCodebase( - CodebaseSetting.builder().token("token").build(), MOCK_START_TIME, MOCK_END_TIME, + List result = pipelineService.generateCSVForPipeline(MOCK_START_TIME, MOCK_END_TIME, FetchedData.BuildKiteData.builder() .buildInfosList(List.of(Map.entry("env1", kiteBuildInfos))) .build(), @@ -461,20 +381,18 @@ void shouldGenerateValueHasCommit() { @Test void shouldGenerateValueWithLeadTimeWhenLeadTimeExisting() { - List kiteBuildInfos = List.of(BuildKiteBuildInfo.builder().commit("commit").build()); - CommitInfo fakeCommitInfo = CommitInfo.builder() - .commit(Commit.builder().author(Author.builder().name("xxxx").build()).build()) - .build(); + List kiteBuildInfos = List.of(BuildKiteBuildInfo.builder() + .commit("commit") + .author(BuildKiteBuildInfo.Author.builder().name("xxxx").build()) + .build()); when(buildKiteService.getPipelineStepNames(eq(kiteBuildInfos))).thenReturn(List.of("check")); when(buildKiteService.getStepsBeforeEndStep(any(), any())).thenReturn(List.of("check")); when(buildKiteService.getBuildKiteJob(any(), any(), any(), eq(MOCK_START_TIME), eq(MOCK_END_TIME))) .thenReturn(BuildKiteJob.builder().build()); DeployInfo fakeDeploy = DeployInfo.builder().commitId("commitId").jobName("test").build(); when(buildKiteService.mapToDeployInfo(any(), any(), any(), any(), any())).thenReturn(fakeDeploy); - when(gitHubService.fetchCommitInfo(any(), any(), any())).thenReturn(fakeCommitInfo); - List result = pipelineService.generateCSVForPipelineWithCodebase( - CodebaseSetting.builder().token("token").build(), MOCK_START_TIME, MOCK_END_TIME, + List result = pipelineService.generateCSVForPipeline(MOCK_START_TIME, MOCK_END_TIME, FetchedData.BuildKiteData.builder() .pipelineLeadTimes(List.of(PipelineLeadTime.builder() .leadTimes(List.of(LeadTime.builder().commitId("commitId").build())) @@ -495,20 +413,18 @@ void shouldGenerateValueWithLeadTimeWhenLeadTimeExisting() { @Test void shouldGenerateValueWithOrganizationWhenDeployHasOrganization() { - List kiteBuildInfos = List.of(BuildKiteBuildInfo.builder().commit("commit").build()); - CommitInfo fakeCommitInfo = CommitInfo.builder() - .commit(Commit.builder().author(Author.builder().name("xxxx").build()).build()) - .build(); + List kiteBuildInfos = List.of(BuildKiteBuildInfo.builder() + .commit("commit") + .author(BuildKiteBuildInfo.Author.builder().name("xxxx").build()) + .build()); when(buildKiteService.getPipelineStepNames(eq(kiteBuildInfos))).thenReturn(List.of("check")); when(buildKiteService.getStepsBeforeEndStep(any(), any())).thenReturn(List.of("check")); when(buildKiteService.getBuildKiteJob(any(), any(), any(), eq(MOCK_START_TIME), eq(MOCK_END_TIME))) .thenReturn(BuildKiteJob.builder().build()); DeployInfo fakeDeploy = DeployInfo.builder().commitId("commitId").jobName("test").build(); when(buildKiteService.mapToDeployInfo(any(), any(), any(), any(), any())).thenReturn(fakeDeploy); - when(gitHubService.fetchCommitInfo(any(), any(), any())).thenReturn(fakeCommitInfo); - List result = pipelineService.generateCSVForPipelineWithCodebase( - CodebaseSetting.builder().token("token").build(), MOCK_START_TIME, MOCK_END_TIME, + List result = pipelineService.generateCSVForPipeline(MOCK_START_TIME, MOCK_END_TIME, FetchedData.BuildKiteData.builder() .pipelineLeadTimes(List.of(PipelineLeadTime.builder() .leadTimes(List.of(LeadTime.builder().commitId("commitId").build())) @@ -544,8 +460,7 @@ void shouldGenerateValueWhenBuildKiteDataAuthorIsNotNull() { DeployInfo fakeDeploy = DeployInfo.builder().commitId("commitId").jobName("test").build(); when(buildKiteService.mapToDeployInfo(any(), any(), any(), any(), any())).thenReturn(fakeDeploy); - List result = pipelineService.generateCSVForPipelineWithCodebase( - CodebaseSetting.builder().token("token").build(), MOCK_START_TIME, MOCK_END_TIME, + List result = pipelineService.generateCSVForPipeline(MOCK_START_TIME, MOCK_END_TIME, FetchedData.BuildKiteData.builder() .pipelineLeadTimes(List.of(PipelineLeadTime.builder() .leadTimes(List.of(LeadTime.builder().commitId("commitId").build())) diff --git a/frontend/e2e/fixtures/create-new/pipeline-data.csv b/frontend/e2e/fixtures/create-new/pipeline-data.csv index 2716056019..bdc85795a0 100644 --- a/frontend/e2e/fixtures/create-new/pipeline-data.csv +++ b/frontend/e2e/fixtures/create-new/pipeline-data.csv @@ -1,23 +1,31 @@ "Organization","Pipeline Name","Pipeline Step","Valid","Build Number","Code Committer","Pipeline Creator","First Code Committed Time In PR","PR Created Time","PR Merged Time","No PR Committed Time","Job Start Time","Pipeline Start Time","Pipeline Finish Time","Total Lead Time (HH:mm:ss)","PR Lead Time (HH:mm:ss)","Pipeline Lead Time (HH:mm:ss)","Status","Branch","Revert" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4210","guzhongren","guzhongren","2024-01-19T14:58:27Z","2024-01-19T14:59:15Z","2024-01-19T15:02:47Z",,"2024-01-19T15:26:59Z","2024-01-19T15:02:47Z","2024-01-19T15:27:32.983Z","0:24:45","0:0:0","0:24:45","passed","main","true" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Run e2e","false","4208","Steveay","guzhongren",,,,,,,"2024-01-19T15:09:15.439Z",,,,"failed","main","" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4210","guzhongren +guzhongren","guzhongren","2024-01-19T14:58:27Z","2024-01-19T14:59:15Z","2024-01-19T15:02:47Z",,"2024-01-19T15:26:59Z","2024-01-19T15:02:47Z","2024-01-19T15:27:32.983Z","0:24:45","0:0:0","0:24:45","passed","main","true" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Run e2e","false","4208",guzhongren,"guzhongren",,,,,,,"2024-01-19T15:09:15.439Z",,,,"failed","main","" "Thoughtworks-Heartbeat","Heartbeat",":mag: Check Frontend License","false","4204","Steveay",,,,,,,,"2024-01-19T11:16:12.025Z",,,,"canceled","main","" "Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4187","sqsq5566",,"2024-01-19T04:01:30Z","2024-01-19T06:07:51Z","2024-01-19T06:18:27Z",,"2024-01-19T06:37:09Z","2024-01-19T06:18:27Z","2024-01-19T06:37:42.885Z","2:36:12","2:16:57","0:19:15","passed","main","false" "Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4185","neomgb",,"2024-01-18T09:08:32Z","2024-01-19T02:59:59Z","2024-01-19T05:47:24Z",,"2024-01-19T06:14:02Z","2024-01-19T05:47:24Z","2024-01-19T06:14:32.418Z","21:6:0","20:38:52","0:27:8","passed","main","false" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4178","guzhongren","guzhongren",,,,"2024-01-18T15:51:58Z","2024-01-18T16:55:57Z","2024-01-18T15:51:58Z","2024-01-18T16:56:25.673Z","1:4:27","0:0:0","1:4:27","passed","main","false" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Run e2e","false","4177","guzhongren","guzhongren",,,,,,,"2024-01-18T16:18:32.089Z",,,,"failed","main","" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Run e2e","false","4176","guzhongren","guzhongren",,,,,,,"2024-01-18T16:06:41.439Z",,,,"passed","main","" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4175","guzhongren","guzhongren",,,,"2024-01-18T15:16:05Z","2024-01-18T15:53:30Z","2024-01-18T15:16:05Z","2024-01-18T15:53:58.280Z","0:37:53","0:0:0","0:37:53","passed","main","false" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4174","guzhongren","guzhongren",,,,"2024-01-18T15:00:53Z","2024-01-18T15:27:37Z","2024-01-18T15:00:53Z","2024-01-18T15:28:06.427Z","0:27:13","0:0:0","0:27:13","passed","main","false" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4178","guzhongren +guzhongren","guzhongren",,,,"2024-01-18T15:51:58Z","2024-01-18T16:55:57Z","2024-01-18T15:51:58Z","2024-01-18T16:56:25.673Z","1:4:27","0:0:0","1:4:27","passed","main","false" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Run e2e","false","4177","guzhongren +guzhongren","guzhongren",,,,,,,"2024-01-18T16:18:32.089Z",,,,"failed","main","" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Run e2e","false","4176","guzhongren +guzhongren","guzhongren",,,,,,,"2024-01-18T16:06:41.439Z",,,,"passed","main","" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4175","guzhongren +guzhongren","guzhongren",,,,"2024-01-18T15:16:05Z","2024-01-18T15:53:30Z","2024-01-18T15:16:05Z","2024-01-18T15:53:58.280Z","0:37:53","0:0:0","0:37:53","passed","main","false" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4174","guzhongren +guzhongren","guzhongren",,,,"2024-01-18T15:00:53Z","2024-01-18T15:27:37Z","2024-01-18T15:00:53Z","2024-01-18T15:28:06.427Z","0:27:13","0:0:0","0:27:13","passed","main","false" "Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4173","Chao",,"2024-01-18T09:54:35Z","2024-01-18T05:47:24Z","2024-01-18T10:08:17Z",,"2024-01-18T10:33:18Z","2024-01-18T10:08:17Z","2024-01-18T10:33:46.039Z","0:39:11","0:13:42","0:25:29","passed","main","false" "Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4171","neomgb",,"2024-01-18T02:33:54Z","2024-01-18T02:54:05Z","2024-01-18T09:41:40Z",,"2024-01-18T10:07:00Z","2024-01-18T09:41:40Z","2024-01-18T10:07:29.676Z","7:33:35","7:7:46","0:25:49","passed","main","false" "Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4166","junbo dai",,"2024-01-18T08:28:22Z","2024-01-18T08:27:11Z","2024-01-18T08:56:52Z",,"2024-01-18T09:15:09Z","2024-01-18T08:56:52Z","2024-01-18T09:15:44.306Z","0:47:22","0:28:30","0:18:52","passed","main","false" "Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4162","李雪冰",,"2024-01-18T05:45:03Z","2024-01-18T06:34:30Z","2024-01-18T08:28:09Z",,"2024-01-18T08:52:29Z","2024-01-18T08:28:09Z","2024-01-18T08:52:58.699Z","3:7:55","2:43:6","0:24:49","passed","main","false" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4151","yichen.wang","heartbeat-user",,,,"2024-01-18T05:35:15Z","2024-01-18T05:55:59Z","2024-01-18T05:35:15Z","2024-01-18T05:56:34.575Z","0:21:19","0:0:0","0:21:19","passed","main","true" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Run e2e","false","4148","yichen.wang","heartbeat-user",,,,,,,"2024-01-18T03:01:41.593Z",,,,"failed","main","" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4151","yichen.wang +heartbeat-user","heartbeat-user",,,,"2024-01-18T05:35:15Z","2024-01-18T05:55:59Z","2024-01-18T05:35:15Z","2024-01-18T05:56:34.575Z","0:21:19","0:0:0","0:21:19","passed","main","true" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Run e2e","false","4148","yichen.wang +heartbeat-user","heartbeat-user",,,,,,,"2024-01-18T03:01:41.593Z",,,,"failed","main","" "Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4147","Steveay",,"2024-01-17T07:43:29Z","2024-01-17T09:42:52Z","2024-01-17T10:47:01Z",,"2024-01-17T11:21:20Z","2024-01-17T10:47:01Z","2024-01-17T11:22:02.967Z","3:38:33","3:3:32","0:35:1","passed","main","false" "Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4146","李雪冰",,"2024-01-17T08:06:19Z","2024-01-17T09:34:27Z","2024-01-17T09:48:38Z",,"2024-01-17T10:13:10Z","2024-01-17T09:48:38Z","2024-01-17T10:13:39.473Z","2:7:20","1:42:19","0:25:1","passed","main","false" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4137","neomgb","heartbeat-user","2024-01-17T03:05:11Z","2024-01-17T04:01:00Z","2024-01-17T06:46:34Z",,"2024-01-17T07:22:06Z","2024-01-17T06:46:34Z","2024-01-17T07:22:40.087Z","4:17:29","3:41:23","0:36:6","passed","main","false" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4137",heartbeat-user,"heartbeat-user","2024-01-17T03:05:11Z","2024-01-17T04:01:00Z","2024-01-17T06:46:34Z",,"2024-01-17T07:22:06Z","2024-01-17T06:46:34Z","2024-01-17T07:22:40.087Z","4:17:29","3:41:23","0:36:6","passed","main","false" "Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4133","junbo dai",,"2024-01-17T03:54:13Z","2024-01-17T03:59:41Z","2024-01-17T06:15:16Z",,"2024-01-17T06:33:32Z","2024-01-17T06:15:16Z","2024-01-17T06:34:03.987Z","2:39:50","2:21:3","0:18:47","passed","main","false" "Thoughtworks-Heartbeat","Heartbeat",":rocket: Run e2e","false","4123","junbo dai",,,,,,,,"2024-01-17T03:28:28.520Z",,,,"passed","main","" "Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4119","sqsq5566",,"2024-01-17T02:26:10Z","2024-01-17T02:31:10Z","2024-01-17T02:55:54Z",,"2024-01-17T03:14:17Z","2024-01-17T02:55:54Z","2024-01-17T03:14:48.671Z","0:48:38","0:29:44","0:18:54","passed","main","false" @@ -27,21 +35,24 @@ "Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4104","sqsq5566",,"2024-01-16T08:55:43Z","2024-01-16T09:33:36Z","2024-01-16T13:49:23Z",,"2024-01-16T14:09:48Z","2024-01-16T13:49:23Z","2024-01-16T14:10:20.523Z","5:14:37","4:53:40","0:20:57","passed","main","false" "Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4094","xuebing",,"2024-01-16T08:20:20Z","2024-01-16T08:42:05Z","2024-01-16T09:03:42Z",,"2024-01-16T09:29:48Z","2024-01-16T09:03:42Z","2024-01-16T09:30:16.889Z","1:9:56","0:43:22","0:26:34","passed","main","false" "Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4087","Yunsong",,"2024-01-16T08:42:19Z","2024-01-16T08:43:18Z","2024-01-16T08:43:45Z",,"2024-01-16T09:02:16Z","2024-01-16T08:43:45Z","2024-01-16T09:02:46.685Z","0:20:27","0:1:26","0:19:1","passed","main","false" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4078","GuangbinMa","heartbeat-user","2024-01-16T06:33:44Z","2024-01-16T07:25:34Z","2024-01-16T07:58:33Z",,"2024-01-16T08:31:57Z","2024-01-16T07:58:33Z","2024-01-16T08:32:28.349Z","1:58:44","1:24:49","0:33:55","passed","main","false" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4078",heartbeat-user,"heartbeat-user","2024-01-16T06:33:44Z","2024-01-16T07:25:34Z","2024-01-16T07:58:33Z",,"2024-01-16T08:31:57Z","2024-01-16T07:58:33Z","2024-01-16T08:32:28.349Z","1:58:44","1:24:49","0:33:55","passed","main","false" "Thoughtworks-Heartbeat","Heartbeat",":pipeline: Upload pipeline.yml","false","4075","Yunsong",,,,,,,,"2024-01-16T07:58:17.589Z",,,,"canceled","main","" "Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4070","Yunsong",,"2024-01-16T07:06:35Z","2024-01-16T07:11:17Z","2024-01-16T07:31:50Z",,"2024-01-16T07:50:18Z","2024-01-16T07:31:50Z","2024-01-16T07:50:58.369Z","0:44:23","0:25:15","0:19:8","passed","main","false" "Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4065","Nathan Wang",,"2024-01-16T03:51:04Z","2024-01-10T07:48:39Z","2024-01-16T05:44:17Z",,"2024-01-16T06:36:15Z","2024-01-16T05:44:17Z","2024-01-16T06:36:44.984Z","2:45:40","1:53:13","0:52:27","passed","main","false" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4064","Simon Tal","heartbeat-user","2024-01-16T03:35:20Z","2024-01-16T03:38:26Z","2024-01-16T03:47:27Z",,"2024-01-16T06:10:58Z","2024-01-16T03:47:27Z","2024-01-16T06:11:26.201Z","2:36:6","0:12:7","2:23:59","passed","main","false" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4064",heartbeat-user,"heartbeat-user","2024-01-16T03:35:20Z","2024-01-16T03:38:26Z","2024-01-16T03:47:27Z",,"2024-01-16T06:10:58Z","2024-01-16T03:47:27Z","2024-01-16T06:11:26.201Z","2:36:6","0:12:7","2:23:59","passed","main","false" "Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4056","weiran.sun",,"2024-01-16T02:27:37Z","2024-01-16T02:38:02Z","2024-01-16T02:41:35Z",,"2024-01-16T03:00:48Z","2024-01-16T02:41:35Z","2024-01-16T03:01:19.266Z","0:33:42","0:13:58","0:19:44","passed","main","false" "Thoughtworks-Heartbeat","Heartbeat",":rocket: Run e2e","false","4054","Jianxun.Ma",,,,,,,,"2024-01-16T02:22:28.775Z",,,,"passed","main","" "Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4050","junbo.dai",,"2024-01-16T01:14:24Z","2024-01-16T01:13:59Z","2024-01-16T01:36:23Z",,"2024-01-16T01:56:42Z","2024-01-16T01:36:23Z","2024-01-16T01:57:13.241Z","0:42:49","0:21:59","0:20:50","passed","main","false" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4047","guzhongren","guzhongren",,,,"2024-01-15T15:41:49Z","2024-01-15T16:09:35Z","2024-01-15T15:41:49Z","2024-01-15T16:10:04.028Z","0:28:15","0:0:0","0:28:15","passed","main","false" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy e2e","false","4046","guzhongren","guzhongren",,,,,,,"2024-01-15T15:40:09.332Z",,,,"passed","main","" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4045","guzhongren","guzhongren",,,,"2024-01-15T14:30:35Z","2024-01-15T14:58:51Z","2024-01-15T14:30:35Z","2024-01-15T14:59:21.298Z","0:28:46","0:0:0","0:28:46","passed","main","false" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4047","guzhongren +guzhongren","guzhongren",,,,"2024-01-15T15:41:49Z","2024-01-15T16:09:35Z","2024-01-15T15:41:49Z","2024-01-15T16:10:04.028Z","0:28:15","0:0:0","0:28:15","passed","main","false" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy e2e","false","4046","guzhongren +guzhongren","guzhongren",,,,,,,"2024-01-15T15:40:09.332Z",,,,"passed","main","" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4045","guzhongren +guzhongren","guzhongren",,,,"2024-01-15T14:30:35Z","2024-01-15T14:58:51Z","2024-01-15T14:30:35Z","2024-01-15T14:59:21.298Z","0:28:46","0:0:0","0:28:46","passed","main","false" "Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4044","GuangbinMa",,"2024-01-15T09:00:10Z","2024-01-15T09:55:27Z","2024-01-15T10:06:21Z",,"2024-01-15T10:33:21Z","2024-01-15T10:06:21Z","2024-01-15T10:33:54.045Z","1:33:44","1:6:11","0:27:33","passed","main","false" "Thoughtworks-Heartbeat","Heartbeat",":rocket: Run e2e","false","4034","JiangRu1",,,,,,,,"2024-01-15T08:49:47.422Z",,,,"failed","main","" -"Thoughtworks-Heartbeat","Heartbeat",":mag: Check Backend License","false","4033","Jianxun.Ma","heartbeat-user",,,,,,,"2024-01-15T08:14:07.027Z",,,,"canceled","main","" -"Thoughtworks-Heartbeat","Heartbeat",":pipeline: Upload pipeline.yml","false","4031","Jianxun.Ma","heartbeat-user",,,,,,,"2024-01-15T07:58:40.203Z",,,,"canceled","main","" +"Thoughtworks-Heartbeat","Heartbeat",":mag: Check Backend License","false","4033",heartbeat-user,"heartbeat-user",,,,,,,"2024-01-15T08:14:07.027Z",,,,"canceled","main","" +"Thoughtworks-Heartbeat","Heartbeat",":pipeline: Upload pipeline.yml","false","4031",heartbeat-user,"heartbeat-user",,,,,,,"2024-01-15T07:58:40.203Z",,,,"canceled","main","" "Thoughtworks-Heartbeat","Heartbeat",":rocket: Run e2e","false","4027","Jianxun.Ma",,,,,,,,"2024-01-15T08:25:40.681Z",,,,"failed","main","" "Thoughtworks-Heartbeat","Heartbeat",":rocket: Run e2e","false","4018","GuangbinMa",,,,,,,,"2024-01-15T06:49:24.921Z",,,,"failed","main","" "Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4012","Steveay",,"2024-01-12T08:02:24Z","2024-01-15T01:27:53Z","2024-01-15T03:45:41Z",,"2024-01-15T04:04:34Z","2024-01-15T03:45:41Z","2024-01-15T04:05:06.398Z","68:2:42","67:43:17","0:19:25","passed","main","false" diff --git a/frontend/e2e/fixtures/import-file/pipeline-data.csv b/frontend/e2e/fixtures/import-file/pipeline-data.csv index 2716056019..bdc85795a0 100644 --- a/frontend/e2e/fixtures/import-file/pipeline-data.csv +++ b/frontend/e2e/fixtures/import-file/pipeline-data.csv @@ -1,23 +1,31 @@ "Organization","Pipeline Name","Pipeline Step","Valid","Build Number","Code Committer","Pipeline Creator","First Code Committed Time In PR","PR Created Time","PR Merged Time","No PR Committed Time","Job Start Time","Pipeline Start Time","Pipeline Finish Time","Total Lead Time (HH:mm:ss)","PR Lead Time (HH:mm:ss)","Pipeline Lead Time (HH:mm:ss)","Status","Branch","Revert" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4210","guzhongren","guzhongren","2024-01-19T14:58:27Z","2024-01-19T14:59:15Z","2024-01-19T15:02:47Z",,"2024-01-19T15:26:59Z","2024-01-19T15:02:47Z","2024-01-19T15:27:32.983Z","0:24:45","0:0:0","0:24:45","passed","main","true" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Run e2e","false","4208","Steveay","guzhongren",,,,,,,"2024-01-19T15:09:15.439Z",,,,"failed","main","" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4210","guzhongren +guzhongren","guzhongren","2024-01-19T14:58:27Z","2024-01-19T14:59:15Z","2024-01-19T15:02:47Z",,"2024-01-19T15:26:59Z","2024-01-19T15:02:47Z","2024-01-19T15:27:32.983Z","0:24:45","0:0:0","0:24:45","passed","main","true" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Run e2e","false","4208",guzhongren,"guzhongren",,,,,,,"2024-01-19T15:09:15.439Z",,,,"failed","main","" "Thoughtworks-Heartbeat","Heartbeat",":mag: Check Frontend License","false","4204","Steveay",,,,,,,,"2024-01-19T11:16:12.025Z",,,,"canceled","main","" "Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4187","sqsq5566",,"2024-01-19T04:01:30Z","2024-01-19T06:07:51Z","2024-01-19T06:18:27Z",,"2024-01-19T06:37:09Z","2024-01-19T06:18:27Z","2024-01-19T06:37:42.885Z","2:36:12","2:16:57","0:19:15","passed","main","false" "Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4185","neomgb",,"2024-01-18T09:08:32Z","2024-01-19T02:59:59Z","2024-01-19T05:47:24Z",,"2024-01-19T06:14:02Z","2024-01-19T05:47:24Z","2024-01-19T06:14:32.418Z","21:6:0","20:38:52","0:27:8","passed","main","false" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4178","guzhongren","guzhongren",,,,"2024-01-18T15:51:58Z","2024-01-18T16:55:57Z","2024-01-18T15:51:58Z","2024-01-18T16:56:25.673Z","1:4:27","0:0:0","1:4:27","passed","main","false" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Run e2e","false","4177","guzhongren","guzhongren",,,,,,,"2024-01-18T16:18:32.089Z",,,,"failed","main","" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Run e2e","false","4176","guzhongren","guzhongren",,,,,,,"2024-01-18T16:06:41.439Z",,,,"passed","main","" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4175","guzhongren","guzhongren",,,,"2024-01-18T15:16:05Z","2024-01-18T15:53:30Z","2024-01-18T15:16:05Z","2024-01-18T15:53:58.280Z","0:37:53","0:0:0","0:37:53","passed","main","false" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4174","guzhongren","guzhongren",,,,"2024-01-18T15:00:53Z","2024-01-18T15:27:37Z","2024-01-18T15:00:53Z","2024-01-18T15:28:06.427Z","0:27:13","0:0:0","0:27:13","passed","main","false" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4178","guzhongren +guzhongren","guzhongren",,,,"2024-01-18T15:51:58Z","2024-01-18T16:55:57Z","2024-01-18T15:51:58Z","2024-01-18T16:56:25.673Z","1:4:27","0:0:0","1:4:27","passed","main","false" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Run e2e","false","4177","guzhongren +guzhongren","guzhongren",,,,,,,"2024-01-18T16:18:32.089Z",,,,"failed","main","" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Run e2e","false","4176","guzhongren +guzhongren","guzhongren",,,,,,,"2024-01-18T16:06:41.439Z",,,,"passed","main","" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4175","guzhongren +guzhongren","guzhongren",,,,"2024-01-18T15:16:05Z","2024-01-18T15:53:30Z","2024-01-18T15:16:05Z","2024-01-18T15:53:58.280Z","0:37:53","0:0:0","0:37:53","passed","main","false" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4174","guzhongren +guzhongren","guzhongren",,,,"2024-01-18T15:00:53Z","2024-01-18T15:27:37Z","2024-01-18T15:00:53Z","2024-01-18T15:28:06.427Z","0:27:13","0:0:0","0:27:13","passed","main","false" "Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4173","Chao",,"2024-01-18T09:54:35Z","2024-01-18T05:47:24Z","2024-01-18T10:08:17Z",,"2024-01-18T10:33:18Z","2024-01-18T10:08:17Z","2024-01-18T10:33:46.039Z","0:39:11","0:13:42","0:25:29","passed","main","false" "Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4171","neomgb",,"2024-01-18T02:33:54Z","2024-01-18T02:54:05Z","2024-01-18T09:41:40Z",,"2024-01-18T10:07:00Z","2024-01-18T09:41:40Z","2024-01-18T10:07:29.676Z","7:33:35","7:7:46","0:25:49","passed","main","false" "Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4166","junbo dai",,"2024-01-18T08:28:22Z","2024-01-18T08:27:11Z","2024-01-18T08:56:52Z",,"2024-01-18T09:15:09Z","2024-01-18T08:56:52Z","2024-01-18T09:15:44.306Z","0:47:22","0:28:30","0:18:52","passed","main","false" "Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4162","李雪冰",,"2024-01-18T05:45:03Z","2024-01-18T06:34:30Z","2024-01-18T08:28:09Z",,"2024-01-18T08:52:29Z","2024-01-18T08:28:09Z","2024-01-18T08:52:58.699Z","3:7:55","2:43:6","0:24:49","passed","main","false" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4151","yichen.wang","heartbeat-user",,,,"2024-01-18T05:35:15Z","2024-01-18T05:55:59Z","2024-01-18T05:35:15Z","2024-01-18T05:56:34.575Z","0:21:19","0:0:0","0:21:19","passed","main","true" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Run e2e","false","4148","yichen.wang","heartbeat-user",,,,,,,"2024-01-18T03:01:41.593Z",,,,"failed","main","" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4151","yichen.wang +heartbeat-user","heartbeat-user",,,,"2024-01-18T05:35:15Z","2024-01-18T05:55:59Z","2024-01-18T05:35:15Z","2024-01-18T05:56:34.575Z","0:21:19","0:0:0","0:21:19","passed","main","true" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Run e2e","false","4148","yichen.wang +heartbeat-user","heartbeat-user",,,,,,,"2024-01-18T03:01:41.593Z",,,,"failed","main","" "Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4147","Steveay",,"2024-01-17T07:43:29Z","2024-01-17T09:42:52Z","2024-01-17T10:47:01Z",,"2024-01-17T11:21:20Z","2024-01-17T10:47:01Z","2024-01-17T11:22:02.967Z","3:38:33","3:3:32","0:35:1","passed","main","false" "Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4146","李雪冰",,"2024-01-17T08:06:19Z","2024-01-17T09:34:27Z","2024-01-17T09:48:38Z",,"2024-01-17T10:13:10Z","2024-01-17T09:48:38Z","2024-01-17T10:13:39.473Z","2:7:20","1:42:19","0:25:1","passed","main","false" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4137","neomgb","heartbeat-user","2024-01-17T03:05:11Z","2024-01-17T04:01:00Z","2024-01-17T06:46:34Z",,"2024-01-17T07:22:06Z","2024-01-17T06:46:34Z","2024-01-17T07:22:40.087Z","4:17:29","3:41:23","0:36:6","passed","main","false" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4137",heartbeat-user,"heartbeat-user","2024-01-17T03:05:11Z","2024-01-17T04:01:00Z","2024-01-17T06:46:34Z",,"2024-01-17T07:22:06Z","2024-01-17T06:46:34Z","2024-01-17T07:22:40.087Z","4:17:29","3:41:23","0:36:6","passed","main","false" "Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4133","junbo dai",,"2024-01-17T03:54:13Z","2024-01-17T03:59:41Z","2024-01-17T06:15:16Z",,"2024-01-17T06:33:32Z","2024-01-17T06:15:16Z","2024-01-17T06:34:03.987Z","2:39:50","2:21:3","0:18:47","passed","main","false" "Thoughtworks-Heartbeat","Heartbeat",":rocket: Run e2e","false","4123","junbo dai",,,,,,,,"2024-01-17T03:28:28.520Z",,,,"passed","main","" "Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4119","sqsq5566",,"2024-01-17T02:26:10Z","2024-01-17T02:31:10Z","2024-01-17T02:55:54Z",,"2024-01-17T03:14:17Z","2024-01-17T02:55:54Z","2024-01-17T03:14:48.671Z","0:48:38","0:29:44","0:18:54","passed","main","false" @@ -27,21 +35,24 @@ "Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4104","sqsq5566",,"2024-01-16T08:55:43Z","2024-01-16T09:33:36Z","2024-01-16T13:49:23Z",,"2024-01-16T14:09:48Z","2024-01-16T13:49:23Z","2024-01-16T14:10:20.523Z","5:14:37","4:53:40","0:20:57","passed","main","false" "Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4094","xuebing",,"2024-01-16T08:20:20Z","2024-01-16T08:42:05Z","2024-01-16T09:03:42Z",,"2024-01-16T09:29:48Z","2024-01-16T09:03:42Z","2024-01-16T09:30:16.889Z","1:9:56","0:43:22","0:26:34","passed","main","false" "Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4087","Yunsong",,"2024-01-16T08:42:19Z","2024-01-16T08:43:18Z","2024-01-16T08:43:45Z",,"2024-01-16T09:02:16Z","2024-01-16T08:43:45Z","2024-01-16T09:02:46.685Z","0:20:27","0:1:26","0:19:1","passed","main","false" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4078","GuangbinMa","heartbeat-user","2024-01-16T06:33:44Z","2024-01-16T07:25:34Z","2024-01-16T07:58:33Z",,"2024-01-16T08:31:57Z","2024-01-16T07:58:33Z","2024-01-16T08:32:28.349Z","1:58:44","1:24:49","0:33:55","passed","main","false" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4078",heartbeat-user,"heartbeat-user","2024-01-16T06:33:44Z","2024-01-16T07:25:34Z","2024-01-16T07:58:33Z",,"2024-01-16T08:31:57Z","2024-01-16T07:58:33Z","2024-01-16T08:32:28.349Z","1:58:44","1:24:49","0:33:55","passed","main","false" "Thoughtworks-Heartbeat","Heartbeat",":pipeline: Upload pipeline.yml","false","4075","Yunsong",,,,,,,,"2024-01-16T07:58:17.589Z",,,,"canceled","main","" "Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4070","Yunsong",,"2024-01-16T07:06:35Z","2024-01-16T07:11:17Z","2024-01-16T07:31:50Z",,"2024-01-16T07:50:18Z","2024-01-16T07:31:50Z","2024-01-16T07:50:58.369Z","0:44:23","0:25:15","0:19:8","passed","main","false" "Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4065","Nathan Wang",,"2024-01-16T03:51:04Z","2024-01-10T07:48:39Z","2024-01-16T05:44:17Z",,"2024-01-16T06:36:15Z","2024-01-16T05:44:17Z","2024-01-16T06:36:44.984Z","2:45:40","1:53:13","0:52:27","passed","main","false" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4064","Simon Tal","heartbeat-user","2024-01-16T03:35:20Z","2024-01-16T03:38:26Z","2024-01-16T03:47:27Z",,"2024-01-16T06:10:58Z","2024-01-16T03:47:27Z","2024-01-16T06:11:26.201Z","2:36:6","0:12:7","2:23:59","passed","main","false" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4064",heartbeat-user,"heartbeat-user","2024-01-16T03:35:20Z","2024-01-16T03:38:26Z","2024-01-16T03:47:27Z",,"2024-01-16T06:10:58Z","2024-01-16T03:47:27Z","2024-01-16T06:11:26.201Z","2:36:6","0:12:7","2:23:59","passed","main","false" "Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4056","weiran.sun",,"2024-01-16T02:27:37Z","2024-01-16T02:38:02Z","2024-01-16T02:41:35Z",,"2024-01-16T03:00:48Z","2024-01-16T02:41:35Z","2024-01-16T03:01:19.266Z","0:33:42","0:13:58","0:19:44","passed","main","false" "Thoughtworks-Heartbeat","Heartbeat",":rocket: Run e2e","false","4054","Jianxun.Ma",,,,,,,,"2024-01-16T02:22:28.775Z",,,,"passed","main","" "Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4050","junbo.dai",,"2024-01-16T01:14:24Z","2024-01-16T01:13:59Z","2024-01-16T01:36:23Z",,"2024-01-16T01:56:42Z","2024-01-16T01:36:23Z","2024-01-16T01:57:13.241Z","0:42:49","0:21:59","0:20:50","passed","main","false" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4047","guzhongren","guzhongren",,,,"2024-01-15T15:41:49Z","2024-01-15T16:09:35Z","2024-01-15T15:41:49Z","2024-01-15T16:10:04.028Z","0:28:15","0:0:0","0:28:15","passed","main","false" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy e2e","false","4046","guzhongren","guzhongren",,,,,,,"2024-01-15T15:40:09.332Z",,,,"passed","main","" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4045","guzhongren","guzhongren",,,,"2024-01-15T14:30:35Z","2024-01-15T14:58:51Z","2024-01-15T14:30:35Z","2024-01-15T14:59:21.298Z","0:28:46","0:0:0","0:28:46","passed","main","false" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4047","guzhongren +guzhongren","guzhongren",,,,"2024-01-15T15:41:49Z","2024-01-15T16:09:35Z","2024-01-15T15:41:49Z","2024-01-15T16:10:04.028Z","0:28:15","0:0:0","0:28:15","passed","main","false" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy e2e","false","4046","guzhongren +guzhongren","guzhongren",,,,,,,"2024-01-15T15:40:09.332Z",,,,"passed","main","" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4045","guzhongren +guzhongren","guzhongren",,,,"2024-01-15T14:30:35Z","2024-01-15T14:58:51Z","2024-01-15T14:30:35Z","2024-01-15T14:59:21.298Z","0:28:46","0:0:0","0:28:46","passed","main","false" "Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4044","GuangbinMa",,"2024-01-15T09:00:10Z","2024-01-15T09:55:27Z","2024-01-15T10:06:21Z",,"2024-01-15T10:33:21Z","2024-01-15T10:06:21Z","2024-01-15T10:33:54.045Z","1:33:44","1:6:11","0:27:33","passed","main","false" "Thoughtworks-Heartbeat","Heartbeat",":rocket: Run e2e","false","4034","JiangRu1",,,,,,,,"2024-01-15T08:49:47.422Z",,,,"failed","main","" -"Thoughtworks-Heartbeat","Heartbeat",":mag: Check Backend License","false","4033","Jianxun.Ma","heartbeat-user",,,,,,,"2024-01-15T08:14:07.027Z",,,,"canceled","main","" -"Thoughtworks-Heartbeat","Heartbeat",":pipeline: Upload pipeline.yml","false","4031","Jianxun.Ma","heartbeat-user",,,,,,,"2024-01-15T07:58:40.203Z",,,,"canceled","main","" +"Thoughtworks-Heartbeat","Heartbeat",":mag: Check Backend License","false","4033",heartbeat-user,"heartbeat-user",,,,,,,"2024-01-15T08:14:07.027Z",,,,"canceled","main","" +"Thoughtworks-Heartbeat","Heartbeat",":pipeline: Upload pipeline.yml","false","4031",heartbeat-user,"heartbeat-user",,,,,,,"2024-01-15T07:58:40.203Z",,,,"canceled","main","" "Thoughtworks-Heartbeat","Heartbeat",":rocket: Run e2e","false","4027","Jianxun.Ma",,,,,,,,"2024-01-15T08:25:40.681Z",,,,"failed","main","" "Thoughtworks-Heartbeat","Heartbeat",":rocket: Run e2e","false","4018","GuangbinMa",,,,,,,,"2024-01-15T06:49:24.921Z",,,,"failed","main","" "Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4012","Steveay",,"2024-01-12T08:02:24Z","2024-01-15T01:27:53Z","2024-01-15T03:45:41Z",,"2024-01-15T04:04:34Z","2024-01-15T03:45:41Z","2024-01-15T04:05:06.398Z","68:2:42","67:43:17","0:19:25","passed","main","false" From d8c3fea4c004a64fbc3b8ec7a2624b79e1770b9e Mon Sep 17 00:00:00 2001 From: Steveay <907221539@qq.com> Date: Mon, 15 Apr 2024 17:39:29 +0800 Subject: [PATCH 12/81] ADM-878:[frontend]refactor: rename date range (#1381) --- .../Common/DateRangeViewer/DateRangeViewer.test.tsx | 4 ++-- .../__tests__/containers/ReportStep/ReportStep.test.tsx | 4 ++-- frontend/src/clients/board/dto/request.ts | 4 ++-- frontend/src/components/Common/DateRangeViewer/index.tsx | 4 ++-- .../src/containers/ConfigStep/DateRangePicker/validation.ts | 6 +++--- frontend/src/context/config/configSlice.ts | 4 ++-- frontend/src/utils/util.ts | 4 ++-- 7 files changed, 15 insertions(+), 15 deletions(-) diff --git a/frontend/__tests__/components/Common/DateRangeViewer/DateRangeViewer.test.tsx b/frontend/__tests__/components/Common/DateRangeViewer/DateRangeViewer.test.tsx index e8401ba659..9a3c22332f 100644 --- a/frontend/__tests__/components/Common/DateRangeViewer/DateRangeViewer.test.tsx +++ b/frontend/__tests__/components/Common/DateRangeViewer/DateRangeViewer.test.tsx @@ -1,10 +1,10 @@ import DateRangeViewer from '@src/components/Common/DateRangeViewer'; -import { TDateRange } from '@src/context/config/configSlice'; +import { DateRange } from '@src/context/config/configSlice'; import userEvent from '@testing-library/user-event'; import { render } from '@testing-library/react'; describe('DateRangeViewer', () => { - const setup = (dateRanges: TDateRange) => { + const setup = (dateRanges: DateRange) => { return render(); }; const mockDateRanges = [ diff --git a/frontend/__tests__/containers/ReportStep/ReportStep.test.tsx b/frontend/__tests__/containers/ReportStep/ReportStep.test.tsx index 0f8ae03d09..90033308b7 100644 --- a/frontend/__tests__/containers/ReportStep/ReportStep.test.tsx +++ b/frontend/__tests__/containers/ReportStep/ReportStep.test.tsx @@ -17,7 +17,7 @@ import { SHOW_MORE, } from '../../fixtures'; import { - TDateRange, + DateRange, updateDateRange, updateJiraVerifyResponse, updateMetrics, @@ -89,7 +89,7 @@ describe('Report Step', () => { reportHook.current.reportData = { ...MOCK_REPORT_RESPONSE, exportValidityTime: 30 }; }; const handleSaveMock = jest.fn(); - const setup = (params: string[], dateRange?: TDateRange) => { + const setup = (params: string[], dateRange?: DateRange) => { store = setupStore(); dateRange && store.dispatch(updateDateRange(dateRange)); store.dispatch( diff --git a/frontend/src/clients/board/dto/request.ts b/frontend/src/clients/board/dto/request.ts index ddc96f82ec..140d3657d9 100644 --- a/frontend/src/clients/board/dto/request.ts +++ b/frontend/src/clients/board/dto/request.ts @@ -1,4 +1,4 @@ -import { TDateRange } from '@src/context/config/configSlice'; +import { DateRange } from '@src/context/config/configSlice'; export interface BoardRequestDTO { token: string; @@ -20,6 +20,6 @@ export interface BoardInfoRequestDTO { } export interface BoardInfoConfigDTO extends BoardRequestDTO { - dateRanges: TDateRange | null; + dateRanges: DateRange | null; projectKey: string; } diff --git a/frontend/src/components/Common/DateRangeViewer/index.tsx b/frontend/src/components/Common/DateRangeViewer/index.tsx index a16ce8244e..d90e08e488 100644 --- a/frontend/src/components/Common/DateRangeViewer/index.tsx +++ b/frontend/src/components/Common/DateRangeViewer/index.tsx @@ -8,12 +8,12 @@ import { StyledExpandMoreIcon, } from './style'; import React, { useRef, useState, forwardRef, useEffect, useCallback } from 'react'; -import { TDateRange } from '@src/context/config/configSlice'; +import { DateRange } from '@src/context/config/configSlice'; import { formatDate } from '@src/utils/util'; import { theme } from '@src/theme'; type Props = { - dateRanges: TDateRange; + dateRanges: DateRange; expandColor?: string; expandBackgroundColor?: string; }; diff --git a/frontend/src/containers/ConfigStep/DateRangePicker/validation.ts b/frontend/src/containers/ConfigStep/DateRangePicker/validation.ts index ce0edf0666..56b83c25d7 100644 --- a/frontend/src/containers/ConfigStep/DateRangePicker/validation.ts +++ b/frontend/src/containers/ConfigStep/DateRangePicker/validation.ts @@ -1,12 +1,12 @@ import dayjsSameOrBeforePlugin from 'dayjs/plugin/isSameOrBefore'; import dayjsSameOrAfterPlugin from 'dayjs/plugin/isSameOrAfter'; -import { TDateRange } from '@src/context/config/configSlice'; +import { DateRange } from '@src/context/config/configSlice'; import dayjs, { Dayjs } from 'dayjs'; dayjs.extend(dayjsSameOrBeforePlugin); dayjs.extend(dayjsSameOrAfterPlugin); -export const calculateLastAvailableDate = (date: Dayjs, coveredRange: TDateRange) => { +export const calculateLastAvailableDate = (date: Dayjs, coveredRange: DateRange) => { let lastAvailableDate = dayjs(new Date()).startOf('date'); let minimumDiffDays = lastAvailableDate.diff(date, 'days'); @@ -24,7 +24,7 @@ export const calculateLastAvailableDate = (date: Dayjs, coveredRange: TDateRange return lastAvailableDate; }; -export const isDateDisabled = (coveredRange: TDateRange, date: Dayjs) => +export const isDateDisabled = (coveredRange: DateRange, date: Dayjs) => coveredRange.some( ({ startDate, endDate }) => date.isSameOrAfter(startDate, 'date') && date.isSameOrBefore(endDate, 'date'), ); diff --git a/frontend/src/context/config/configSlice.ts b/frontend/src/context/config/configSlice.ts index 2bcec116f8..01ae86d2d4 100644 --- a/frontend/src/context/config/configSlice.ts +++ b/frontend/src/context/config/configSlice.ts @@ -18,7 +18,7 @@ import merge from 'lodash/merge'; import { isArray } from 'lodash'; import dayjs from 'dayjs'; -export type TDateRange = { +export type DateRange = { startDate: string | null; endDate: string | null; }[]; @@ -28,7 +28,7 @@ export interface BasicConfigState { basic: { projectName: string; calendarType: string; - dateRange: TDateRange; + dateRange: DateRange; metrics: string[]; }; board: IBoardState; diff --git a/frontend/src/utils/util.ts b/frontend/src/utils/util.ts index 3541cae1b0..3393e8d09f 100644 --- a/frontend/src/utils/util.ts +++ b/frontend/src/utils/util.ts @@ -4,7 +4,7 @@ import { ICycleTimeSetting, IPipelineConfig } from '@src/context/Metrics/metrics import { ITargetFieldType } from '@src/components/Common/MultiAutoComplete/styles'; import { BoardInfoResponse } from '@src/hooks/useGetBoardInfo'; import { DATE_FORMAT_TEMPLATE } from '@src/constants/template'; -import { TDateRange } from '@src/context/config/configSlice'; +import { DateRange } from '@src/context/config/configSlice'; import { includes, isEqual, sortBy, uniqBy } from 'lodash'; import duration from 'dayjs/plugin/duration'; import dayjs from 'dayjs'; @@ -102,7 +102,7 @@ export const formatDateToTimestampString = (date: string) => { return dayjs(date).valueOf().toString(); }; -export const sortDateRanges = (dateRanges: TDateRange, descending = true) => { +export const sortDateRanges = (dateRanges: DateRange, descending = true) => { const result = [...dateRanges].sort((a, b) => { return dayjs(b.startDate as string).diff(dayjs(a.startDate as string)); }); From 22590c5d0ed9a297ce0e8a3fa9b32c5505b87814 Mon Sep 17 00:00:00 2001 From: yulongcai <141199398+yulongcai@users.noreply.github.com> Date: Mon, 15 Apr 2024 18:03:34 +0800 Subject: [PATCH 13/81] ADM-919:[backend] fix: set code committer is null when author is null (#1382) --- .../service/report/CSVFileGenerator.java | 9 ++-- .../service/report/CSVFileGeneratorTest.java | 24 +++++----- .../e2e/fixtures/create-new/pipeline-data.csv | 47 +++++++------------ .../fixtures/import-file/pipeline-data.csv | 47 +++++++------------ 4 files changed, 51 insertions(+), 76 deletions(-) diff --git a/backend/src/main/java/heartbeat/service/report/CSVFileGenerator.java b/backend/src/main/java/heartbeat/service/report/CSVFileGenerator.java index 7b42b868ef..349168149d 100644 --- a/backend/src/main/java/heartbeat/service/report/CSVFileGenerator.java +++ b/backend/src/main/java/heartbeat/service/report/CSVFileGenerator.java @@ -99,7 +99,7 @@ public void convertPipelineDataToCSV(List leadTimeData, String File file = new File(fileName); try (CSVWriter csvWriter = new CSVWriter(new FileWriter(file))) { String[] headers = { "Organization", "Pipeline Name", "Pipeline Step", "Valid", "Build Number", - "Code Committer", "Pipeline Creator", "First Code Committed Time In PR", "PR Created Time", + "Code Committer", "Build Creator", "First Code Committed Time In PR", "PR Created Time", "PR Merged Time", "No PR Committed Time", "Job Start Time", "Pipeline Start Time", "Pipeline Finish Time", "Total Lead Time (HH:mm:ss)", "PR Lead Time (HH:mm:ss)", "Pipeline Lead Time (HH:mm:ss)", "Status", "Branch", "Revert" }; @@ -119,19 +119,16 @@ public void convertPipelineDataToCSV(List leadTimeData, String } private String[] getRowData(PipelineCSVInfo csvInfo) { - List committerNames = new ArrayList<>(); + String committerName = null; if (csvInfo.getBuildInfo().getAuthor() != null && csvInfo.getBuildInfo().getAuthor().getName() != null) { - String authorName = String.valueOf(csvInfo.getBuildInfo().getAuthor().getName()); - committerNames.add(authorName); + committerName = String.valueOf(csvInfo.getBuildInfo().getAuthor().getName()); } String creatorName = null; if (csvInfo.getBuildInfo().getCreator() != null && csvInfo.getBuildInfo().getCreator().getName() != null) { creatorName = csvInfo.getBuildInfo().getCreator().getName(); - committerNames.add(creatorName); } - String committerName = committerNames.isEmpty() ? null : String.join("\n", committerNames); String organization = csvInfo.getOrganizationName(); String pipelineName = csvInfo.getPipeLineName(); String stepName = csvInfo.getStepName(); diff --git a/backend/src/test/java/heartbeat/service/report/CSVFileGeneratorTest.java b/backend/src/test/java/heartbeat/service/report/CSVFileGeneratorTest.java index 64cfdc4570..5ae5529d02 100644 --- a/backend/src/test/java/heartbeat/service/report/CSVFileGeneratorTest.java +++ b/backend/src/test/java/heartbeat/service/report/CSVFileGeneratorTest.java @@ -72,7 +72,7 @@ void shouldConvertPipelineDataToCsvGivenCommitInfoNotNull() throws IOException { BufferedReader reader = new BufferedReader(new InputStreamReader(fileInputStream)); String headers = reader.readLine(); assertEquals( - "\"Organization\",\"Pipeline Name\",\"Pipeline Step\",\"Valid\",\"Build Number\",\"Code Committer\",\"Pipeline Creator\",\"First Code Committed Time In PR\",\"PR Created Time\",\"PR Merged Time\",\"No PR Committed Time\",\"Job Start Time\",\"Pipeline Start Time\",\"Pipeline Finish Time\",\"Total Lead Time (HH:mm:ss)\",\"PR Lead Time (HH:mm:ss)\",\"Pipeline Lead Time (HH:mm:ss)\",\"Status\",\"Branch\",\"Revert\"", + "\"Organization\",\"Pipeline Name\",\"Pipeline Step\",\"Valid\",\"Build Number\",\"Code Committer\",\"Build Creator\",\"First Code Committed Time In PR\",\"PR Created Time\",\"PR Merged Time\",\"No PR Committed Time\",\"Job Start Time\",\"Pipeline Start Time\",\"Pipeline Finish Time\",\"Total Lead Time (HH:mm:ss)\",\"PR Lead Time (HH:mm:ss)\",\"Pipeline Lead Time (HH:mm:ss)\",\"Status\",\"Branch\",\"Revert\"", headers); String firstLine = reader.readLine(); assertEquals( @@ -98,7 +98,7 @@ void shouldConvertPipelineDataToCsvGivenCommitInfoNotNullAndPipelineStateIsCance BufferedReader reader = new BufferedReader(new InputStreamReader(fileInputStream)); String headers = reader.readLine(); assertEquals( - "\"Organization\",\"Pipeline Name\",\"Pipeline Step\",\"Valid\",\"Build Number\",\"Code Committer\",\"Pipeline Creator\",\"First Code Committed Time In PR\",\"PR Created Time\",\"PR Merged Time\",\"No PR Committed Time\",\"Job Start Time\",\"Pipeline Start Time\",\"Pipeline Finish Time\",\"Total Lead Time (HH:mm:ss)\",\"PR Lead Time (HH:mm:ss)\",\"Pipeline Lead Time (HH:mm:ss)\",\"Status\",\"Branch\",\"Revert\"", + "\"Organization\",\"Pipeline Name\",\"Pipeline Step\",\"Valid\",\"Build Number\",\"Code Committer\",\"Build Creator\",\"First Code Committed Time In PR\",\"PR Created Time\",\"PR Merged Time\",\"No PR Committed Time\",\"Job Start Time\",\"Pipeline Start Time\",\"Pipeline Finish Time\",\"Total Lead Time (HH:mm:ss)\",\"PR Lead Time (HH:mm:ss)\",\"Pipeline Lead Time (HH:mm:ss)\",\"Status\",\"Branch\",\"Revert\"", headers); String firstLine = reader.readLine(); assertEquals( @@ -123,7 +123,7 @@ void shouldConvertPipelineDataToCsvWithoutCreator() throws IOException { assertTrue(file.exists()); assertEquals( - "\"Organization\",\"Pipeline Name\",\"Pipeline Step\",\"Valid\",\"Build Number\",\"Code Committer\",\"Pipeline Creator\",\"First Code Committed Time In PR\",\"PR Created Time\",\"PR Merged Time\",\"No PR Committed Time\",\"Job Start Time\",\"Pipeline Start Time\",\"Pipeline Finish Time\",\"Total Lead Time (HH:mm:ss)\",\"PR Lead Time (HH:mm:ss)\",\"Pipeline Lead Time (HH:mm:ss)\",\"Status\",\"Branch\",\"Revert\"", + "\"Organization\",\"Pipeline Name\",\"Pipeline Step\",\"Valid\",\"Build Number\",\"Code Committer\",\"Build Creator\",\"First Code Committed Time In PR\",\"PR Created Time\",\"PR Merged Time\",\"No PR Committed Time\",\"Job Start Time\",\"Pipeline Start Time\",\"Pipeline Finish Time\",\"Total Lead Time (HH:mm:ss)\",\"PR Lead Time (HH:mm:ss)\",\"Pipeline Lead Time (HH:mm:ss)\",\"Status\",\"Branch\",\"Revert\"", headers); assertEquals( "\"Thoughtworks-Heartbeat\",\"Heartbeat\",\":rocket: Deploy prod\",\"null\",\"880\",\"XXXX\",,\"2023-05-08T07:18:18Z\",\"168369327000\",\"1683793037000\",,\"1683793037000\",\"168369327000\",\"1684793037000\",\"8379303\",\"16837\",\"653037000\",\"passed\",\"branch\",\"\"", @@ -147,7 +147,7 @@ void shouldConvertPipelineDataToCsvWithoutCreatorName() throws IOException { assertTrue(file.exists()); assertEquals( - "\"Organization\",\"Pipeline Name\",\"Pipeline Step\",\"Valid\",\"Build Number\",\"Code Committer\",\"Pipeline Creator\",\"First Code Committed Time In PR\",\"PR Created Time\",\"PR Merged Time\",\"No PR Committed Time\",\"Job Start Time\",\"Pipeline Start Time\",\"Pipeline Finish Time\",\"Total Lead Time (HH:mm:ss)\",\"PR Lead Time (HH:mm:ss)\",\"Pipeline Lead Time (HH:mm:ss)\",\"Status\",\"Branch\",\"Revert\"", + "\"Organization\",\"Pipeline Name\",\"Pipeline Step\",\"Valid\",\"Build Number\",\"Code Committer\",\"Build Creator\",\"First Code Committed Time In PR\",\"PR Created Time\",\"PR Merged Time\",\"No PR Committed Time\",\"Job Start Time\",\"Pipeline Start Time\",\"Pipeline Finish Time\",\"Total Lead Time (HH:mm:ss)\",\"PR Lead Time (HH:mm:ss)\",\"Pipeline Lead Time (HH:mm:ss)\",\"Status\",\"Branch\",\"Revert\"", headers); assertEquals( "\"Thoughtworks-Heartbeat\",\"Heartbeat\",\":rocket: Deploy prod\",\"null\",\"880\",,,\"2023-05-08T07:18:18Z\",\"168369327000\",\"1683793037000\",,\"168369327000\",\"168369327000\",\"1684793037000\",\"8379303\",\"16837\",\"653037000\",\"passed\",\"branch\",\"\"", @@ -171,7 +171,7 @@ void shouldConvertPipelineDataToCsvGivenNullCommitInfo() throws IOException { BufferedReader reader = new BufferedReader(new InputStreamReader(fileInputStream)); String headers = reader.readLine(); assertEquals( - "\"Organization\",\"Pipeline Name\",\"Pipeline Step\",\"Valid\",\"Build Number\",\"Code Committer\",\"Pipeline Creator\",\"First Code Committed Time In PR\",\"PR Created Time\",\"PR Merged Time\",\"No PR Committed Time\",\"Job Start Time\",\"Pipeline Start Time\",\"Pipeline Finish Time\",\"Total Lead Time (HH:mm:ss)\",\"PR Lead Time (HH:mm:ss)\",\"Pipeline Lead Time (HH:mm:ss)\",\"Status\",\"Branch\",\"Revert\"", + "\"Organization\",\"Pipeline Name\",\"Pipeline Step\",\"Valid\",\"Build Number\",\"Code Committer\",\"Build Creator\",\"First Code Committed Time In PR\",\"PR Created Time\",\"PR Merged Time\",\"No PR Committed Time\",\"Job Start Time\",\"Pipeline Start Time\",\"Pipeline Finish Time\",\"Total Lead Time (HH:mm:ss)\",\"PR Lead Time (HH:mm:ss)\",\"Pipeline Lead Time (HH:mm:ss)\",\"Status\",\"Branch\",\"Revert\"", headers); String firstLine = reader.readLine(); assertEquals( @@ -196,7 +196,7 @@ void shouldConvertPipelineDataToCsvGivenCommitMessageIsRevert() throws IOExcepti assertTrue(file.exists()); assertEquals( - "\"Organization\",\"Pipeline Name\",\"Pipeline Step\",\"Valid\",\"Build Number\",\"Code Committer\",\"Pipeline Creator\",\"First Code Committed Time In PR\",\"PR Created Time\",\"PR Merged Time\",\"No PR Committed Time\",\"Job Start Time\",\"Pipeline Start Time\",\"Pipeline Finish Time\",\"Total Lead Time (HH:mm:ss)\",\"PR Lead Time (HH:mm:ss)\",\"Pipeline Lead Time (HH:mm:ss)\",\"Status\",\"Branch\",\"Revert\"", + "\"Organization\",\"Pipeline Name\",\"Pipeline Step\",\"Valid\",\"Build Number\",\"Code Committer\",\"Build Creator\",\"First Code Committed Time In PR\",\"PR Created Time\",\"PR Merged Time\",\"No PR Committed Time\",\"Job Start Time\",\"Pipeline Start Time\",\"Pipeline Finish Time\",\"Total Lead Time (HH:mm:ss)\",\"PR Lead Time (HH:mm:ss)\",\"Pipeline Lead Time (HH:mm:ss)\",\"Status\",\"Branch\",\"Revert\"", headers); assertEquals( "\"Thoughtworks-Heartbeat\",\"Heartbeat\",\":rocket: Deploy prod\",\"null\",\"880\",\"XXXX\",,\"2023-05-08T07:18:18Z\",\"168369327000\",\"1683793037000\",,\"168369327000\",\"168369327000\",\"1684793037000\",\"8379303\",\"16837\",\"653037000\",\"passed\",\"branch\",\"true\"", @@ -220,10 +220,10 @@ void shouldConvertPipelineDataToCsvGivenAuthorIsNull() throws IOException { assertTrue(file.exists()); assertEquals( - "\"Organization\",\"Pipeline Name\",\"Pipeline Step\",\"Valid\",\"Build Number\",\"Code Committer\",\"Pipeline Creator\",\"First Code Committed Time In PR\",\"PR Created Time\",\"PR Merged Time\",\"No PR Committed Time\",\"Job Start Time\",\"Pipeline Start Time\",\"Pipeline Finish Time\",\"Total Lead Time (HH:mm:ss)\",\"PR Lead Time (HH:mm:ss)\",\"Pipeline Lead Time (HH:mm:ss)\",\"Status\",\"Branch\",\"Revert\"", + "\"Organization\",\"Pipeline Name\",\"Pipeline Step\",\"Valid\",\"Build Number\",\"Code Committer\",\"Build Creator\",\"First Code Committed Time In PR\",\"PR Created Time\",\"PR Merged Time\",\"No PR Committed Time\",\"Job Start Time\",\"Pipeline Start Time\",\"Pipeline Finish Time\",\"Total Lead Time (HH:mm:ss)\",\"PR Lead Time (HH:mm:ss)\",\"Pipeline Lead Time (HH:mm:ss)\",\"Status\",\"Branch\",\"Revert\"", headers); assertEquals( - "\"Thoughtworks-Heartbeat\",\"Heartbeat\",\":rocket: Deploy prod\",\"null\",\"880\",\"XXX\",\"XXX\",\"2023-05-08T07:18:18Z\",\"168369327000\",\"1683793037000\",,\"168369327000\",\"168369327000\",\"1684793037000\",\"8379303\",\"16837\",\"653037000\",\"passed\",\"branch\",\"\"", + "\"Thoughtworks-Heartbeat\",\"Heartbeat\",\":rocket: Deploy prod\",\"null\",\"880\",,\"XXX\",\"2023-05-08T07:18:18Z\",\"168369327000\",\"1683793037000\",,\"168369327000\",\"168369327000\",\"1684793037000\",\"8379303\",\"16837\",\"653037000\",\"passed\",\"branch\",\"\"", firstLine); reader.close(); fileInputStream.close(); @@ -257,7 +257,7 @@ void shouldHasContentWhenGetDataFromCsvGivenDataTypeIsPipeline() throws IOExcept .collect(Collectors.joining("\n")); Assertions.assertEquals( - "\"Organization\",\"Pipeline Name\",\"Pipeline Step\",\"Valid\",\"Build Number\",\"Code Committer\",\"Pipeline Creator\",\"First Code Committed Time In PR\",\"PR Created Time\",\"PR Merged Time\",\"No PR Committed Time\",\"Job Start Time\",\"Pipeline Start Time\",\"Pipeline Finish Time\",\"Total Lead Time (HH:mm:ss)\",\"PR Lead Time (HH:mm:ss)\",\"Pipeline Lead Time (HH:mm:ss)\",\"Status\",\"Branch\",\"Revert\"\n" + "\"Organization\",\"Pipeline Name\",\"Pipeline Step\",\"Valid\",\"Build Number\",\"Code Committer\",\"Build Creator\",\"First Code Committed Time In PR\",\"PR Created Time\",\"PR Merged Time\",\"No PR Committed Time\",\"Job Start Time\",\"Pipeline Start Time\",\"Pipeline Finish Time\",\"Total Lead Time (HH:mm:ss)\",\"PR Lead Time (HH:mm:ss)\",\"Pipeline Lead Time (HH:mm:ss)\",\"Status\",\"Branch\",\"Revert\"\n" + "\"Thoughtworks-Heartbeat\",\"Heartbeat\",\":rocket: Deploy prod\",\"true\",\"880\",\"XXXX\",,\"2023-05-08T07:18:18Z\",\"168369327000\",\"1683793037000\",,\"168369327000\",\"168369327000\",\"1684793037000\",\"8379303\",\"16837\",\"653037000\",\"passed\",\"branch\",\"\"", csvPipelineData); @@ -281,12 +281,12 @@ void shouldConvertPipelineDataToCsvGivenTwoOrganizationsPipeline() throws IOExce BufferedReader reader = new BufferedReader(new InputStreamReader(fileInputStream)); String headers = reader.readLine(); assertEquals( - "\"Organization\",\"Pipeline Name\",\"Pipeline Step\",\"Valid\",\"Build Number\",\"Code Committer\",\"Pipeline Creator\",\"First Code Committed Time In PR\",\"PR Created Time\",\"PR Merged Time\",\"No PR Committed Time\",\"Job Start Time\",\"Pipeline Start Time\",\"Pipeline Finish Time\",\"Total Lead Time (HH:mm:ss)\",\"PR Lead Time (HH:mm:ss)\",\"Pipeline Lead Time (HH:mm:ss)\",\"Status\",\"Branch\",\"Revert\"", + "\"Organization\",\"Pipeline Name\",\"Pipeline Step\",\"Valid\",\"Build Number\",\"Code Committer\",\"Build Creator\",\"First Code Committed Time In PR\",\"PR Created Time\",\"PR Merged Time\",\"No PR Committed Time\",\"Job Start Time\",\"Pipeline Start Time\",\"Pipeline Finish Time\",\"Total Lead Time (HH:mm:ss)\",\"PR Lead Time (HH:mm:ss)\",\"Pipeline Lead Time (HH:mm:ss)\",\"Status\",\"Branch\",\"Revert\"", headers); String firstLine = reader.readLine(); assertEquals( - "\"Thoughtworks-Heartbeat\",\"Heartbeat\",\":rocket: Deploy prod\",\"true\",\"880\",\"XXXX\",\"XXXX\",\"2023-05-08T07:18:18Z\",\"168369327000\",\"1683793037000\",,\"168369327000\",\"168369327000\",\"1684793037000\",\"8379303\",\"16837\",\"653037000\",\"passed\",\"branch\",\"\"", + "\"Thoughtworks-Heartbeat\",\"Heartbeat\",\":rocket: Deploy prod\",\"true\",\"880\",,\"XXXX\",\"2023-05-08T07:18:18Z\",\"168369327000\",\"1683793037000\",,\"168369327000\",\"168369327000\",\"1684793037000\",\"8379303\",\"16837\",\"653037000\",\"passed\",\"branch\",\"\"", firstLine); String secondLine = reader.readLine(); @@ -296,7 +296,7 @@ void shouldConvertPipelineDataToCsvGivenTwoOrganizationsPipeline() throws IOExce String thirdLine = reader.readLine(); assertEquals( - "\"Thoughtworks-Foxtel\",\"Heartbeat1\",\":rocket: Deploy prod\",\"true\",\"880\",\"XXXX\",\"XXXX\",\"2023-05-08T07:18:18Z\",\"168369327000\",\"1683793037000\",,\"168369327000\",\"168369327000\",\"1684793037000\",\"8379303\",\"16837\",\"653037000\",\"passed\",\"branch\",\"\"", + "\"Thoughtworks-Foxtel\",\"Heartbeat1\",\":rocket: Deploy prod\",\"true\",\"880\",,\"XXXX\",\"2023-05-08T07:18:18Z\",\"168369327000\",\"1683793037000\",,\"168369327000\",\"168369327000\",\"1684793037000\",\"8379303\",\"16837\",\"653037000\",\"passed\",\"branch\",\"\"", thirdLine); reader.close(); diff --git a/frontend/e2e/fixtures/create-new/pipeline-data.csv b/frontend/e2e/fixtures/create-new/pipeline-data.csv index bdc85795a0..581b1cf87a 100644 --- a/frontend/e2e/fixtures/create-new/pipeline-data.csv +++ b/frontend/e2e/fixtures/create-new/pipeline-data.csv @@ -1,31 +1,23 @@ -"Organization","Pipeline Name","Pipeline Step","Valid","Build Number","Code Committer","Pipeline Creator","First Code Committed Time In PR","PR Created Time","PR Merged Time","No PR Committed Time","Job Start Time","Pipeline Start Time","Pipeline Finish Time","Total Lead Time (HH:mm:ss)","PR Lead Time (HH:mm:ss)","Pipeline Lead Time (HH:mm:ss)","Status","Branch","Revert" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4210","guzhongren -guzhongren","guzhongren","2024-01-19T14:58:27Z","2024-01-19T14:59:15Z","2024-01-19T15:02:47Z",,"2024-01-19T15:26:59Z","2024-01-19T15:02:47Z","2024-01-19T15:27:32.983Z","0:24:45","0:0:0","0:24:45","passed","main","true" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Run e2e","false","4208",guzhongren,"guzhongren",,,,,,,"2024-01-19T15:09:15.439Z",,,,"failed","main","" +"Organization","Pipeline Name","Pipeline Step","Valid","Build Number","Code Committer",Build Creator,"First Code Committed Time In PR","PR Created Time","PR Merged Time","No PR Committed Time","Job Start Time","Pipeline Start Time","Pipeline Finish Time","Total Lead Time (HH:mm:ss)","PR Lead Time (HH:mm:ss)","Pipeline Lead Time (HH:mm:ss)","Status","Branch","Revert" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4210",guzhongren,"guzhongren","2024-01-19T14:58:27Z","2024-01-19T14:59:15Z","2024-01-19T15:02:47Z",,"2024-01-19T15:26:59Z","2024-01-19T15:02:47Z","2024-01-19T15:27:32.983Z","0:24:45","0:0:0","0:24:45","passed","main","true" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Run e2e","false","4208",,"guzhongren",,,,,,,"2024-01-19T15:09:15.439Z",,,,"failed","main","" "Thoughtworks-Heartbeat","Heartbeat",":mag: Check Frontend License","false","4204","Steveay",,,,,,,,"2024-01-19T11:16:12.025Z",,,,"canceled","main","" "Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4187","sqsq5566",,"2024-01-19T04:01:30Z","2024-01-19T06:07:51Z","2024-01-19T06:18:27Z",,"2024-01-19T06:37:09Z","2024-01-19T06:18:27Z","2024-01-19T06:37:42.885Z","2:36:12","2:16:57","0:19:15","passed","main","false" "Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4185","neomgb",,"2024-01-18T09:08:32Z","2024-01-19T02:59:59Z","2024-01-19T05:47:24Z",,"2024-01-19T06:14:02Z","2024-01-19T05:47:24Z","2024-01-19T06:14:32.418Z","21:6:0","20:38:52","0:27:8","passed","main","false" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4178","guzhongren -guzhongren","guzhongren",,,,"2024-01-18T15:51:58Z","2024-01-18T16:55:57Z","2024-01-18T15:51:58Z","2024-01-18T16:56:25.673Z","1:4:27","0:0:0","1:4:27","passed","main","false" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Run e2e","false","4177","guzhongren -guzhongren","guzhongren",,,,,,,"2024-01-18T16:18:32.089Z",,,,"failed","main","" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Run e2e","false","4176","guzhongren -guzhongren","guzhongren",,,,,,,"2024-01-18T16:06:41.439Z",,,,"passed","main","" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4175","guzhongren -guzhongren","guzhongren",,,,"2024-01-18T15:16:05Z","2024-01-18T15:53:30Z","2024-01-18T15:16:05Z","2024-01-18T15:53:58.280Z","0:37:53","0:0:0","0:37:53","passed","main","false" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4174","guzhongren -guzhongren","guzhongren",,,,"2024-01-18T15:00:53Z","2024-01-18T15:27:37Z","2024-01-18T15:00:53Z","2024-01-18T15:28:06.427Z","0:27:13","0:0:0","0:27:13","passed","main","false" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4178",guzhongren,"guzhongren",,,,"2024-01-18T15:51:58Z","2024-01-18T16:55:57Z","2024-01-18T15:51:58Z","2024-01-18T16:56:25.673Z","1:4:27","0:0:0","1:4:27","passed","main","false" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Run e2e","false","4177",guzhongren,"guzhongren",,,,,,,"2024-01-18T16:18:32.089Z",,,,"failed","main","" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Run e2e","false","4176",guzhongren,"guzhongren",,,,,,,"2024-01-18T16:06:41.439Z",,,,"passed","main","" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4175",guzhongren,"guzhongren",,,,"2024-01-18T15:16:05Z","2024-01-18T15:53:30Z","2024-01-18T15:16:05Z","2024-01-18T15:53:58.280Z","0:37:53","0:0:0","0:37:53","passed","main","false" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4174",guzhongren,"guzhongren",,,,"2024-01-18T15:00:53Z","2024-01-18T15:27:37Z","2024-01-18T15:00:53Z","2024-01-18T15:28:06.427Z","0:27:13","0:0:0","0:27:13","passed","main","false" "Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4173","Chao",,"2024-01-18T09:54:35Z","2024-01-18T05:47:24Z","2024-01-18T10:08:17Z",,"2024-01-18T10:33:18Z","2024-01-18T10:08:17Z","2024-01-18T10:33:46.039Z","0:39:11","0:13:42","0:25:29","passed","main","false" "Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4171","neomgb",,"2024-01-18T02:33:54Z","2024-01-18T02:54:05Z","2024-01-18T09:41:40Z",,"2024-01-18T10:07:00Z","2024-01-18T09:41:40Z","2024-01-18T10:07:29.676Z","7:33:35","7:7:46","0:25:49","passed","main","false" "Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4166","junbo dai",,"2024-01-18T08:28:22Z","2024-01-18T08:27:11Z","2024-01-18T08:56:52Z",,"2024-01-18T09:15:09Z","2024-01-18T08:56:52Z","2024-01-18T09:15:44.306Z","0:47:22","0:28:30","0:18:52","passed","main","false" "Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4162","李雪冰",,"2024-01-18T05:45:03Z","2024-01-18T06:34:30Z","2024-01-18T08:28:09Z",,"2024-01-18T08:52:29Z","2024-01-18T08:28:09Z","2024-01-18T08:52:58.699Z","3:7:55","2:43:6","0:24:49","passed","main","false" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4151","yichen.wang -heartbeat-user","heartbeat-user",,,,"2024-01-18T05:35:15Z","2024-01-18T05:55:59Z","2024-01-18T05:35:15Z","2024-01-18T05:56:34.575Z","0:21:19","0:0:0","0:21:19","passed","main","true" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Run e2e","false","4148","yichen.wang -heartbeat-user","heartbeat-user",,,,,,,"2024-01-18T03:01:41.593Z",,,,"failed","main","" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4151",yichen.wang,"heartbeat-user",,,,"2024-01-18T05:35:15Z","2024-01-18T05:55:59Z","2024-01-18T05:35:15Z","2024-01-18T05:56:34.575Z","0:21:19","0:0:0","0:21:19","passed","main","true" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Run e2e","false","4148",yichen.wang,"heartbeat-user",,,,,,,"2024-01-18T03:01:41.593Z",,,,"failed","main","" "Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4147","Steveay",,"2024-01-17T07:43:29Z","2024-01-17T09:42:52Z","2024-01-17T10:47:01Z",,"2024-01-17T11:21:20Z","2024-01-17T10:47:01Z","2024-01-17T11:22:02.967Z","3:38:33","3:3:32","0:35:1","passed","main","false" "Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4146","李雪冰",,"2024-01-17T08:06:19Z","2024-01-17T09:34:27Z","2024-01-17T09:48:38Z",,"2024-01-17T10:13:10Z","2024-01-17T09:48:38Z","2024-01-17T10:13:39.473Z","2:7:20","1:42:19","0:25:1","passed","main","false" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4137",heartbeat-user,"heartbeat-user","2024-01-17T03:05:11Z","2024-01-17T04:01:00Z","2024-01-17T06:46:34Z",,"2024-01-17T07:22:06Z","2024-01-17T06:46:34Z","2024-01-17T07:22:40.087Z","4:17:29","3:41:23","0:36:6","passed","main","false" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4137",,"heartbeat-user","2024-01-17T03:05:11Z","2024-01-17T04:01:00Z","2024-01-17T06:46:34Z",,"2024-01-17T07:22:06Z","2024-01-17T06:46:34Z","2024-01-17T07:22:40.087Z","4:17:29","3:41:23","0:36:6","passed","main","false" "Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4133","junbo dai",,"2024-01-17T03:54:13Z","2024-01-17T03:59:41Z","2024-01-17T06:15:16Z",,"2024-01-17T06:33:32Z","2024-01-17T06:15:16Z","2024-01-17T06:34:03.987Z","2:39:50","2:21:3","0:18:47","passed","main","false" "Thoughtworks-Heartbeat","Heartbeat",":rocket: Run e2e","false","4123","junbo dai",,,,,,,,"2024-01-17T03:28:28.520Z",,,,"passed","main","" "Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4119","sqsq5566",,"2024-01-17T02:26:10Z","2024-01-17T02:31:10Z","2024-01-17T02:55:54Z",,"2024-01-17T03:14:17Z","2024-01-17T02:55:54Z","2024-01-17T03:14:48.671Z","0:48:38","0:29:44","0:18:54","passed","main","false" @@ -35,24 +27,21 @@ heartbeat-user","heartbeat-user",,,,,,,"2024-01-18T03:01:41.593Z",,,,"failed","m "Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4104","sqsq5566",,"2024-01-16T08:55:43Z","2024-01-16T09:33:36Z","2024-01-16T13:49:23Z",,"2024-01-16T14:09:48Z","2024-01-16T13:49:23Z","2024-01-16T14:10:20.523Z","5:14:37","4:53:40","0:20:57","passed","main","false" "Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4094","xuebing",,"2024-01-16T08:20:20Z","2024-01-16T08:42:05Z","2024-01-16T09:03:42Z",,"2024-01-16T09:29:48Z","2024-01-16T09:03:42Z","2024-01-16T09:30:16.889Z","1:9:56","0:43:22","0:26:34","passed","main","false" "Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4087","Yunsong",,"2024-01-16T08:42:19Z","2024-01-16T08:43:18Z","2024-01-16T08:43:45Z",,"2024-01-16T09:02:16Z","2024-01-16T08:43:45Z","2024-01-16T09:02:46.685Z","0:20:27","0:1:26","0:19:1","passed","main","false" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4078",heartbeat-user,"heartbeat-user","2024-01-16T06:33:44Z","2024-01-16T07:25:34Z","2024-01-16T07:58:33Z",,"2024-01-16T08:31:57Z","2024-01-16T07:58:33Z","2024-01-16T08:32:28.349Z","1:58:44","1:24:49","0:33:55","passed","main","false" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4078",,"heartbeat-user","2024-01-16T06:33:44Z","2024-01-16T07:25:34Z","2024-01-16T07:58:33Z",,"2024-01-16T08:31:57Z","2024-01-16T07:58:33Z","2024-01-16T08:32:28.349Z","1:58:44","1:24:49","0:33:55","passed","main","false" "Thoughtworks-Heartbeat","Heartbeat",":pipeline: Upload pipeline.yml","false","4075","Yunsong",,,,,,,,"2024-01-16T07:58:17.589Z",,,,"canceled","main","" "Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4070","Yunsong",,"2024-01-16T07:06:35Z","2024-01-16T07:11:17Z","2024-01-16T07:31:50Z",,"2024-01-16T07:50:18Z","2024-01-16T07:31:50Z","2024-01-16T07:50:58.369Z","0:44:23","0:25:15","0:19:8","passed","main","false" "Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4065","Nathan Wang",,"2024-01-16T03:51:04Z","2024-01-10T07:48:39Z","2024-01-16T05:44:17Z",,"2024-01-16T06:36:15Z","2024-01-16T05:44:17Z","2024-01-16T06:36:44.984Z","2:45:40","1:53:13","0:52:27","passed","main","false" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4064",heartbeat-user,"heartbeat-user","2024-01-16T03:35:20Z","2024-01-16T03:38:26Z","2024-01-16T03:47:27Z",,"2024-01-16T06:10:58Z","2024-01-16T03:47:27Z","2024-01-16T06:11:26.201Z","2:36:6","0:12:7","2:23:59","passed","main","false" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4064",,"heartbeat-user","2024-01-16T03:35:20Z","2024-01-16T03:38:26Z","2024-01-16T03:47:27Z",,"2024-01-16T06:10:58Z","2024-01-16T03:47:27Z","2024-01-16T06:11:26.201Z","2:36:6","0:12:7","2:23:59","passed","main","false" "Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4056","weiran.sun",,"2024-01-16T02:27:37Z","2024-01-16T02:38:02Z","2024-01-16T02:41:35Z",,"2024-01-16T03:00:48Z","2024-01-16T02:41:35Z","2024-01-16T03:01:19.266Z","0:33:42","0:13:58","0:19:44","passed","main","false" "Thoughtworks-Heartbeat","Heartbeat",":rocket: Run e2e","false","4054","Jianxun.Ma",,,,,,,,"2024-01-16T02:22:28.775Z",,,,"passed","main","" "Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4050","junbo.dai",,"2024-01-16T01:14:24Z","2024-01-16T01:13:59Z","2024-01-16T01:36:23Z",,"2024-01-16T01:56:42Z","2024-01-16T01:36:23Z","2024-01-16T01:57:13.241Z","0:42:49","0:21:59","0:20:50","passed","main","false" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4047","guzhongren -guzhongren","guzhongren",,,,"2024-01-15T15:41:49Z","2024-01-15T16:09:35Z","2024-01-15T15:41:49Z","2024-01-15T16:10:04.028Z","0:28:15","0:0:0","0:28:15","passed","main","false" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy e2e","false","4046","guzhongren -guzhongren","guzhongren",,,,,,,"2024-01-15T15:40:09.332Z",,,,"passed","main","" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4045","guzhongren -guzhongren","guzhongren",,,,"2024-01-15T14:30:35Z","2024-01-15T14:58:51Z","2024-01-15T14:30:35Z","2024-01-15T14:59:21.298Z","0:28:46","0:0:0","0:28:46","passed","main","false" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4047",guzhongren,"guzhongren",,,,"2024-01-15T15:41:49Z","2024-01-15T16:09:35Z","2024-01-15T15:41:49Z","2024-01-15T16:10:04.028Z","0:28:15","0:0:0","0:28:15","passed","main","false" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy e2e","false","4046",guzhongren,"guzhongren",,,,,,,"2024-01-15T15:40:09.332Z",,,,"passed","main","" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4045",guzhongren,"guzhongren",,,,"2024-01-15T14:30:35Z","2024-01-15T14:58:51Z","2024-01-15T14:30:35Z","2024-01-15T14:59:21.298Z","0:28:46","0:0:0","0:28:46","passed","main","false" "Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4044","GuangbinMa",,"2024-01-15T09:00:10Z","2024-01-15T09:55:27Z","2024-01-15T10:06:21Z",,"2024-01-15T10:33:21Z","2024-01-15T10:06:21Z","2024-01-15T10:33:54.045Z","1:33:44","1:6:11","0:27:33","passed","main","false" "Thoughtworks-Heartbeat","Heartbeat",":rocket: Run e2e","false","4034","JiangRu1",,,,,,,,"2024-01-15T08:49:47.422Z",,,,"failed","main","" -"Thoughtworks-Heartbeat","Heartbeat",":mag: Check Backend License","false","4033",heartbeat-user,"heartbeat-user",,,,,,,"2024-01-15T08:14:07.027Z",,,,"canceled","main","" -"Thoughtworks-Heartbeat","Heartbeat",":pipeline: Upload pipeline.yml","false","4031",heartbeat-user,"heartbeat-user",,,,,,,"2024-01-15T07:58:40.203Z",,,,"canceled","main","" +"Thoughtworks-Heartbeat","Heartbeat",":mag: Check Backend License","false","4033",,"heartbeat-user",,,,,,,"2024-01-15T08:14:07.027Z",,,,"canceled","main","" +"Thoughtworks-Heartbeat","Heartbeat",":pipeline: Upload pipeline.yml","false","4031",,"heartbeat-user",,,,,,,"2024-01-15T07:58:40.203Z",,,,"canceled","main","" "Thoughtworks-Heartbeat","Heartbeat",":rocket: Run e2e","false","4027","Jianxun.Ma",,,,,,,,"2024-01-15T08:25:40.681Z",,,,"failed","main","" "Thoughtworks-Heartbeat","Heartbeat",":rocket: Run e2e","false","4018","GuangbinMa",,,,,,,,"2024-01-15T06:49:24.921Z",,,,"failed","main","" "Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4012","Steveay",,"2024-01-12T08:02:24Z","2024-01-15T01:27:53Z","2024-01-15T03:45:41Z",,"2024-01-15T04:04:34Z","2024-01-15T03:45:41Z","2024-01-15T04:05:06.398Z","68:2:42","67:43:17","0:19:25","passed","main","false" diff --git a/frontend/e2e/fixtures/import-file/pipeline-data.csv b/frontend/e2e/fixtures/import-file/pipeline-data.csv index bdc85795a0..581b1cf87a 100644 --- a/frontend/e2e/fixtures/import-file/pipeline-data.csv +++ b/frontend/e2e/fixtures/import-file/pipeline-data.csv @@ -1,31 +1,23 @@ -"Organization","Pipeline Name","Pipeline Step","Valid","Build Number","Code Committer","Pipeline Creator","First Code Committed Time In PR","PR Created Time","PR Merged Time","No PR Committed Time","Job Start Time","Pipeline Start Time","Pipeline Finish Time","Total Lead Time (HH:mm:ss)","PR Lead Time (HH:mm:ss)","Pipeline Lead Time (HH:mm:ss)","Status","Branch","Revert" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4210","guzhongren -guzhongren","guzhongren","2024-01-19T14:58:27Z","2024-01-19T14:59:15Z","2024-01-19T15:02:47Z",,"2024-01-19T15:26:59Z","2024-01-19T15:02:47Z","2024-01-19T15:27:32.983Z","0:24:45","0:0:0","0:24:45","passed","main","true" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Run e2e","false","4208",guzhongren,"guzhongren",,,,,,,"2024-01-19T15:09:15.439Z",,,,"failed","main","" +"Organization","Pipeline Name","Pipeline Step","Valid","Build Number","Code Committer",Build Creator,"First Code Committed Time In PR","PR Created Time","PR Merged Time","No PR Committed Time","Job Start Time","Pipeline Start Time","Pipeline Finish Time","Total Lead Time (HH:mm:ss)","PR Lead Time (HH:mm:ss)","Pipeline Lead Time (HH:mm:ss)","Status","Branch","Revert" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4210",guzhongren,"guzhongren","2024-01-19T14:58:27Z","2024-01-19T14:59:15Z","2024-01-19T15:02:47Z",,"2024-01-19T15:26:59Z","2024-01-19T15:02:47Z","2024-01-19T15:27:32.983Z","0:24:45","0:0:0","0:24:45","passed","main","true" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Run e2e","false","4208",,"guzhongren",,,,,,,"2024-01-19T15:09:15.439Z",,,,"failed","main","" "Thoughtworks-Heartbeat","Heartbeat",":mag: Check Frontend License","false","4204","Steveay",,,,,,,,"2024-01-19T11:16:12.025Z",,,,"canceled","main","" "Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4187","sqsq5566",,"2024-01-19T04:01:30Z","2024-01-19T06:07:51Z","2024-01-19T06:18:27Z",,"2024-01-19T06:37:09Z","2024-01-19T06:18:27Z","2024-01-19T06:37:42.885Z","2:36:12","2:16:57","0:19:15","passed","main","false" "Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4185","neomgb",,"2024-01-18T09:08:32Z","2024-01-19T02:59:59Z","2024-01-19T05:47:24Z",,"2024-01-19T06:14:02Z","2024-01-19T05:47:24Z","2024-01-19T06:14:32.418Z","21:6:0","20:38:52","0:27:8","passed","main","false" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4178","guzhongren -guzhongren","guzhongren",,,,"2024-01-18T15:51:58Z","2024-01-18T16:55:57Z","2024-01-18T15:51:58Z","2024-01-18T16:56:25.673Z","1:4:27","0:0:0","1:4:27","passed","main","false" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Run e2e","false","4177","guzhongren -guzhongren","guzhongren",,,,,,,"2024-01-18T16:18:32.089Z",,,,"failed","main","" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Run e2e","false","4176","guzhongren -guzhongren","guzhongren",,,,,,,"2024-01-18T16:06:41.439Z",,,,"passed","main","" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4175","guzhongren -guzhongren","guzhongren",,,,"2024-01-18T15:16:05Z","2024-01-18T15:53:30Z","2024-01-18T15:16:05Z","2024-01-18T15:53:58.280Z","0:37:53","0:0:0","0:37:53","passed","main","false" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4174","guzhongren -guzhongren","guzhongren",,,,"2024-01-18T15:00:53Z","2024-01-18T15:27:37Z","2024-01-18T15:00:53Z","2024-01-18T15:28:06.427Z","0:27:13","0:0:0","0:27:13","passed","main","false" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4178",guzhongren,"guzhongren",,,,"2024-01-18T15:51:58Z","2024-01-18T16:55:57Z","2024-01-18T15:51:58Z","2024-01-18T16:56:25.673Z","1:4:27","0:0:0","1:4:27","passed","main","false" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Run e2e","false","4177",guzhongren,"guzhongren",,,,,,,"2024-01-18T16:18:32.089Z",,,,"failed","main","" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Run e2e","false","4176",guzhongren,"guzhongren",,,,,,,"2024-01-18T16:06:41.439Z",,,,"passed","main","" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4175",guzhongren,"guzhongren",,,,"2024-01-18T15:16:05Z","2024-01-18T15:53:30Z","2024-01-18T15:16:05Z","2024-01-18T15:53:58.280Z","0:37:53","0:0:0","0:37:53","passed","main","false" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4174",guzhongren,"guzhongren",,,,"2024-01-18T15:00:53Z","2024-01-18T15:27:37Z","2024-01-18T15:00:53Z","2024-01-18T15:28:06.427Z","0:27:13","0:0:0","0:27:13","passed","main","false" "Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4173","Chao",,"2024-01-18T09:54:35Z","2024-01-18T05:47:24Z","2024-01-18T10:08:17Z",,"2024-01-18T10:33:18Z","2024-01-18T10:08:17Z","2024-01-18T10:33:46.039Z","0:39:11","0:13:42","0:25:29","passed","main","false" "Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4171","neomgb",,"2024-01-18T02:33:54Z","2024-01-18T02:54:05Z","2024-01-18T09:41:40Z",,"2024-01-18T10:07:00Z","2024-01-18T09:41:40Z","2024-01-18T10:07:29.676Z","7:33:35","7:7:46","0:25:49","passed","main","false" "Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4166","junbo dai",,"2024-01-18T08:28:22Z","2024-01-18T08:27:11Z","2024-01-18T08:56:52Z",,"2024-01-18T09:15:09Z","2024-01-18T08:56:52Z","2024-01-18T09:15:44.306Z","0:47:22","0:28:30","0:18:52","passed","main","false" "Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4162","李雪冰",,"2024-01-18T05:45:03Z","2024-01-18T06:34:30Z","2024-01-18T08:28:09Z",,"2024-01-18T08:52:29Z","2024-01-18T08:28:09Z","2024-01-18T08:52:58.699Z","3:7:55","2:43:6","0:24:49","passed","main","false" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4151","yichen.wang -heartbeat-user","heartbeat-user",,,,"2024-01-18T05:35:15Z","2024-01-18T05:55:59Z","2024-01-18T05:35:15Z","2024-01-18T05:56:34.575Z","0:21:19","0:0:0","0:21:19","passed","main","true" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Run e2e","false","4148","yichen.wang -heartbeat-user","heartbeat-user",,,,,,,"2024-01-18T03:01:41.593Z",,,,"failed","main","" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4151",yichen.wang,"heartbeat-user",,,,"2024-01-18T05:35:15Z","2024-01-18T05:55:59Z","2024-01-18T05:35:15Z","2024-01-18T05:56:34.575Z","0:21:19","0:0:0","0:21:19","passed","main","true" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Run e2e","false","4148",yichen.wang,"heartbeat-user",,,,,,,"2024-01-18T03:01:41.593Z",,,,"failed","main","" "Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4147","Steveay",,"2024-01-17T07:43:29Z","2024-01-17T09:42:52Z","2024-01-17T10:47:01Z",,"2024-01-17T11:21:20Z","2024-01-17T10:47:01Z","2024-01-17T11:22:02.967Z","3:38:33","3:3:32","0:35:1","passed","main","false" "Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4146","李雪冰",,"2024-01-17T08:06:19Z","2024-01-17T09:34:27Z","2024-01-17T09:48:38Z",,"2024-01-17T10:13:10Z","2024-01-17T09:48:38Z","2024-01-17T10:13:39.473Z","2:7:20","1:42:19","0:25:1","passed","main","false" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4137",heartbeat-user,"heartbeat-user","2024-01-17T03:05:11Z","2024-01-17T04:01:00Z","2024-01-17T06:46:34Z",,"2024-01-17T07:22:06Z","2024-01-17T06:46:34Z","2024-01-17T07:22:40.087Z","4:17:29","3:41:23","0:36:6","passed","main","false" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4137",,"heartbeat-user","2024-01-17T03:05:11Z","2024-01-17T04:01:00Z","2024-01-17T06:46:34Z",,"2024-01-17T07:22:06Z","2024-01-17T06:46:34Z","2024-01-17T07:22:40.087Z","4:17:29","3:41:23","0:36:6","passed","main","false" "Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4133","junbo dai",,"2024-01-17T03:54:13Z","2024-01-17T03:59:41Z","2024-01-17T06:15:16Z",,"2024-01-17T06:33:32Z","2024-01-17T06:15:16Z","2024-01-17T06:34:03.987Z","2:39:50","2:21:3","0:18:47","passed","main","false" "Thoughtworks-Heartbeat","Heartbeat",":rocket: Run e2e","false","4123","junbo dai",,,,,,,,"2024-01-17T03:28:28.520Z",,,,"passed","main","" "Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4119","sqsq5566",,"2024-01-17T02:26:10Z","2024-01-17T02:31:10Z","2024-01-17T02:55:54Z",,"2024-01-17T03:14:17Z","2024-01-17T02:55:54Z","2024-01-17T03:14:48.671Z","0:48:38","0:29:44","0:18:54","passed","main","false" @@ -35,24 +27,21 @@ heartbeat-user","heartbeat-user",,,,,,,"2024-01-18T03:01:41.593Z",,,,"failed","m "Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4104","sqsq5566",,"2024-01-16T08:55:43Z","2024-01-16T09:33:36Z","2024-01-16T13:49:23Z",,"2024-01-16T14:09:48Z","2024-01-16T13:49:23Z","2024-01-16T14:10:20.523Z","5:14:37","4:53:40","0:20:57","passed","main","false" "Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4094","xuebing",,"2024-01-16T08:20:20Z","2024-01-16T08:42:05Z","2024-01-16T09:03:42Z",,"2024-01-16T09:29:48Z","2024-01-16T09:03:42Z","2024-01-16T09:30:16.889Z","1:9:56","0:43:22","0:26:34","passed","main","false" "Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4087","Yunsong",,"2024-01-16T08:42:19Z","2024-01-16T08:43:18Z","2024-01-16T08:43:45Z",,"2024-01-16T09:02:16Z","2024-01-16T08:43:45Z","2024-01-16T09:02:46.685Z","0:20:27","0:1:26","0:19:1","passed","main","false" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4078",heartbeat-user,"heartbeat-user","2024-01-16T06:33:44Z","2024-01-16T07:25:34Z","2024-01-16T07:58:33Z",,"2024-01-16T08:31:57Z","2024-01-16T07:58:33Z","2024-01-16T08:32:28.349Z","1:58:44","1:24:49","0:33:55","passed","main","false" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4078",,"heartbeat-user","2024-01-16T06:33:44Z","2024-01-16T07:25:34Z","2024-01-16T07:58:33Z",,"2024-01-16T08:31:57Z","2024-01-16T07:58:33Z","2024-01-16T08:32:28.349Z","1:58:44","1:24:49","0:33:55","passed","main","false" "Thoughtworks-Heartbeat","Heartbeat",":pipeline: Upload pipeline.yml","false","4075","Yunsong",,,,,,,,"2024-01-16T07:58:17.589Z",,,,"canceled","main","" "Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4070","Yunsong",,"2024-01-16T07:06:35Z","2024-01-16T07:11:17Z","2024-01-16T07:31:50Z",,"2024-01-16T07:50:18Z","2024-01-16T07:31:50Z","2024-01-16T07:50:58.369Z","0:44:23","0:25:15","0:19:8","passed","main","false" "Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4065","Nathan Wang",,"2024-01-16T03:51:04Z","2024-01-10T07:48:39Z","2024-01-16T05:44:17Z",,"2024-01-16T06:36:15Z","2024-01-16T05:44:17Z","2024-01-16T06:36:44.984Z","2:45:40","1:53:13","0:52:27","passed","main","false" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4064",heartbeat-user,"heartbeat-user","2024-01-16T03:35:20Z","2024-01-16T03:38:26Z","2024-01-16T03:47:27Z",,"2024-01-16T06:10:58Z","2024-01-16T03:47:27Z","2024-01-16T06:11:26.201Z","2:36:6","0:12:7","2:23:59","passed","main","false" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4064",,"heartbeat-user","2024-01-16T03:35:20Z","2024-01-16T03:38:26Z","2024-01-16T03:47:27Z",,"2024-01-16T06:10:58Z","2024-01-16T03:47:27Z","2024-01-16T06:11:26.201Z","2:36:6","0:12:7","2:23:59","passed","main","false" "Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4056","weiran.sun",,"2024-01-16T02:27:37Z","2024-01-16T02:38:02Z","2024-01-16T02:41:35Z",,"2024-01-16T03:00:48Z","2024-01-16T02:41:35Z","2024-01-16T03:01:19.266Z","0:33:42","0:13:58","0:19:44","passed","main","false" "Thoughtworks-Heartbeat","Heartbeat",":rocket: Run e2e","false","4054","Jianxun.Ma",,,,,,,,"2024-01-16T02:22:28.775Z",,,,"passed","main","" "Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4050","junbo.dai",,"2024-01-16T01:14:24Z","2024-01-16T01:13:59Z","2024-01-16T01:36:23Z",,"2024-01-16T01:56:42Z","2024-01-16T01:36:23Z","2024-01-16T01:57:13.241Z","0:42:49","0:21:59","0:20:50","passed","main","false" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4047","guzhongren -guzhongren","guzhongren",,,,"2024-01-15T15:41:49Z","2024-01-15T16:09:35Z","2024-01-15T15:41:49Z","2024-01-15T16:10:04.028Z","0:28:15","0:0:0","0:28:15","passed","main","false" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy e2e","false","4046","guzhongren -guzhongren","guzhongren",,,,,,,"2024-01-15T15:40:09.332Z",,,,"passed","main","" -"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4045","guzhongren -guzhongren","guzhongren",,,,"2024-01-15T14:30:35Z","2024-01-15T14:58:51Z","2024-01-15T14:30:35Z","2024-01-15T14:59:21.298Z","0:28:46","0:0:0","0:28:46","passed","main","false" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4047",guzhongren,"guzhongren",,,,"2024-01-15T15:41:49Z","2024-01-15T16:09:35Z","2024-01-15T15:41:49Z","2024-01-15T16:10:04.028Z","0:28:15","0:0:0","0:28:15","passed","main","false" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy e2e","false","4046",guzhongren,"guzhongren",,,,,,,"2024-01-15T15:40:09.332Z",,,,"passed","main","" +"Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4045",guzhongren,"guzhongren",,,,"2024-01-15T14:30:35Z","2024-01-15T14:58:51Z","2024-01-15T14:30:35Z","2024-01-15T14:59:21.298Z","0:28:46","0:0:0","0:28:46","passed","main","false" "Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4044","GuangbinMa",,"2024-01-15T09:00:10Z","2024-01-15T09:55:27Z","2024-01-15T10:06:21Z",,"2024-01-15T10:33:21Z","2024-01-15T10:06:21Z","2024-01-15T10:33:54.045Z","1:33:44","1:6:11","0:27:33","passed","main","false" "Thoughtworks-Heartbeat","Heartbeat",":rocket: Run e2e","false","4034","JiangRu1",,,,,,,,"2024-01-15T08:49:47.422Z",,,,"failed","main","" -"Thoughtworks-Heartbeat","Heartbeat",":mag: Check Backend License","false","4033",heartbeat-user,"heartbeat-user",,,,,,,"2024-01-15T08:14:07.027Z",,,,"canceled","main","" -"Thoughtworks-Heartbeat","Heartbeat",":pipeline: Upload pipeline.yml","false","4031",heartbeat-user,"heartbeat-user",,,,,,,"2024-01-15T07:58:40.203Z",,,,"canceled","main","" +"Thoughtworks-Heartbeat","Heartbeat",":mag: Check Backend License","false","4033",,"heartbeat-user",,,,,,,"2024-01-15T08:14:07.027Z",,,,"canceled","main","" +"Thoughtworks-Heartbeat","Heartbeat",":pipeline: Upload pipeline.yml","false","4031",,"heartbeat-user",,,,,,,"2024-01-15T07:58:40.203Z",,,,"canceled","main","" "Thoughtworks-Heartbeat","Heartbeat",":rocket: Run e2e","false","4027","Jianxun.Ma",,,,,,,,"2024-01-15T08:25:40.681Z",,,,"failed","main","" "Thoughtworks-Heartbeat","Heartbeat",":rocket: Run e2e","false","4018","GuangbinMa",,,,,,,,"2024-01-15T06:49:24.921Z",,,,"failed","main","" "Thoughtworks-Heartbeat","Heartbeat",":rocket: Deploy prod","true","4012","Steveay",,"2024-01-12T08:02:24Z","2024-01-15T01:27:53Z","2024-01-15T03:45:41Z",,"2024-01-15T04:04:34Z","2024-01-15T03:45:41Z","2024-01-15T04:05:06.398Z","68:2:42","67:43:17","0:19:25","passed","main","false" From f465952a1e69f00b209a46f646e3203ea96208e9 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 15 Apr 2024 23:05:32 +0800 Subject: [PATCH 14/81] fix(deps): update dependency org.yaml:snakeyaml to v2.2 (#1373)[backend] Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- backend/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/build.gradle b/backend/build.gradle index 92f14b788f..3612c0bf11 100644 --- a/backend/build.gradle +++ b/backend/build.gradle @@ -37,7 +37,7 @@ dependencies { exclude group: 'org.yaml', module: 'snakeyaml' } implementation 'commons-fileupload:commons-fileupload:1.5' - implementation 'org.yaml:snakeyaml:2.0' + implementation 'org.yaml:snakeyaml:2.2' implementation 'org.springframework.boot:spring-boot-starter-cache' implementation 'org.ehcache:ehcache:3.10.8' implementation 'javax.annotation:javax.annotation-api:1.3.2' From 05ad6a7cfcafbf437db654cd046cbd4905adfdff Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 15 Apr 2024 18:44:47 +0000 Subject: [PATCH 15/81] chore(deps): update dependency prettier-plugin-sort-imports to v1.8.5 (#1370) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- frontend/pnpm-lock.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/frontend/pnpm-lock.yaml b/frontend/pnpm-lock.yaml index ea4b1fab3b..cbb110a699 100644 --- a/frontend/pnpm-lock.yaml +++ b/frontend/pnpm-lock.yaml @@ -177,7 +177,7 @@ devDependencies: version: 3.2.5 prettier-plugin-sort-imports: specifier: ^1.8.4 - version: 1.8.4(typescript@5.4.5) + version: 1.8.5(typescript@5.4.5) ts-jest: specifier: ^29.1.2 version: 29.1.2(@babel/core@7.24.3)(jest@29.7.0)(typescript@5.4.5) @@ -7861,8 +7861,8 @@ packages: fast-diff: 1.3.0 dev: true - /prettier-plugin-sort-imports@1.8.4(typescript@5.4.5): - resolution: {integrity: sha512-3Y5TK68TXdP+ViIzRNp4bvjjjPZ0MULL96ImBVTwWtKiIOIcuBIzFmtfPEzOVHaX0tJa3MGChrzmJAsyObvPbA==} + /prettier-plugin-sort-imports@1.8.5(typescript@5.4.5): + resolution: {integrity: sha512-PkizzuO2S8h3kJeWHytnMZXqvv/fD6g+en/dhv4y5QjoiMm1wq3FWzFiFT7c/BilX95l0ZIqJTlMsXYs8z/WQQ==} peerDependencies: typescript: '>4.0.0' dependencies: From aa9a2d2ed09e3226db40d4c8c0e9f02fa8f8624e Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 15 Apr 2024 22:48:39 +0000 Subject: [PATCH 16/81] fix(deps): update material-ui monorepo (#1368) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- frontend/pnpm-lock.yaml | 64 ++++++++++++++++++++++------------------- 1 file changed, 34 insertions(+), 30 deletions(-) diff --git a/frontend/pnpm-lock.yaml b/frontend/pnpm-lock.yaml index cbb110a699..c06c8f3048 100644 --- a/frontend/pnpm-lock.yaml +++ b/frontend/pnpm-lock.yaml @@ -16,13 +16,13 @@ dependencies: version: 5.0.12 '@mui/icons-material': specifier: ^5.15.14 - version: 5.15.14(@mui/material@5.15.14)(@types/react@18.2.67)(react@18.2.0) + version: 5.15.15(@mui/material@5.15.15)(@types/react@18.2.67)(react@18.2.0) '@mui/material': specifier: ^5.15.14 - version: 5.15.14(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.2.67)(react-dom@18.2.0)(react@18.2.0) + version: 5.15.15(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.2.67)(react-dom@18.2.0)(react@18.2.0) '@mui/x-date-pickers': specifier: ^7.0.0 - version: 7.0.0(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@mui/material@5.15.14)(@types/react@18.2.67)(dayjs@1.11.10)(react-dom@18.2.0)(react@18.2.0) + version: 7.2.0(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@mui/material@5.15.15)(@types/react@18.2.67)(dayjs@1.11.10)(react-dom@18.2.0)(react@18.2.0) '@reduxjs/toolkit': specifier: ^2.2.2 version: 2.2.3(react-redux@9.1.0)(react@18.2.0) @@ -2492,7 +2492,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.4 '@floating-ui/react-dom': 2.0.8(react-dom@18.2.0)(react@18.2.0) '@mui/types': 7.2.14(@types/react@18.2.67) '@mui/utils': 5.15.14(@types/react@18.2.67)(react@18.2.0) @@ -2504,12 +2504,12 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: false - /@mui/core-downloads-tracker@5.15.14: - resolution: {integrity: sha512-on75VMd0XqZfaQW+9pGjSNiqW+ghc5E2ZSLRBXwcXl/C4YzjfyjrLPhrEpKnR9Uym9KXBvxrhoHfPcczYHweyA==} + /@mui/core-downloads-tracker@5.15.15: + resolution: {integrity: sha512-aXnw29OWQ6I5A47iuWEI6qSSUfH6G/aCsW9KmW3LiFqr7uXZBK4Ks+z8G+qeIub8k0T5CMqlT2q0L+ZJTMrqpg==} dev: false - /@mui/icons-material@5.15.14(@mui/material@5.15.14)(@types/react@18.2.67)(react@18.2.0): - resolution: {integrity: sha512-vj/51k7MdFmt+XVw94sl30SCvGx6+wJLsNYjZRgxhS6y3UtnWnypMOsm3Kmg8TN+P0dqwsjy4/fX7B1HufJIhw==} + /@mui/icons-material@5.15.15(@mui/material@5.15.15)(@types/react@18.2.67)(react@18.2.0): + resolution: {integrity: sha512-kkeU/pe+hABcYDH6Uqy8RmIsr2S/y5bP2rp+Gat4CcRjCcVne6KudS1NrZQhUCRysrTDCAhcbcf9gt+/+pGO2g==} engines: {node: '>=12.0.0'} peerDependencies: '@mui/material': ^5.0.0 @@ -2519,14 +2519,14 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.24.1 - '@mui/material': 5.15.14(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.2.67)(react-dom@18.2.0)(react@18.2.0) + '@babel/runtime': 7.24.4 + '@mui/material': 5.15.15(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.2.67)(react-dom@18.2.0)(react@18.2.0) '@types/react': 18.2.67 react: 18.2.0 dev: false - /@mui/material@5.15.14(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.2.67)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-kEbRw6fASdQ1SQ7LVdWR5OlWV3y7Y54ZxkLzd6LV5tmz+NpO3MJKZXSfgR0LHMP7meKsPiMm4AuzV0pXDpk/BQ==} + /@mui/material@5.15.15(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.2.67)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-3zvWayJ+E1kzoIsvwyEvkTUKVKt1AjchFFns+JtluHCuvxgKcLSRJTADw37k0doaRtVAsyh8bz9Afqzv+KYrIA==} engines: {node: '>=12.0.0'} peerDependencies: '@emotion/react': ^11.5.0 @@ -2542,12 +2542,12 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.4 '@emotion/react': 11.11.4(@types/react@18.2.67)(react@18.2.0) '@emotion/styled': 11.11.5(@emotion/react@11.11.4)(@types/react@18.2.67)(react@18.2.0) '@mui/base': 5.0.0-beta.40(@types/react@18.2.67)(react-dom@18.2.0)(react@18.2.0) - '@mui/core-downloads-tracker': 5.15.14 - '@mui/system': 5.15.14(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.2.67)(react@18.2.0) + '@mui/core-downloads-tracker': 5.15.15 + '@mui/system': 5.15.15(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.2.67)(react@18.2.0) '@mui/types': 7.2.14(@types/react@18.2.67) '@mui/utils': 5.15.14(@types/react@18.2.67)(react@18.2.0) '@types/react': 18.2.67 @@ -2571,7 +2571,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.4 '@mui/utils': 5.15.14(@types/react@18.2.67)(react@18.2.0) '@types/react': 18.2.67 prop-types: 15.8.1 @@ -2591,7 +2591,7 @@ packages: '@emotion/styled': optional: true dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.4 '@emotion/cache': 11.11.0 '@emotion/react': 11.11.4(@types/react@18.2.67)(react@18.2.0) '@emotion/styled': 11.11.5(@emotion/react@11.11.4)(@types/react@18.2.67)(react@18.2.0) @@ -2600,8 +2600,8 @@ packages: react: 18.2.0 dev: false - /@mui/system@5.15.14(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.2.67)(react@18.2.0): - resolution: {integrity: sha512-auXLXzUaCSSOLqJXmsAaq7P96VPRXg2Rrz6OHNV7lr+kB8lobUF+/N84Vd9C4G/wvCXYPs5TYuuGBRhcGbiBGg==} + /@mui/system@5.15.15(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.2.67)(react@18.2.0): + resolution: {integrity: sha512-aulox6N1dnu5PABsfxVGOZffDVmlxPOVgj56HrUnJE8MCSh8lOvvkd47cebIVQQYAjpwieXQXiDPj5pwM40jTQ==} engines: {node: '>=12.0.0'} peerDependencies: '@emotion/react': ^11.5.0 @@ -2616,7 +2616,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.4 '@emotion/react': 11.11.4(@types/react@18.2.67)(react@18.2.0) '@emotion/styled': 11.11.5(@emotion/react@11.11.4)(@types/react@18.2.67)(react@18.2.0) '@mui/private-theming': 5.15.14(@types/react@18.2.67)(react@18.2.0) @@ -2651,16 +2651,16 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.24.1 - '@types/prop-types': 15.7.11 + '@babel/runtime': 7.24.4 + '@types/prop-types': 15.7.12 '@types/react': 18.2.67 prop-types: 15.8.1 react: 18.2.0 react-is: 18.2.0 dev: false - /@mui/x-date-pickers@7.0.0(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@mui/material@5.15.14)(@types/react@18.2.67)(dayjs@1.11.10)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-/9mp4O2WMixHOso63DBoZVfJVYGrzOHF5voheV2tYQ4XqDdTKp2AdWS3oh8PGwrsvCzqkvb3quzTqhKoEsJUwA==} + /@mui/x-date-pickers@7.2.0(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@mui/material@5.15.15)(@types/react@18.2.67)(dayjs@1.11.10)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-hsXugZ+n1ZnHRYzf7+PFrjZ44T+FyGZmTreBmH0M2RUaAblgK+A1V3KNLT+r4Y9gJLH+92LwePxQ9xyfR+E51A==} engines: {node: '>=14.0.0'} peerDependencies: '@emotion/react': ^11.9.0 @@ -2695,12 +2695,12 @@ packages: moment-jalaali: optional: true dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.4 '@emotion/react': 11.11.4(@types/react@18.2.67)(react@18.2.0) '@emotion/styled': 11.11.5(@emotion/react@11.11.4)(@types/react@18.2.67)(react@18.2.0) '@mui/base': 5.0.0-beta.40(@types/react@18.2.67)(react-dom@18.2.0)(react@18.2.0) - '@mui/material': 5.15.14(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.2.67)(react-dom@18.2.0)(react@18.2.0) - '@mui/system': 5.15.14(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.2.67)(react@18.2.0) + '@mui/material': 5.15.15(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.2.67)(react-dom@18.2.0)(react@18.2.0) + '@mui/system': 5.15.15(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.2.67)(react@18.2.0) '@mui/utils': 5.15.14(@types/react@18.2.67)(react@18.2.0) '@types/react-transition-group': 4.4.10 clsx: 2.1.0 @@ -3393,6 +3393,10 @@ packages: /@types/prop-types@15.7.11: resolution: {integrity: sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==} + /@types/prop-types@15.7.12: + resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} + dev: false + /@types/react-dom@18.2.22: resolution: {integrity: sha512-fHkBXPeNtfvri6gdsMYyW+dW7RXFo6Ad09nLFK0VQWR7yGLai/Cyvyj696gbwYvBnhGtevUG9cET0pmUbMtoPQ==} dependencies: @@ -4787,7 +4791,7 @@ packages: /dom-helpers@5.2.1: resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==} dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.4 csstype: 3.1.3 dev: false @@ -8056,7 +8060,7 @@ packages: react: '>=16.6.0' react-dom: '>=16.6.0' dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.4 dom-helpers: 5.2.1 loose-envify: 1.4.0 prop-types: 15.8.1 @@ -8110,7 +8114,7 @@ packages: /redux@4.2.1: resolution: {integrity: sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==} dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.4 dev: true /redux@5.0.1: From c59344e401d8b416221bcca4389c088ef8e0a38c Mon Sep 17 00:00:00 2001 From: Rui7ing <129819182+Rui7ing@users.noreply.github.com> Date: Tue, 16 Apr 2024 10:49:11 +0800 Subject: [PATCH 17/81] Adm 889 - remove some 'name' column in DORA Metrics Detail page (#1380) * ADM-889:[frontend] fix: remove name column * ADM-889:[frontend] fix: rename column title as 'subtitle' * ADM-889:[frontend] fix: add transformEmoji fun * ADM-889:[frontend] fix: fix test * ADM-889:[frontend] fix: fix e2e test * ADM-889:[frontend] fix: add test to fix coverage * ADM-889:[frontend] fix: fix title unit and test --- .../Common/ReportForThreeColumns.test.tsx | 17 ++++++- .../Common/ReportForTwoColumns.test.tsx | 29 ++++++++++++ .../ReportStep/ReportDetail/dora.test.tsx | 12 ++--- .../reportMapper/changeFailureRate.test.tsx | 13 +----- .../reportMapper/deploymentFrequency.test.tsx | 13 +----- .../reportMapper/meanTimeToRecovery.test.tsx | 39 ++-------------- .../hooks/reportMapper/report.test.tsx | 45 +++---------------- frontend/e2e/pages/metrics/report-step.ts | 25 ++++++----- frontend/src/clients/report/dto/response.ts | 6 +-- .../Common/ReportForThreeColumns/index.tsx | 6 +-- .../Common/ReportForTwoColumns/index.tsx | 39 +++++++++++++++- frontend/src/constants/resources.ts | 2 +- .../ReportStep/ReportDetail/dora.tsx | 21 +++++---- .../hooks/reportMapper/deploymentFrequency.ts | 25 +++-------- .../reportMapper/devChangeFailureRate.ts | 28 +++--------- .../reportMapper/devMeanTimeToRecovery.ts | 25 +++-------- 16 files changed, 144 insertions(+), 201 deletions(-) create mode 100644 frontend/__tests__/components/Common/ReportForTwoColumns.test.tsx diff --git a/frontend/__tests__/components/Common/ReportForThreeColumns.test.tsx b/frontend/__tests__/components/Common/ReportForThreeColumns.test.tsx index 3cb975f8da..752d4f60c7 100644 --- a/frontend/__tests__/components/Common/ReportForThreeColumns.test.tsx +++ b/frontend/__tests__/components/Common/ReportForThreeColumns.test.tsx @@ -1,7 +1,6 @@ import ReportForThreeColumns from '@src/components/Common/ReportForThreeColumns'; +import { LEAD_TIME_FOR_CHANGES, LOADING, VELOCITY } from '../../fixtures'; import { render, screen } from '@testing-library/react'; -import { LOADING, VELOCITY } from '../../fixtures'; -import React from 'react'; describe('Report for three columns', () => { it('should show loading when data is empty', () => { @@ -18,6 +17,20 @@ describe('Report for three columns', () => { { id: 2, name: 'name3', valuesList: [{ name: 'test3', value: '3' }] }, ]; + render( + , + ); + + expect(screen.getByTestId(LEAD_TIME_FOR_CHANGES)).toBeInTheDocument(); + }); + + it('should show table when data name contains emoji', () => { + const mockData = [ + { id: 0, name: 'name1/:rocket: Deploy prod', valuesList: [{ name: 'test1', value: '1' }] }, + { id: 1, name: 'name2/:rocket: Deploy prod', valuesList: [{ name: 'test2', value: '2' }] }, + { id: 2, name: 'name3/:rocket: Deploy prod', valuesList: [{ name: 'test3', value: '3' }] }, + ]; + render(); expect(screen.getByTestId(VELOCITY)).toBeInTheDocument(); diff --git a/frontend/__tests__/components/Common/ReportForTwoColumns.test.tsx b/frontend/__tests__/components/Common/ReportForTwoColumns.test.tsx new file mode 100644 index 0000000000..91cdda2aeb --- /dev/null +++ b/frontend/__tests__/components/Common/ReportForTwoColumns.test.tsx @@ -0,0 +1,29 @@ +import ReportForTwoColumns from '@src/components/Common/ReportForTwoColumns'; +import { REPORT_SUFFIX_UNITS } from '@src/constants/resources'; +import { render, screen } from '@testing-library/react'; +import { CYCLE_TIME, VELOCITY } from '../../fixtures'; + +describe('Report for two columns', () => { + it('should show table when data is not empty', () => { + const mockData = [ + { id: 0, name: 'name1', valueList: [{ value: '1' }] }, + { id: 1, name: 'name2', valueList: [{ value: '2' }] }, + { id: 2, name: 'name3', valueList: [{ value: '3' }] }, + ]; + + render(); + + expect(screen.getByTestId(VELOCITY)).toBeInTheDocument(); + }); + + it('should show table when data with Units is not empty', () => { + const mockData = [ + { id: 0, name: 'name1', valueList: [{ value: 1, units: REPORT_SUFFIX_UNITS.PER_CARD }] }, + { id: 1, name: 'name2', valueList: [{ value: 2, units: REPORT_SUFFIX_UNITS.PER_CARD }] }, + ]; + + render(); + + expect(screen.getByTestId(CYCLE_TIME)).toBeInTheDocument(); + }); +}); diff --git a/frontend/__tests__/containers/ReportStep/ReportDetail/dora.test.tsx b/frontend/__tests__/containers/ReportStep/ReportDetail/dora.test.tsx index a847b689c4..bb8e7ebd90 100644 --- a/frontend/__tests__/containers/ReportStep/ReportDetail/dora.test.tsx +++ b/frontend/__tests__/containers/ReportStep/ReportDetail/dora.test.tsx @@ -20,13 +20,13 @@ describe('DoraDetail', () => { describe('Deployment Frequency', () => { it('should show deploymentFrequencyList when deploymentFrequencyList data is existing', () => { (reportMapper as jest.Mock).mockReturnValue({ - deploymentFrequencyList: [{ id: 0, name: 'name1', valuesList: [{ name: 'test1', value: 1 }] }], + deploymentFrequencyList: [{ id: 0, name: 'name1', valueList: [{ value: 1 }] }], }); render(); const deploymentFrequencyTable = screen.getByTestId('Deployment Frequency'); expect(screen.getByText('Deployment Frequency')).toBeInTheDocument(); expect(deploymentFrequencyTable).toBeInTheDocument(); - expect(within(deploymentFrequencyTable).queryAllByTestId('tr').length).toBe(2); + expect(within(deploymentFrequencyTable).queryAllByTestId('tr').length).toBe(1); }); it('should not show deploymentFrequencyList when deploymentFrequencyList data is not existing', () => { @@ -62,13 +62,13 @@ describe('DoraDetail', () => { describe('Dev Change Failure Rate', () => { it('should show devChangeFailureRateList when devChangeFailureRateList data is existing', () => { (reportMapper as jest.Mock).mockReturnValue({ - devChangeFailureRateList: [{ id: 0, name: 'name1', valuesList: [{ name: 'test1', value: 1 }] }], + devChangeFailureRateList: [{ id: 0, name: 'name1', valueList: [{ value: 1 }] }], }); render(); const devChangeFailureRateTable = screen.getByTestId('Dev Change Failure Rate'); expect(screen.getByText('Dev Change Failure Rate')).toBeInTheDocument(); expect(devChangeFailureRateTable).toBeInTheDocument(); - expect(within(devChangeFailureRateTable).queryAllByTestId('tr').length).toBe(2); + expect(within(devChangeFailureRateTable).queryAllByTestId('tr').length).toBe(1); }); it('should not show devChangeFailureRateList when devChangeFailureRateList data is not existing', () => { @@ -83,13 +83,13 @@ describe('DoraDetail', () => { describe('Dev Mean Time To Recovery', () => { it('should show devMeanTimeToRecoveryList when devMeanTimeToRecoveryList data is existing', () => { (reportMapper as jest.Mock).mockReturnValue({ - devMeanTimeToRecoveryList: [{ id: 0, name: 'name1', valuesList: [{ name: 'test1', value: 1 }] }], + devMeanTimeToRecoveryList: [{ id: 0, name: 'name1', valueList: [{ value: 1 }] }], }); render(); const devMeanTimeToRecoveryTable = screen.getByTestId('Dev Mean Time To Recovery'); expect(screen.getByText('Dev Mean Time To Recovery')).toBeInTheDocument(); expect(devMeanTimeToRecoveryTable).toBeInTheDocument(); - expect(within(devMeanTimeToRecoveryTable).queryAllByTestId('tr').length).toBe(2); + expect(within(devMeanTimeToRecoveryTable).queryAllByTestId('tr').length).toBe(1); }); it('should not show devMeanTimeToRecoveryList when devMeanTimeToRecoveryList data is not existing', () => { diff --git a/frontend/__tests__/hooks/reportMapper/changeFailureRate.test.tsx b/frontend/__tests__/hooks/reportMapper/changeFailureRate.test.tsx index f8ae3f238e..05dfd09e3b 100644 --- a/frontend/__tests__/hooks/reportMapper/changeFailureRate.test.tsx +++ b/frontend/__tests__/hooks/reportMapper/changeFailureRate.test.tsx @@ -23,23 +23,12 @@ describe('dev change failure rate data mapper', () => { { id: 0, name: 'fs-platform-onboarding/ :shipit: deploy to PROD', - valuesList: [ + valueList: [ { - name: 'Dev change failure rate', value: '0.00%(0/3)', }, ], }, - { - id: 1, - name: 'Average', - valuesList: [ - { - name: 'Dev change failure rate', - value: '0.00%(0/12)', - }, - ], - }, ]; const mappedDevChangeFailureRate = devChangeFailureRateMapper(mockDevChangeFailureRateRes); diff --git a/frontend/__tests__/hooks/reportMapper/deploymentFrequency.test.tsx b/frontend/__tests__/hooks/reportMapper/deploymentFrequency.test.tsx index 4583784366..a3bc1023f8 100644 --- a/frontend/__tests__/hooks/reportMapper/deploymentFrequency.test.tsx +++ b/frontend/__tests__/hooks/reportMapper/deploymentFrequency.test.tsx @@ -33,23 +33,12 @@ describe('deployment frequency data mapper', () => { { id: 0, name: 'fs-platform-onboarding/ :shipit: deploy to PROD', - valuesList: [ + valueList: [ { - name: 'Deployment frequency', value: '0.30', }, ], }, - { - id: 1, - name: 'Average', - valuesList: [ - { - name: 'Deployment frequency', - value: '0.40', - }, - ], - }, ]; const mappedDeploymentFrequency = deploymentFrequencyMapper(mockDeploymentFrequencyRes); diff --git a/frontend/__tests__/hooks/reportMapper/meanTimeToRecovery.test.tsx b/frontend/__tests__/hooks/reportMapper/meanTimeToRecovery.test.tsx index 7605c059e4..451e76d164 100644 --- a/frontend/__tests__/hooks/reportMapper/meanTimeToRecovery.test.tsx +++ b/frontend/__tests__/hooks/reportMapper/meanTimeToRecovery.test.tsx @@ -19,19 +19,8 @@ describe('dev mean time to recovery data mapper', () => { { id: 0, name: 'fs-platform-onboarding/ :shipit: deploy to PROD', - valuesList: [ + valueList: [ { - name: 'Dev mean time to recovery', - value: '45.03', - }, - ], - }, - { - id: 1, - name: 'Average', - valuesList: [ - { - name: 'Dev mean time to recovery', value: '45.03', }, ], @@ -60,19 +49,8 @@ describe('dev mean time to recovery data mapper', () => { { id: 0, name: 'fs-platform-onboarding/ :shipit: deploy to PROD', - valuesList: [ + valueList: [ { - name: 'Dev mean time to recovery', - value: '0.00', - }, - ], - }, - { - id: 1, - name: 'Average', - valuesList: [ - { - name: 'Dev mean time to recovery', value: '0.00', }, ], @@ -101,19 +79,8 @@ describe('dev mean time to recovery data mapper', () => { { id: 0, name: 'fs-platform-onboarding/ :shipit: deploy to PROD', - valuesList: [ - { - name: 'Dev mean time to recovery', - value: '0.00', - }, - ], - }, - { - id: 1, - name: 'Average', - valuesList: [ + valueList: [ { - name: 'Dev mean time to recovery', value: '0.00', }, ], diff --git a/frontend/__tests__/hooks/reportMapper/report.test.tsx b/frontend/__tests__/hooks/reportMapper/report.test.tsx index 6a9b084fb3..56e745f02f 100644 --- a/frontend/__tests__/hooks/reportMapper/report.test.tsx +++ b/frontend/__tests__/hooks/reportMapper/report.test.tsx @@ -42,31 +42,19 @@ export const EXPECTED_REPORT_VALUES = { { id: 0, name: 'fs-platform-onboarding/ :shipit: deploy to PROD', - valuesList: [ + valueList: [ { - name: 'Deployment frequency', value: '0.30', }, ], }, - { - id: 1, - name: 'Average', - valuesList: [ - { - name: 'Deployment frequency', - value: '0.40', - }, - ], - }, ], devMeanTimeToRecoveryList: [ { id: 0, name: 'Heartbeat/:react: Build Frontend', - valuesList: [ + valueList: [ { - name: 'Dev mean time to recovery', value: '4.32', }, ], @@ -74,9 +62,8 @@ export const EXPECTED_REPORT_VALUES = { { id: 1, name: 'Heartbeat/:cloudformation: Deploy infra', - valuesList: [ + valueList: [ { - name: 'Dev mean time to recovery', value: '0.00', }, ], @@ -84,23 +71,12 @@ export const EXPECTED_REPORT_VALUES = { { id: 2, name: 'Heartbeat/:rocket: Run e2e', - valuesList: [ + valueList: [ { - name: 'Dev mean time to recovery', value: '7.67', }, ], }, - { - id: 3, - name: 'Average', - valuesList: [ - { - name: 'Dev mean time to recovery', - value: '4.00', - }, - ], - }, ], leadTimeForChangesList: [ { @@ -126,23 +102,12 @@ export const EXPECTED_REPORT_VALUES = { { id: 0, name: 'fs-platform-onboarding/ :shipit: deploy to PROD', - valuesList: [ + valueList: [ { - name: 'Dev change failure rate', value: '0.00%(0/2)', }, ], }, - { - id: 1, - name: 'Average', - valuesList: [ - { - name: 'Dev change failure rate', - value: '0.00%(0/6)', - }, - ], - }, ], exportValidityTimeMin: 30, reworkList: [ diff --git a/frontend/e2e/pages/metrics/report-step.ts b/frontend/e2e/pages/metrics/report-step.ts index 28d5c890d2..71b3d6515c 100644 --- a/frontend/e2e/pages/metrics/report-step.ts +++ b/frontend/e2e/pages/metrics/report-step.ts @@ -38,6 +38,7 @@ export class ReportStep { readonly classificationRows: Locator; readonly leadTimeForChangesRows: Locator; readonly devChangeFailureRateRows: Locator; + readonly deploymentFrequencyRows: Locator; readonly devMeanTimeToRecoveryRows: Locator; readonly reworkRows: Locator; @@ -72,10 +73,14 @@ export class ReportStep { this.homeIcon = page.getByLabel('Home'); this.velocityRows = this.page.getByTestId('Velocity').locator('tbody').getByRole('row'); this.cycleTimeRows = this.page.getByTestId('Cycle Time').locator('tbody').getByRole('row'); + this.deploymentFrequencyRows = this.page.getByTestId('Deployment Frequency').locator('tbody').getByRole('row'); this.classificationRows = this.page.getByTestId('Classification').locator('tbody').getByRole('row'); this.leadTimeForChangesRows = this.page.getByTestId('Lead Time For Changes').getByRole('row'); - this.devChangeFailureRateRows = this.page.getByTestId('Dev Change Failure Rate').getByRole('row'); - this.devMeanTimeToRecoveryRows = this.page.getByTestId('Dev Mean Time To Recovery').getByRole('row'); + this.devChangeFailureRateRows = this.page.getByTestId('Dev Change Failure Rate').locator('tbody').getByRole('row'); + this.devMeanTimeToRecoveryRows = this.page + .getByTestId('Dev Mean Time To Recovery') + .locator('tbody') + .getByRole('row'); this.reworkRows = this.page.getByTestId('Rework').getByRole('row'); } combineStrings(arr: string[]): string { @@ -91,9 +96,8 @@ export class ReportStep { } async checkDoraMetricsReportDetails() { - await expect(this.page.getByTestId('Deployment Frequency').getByRole('row').nth(2)).toContainText( - this.combineStrings(['Deployment frequency', '6.60']), - ); + await expect(this.deploymentFrequencyRows.getByRole('cell').nth(0)).toContainText('Heartbeat/ Deploy prod'); + await expect(this.deploymentFrequencyRows.getByRole('cell').nth(1)).toContainText('6.60'); await expect(this.leadTimeForChangesRows.nth(2)).toContainText(this.combineStrings(['PR Lead Time', '6.12'])); await expect(this.leadTimeForChangesRows.nth(3)).toContainText(this.combineStrings(['Pipeline Lead Time', '0.50'])); @@ -101,13 +105,10 @@ export class ReportStep { await expect(this.leadTimeForChangesRows.nth(4)).toContainText(this.combineStrings(['Total Lead Time', '6.62'])); - await expect(this.devChangeFailureRateRows.nth(2)).toContainText( - this.combineStrings(['Dev change failure rate', '17.50%(7/40)']), - ); - - await expect(this.devMeanTimeToRecoveryRows.nth(2)).toContainText( - this.combineStrings(['Dev mean time to recovery', '1.90']), - ); + await expect(this.devChangeFailureRateRows.getByRole('cell').nth(0)).toContainText('Heartbeat/ Deploy prod'); + await expect(this.devChangeFailureRateRows.getByRole('cell').nth(1)).toContainText('17.50%(7/40)'); + await expect(this.devMeanTimeToRecoveryRows.getByRole('cell').nth(0)).toContainText('Heartbeat/ Deploy prod'); + await expect(this.devMeanTimeToRecoveryRows.getByRole('cell').nth(1)).toContainText('1.90'); } async checkDoraMetricsDetails(projectCreationType: ProjectCreationType) { diff --git a/frontend/src/clients/report/dto/response.ts b/frontend/src/clients/report/dto/response.ts index c9b1b7e64f..535a33404d 100644 --- a/frontend/src/clients/report/dto/response.ts +++ b/frontend/src/clients/report/dto/response.ts @@ -166,9 +166,9 @@ export interface ReportResponse { cycleTimeList?: ReportDataWithTwoColumns[] | null; reworkList?: ReportDataWithTwoColumns[] | null; classification?: ReportDataWithThreeColumns[] | null; - deploymentFrequencyList?: ReportDataWithThreeColumns[] | null; - devMeanTimeToRecoveryList?: ReportDataWithThreeColumns[] | null; + deploymentFrequencyList?: ReportDataWithTwoColumns[] | null; + devMeanTimeToRecoveryList?: ReportDataWithTwoColumns[] | null; leadTimeForChangesList?: ReportDataWithThreeColumns[] | null; - devChangeFailureRateList?: ReportDataWithThreeColumns[] | null; + devChangeFailureRateList?: ReportDataWithTwoColumns[] | null; exportValidityTimeMin?: number | null; } diff --git a/frontend/src/components/Common/ReportForThreeColumns/index.tsx b/frontend/src/components/Common/ReportForThreeColumns/index.tsx index b5ea98f58c..c85e059a54 100644 --- a/frontend/src/components/Common/ReportForThreeColumns/index.tsx +++ b/frontend/src/components/Common/ReportForThreeColumns/index.tsx @@ -83,11 +83,7 @@ export const ReportForThreeColumns = ({ }); const getTitleUnit = (title: string) => { - return title === METRICS_TITLE.LEAD_TIME_FOR_CHANGES || title === METRICS_TITLE.DEV_MEAN_TIME_TO_RECOVERY - ? REPORT_SUFFIX_UNITS.HOURS - : title === METRICS_TITLE.DEPLOYMENT_FREQUENCY - ? REPORT_SUFFIX_UNITS.DEPLOYMENTS_DAY - : ''; + return title === METRICS_TITLE.LEAD_TIME_FOR_CHANGES ? REPORT_SUFFIX_UNITS.HOURS : ''; }; const renderLoading = () => ( diff --git a/frontend/src/components/Common/ReportForTwoColumns/index.tsx b/frontend/src/components/Common/ReportForTwoColumns/index.tsx index 427258a4af..cc668b12df 100644 --- a/frontend/src/components/Common/ReportForTwoColumns/index.tsx +++ b/frontend/src/components/Common/ReportForTwoColumns/index.tsx @@ -6,6 +6,9 @@ import { StyledTableCell, } from '@src/components/Common/ReportForTwoColumns/style'; import { ReportDataWithTwoColumns } from '@src/hooks/reportMapper/reportUIDataStructure'; +import { EmojiWrap, StyledAvatar, StyledTypography } from '@src/constants/emojis/style'; +import { getEmojiUrls, removeExtraEmojiName } from '@src/constants/emojis/emoji'; +import { METRICS_TITLE, REPORT_SUFFIX_UNITS } from '@src/constants/resources'; import { ReportSelectionTitle } from '@src/containers/MetricsStep/style'; import { Table, TableBody, TableHead, TableRow } from '@mui/material'; import React, { Fragment } from 'react'; @@ -16,11 +19,32 @@ interface ReportForTwoColumnsProps { } export const ReportForTwoColumns = ({ title, data }: ReportForTwoColumnsProps) => { + const transformEmoji = (row: ReportDataWithTwoColumns) => { + if (typeof row.name != 'string') { + return row.name; + } + const name = row.name as string; + const emojiUrls: string[] = getEmojiUrls(name); + if (name.includes(':') && emojiUrls.length > 0) { + const [prefix, suffix] = name.split('/'); + return ( + + {prefix}/ + {emojiUrls.map((url) => ( + + ))} + {removeExtraEmojiName(suffix)} + + ); + } + return {name}; + }; + const renderRows = () => { return data.map((row) => ( - {row.name} + {transformEmoji(row)} {row.valueList[0]?.unit ? `${row.valueList[0].value}${row.valueList[0].unit}` : row.valueList[0].value} @@ -42,7 +66,7 @@ export const ReportForTwoColumns = ({ title, data }: ReportForTwoColumnsProps) = Name - Value + {`Value${getTitleUnit(title)}`} {renderRows()} @@ -52,4 +76,15 @@ export const ReportForTwoColumns = ({ title, data }: ReportForTwoColumnsProps) = ); }; +const getTitleUnit = (title: string) => { + switch (title) { + case METRICS_TITLE.DEV_MEAN_TIME_TO_RECOVERY: + return REPORT_SUFFIX_UNITS.HOURS; + case METRICS_TITLE.DEPLOYMENT_FREQUENCY: + return REPORT_SUFFIX_UNITS.DEPLOYMENTS_DAY; + default: + return ''; + } +}; + export default ReportForTwoColumns; diff --git a/frontend/src/constants/resources.ts b/frontend/src/constants/resources.ts index f2ede0d95c..54dbf122ad 100644 --- a/frontend/src/constants/resources.ts +++ b/frontend/src/constants/resources.ts @@ -244,7 +244,7 @@ export const DEV_MEAN_TIME_TO_RECOVERY_NAME = 'Dev mean time to recovery'; export const PIPELINE_STEP = 'Pipeline/step'; -export const NAME = 'Name'; +export const SUBTITLE = 'Subtitle'; export const AVERAGE_FIELD = 'Average'; diff --git a/frontend/src/containers/ReportStep/ReportDetail/dora.tsx b/frontend/src/containers/ReportStep/ReportDetail/dora.tsx index 1ca30a04ce..cc4d0519bf 100644 --- a/frontend/src/containers/ReportStep/ReportDetail/dora.tsx +++ b/frontend/src/containers/ReportStep/ReportDetail/dora.tsx @@ -1,6 +1,7 @@ -import { ReportDataWithThreeColumns } from '@src/hooks/reportMapper/reportUIDataStructure'; +import { ReportDataWithThreeColumns, ReportDataWithTwoColumns } from '@src/hooks/reportMapper/reportUIDataStructure'; +import { METRICS_TITLE, PIPELINE_STEP, SUBTITLE } from '@src/constants/resources'; import ReportForThreeColumns from '@src/components/Common/ReportForThreeColumns'; -import { METRICS_TITLE, NAME, PIPELINE_STEP } from '@src/constants/resources'; +import ReportForTwoColumns from '@src/components/Common/ReportForTwoColumns'; import { ReportResponseDTO } from '@src/clients/report/dto/response'; import { reportMapper } from '@src/hooks/reportMapper/report'; import { Optional } from '@src/utils/types'; @@ -11,18 +12,22 @@ interface Property { data: ReportResponseDTO; onBack: () => void; } -const showSection = (title: string, value: Optional) => - value && ; + +const showTwoColumnSection = (title: string, value: Optional) => + value && ; + +const showThreeColumnSection = (title: string, value: Optional) => + value && ; export const DoraDetail = withGoBack(({ data }: Property) => { const mappedData = reportMapper(data); return ( <> - {showSection(METRICS_TITLE.DEPLOYMENT_FREQUENCY, mappedData.deploymentFrequencyList)} - {showSection(METRICS_TITLE.LEAD_TIME_FOR_CHANGES, mappedData.leadTimeForChangesList)} - {showSection(METRICS_TITLE.DEV_CHANGE_FAILURE_RATE, mappedData.devChangeFailureRateList)} - {showSection(METRICS_TITLE.DEV_MEAN_TIME_TO_RECOVERY, mappedData.devMeanTimeToRecoveryList)} + {showTwoColumnSection(METRICS_TITLE.DEPLOYMENT_FREQUENCY, mappedData.deploymentFrequencyList)} + {showThreeColumnSection(METRICS_TITLE.LEAD_TIME_FOR_CHANGES, mappedData.leadTimeForChangesList)} + {showTwoColumnSection(METRICS_TITLE.DEV_CHANGE_FAILURE_RATE, mappedData.devChangeFailureRateList)} + {showTwoColumnSection(METRICS_TITLE.DEV_MEAN_TIME_TO_RECOVERY, mappedData.devMeanTimeToRecoveryList)} ); }); diff --git a/frontend/src/hooks/reportMapper/deploymentFrequency.ts b/frontend/src/hooks/reportMapper/deploymentFrequency.ts index df4689bd44..0445616891 100644 --- a/frontend/src/hooks/reportMapper/deploymentFrequency.ts +++ b/frontend/src/hooks/reportMapper/deploymentFrequency.ts @@ -1,30 +1,17 @@ -import { ReportDataWithThreeColumns } from '@src/hooks/reportMapper/reportUIDataStructure'; +import { ReportDataWithTwoColumns } from '@src/hooks/reportMapper/reportUIDataStructure'; import { DeploymentFrequencyResponse } from '@src/clients/report/dto/response'; -import { DEPLOYMENT_FREQUENCY_NAME } from '@src/constants/resources'; -export const deploymentFrequencyMapper = ({ - avgDeploymentFrequency, - deploymentFrequencyOfPipelines, -}: DeploymentFrequencyResponse) => { - const mappedDeploymentFrequencyValue: ReportDataWithThreeColumns[] = []; +export const deploymentFrequencyMapper = ({ deploymentFrequencyOfPipelines }: DeploymentFrequencyResponse) => { + const mappedDeploymentFrequencyValue: ReportDataWithTwoColumns[] = []; deploymentFrequencyOfPipelines.map((item, index) => { - const deploymentFrequencyValue: ReportDataWithThreeColumns = { + const deploymentFrequencyValue: ReportDataWithTwoColumns = { id: index, name: `${item.name}/${item.step}`, - valuesList: [{ name: DEPLOYMENT_FREQUENCY_NAME, value: `${item.deploymentFrequency.toFixed(2)}` }], + valueList: [{ value: `${item.deploymentFrequency.toFixed(2)}` }], }; mappedDeploymentFrequencyValue.push(deploymentFrequencyValue); }); - mappedDeploymentFrequencyValue.push({ - id: mappedDeploymentFrequencyValue.length, - name: avgDeploymentFrequency.name, - valuesList: [ - { - name: DEPLOYMENT_FREQUENCY_NAME, - value: `${avgDeploymentFrequency.deploymentFrequency.toFixed(2)}`, - }, - ], - }); + return mappedDeploymentFrequencyValue; }; diff --git a/frontend/src/hooks/reportMapper/devChangeFailureRate.ts b/frontend/src/hooks/reportMapper/devChangeFailureRate.ts index 7dd9a0375b..682384b996 100644 --- a/frontend/src/hooks/reportMapper/devChangeFailureRate.ts +++ b/frontend/src/hooks/reportMapper/devChangeFailureRate.ts @@ -1,38 +1,20 @@ -import { ReportDataWithThreeColumns } from '@src/hooks/reportMapper/reportUIDataStructure'; +import { ReportDataWithTwoColumns } from '@src/hooks/reportMapper/reportUIDataStructure'; import { DevChangeFailureRateResponse } from '@src/clients/report/dto/response'; -import { DEV_FAILURE_RATE_NAME } from '@src/constants/resources'; -export const devChangeFailureRateMapper = ({ - avgDevChangeFailureRate, - devChangeFailureRateOfPipelines, -}: DevChangeFailureRateResponse) => { - const mappedDevChangeFailureRateValue: ReportDataWithThreeColumns[] = []; +export const devChangeFailureRateMapper = ({ devChangeFailureRateOfPipelines }: DevChangeFailureRateResponse) => { + const mappedDevChangeFailureRateValue: ReportDataWithTwoColumns[] = []; devChangeFailureRateOfPipelines.map((item, index) => { - const devChangeFailureRateValue: ReportDataWithThreeColumns = { + const devChangeFailureRateValue: ReportDataWithTwoColumns = { id: index, name: `${item.name}/${item.step}`, - valuesList: [ + valueList: [ { - name: DEV_FAILURE_RATE_NAME, value: `${(item.failureRate * 100).toFixed(2)}%(${item.failedTimesOfPipeline}/${item.totalTimesOfPipeline})`, }, ], }; mappedDevChangeFailureRateValue.push(devChangeFailureRateValue); }); - mappedDevChangeFailureRateValue.push({ - id: mappedDevChangeFailureRateValue.length, - name: avgDevChangeFailureRate.name, - valuesList: [ - { - name: DEV_FAILURE_RATE_NAME, - value: `${(avgDevChangeFailureRate.failureRate * 100).toFixed(2)}%(${avgDevChangeFailureRate.totalFailedTimes}/${ - avgDevChangeFailureRate.totalTimes - })`, - }, - ], - }); - return mappedDevChangeFailureRateValue; }; diff --git a/frontend/src/hooks/reportMapper/devMeanTimeToRecovery.ts b/frontend/src/hooks/reportMapper/devMeanTimeToRecovery.ts index 086063de94..597b727173 100644 --- a/frontend/src/hooks/reportMapper/devMeanTimeToRecovery.ts +++ b/frontend/src/hooks/reportMapper/devMeanTimeToRecovery.ts @@ -1,11 +1,7 @@ -import { ReportDataWithThreeColumns } from '@src/hooks/reportMapper/reportUIDataStructure'; +import { ReportDataWithTwoColumns } from '@src/hooks/reportMapper/reportUIDataStructure'; import { DevMeanTimeToRecoveryResponse } from '@src/clients/report/dto/response'; -import { DEV_MEAN_TIME_TO_RECOVERY_NAME } from '@src/constants/resources'; -export const devMeanTimeToRecoveryMapper = ({ - avgDevMeanTimeToRecovery, - devMeanTimeToRecoveryOfPipelines, -}: DevMeanTimeToRecoveryResponse) => { +export const devMeanTimeToRecoveryMapper = ({ devMeanTimeToRecoveryOfPipelines }: DevMeanTimeToRecoveryResponse) => { const minutesPerHour = 60; const milliscondMinute = 60000; const formatDuration = (duration: number) => { @@ -13,31 +9,20 @@ export const devMeanTimeToRecoveryMapper = ({ return (minutesDuration / minutesPerHour).toFixed(2); }; - const mappedDevMeanTimeToRecoveryValue: ReportDataWithThreeColumns[] = []; + const mappedDevMeanTimeToRecoveryValue: ReportDataWithTwoColumns[] = []; devMeanTimeToRecoveryOfPipelines.map((item, index) => { - const devMeanTimeToRecoveryValue: ReportDataWithThreeColumns = { + const devMeanTimeToRecoveryValue: ReportDataWithTwoColumns = { id: index, name: `${item.name}/${item.step}`, - valuesList: [ + valueList: [ { - name: DEV_MEAN_TIME_TO_RECOVERY_NAME, value: formatDuration(item.timeToRecovery), }, ], }; mappedDevMeanTimeToRecoveryValue.push(devMeanTimeToRecoveryValue); }); - mappedDevMeanTimeToRecoveryValue.push({ - id: mappedDevMeanTimeToRecoveryValue.length, - name: avgDevMeanTimeToRecovery.name, - valuesList: [ - { - name: DEV_MEAN_TIME_TO_RECOVERY_NAME, - value: formatDuration(avgDevMeanTimeToRecovery.timeToRecovery), - }, - ], - }); return mappedDevMeanTimeToRecoveryValue; }; From f8c0323e958857eefd1c698ccd38c318037b9604 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 17 Apr 2024 23:14:35 +0800 Subject: [PATCH 18/81] chore(deps): bump gradle/wrapper-validation-action from 2 to 3 (#1384) * chore(deps): bump gradle/wrapper-validation-action from 2 to 3 Bumps [gradle/wrapper-validation-action](https://github.com/gradle/wrapper-validation-action) from 2 to 3. - [Release notes](https://github.com/gradle/wrapper-validation-action/releases) - [Commits](https://github.com/gradle/wrapper-validation-action/compare/v2...v3) --- updated-dependencies: - dependency-name: gradle/wrapper-validation-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] * fix(voluner): ignore voluneriability --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: guzhongren --- .github/workflows/Release.yaml | 2 +- .github/workflows/build-and-deploy.yml | 4 ++-- .trivyignore | 1 + 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/.github/workflows/Release.yaml b/.github/workflows/Release.yaml index 4319387ab5..71827c1935 100644 --- a/.github/workflows/Release.yaml +++ b/.github/workflows/Release.yaml @@ -22,7 +22,7 @@ jobs: java-version: ${{ vars.JAVA_VERSION || 19 }} distribution: "adopt" - name: Validate Gradle wrapper - uses: gradle/wrapper-validation-action@v2 + uses: gradle/wrapper-validation-action@v3 - name: Set up Gradle uses: gradle/gradle-build-action@v3.2.1 - name: Build diff --git a/.github/workflows/build-and-deploy.yml b/.github/workflows/build-and-deploy.yml index 9fd7814e0d..3c3e473ee7 100644 --- a/.github/workflows/build-and-deploy.yml +++ b/.github/workflows/build-and-deploy.yml @@ -89,7 +89,7 @@ jobs: java-version: ${{ vars.JAVA_VERSION }} distribution: "adopt" - name: Validate Gradle wrapper - uses: gradle/wrapper-validation-action@v2 + uses: gradle/wrapper-validation-action@v3 - name: Set up Gradle uses: gradle/gradle-build-action@v3.2.1 - name: Test and check @@ -118,7 +118,7 @@ jobs: java-version: ${{ vars.JAVA_VERSION }} distribution: "adopt" - name: Validate Gradle wrapper - uses: gradle/wrapper-validation-action@v2 + uses: gradle/wrapper-validation-action@v3 - name: Set up Gradle uses: gradle/gradle-build-action@v3.2.1 - name: License check diff --git a/.trivyignore b/.trivyignore index b693001686..4c9ee83cca 100644 --- a/.trivyignore +++ b/.trivyignore @@ -14,3 +14,4 @@ CVE-2024-0567 CVE-2024-22201 CVE-2024-22259 CVE-2024-28085 +CVE-2024-22262 From aebbd8796cb4d4af5c6e56200f200227ac979f05 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 18 Apr 2024 08:44:28 +0800 Subject: [PATCH 19/81] fix(deps): [backend]update dependency org.springframework.cloud:spring-cloud-starter-openfeign to v4.1.1 (#1390) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- backend/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/build.gradle b/backend/build.gradle index 3612c0bf11..0a898b6441 100644 --- a/backend/build.gradle +++ b/backend/build.gradle @@ -30,7 +30,7 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-log4j2' implementation 'org.springframework.boot:spring-boot-starter-validation' implementation 'org.springframework:spring-core:6.1.6' - implementation("org.springframework.cloud:spring-cloud-starter-openfeign:4.0.2") { + implementation("org.springframework.cloud:spring-cloud-starter-openfeign:4.1.1") { exclude group: 'commons-fileupload', module: 'commons-fileupload' } implementation ("org.springdoc:springdoc-openapi-starter-webmvc-ui:2.0.4") { From cf74ad229189cc53b000cf9e4dd60bd4fc528252 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 18 Apr 2024 01:13:37 +0000 Subject: [PATCH 20/81] chore(deps): update plugin com.github.jk1.dependency-license-report to v2.7 (#1388) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- backend/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/build.gradle b/backend/build.gradle index 0a898b6441..b6deca7586 100644 --- a/backend/build.gradle +++ b/backend/build.gradle @@ -5,7 +5,7 @@ plugins { id 'org.springframework.boot' version '3.1.9' id 'io.spring.dependency-management' version '1.1.4' id "io.spring.javaformat" version "0.0.41" - id 'com.github.jk1.dependency-license-report' version '2.6' + id 'com.github.jk1.dependency-license-report' version '2.7' id "org.sonarqube" version "4.4.1.3373" } From de335b19ef5351900141eac8655466960243ecfb Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 18 Apr 2024 01:51:02 +0000 Subject: [PATCH 21/81] fix(deps): update dependency org.springdoc:springdoc-openapi-starter-webmvc-ui to v2.5.0 (#1389) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- backend/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/build.gradle b/backend/build.gradle index b6deca7586..c73e2cc73f 100644 --- a/backend/build.gradle +++ b/backend/build.gradle @@ -33,7 +33,7 @@ dependencies { implementation("org.springframework.cloud:spring-cloud-starter-openfeign:4.1.1") { exclude group: 'commons-fileupload', module: 'commons-fileupload' } - implementation ("org.springdoc:springdoc-openapi-starter-webmvc-ui:2.0.4") { + implementation ("org.springdoc:springdoc-openapi-starter-webmvc-ui:2.5.0") { exclude group: 'org.yaml', module: 'snakeyaml' } implementation 'commons-fileupload:commons-fileupload:1.5' From 935faf254d35f6c1aaf32616405bcb17543b35f0 Mon Sep 17 00:00:00 2001 From: guzhongren Date: Thu, 18 Apr 2024 11:16:09 +0800 Subject: [PATCH 22/81] =?UTF-8?q?Revert=20"fix(deps):=20[backend]update=20?= =?UTF-8?q?dependency=20org.springframework.cloud:sprin=E2=80=A6"=20(#1392?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit aebbd8796cb4d4af5c6e56200f200227ac979f05. Co-authored-by: neomgb <123063936+neomgb@users.noreply.github.com> --- backend/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/build.gradle b/backend/build.gradle index c73e2cc73f..e8e3225329 100644 --- a/backend/build.gradle +++ b/backend/build.gradle @@ -30,7 +30,7 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-log4j2' implementation 'org.springframework.boot:spring-boot-starter-validation' implementation 'org.springframework:spring-core:6.1.6' - implementation("org.springframework.cloud:spring-cloud-starter-openfeign:4.1.1") { + implementation("org.springframework.cloud:spring-cloud-starter-openfeign:4.0.2") { exclude group: 'commons-fileupload', module: 'commons-fileupload' } implementation ("org.springdoc:springdoc-openapi-starter-webmvc-ui:2.5.0") { From fea3c9af8d37ed981057ee304d54a79b751673ca Mon Sep 17 00:00:00 2001 From: yulongcai <141199398+yulongcai@users.noreply.github.com> Date: Thu, 18 Apr 2024 13:35:48 +0800 Subject: [PATCH 23/81] ADM-898:[backend] fix: fix bug for exist block column when choose flag as block and status no block (#1387) --- backend/src/main/java/heartbeat/util/BoardUtil.java | 3 +++ .../StatusChangedItemsListAndCycleTimeInfosListFixture.java | 1 - 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/backend/src/main/java/heartbeat/util/BoardUtil.java b/backend/src/main/java/heartbeat/util/BoardUtil.java index fd316d5e6c..edbfd545ee 100644 --- a/backend/src/main/java/heartbeat/util/BoardUtil.java +++ b/backend/src/main/java/heartbeat/util/BoardUtil.java @@ -68,6 +68,9 @@ private List calculateOriginCycleTime(List flagT double totalFlagTimeInDays = calculateTotalFlagCycleTime(flagTimeStamp); originCycleTimeInfos .add(CycleTimeInfo.builder().day(totalFlagTimeInDays).column(CardStepsEnum.FLAG.getValue()).build()); + originCycleTimeInfos = originCycleTimeInfos.stream() + .filter(it -> !Objects.equals(it.getColumn(), CardStepsEnum.BLOCK.getValue().toUpperCase())) + .toList(); } return originCycleTimeInfos; diff --git a/backend/src/test/java/heartbeat/util/StatusChangedItemsListAndCycleTimeInfosListFixture.java b/backend/src/test/java/heartbeat/util/StatusChangedItemsListAndCycleTimeInfosListFixture.java index f2cbdc7fed..f6c65353f3 100644 --- a/backend/src/test/java/heartbeat/util/StatusChangedItemsListAndCycleTimeInfosListFixture.java +++ b/backend/src/test/java/heartbeat/util/StatusChangedItemsListAndCycleTimeInfosListFixture.java @@ -82,7 +82,6 @@ public static List STATUS_CHANGED_ITEMS_LIST_OF_ORIGIN() { public static List CYCLE_TIME_INFOS_LIST_OF_ORIGIN() { return List.of(CycleTimeInfo.builder().column(DONE).day(EXPECT_DAYS).build(), - CycleTimeInfo.builder().column(BLOCK).day(EXPECT_DAYS).build(), CycleTimeInfo.builder().column(IN_PROGRESS).day(EXPECT_DAYS).build(), CycleTimeInfo.builder().column(FLAG).day(EXPECT_DAYS).build()); } From 7ea514e1e4e779dfa2d1ef9d73119015362a7a12 Mon Sep 17 00:00:00 2001 From: Pengfei Qian Date: Thu, 18 Apr 2024 18:12:55 +0800 Subject: [PATCH 24/81] Adm-909[frontend] sort time range (#1378) * ADM-909:[frontend]add sort button * ADM-909:[frontend]should not show sort button in three situation * [kai.zhou]: refact date range event handle part * [kai.zhou]: demo about sortby type * ADM-909:[frontend]sort time range * ADM-909:[frontend]compatible with import & save * [front][feat]: set sort button shown about date range valid * [front][feat]: fix issue about data range can not to success status * [frontend][kai.zhou]: replace event name onError to onChange * [frontend][kai.zhou]: refactor error check function to parent container * ADM-909:[frontend]add test for configSlice * ADM-909:[frontend]debug handle error * [frontend]: reactor onchange event * [frontend]: fix error status * [frontend]: fix unhandle error * [forntend]: replace redux data to state * ADM-909:[frontend]fix change end date according to test * ADM-909:[frontend]fix change end date when input year the date plus one * ADM-909:[frontend]add test * [frontend]: fix issue about unit test * ADM-909:[frontend]add test for dateRangePickerSection * ADM-909:[frontend]fix type * ADM-909:[frontend]fix test * ADM-909:[frontend]fix comments * ADM-909:[frontend]change with comments * ADM-909:[frontend]change SortType to ISortType * ADM-909:[frontend]fix test * ADM-909:[frontend]changes according to comments * ADM-909:[frontend]rename SortDateRange to SortingDateRange * ADM-909:[frontend]fix lint * ADM-909:[frontend]change ISortedDateRangeType to SortedDateRangeType * ADM-909:[frontend]change to SORTING_DATE_RANGE_TEXT --------- Co-authored-by: kai zhou --- .../constants/fileConfig/fileConfig.test.ts | 2 + .../ConfigStep/DateRangePicker.test.tsx | 105 ++++++++++++----- .../ConfigStep/SortingDateRange.test.tsx | 63 +++++++++++ .../__tests__/context/configSlice.test.ts | 9 ++ frontend/__tests__/fixtures.ts | 2 + frontend/__tests__/initialConfigState.ts | 2 + frontend/src/constants/fileConfig.ts | 3 + frontend/src/constants/resources.ts | 6 + .../DateRangePicker/DateRangePicker.tsx | 91 ++++++--------- .../DateRangePicker/DateRangePickerGroup.tsx | 106 +++++++++++++++++- .../DateRangePicker/SortingDateRange.tsx | 55 +++++++++ .../ConfigStep/DateRangePicker/index.tsx | 50 +++++++-- .../ConfigStep/DateRangePicker/style.tsx | 37 +++++- .../ConfigStep/DateRangePicker/types.ts | 7 ++ .../src/containers/MetricsStepper/index.tsx | 3 +- frontend/src/context/config/configSlice.ts | 10 +- 16 files changed, 452 insertions(+), 99 deletions(-) create mode 100644 frontend/__tests__/containers/ConfigStep/SortingDateRange.test.tsx create mode 100644 frontend/src/containers/ConfigStep/DateRangePicker/SortingDateRange.tsx diff --git a/frontend/__tests__/constants/fileConfig/fileConfig.test.ts b/frontend/__tests__/constants/fileConfig/fileConfig.test.ts index 93ec4b8d15..722ac3d961 100644 --- a/frontend/__tests__/constants/fileConfig/fileConfig.test.ts +++ b/frontend/__tests__/constants/fileConfig/fileConfig.test.ts @@ -5,11 +5,13 @@ import { CHINA_CALENDAR, DEFAULT_REWORK_SETTINGS, } from '../../fixtures'; +import { SortType } from '@src/containers/ConfigStep/DateRangePicker/DateRangePickerGroup'; import { convertToNewFileConfig } from '@src/constants/fileConfig'; describe('#fileConfig', () => { const BASIC_NEW_CONFIG = { projectName: 'ConfigFileForImporting', + sortType: SortType.DEFAULT, dateRange: [ { startDate: '2023-03-16T00:00:00.000+08:00', diff --git a/frontend/__tests__/containers/ConfigStep/DateRangePicker.test.tsx b/frontend/__tests__/containers/ConfigStep/DateRangePicker.test.tsx index 9e961d2c1e..f4ab350c4c 100644 --- a/frontend/__tests__/containers/ConfigStep/DateRangePicker.test.tsx +++ b/frontend/__tests__/containers/ConfigStep/DateRangePicker.test.tsx @@ -36,6 +36,9 @@ const setup = () => { }; describe('DateRangePickerSection', () => { + beforeEach(() => { + setup(); + }); describe('Single range behaviors', () => { const expectDate = (inputDate: HTMLInputElement) => { expect(inputDate.value).toEqual(expect.stringContaining(TODAY.date().toString())); @@ -44,15 +47,11 @@ describe('DateRangePickerSection', () => { }; it('should render DateRangePicker', () => { - setup(); - expect(screen.queryAllByText(START_DATE_LABEL)).toHaveLength(1); expect(screen.queryAllByText(END_DATE_LABEL)).toHaveLength(1); }); it('should show right start date when input a valid date given init start date is null ', async () => { - setup(); - const startDateInput = screen.getByRole('textbox', { name: START_DATE_LABEL }) as HTMLInputElement; await userEvent.type(startDateInput, INPUT_DATE_VALUE); @@ -60,8 +59,6 @@ describe('DateRangePickerSection', () => { }); it('should show right end date when input a valid date given init end date is null ', async () => { - setup(); - const endDateInput = screen.getByRole('textbox', { name: END_DATE_LABEL }) as HTMLInputElement; await userEvent.type(endDateInput, INPUT_DATE_VALUE); @@ -69,8 +66,6 @@ describe('DateRangePickerSection', () => { }); it('should Auto-fill endDate which is after startDate 13 days when fill right startDate ', async () => { - setup(); - const endDate = TODAY.add(13, 'day'); const startDateInput = screen.getByRole('textbox', { name: START_DATE_LABEL }) as HTMLInputElement; const endDateInput = screen.getByRole('textbox', { name: END_DATE_LABEL }) as HTMLInputElement; @@ -82,8 +77,6 @@ describe('DateRangePickerSection', () => { }); it('should Auto-clear endDate when its corresponding startDate is cleared ', async () => { - setup(); - const addButton = screen.getByLabelText('Button for adding date range'); await userEvent.click(addButton); const rangeDate1 = ['03/01/2024', '03/10/2024']; @@ -98,8 +91,6 @@ describe('DateRangePickerSection', () => { }); it('should not auto change startDate when its corresponding endDate changes ', async () => { - setup(); - const startDateInput = screen.getByRole('textbox', { name: START_DATE_LABEL }) as HTMLInputElement; const endDateInput = screen.getByRole('textbox', { name: END_DATE_LABEL }) as HTMLInputElement; const startDate = dayjs('2024-03-20').format('MM/DD/YYYY'); @@ -113,8 +104,6 @@ describe('DateRangePickerSection', () => { }); it('should not Auto-fill endDate which is after startDate 14 days when fill wrong format startDate ', async () => { - setup(); - const startDateInput = screen.getByRole('textbox', { name: START_DATE_LABEL }) as HTMLInputElement; const endDateInput = screen.getByRole('textbox', { name: END_DATE_LABEL }) as HTMLInputElement; await userEvent.type(startDateInput, ERROR_DATE); @@ -124,8 +113,6 @@ describe('DateRangePickerSection', () => { }); it('should dispatch update configuration when change startDate', async () => { - setup(); - const startDateInput = screen.getByRole('textbox', { name: START_DATE_LABEL }) as HTMLInputElement; await userEvent.type(startDateInput, INPUT_DATE_VALUE); @@ -135,8 +122,6 @@ describe('DateRangePickerSection', () => { }); it('should dispatch update configuration when change endDate', async () => { - setup(); - const endDateInput = screen.getByRole('textbox', { name: END_DATE_LABEL }) as HTMLInputElement; await userEvent.type(endDateInput, INPUT_DATE_VALUE); @@ -148,8 +133,6 @@ describe('DateRangePickerSection', () => { describe('Multiple range amount behaviors', () => { it('should not show remove button given there is only one range by default', () => { - setup(); - const removeButton = screen.queryByRole('button', { name: 'Remove' }); const ranges = screen.getAllByLabelText('Range picker row'); @@ -158,8 +141,6 @@ describe('DateRangePickerSection', () => { }); it('should allow user to add up to 6 ranges', async () => { - setup(); - const addButton = screen.getByLabelText('Button for adding date range'); const defaultRanges = screen.getAllByLabelText('Range picker row'); @@ -173,8 +154,6 @@ describe('DateRangePickerSection', () => { }); it('should show remove button when ranges are more than 1 and user is able to remove the range itself by clicking the remove button within that row', async () => { - setup(); - const addButton = screen.getByLabelText('Button for adding date range'); await userEvent.click(addButton); const ranges = screen.getAllByLabelText('Range picker row'); @@ -194,8 +173,6 @@ describe('DateRangePickerSection', () => { }); it('should dispatch update configuration when remove the range', async () => { - setup(); - const addButton = screen.getByLabelText('Button for adding date range'); await userEvent.click(addButton); const ranges = screen.getAllByLabelText('Range picker row'); @@ -216,7 +193,6 @@ describe('DateRangePickerSection', () => { describe('Multiple ranges date interactions', () => { it('should auto fill end date when change star date by cloeset earliest date of other ranges', async () => { - setup(); const rangeDate1 = ['03/12/2024', '03/25/2024']; const rangeDate2 = ['03/08/2024']; @@ -237,7 +213,6 @@ describe('DateRangePickerSection', () => { }); it('should display error message for start-date and end-date respectively when time ranges conflict', async () => { - setup(); const rangeDate1 = ['03/12/2024', '03/25/2024']; const rangeDate2 = ['03/08/2024', '03/26/2024']; @@ -258,4 +233,78 @@ describe('DateRangePickerSection', () => { expect(screen.getByText(TIME_RANGE_ERROR_MESSAGE.END_DATE_INVALID_TEXT)).toBeVisible(); }); }); + + describe('Sort date range behaviors', () => { + it('should not show sort button given only one date range', async () => { + const rangeDate1 = ['03/15/2024', '03/25/2024']; + const ranges = screen.getAllByLabelText('Range picker row'); + const startDate1Input = within(ranges[0]).getByRole('textbox', { name: START_DATE_LABEL }) as HTMLInputElement; + const endDate1Input = within(ranges[0]).getByRole('textbox', { name: END_DATE_LABEL }) as HTMLInputElement; + await userEvent.type(startDate1Input, rangeDate1[0]); + await userEvent.type(endDate1Input, rangeDate1[1]); + const sortButtonContainer = screen.queryByLabelText('Sorting date range'); + expect(sortButtonContainer).toBeNull(); + }); + }); + + it('should show sort button given more than one time range', async () => { + const rangeDate1 = ['03/15/2024', '03/25/2024']; + const rangeDate2 = ['03/08/2024', '03/11/2024']; + + const addButton = screen.getByLabelText('Button for adding date range'); + await userEvent.click(addButton); + const ranges = screen.getAllByLabelText('Range picker row'); + const startDate1Input = within(ranges[0]).getByRole('textbox', { name: START_DATE_LABEL }) as HTMLInputElement; + const endDate1Input = within(ranges[0]).getByRole('textbox', { name: END_DATE_LABEL }) as HTMLInputElement; + const startDate2Input = within(ranges[1]).getByRole('textbox', { name: START_DATE_LABEL }) as HTMLInputElement; + const endDate12nput = within(ranges[1]).getByRole('textbox', { name: END_DATE_LABEL }) as HTMLInputElement; + await userEvent.type(startDate1Input, rangeDate1[0]); + await userEvent.type(endDate1Input, rangeDate1[1]); + await userEvent.type(startDate2Input, rangeDate2[0]); + await userEvent.type(endDate12nput, rangeDate2[1]); + const sortButton = screen.getByLabelText('Sorting date range'); + expect(sortButton).toBeInTheDocument(); + }); + + it('should not show sort button given exist errors in date range', async () => { + const rangeDate1 = ['03/12/2024', '03/25/2024']; + const rangeDate2 = ['03/08/2024', '03/26/2024']; + + const addButton = screen.getByLabelText('Button for adding date range'); + await userEvent.click(addButton); + await userEvent.click(addButton); + const ranges = screen.getAllByLabelText('Range picker row'); + const startDate1Input = within(ranges[0]).getByRole('textbox', { name: START_DATE_LABEL }) as HTMLInputElement; + const endDate1Input = within(ranges[0]).getByRole('textbox', { name: END_DATE_LABEL }) as HTMLInputElement; + const startDate2Input = within(ranges[1]).getByRole('textbox', { name: START_DATE_LABEL }) as HTMLInputElement; + const endDate12nput = within(ranges[1]).getByRole('textbox', { name: END_DATE_LABEL }) as HTMLInputElement; + await userEvent.type(startDate1Input, rangeDate1[0]); + await userEvent.type(endDate1Input, rangeDate1[1]); + await userEvent.type(startDate2Input, rangeDate2[0]); + await userEvent.type(endDate12nput, rangeDate2[1]); + const sortButtonContainer = screen.queryByLabelText('Sorting date range'); + expect(sortButtonContainer).toBeNull(); + }); + + it('should update sort status when handleSortTypeChange is called', async () => { + const rangeDate1 = ['03/15/2024', '03/25/2024']; + const rangeDate2 = ['03/08/2024', '03/11/2024']; + + const addButton = screen.getByLabelText('Button for adding date range'); + await userEvent.click(addButton); + const ranges = screen.getAllByLabelText('Range picker row'); + const startDate1Input = within(ranges[0]).getByRole('textbox', { name: START_DATE_LABEL }) as HTMLInputElement; + const endDate1Input = within(ranges[0]).getByRole('textbox', { name: END_DATE_LABEL }) as HTMLInputElement; + const startDate2Input = within(ranges[1]).getByRole('textbox', { name: START_DATE_LABEL }) as HTMLInputElement; + const endDate12nput = within(ranges[1]).getByRole('textbox', { name: END_DATE_LABEL }) as HTMLInputElement; + await userEvent.type(startDate1Input, rangeDate1[0]); + await userEvent.type(endDate1Input, rangeDate1[1]); + await userEvent.type(startDate2Input, rangeDate2[0]); + await userEvent.type(endDate12nput, rangeDate2[1]); + const sortButton = screen.getByLabelText('sort button'); + await userEvent.click(sortButton); + expect(screen.getByRole('button', { name: 'Descending' })).toBeInTheDocument(); + await userEvent.click(sortButton); + expect(screen.getByRole('button', { name: 'Ascending' })).toBeInTheDocument(); + }); }); diff --git a/frontend/__tests__/containers/ConfigStep/SortingDateRange.test.tsx b/frontend/__tests__/containers/ConfigStep/SortingDateRange.test.tsx new file mode 100644 index 0000000000..694e67a53d --- /dev/null +++ b/frontend/__tests__/containers/ConfigStep/SortingDateRange.test.tsx @@ -0,0 +1,63 @@ +import { SortingDateRange } from '@src/containers/ConfigStep/DateRangePicker/SortingDateRange'; +import { SortType } from '@src/containers/ConfigStep/DateRangePicker/DateRangePickerGroup'; +import { updateDateRangeSortType } from '@src/context/config/configSlice'; +import { setupStore } from '@test/utils/setupStoreUtil'; +import { render, screen } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import { Provider } from 'react-redux'; +import React from 'react'; + +let store = setupStore(); +const setup = () => { + store = setupStore(); + return render( + + {}} sortType={SortType.DEFAULT} /> + , + ); +}; +jest.mock('@src/context/config/configSlice', () => ({ + ...jest.requireActual('@src/context/config/configSlice'), + updateDateRangeSortType: jest.fn().mockReturnValue({ type: 'SHOULD_UPDATE_SORT_STATUS' }), +})); + +describe('SortDateRange button behaviors', () => { + it('should show sort time rang button', () => { + setup(); + const sortButtonContainer = screen.getByLabelText('Sorting date range'); + expect(sortButtonContainer).toBeInTheDocument(); + + const sortTextButton = screen.getByText('Default sort'); + expect(sortTextButton).toBeInTheDocument(); + + const sortButton = screen.getByLabelText('sort button'); + expect(sortButton).toBeInTheDocument(); + }); + + it('should change sort order given SortButton is clicked', async () => { + setup(); + const sortButtonContainer = screen.getByLabelText('Sorting date range'); + expect(sortButtonContainer).toBeInTheDocument(); + + const sortTextButton = screen.getByText('Default sort'); + + expect(sortTextButton).toBeInTheDocument(); + + const sortButton = screen.getByLabelText('sort button'); + await userEvent.click(sortButton); + + expect(updateDateRangeSortType).toHaveBeenCalledTimes(1); + expect(updateDateRangeSortType).toHaveBeenCalledWith(SortType.DESCENDING); + }); + + it('should render right icon with sort status', async () => { + setup(); + const sortButton = screen.getByLabelText('sort button'); + await userEvent.click(sortButton); + const arrowDropDown = screen.getByRole('button', { name: 'Descending' }); + expect(arrowDropDown).toBeInTheDocument(); + await userEvent.click(sortButton); + const arrowDropUp = screen.getByRole('button', { name: 'Ascending' }); + expect(arrowDropUp).toBeInTheDocument(); + }); +}); diff --git a/frontend/__tests__/context/configSlice.test.ts b/frontend/__tests__/context/configSlice.test.ts index a301863cb5..9481daff1c 100644 --- a/frontend/__tests__/context/configSlice.test.ts +++ b/frontend/__tests__/context/configSlice.test.ts @@ -3,11 +3,13 @@ import configReducer, { selectSteps, updateCalendarType, updateDateRange, + updateDateRangeSortType, updateMetrics, updateProjectCreatedState, updateProjectName, } from '@src/context/config/configSlice'; import { CHINA_CALENDAR, CONFIG_PAGE_VERIFY_IMPORT_ERROR_MESSAGE, REGULAR_CALENDAR, VELOCITY } from '../fixtures'; +import { SortType } from '@src/containers/ConfigStep/DateRangePicker/DateRangePickerGroup'; import { setupStore } from '@test/utils/setupStoreUtil'; import initialConfigState from '../initialConfigState'; @@ -50,6 +52,13 @@ describe('config reducer', () => { expect(config.dateRange[0].endDate).toEqual(''); }); + it('should update date range sort type with given sort type', () => { + const newSortType = SortType.DEFAULT; + const config = configReducer(initialConfigState, updateDateRangeSortType(newSortType)).basic; + + expect(config.sortType).toEqual(newSortType); + }); + it('should isProjectCreated is false when import file', () => { const config = configReducer(initialConfigState, updateProjectCreatedState(false)); diff --git a/frontend/__tests__/fixtures.ts b/frontend/__tests__/fixtures.ts index ea347d4c83..636101f1b5 100644 --- a/frontend/__tests__/fixtures.ts +++ b/frontend/__tests__/fixtures.ts @@ -1,3 +1,4 @@ +import { SortType } from '@src/containers/ConfigStep/DateRangePicker/DateRangePickerGroup'; import { CSVReportRequestDTO, ReportRequestDTO } from '@src/clients/report/dto/request'; import { ReportResponseDTO } from '@src/clients/report/dto/response'; import { SOURCE_CONTROL_TYPES } from '@src/constants/resources'; @@ -224,6 +225,7 @@ export const MOCK_GENERATE_REPORT_REQUEST_PARAMS: ReportRequestDTO = { export const IMPORTED_NEW_CONFIG_FIXTURE = { projectName: 'ConfigFileForImporting', metrics: ['Velocity', 'Cycle time', 'Classification', 'Lead time for changes'], + sortType: SortType.DEFAULT, dateRange: [ { startDate: '2023-03-16T00:00:00.000+08:00', diff --git a/frontend/__tests__/initialConfigState.ts b/frontend/__tests__/initialConfigState.ts index dd04ea4754..4b36c0ce40 100644 --- a/frontend/__tests__/initialConfigState.ts +++ b/frontend/__tests__/initialConfigState.ts @@ -1,3 +1,4 @@ +import { SortType } from '@src/containers/ConfigStep/DateRangePicker/DateRangePickerGroup'; import { BOARD_TYPES, PIPELINE_TOOL_TYPES, REGULAR_CALENDAR } from './fixtures'; import { BasicConfigState } from '@src/context/config/configSlice'; import { SOURCE_CONTROL_TYPES } from '@src/constants/resources'; @@ -13,6 +14,7 @@ const initialConfigState: BasicConfigState = { endDate: null, }, ], + sortType: SortType.DEFAULT, metrics: [], }, board: { diff --git a/frontend/src/constants/fileConfig.ts b/frontend/src/constants/fileConfig.ts index 737dc7ed2a..459e33cdff 100644 --- a/frontend/src/constants/fileConfig.ts +++ b/frontend/src/constants/fileConfig.ts @@ -1,3 +1,4 @@ +import { SortType } from '@src/containers/ConfigStep/DateRangePicker/DateRangePickerGroup'; import { CALENDAR, REWORK_TIME_LIST } from '@src/constants/resources'; import { IReworkConfig } from '@src/context/Metrics/metricsSlice'; @@ -62,6 +63,7 @@ export interface NewFileConfig { startDate: string; endDate: string; }[]; + sortType: SortType; calendarType: string; metrics: string[]; board?: { @@ -128,6 +130,7 @@ export const convertToNewFileConfig = (fileConfig: OldFileConfig | NewFileConfig reworkTimesSettings, } = fileConfig; return { + sortType: SortType?.DEFAULT, projectName, dateRange, calendarType: considerHoliday ? CALENDAR.CHINA : CALENDAR.REGULAR, diff --git a/frontend/src/constants/resources.ts b/frontend/src/constants/resources.ts index 54dbf122ad..d94043e214 100644 --- a/frontend/src/constants/resources.ts +++ b/frontend/src/constants/resources.ts @@ -429,4 +429,10 @@ export const MAX_TIME_RANGE_AMOUNT = 6; export const START_DATE_INVALID_TEXT = 'Start date is invalid'; export const END_DATE_INVALID_TEXT = 'End date is invalid'; +export enum SORTING_DATE_RANGE_TEXT { + DEFAULT = 'Default sort', + ASCENDING = 'Ascending', + DESCENDING = 'Descending', +} + export const BLOCK_COLUMN_NAME = ['BLOCKED', 'BLOCK']; diff --git a/frontend/src/containers/ConfigStep/DateRangePicker/DateRangePicker.tsx b/frontend/src/containers/ConfigStep/DateRangePicker/DateRangePicker.tsx index cb2e263119..418d94d22a 100644 --- a/frontend/src/containers/ConfigStep/DateRangePicker/DateRangePicker.tsx +++ b/frontend/src/containers/ConfigStep/DateRangePicker/DateRangePicker.tsx @@ -11,21 +11,14 @@ import { START_DATE_INVALID_TEXT, END_DATE_INVALID_TEXT, } from '@src/constants/resources'; -import { - initDeploymentFrequencySettings, - updateShouldGetBoardConfig, - updateShouldGetPipelineConfig, -} from '@src/context/Metrics/metricsSlice'; import { isDateDisabled, calculateLastAvailableDate } from '@src/containers/ConfigStep/DateRangePicker/validation'; import { IRangePickerProps } from '@src/containers/ConfigStep/DateRangePicker/types'; -import { selectDateRange, updateDateRange } from '@src/context/config/configSlice'; -import { useAppDispatch, useAppSelector } from '@src/hooks/useAppDispatch'; import CalendarTodayIcon from '@mui/icons-material/CalendarToday'; +import { DateValidationError } from '@mui/x-date-pickers'; import { TextField, TextFieldProps } from '@mui/material'; import { Z_INDEX } from '@src/constants/commons'; import { Nullable } from '@src/utils/types'; import dayjs, { Dayjs } from 'dayjs'; -import { useCallback } from 'react'; import isNull from 'lodash/isNull'; const HelperTextForStartDate = (props: TextFieldProps) => ( @@ -36,21 +29,21 @@ const HelperTextForEndDate = (props: TextFieldProps) => ( ); -export const DateRangePicker = ({ startDate, endDate, index }: IRangePickerProps) => { - const dispatch = useAppDispatch(); - const dateRangeGroup = useAppSelector(selectDateRange); - const isShowRemoveButton = dateRangeGroup.length > 1; - const dateRangeGroupExcludeSelf = dateRangeGroup.filter((_, idx) => idx !== index); +export const DateRangePicker = ({ + startDate, + endDate, + index, + onError, + onChange, + onRemove, + rangeList, +}: IRangePickerProps) => { + const isShowRemoveButton = rangeList && rangeList.length > 1; + const dateRangeGroupExcludeSelf = rangeList!.filter(({ sortIndex }: { sortIndex: number }) => sortIndex !== index); const shouldStartDateDisableDate = isDateDisabled.bind(null, dateRangeGroupExcludeSelf); const shouldEndDateDisableDate = isDateDisabled.bind(null, dateRangeGroupExcludeSelf); - const dispatchUpdateConfig = useCallback(() => { - dispatch(updateShouldGetBoardConfig(true)); - dispatch(updateShouldGetPipelineConfig(true)); - dispatch(initDeploymentFrequencySettings()); - }, [dispatch]); - - const changeStartDate = (value: Nullable) => { + const changeStartDate = (value: Nullable, { validationError }: { validationError: DateValidationError }) => { let daysAddToEndDate = DEFAULT_SPRINT_INTERVAL_OFFSET_DAYS; if (value) { const valueDate = dayjs(value).startOf('day').format(DATE_RANGE_FORMAT); @@ -61,48 +54,36 @@ export const DateRangePicker = ({ startDate, endDate, index }: IRangePickerProps ? DEFAULT_SPRINT_INTERVAL_OFFSET_DAYS : draftDaysAddition; } - const newDateRangeGroup = dateRangeGroup.map(({ startDate, endDate }, idx) => { - if (idx === index) { - return isNull(value) - ? { - startDate: null, - endDate: null, - } - : { - startDate: value.startOf('date').format(DATE_RANGE_FORMAT), - endDate: value.endOf('date').add(daysAddToEndDate, 'day').format(DATE_RANGE_FORMAT), - }; - } - return { - startDate, - endDate, - }; - }); - dispatch(updateDateRange(newDateRangeGroup)); - dispatchUpdateConfig(); + const result = isNull(value) + ? { + startDate: null, + endDate: null, + } + : { + startDate: value.startOf('date').format(DATE_RANGE_FORMAT), + endDate: value.endOf('date').add(daysAddToEndDate, 'day').format(DATE_RANGE_FORMAT), + }; + isNull(validationError) ? onChange?.(result, index) : onError?.('startDateError', validationError, index); }; - const changeEndDate = (value: Nullable) => { - const newDateRangeGroup = dateRangeGroup.map(({ startDate, endDate }, idx) => { - if (idx === index) { - return { + const changeEndDate = (value: Nullable, { validationError }: { validationError: DateValidationError }) => { + const result = isNull(value) + ? { startDate, - endDate: !isNull(value) ? value.endOf('date').format(DATE_RANGE_FORMAT) : null, + endDate: null, + } + : { + startDate, + endDate: value.endOf('date').format(DATE_RANGE_FORMAT), }; - } - return { startDate, endDate }; - }); - dispatch(updateDateRange(newDateRangeGroup)); - dispatchUpdateConfig(); + isNull(validationError) ? onChange?.(result, index) : onError?.('endDateError', validationError, index); }; - const removeSelfHandler = useCallback(() => { - const newDateRangeGroup = dateRangeGroup.filter((_, idx) => idx !== index); - dispatch(updateDateRange(newDateRangeGroup)); - dispatchUpdateConfig(); - }, [dateRangeGroup, dispatch, index, dispatchUpdateConfig]); + const removeSelfHandler = () => { + onRemove?.(index); + }; return ( @@ -113,6 +94,7 @@ export const DateRangePicker = ({ startDate, endDate, index }: IRangePickerProps label='From *' value={startDate ? dayjs(startDate) : null} onChange={changeStartDate} + onError={(err) => onError?.('startDateError', err, index)} slots={{ openPickerIcon: CalendarTodayIcon, textField: HelperTextForStartDate, @@ -131,6 +113,7 @@ export const DateRangePicker = ({ startDate, endDate, index }: IRangePickerProps maxDate={dayjs(startDate).add(30, 'day')} minDate={dayjs(startDate)} onChange={changeEndDate} + onError={(err) => onError?.('endDateError', err, index)} slots={{ openPickerIcon: CalendarTodayIcon, textField: HelperTextForEndDate, diff --git a/frontend/src/containers/ConfigStep/DateRangePicker/DateRangePickerGroup.tsx b/frontend/src/containers/ConfigStep/DateRangePicker/DateRangePickerGroup.tsx index 95881d68d5..1043d687f9 100644 --- a/frontend/src/containers/ConfigStep/DateRangePicker/DateRangePickerGroup.tsx +++ b/frontend/src/containers/ConfigStep/DateRangePicker/DateRangePickerGroup.tsx @@ -1,3 +1,8 @@ +import { + initDeploymentFrequencySettings, + updateShouldGetBoardConfig, + updateShouldGetPipelineConfig, +} from '@src/context/Metrics/metricsSlice'; import { DateRangePickerGroupContainer } from '@src/containers/ConfigStep/DateRangePicker/style'; import { DateRangePicker } from '@src/containers/ConfigStep/DateRangePicker/DateRangePicker'; import { ADD_TIME_RANGE_BUTTON_TEXT, MAX_TIME_RANGE_AMOUNT } from '@src/constants/resources'; @@ -6,20 +11,111 @@ import { LocalizationProvider } from '@mui/x-date-pickers/LocalizationProvider'; import { useAppDispatch, useAppSelector } from '@src/hooks/useAppDispatch'; import { AddButton } from '@src/components/Common/AddButtonOneLine'; import { AdapterDayjs } from '@mui/x-date-pickers/AdapterDayjs'; +import { DateValidationError } from '@mui/x-date-pickers'; +import { useState, useEffect } from 'react'; +import sortBy from 'lodash/sortBy'; +import remove from 'lodash/remove'; +import get from 'lodash/get'; +import dayjs from 'dayjs'; -export const DateRangePickerGroup = () => { +export enum SortType { + DESCENDING = 'DESCENDING', + ASCENDING = 'ASCENDING', + DEFAULT = 'DEFAULT', +} + +export type SortedDateRangeType = { + startDate: string | null; + endDate: string | null; + sortIndex: number; + startDateError: DateValidationError | null; + endDateError: DateValidationError | null; +}; + +const sortFn = { + DEFAULT: ({ sortIndex }: SortedDateRangeType) => sortIndex, + DESCENDING: ({ startDate }: SortedDateRangeType) => -dayjs(startDate).unix(), + ASCENDING: ({ startDate }: SortedDateRangeType) => dayjs(startDate).unix(), +}; + +type Props = { + sortType: SortType; + onChange?: (data: SortedDateRangeType[]) => void; + onError?: (data: SortedDateRangeType[]) => void; +}; + +const fillDateRangeGroup = (item: T, index: number) => ({ + ...item, + startDateError: null, + endDateError: null, + sortIndex: index, +}); + +export const DateRangePickerGroup = ({ sortType, onError }: Props) => { const dispatch = useAppDispatch(); const dateRangeGroup = useAppSelector(selectDateRange); const isAddButtonDisabled = dateRangeGroup.length === MAX_TIME_RANGE_AMOUNT; + const [sortedDateRangeList, setSortedDateRangeList] = useState( + dateRangeGroup.map(fillDateRangeGroup), + ); + + useEffect(() => { + const errors = sortedDateRangeList.filter(({ startDateError, endDateError }) => startDateError || endDateError); + onError?.(errors); + }, [onError, sortedDateRangeList]); + + const handleError = (type: string, error: DateValidationError, index: number) => { + setSortedDateRangeList( + sortedDateRangeList.map((item) => ({ ...item, [type]: item.sortIndex === index ? error : null })), + ); + }; + + const dispatchUpdateConfig = () => { + dispatch(updateShouldGetBoardConfig(true)); + dispatch(updateShouldGetPipelineConfig(true)); + dispatch(initDeploymentFrequencySettings()); + }; + const addRangeHandler = () => { - const newDateRangeGroup = [...dateRangeGroup, { startDate: null, endDate: null }]; - dispatch(updateDateRange(newDateRangeGroup)); + const result = [...sortedDateRangeList, { startDate: null, endDate: null }]; + setSortedDateRangeList(result.map(fillDateRangeGroup)); + dispatch(updateDateRange(result.map(({ startDate, endDate }) => ({ startDate, endDate })))); }; + + const handleChange = ( + { startDate, endDate }: { startDate: string | null; endDate: string | null }, + index: number, + ) => { + const result = sortedDateRangeList.map((item) => + item.sortIndex === index ? { ...item, startDate, endDate, startDateError: null, endDateError: null } : item, + ); + setSortedDateRangeList(result); + dispatchUpdateConfig(); + dispatch(updateDateRange(result.map(({ startDate, endDate }) => ({ startDate, endDate })))); + }; + + const handleRemove = (index: number) => { + const result = [...sortedDateRangeList]; + remove(result, ({ sortIndex }) => sortIndex === index); + setSortedDateRangeList(result); + dispatchUpdateConfig(); + dispatch(updateDateRange(result.map(({ startDate, endDate }) => ({ startDate, endDate })))); + }; + return ( - {dateRangeGroup.map(({ startDate, endDate }, index) => ( - + {sortBy(sortedDateRangeList, get(sortFn, sortType)).map(({ startDate, endDate, sortIndex }, index) => ( + ))} void; + sortType: SortType; +}; + +export const SortingDateRange = ({ onChange, sortType }: Props) => { + const dispatch = useAppDispatch(); + const [dateRangeSortType, setDateRangeSortType] = useState(sortType); + + const handleChangeSort = () => { + const totalSortTypes = Object.values(SortType).length; + const currentIndex = Object.values(SortType).indexOf(dateRangeSortType); + const newIndex = (currentIndex + 1) % totalSortTypes; + const newSortType = Object.values(SortType)[newIndex]; + + setDateRangeSortType(newSortType); + dispatch(updateDateRangeSortType(newSortType)); + onChange?.(newSortType); + }; + + return ( + + + {SORTING_DATE_RANGE_TEXT[dateRangeSortType]} + + {dateRangeSortType === SortType.ASCENDING ? ( + + ) : ( + + )} + {dateRangeSortType === SortType.DESCENDING ? ( + + ) : ( + + )} + + + + ); +}; diff --git a/frontend/src/containers/ConfigStep/DateRangePicker/index.tsx b/frontend/src/containers/ConfigStep/DateRangePicker/index.tsx index 228097dcd9..59cf8758a5 100644 --- a/frontend/src/containers/ConfigStep/DateRangePicker/index.tsx +++ b/frontend/src/containers/ConfigStep/DateRangePicker/index.tsx @@ -1,18 +1,50 @@ -import { DateRangePickerGroup } from '@src/containers/ConfigStep/DateRangePicker/DateRangePickerGroup'; +import { DateRangePickerGroup, SortType } from '@src/containers/ConfigStep/DateRangePicker/DateRangePickerGroup'; +import { SortedDateRangeType } from '@src/containers/ConfigStep/DateRangePicker/DateRangePickerGroup'; +import { SortingDateRange } from '@src/containers/ConfigStep/DateRangePicker/SortingDateRange'; +import { selectDateRange, selectDateRangeSortType } from '@src/context/config/configSlice'; import SectionTitleWithTooltip from '@src/components/Common/SectionTitleWithTooltip'; +import { TitleContainer } from '@src/containers/ConfigStep/DateRangePicker/style'; import { TIME_RANGE_TITLE, TIPS } from '@src/constants/resources'; +import { useAppSelector } from '@src/hooks/useAppDispatch'; +import { useMemo, useState } from 'react'; export const DateRangePickerSection = () => { + const dateRangeGroup = useAppSelector(selectDateRange); + const dateRangeGroupSortType = useAppSelector(selectDateRangeSortType); + const [sortType, setSortType] = useState( + dateRangeGroupSortType ? dateRangeGroupSortType : SortType.DEFAULT, + ); + + const [hasError, setHasError] = useState(false); + const isDateRangeValid = useMemo(() => { + return dateRangeGroup.every((dateRange) => { + return dateRange.startDate && dateRange.endDate; + }); + }, [dateRangeGroup]); + + const handleSortTypeChange = (type: SortType) => { + setSortType(type); + }; + + const handleError = (err: SortedDateRangeType[]) => { + setHasError(!!err.length); + }; + return (
- - + + + {dateRangeGroup.length > 1 && isDateRangeValid && !hasError && ( + + )} + +
); }; diff --git a/frontend/src/containers/ConfigStep/DateRangePicker/style.tsx b/frontend/src/containers/ConfigStep/DateRangePicker/style.tsx index f5f3d87e08..66ec6ba7ae 100644 --- a/frontend/src/containers/ConfigStep/DateRangePicker/style.tsx +++ b/frontend/src/containers/ConfigStep/DateRangePicker/style.tsx @@ -1,7 +1,8 @@ +import { ArrowDropDown, ArrowDropUp } from '@mui/icons-material'; import { BasicButton } from '@src/components/Common/Buttons'; +import { Button, IconButton } from '@mui/material'; import { DatePicker } from '@mui/x-date-pickers'; import { styled } from '@mui/material/styles'; -import { Button } from '@mui/material'; import { theme } from '@src/theme'; export const DateRangePickerGroupContainer = styled('div')({ @@ -14,6 +15,7 @@ export const TitleContainer = styled('div')({ display: 'flex', flexDirection: 'row', alignItems: 'center', + justifyContent: 'space-between', }); export const StyledFeaturedRangePickerContainer = styled('div')({ @@ -60,3 +62,36 @@ export const RemoveButton = styled(BasicButton)({ right: 0, top: '3rem', }); + +export const SortingTextButton = styled(Button)({ + cursor: 'default', + backgroundColor: theme.main.button.disabled.color, + '&:hover': { + backgroundColor: theme.main.button.disabled.color, + }, + color: theme.main.color, +}); + +export const SortingButton = styled(IconButton)({ + display: 'flex', + flexDirection: 'column', + padding: 0, + '& svg': { + margin: '-0.9rem 0', + }, + marginRight: '2.4rem', + fontSize: '2.4rem', + color: theme.main.button.disabled.color, +}); + +export const SortingButtoningContainer = styled('div')({ + display: 'flex', +}); + +export const AscendingIcon = styled(ArrowDropUp)({ + color: theme.main.backgroundColor, +}); + +export const DescendingIcon = styled(ArrowDropDown)({ + color: theme.main.backgroundColor, +}); diff --git a/frontend/src/containers/ConfigStep/DateRangePicker/types.ts b/frontend/src/containers/ConfigStep/DateRangePicker/types.ts index 18eac31ec6..edac53cfae 100644 --- a/frontend/src/containers/ConfigStep/DateRangePicker/types.ts +++ b/frontend/src/containers/ConfigStep/DateRangePicker/types.ts @@ -1,6 +1,13 @@ +import { SortedDateRangeType } from '@src/containers/ConfigStep/DateRangePicker/DateRangePickerGroup'; +import { DateValidationError } from '@mui/x-date-pickers'; + export interface IRangePickerProps { startDate: string | null; endDate: string | null; index: number; key?: string | number; + onError?: (type: string, error: DateValidationError, index: number) => void; + onChange?: (data: { startDate: string | null; endDate: string | null }, index: number) => void; + onRemove?: (index: number) => void; + rangeList?: SortedDateRangeType[]; } diff --git a/frontend/src/containers/MetricsStepper/index.tsx b/frontend/src/containers/MetricsStepper/index.tsx index 9ba7979379..4e823172bb 100644 --- a/frontend/src/containers/MetricsStepper/index.tsx +++ b/frontend/src/containers/MetricsStepper/index.tsx @@ -175,12 +175,13 @@ const MetricsStepper = () => { /* istanbul ignore next */ const handleSave = () => { - const { projectName, dateRange, calendarType, metrics } = config.basic; + const { projectName, dateRange, calendarType, metrics, sortType } = config.basic; const configData = { projectName, dateRange, calendarType, metrics, + sortType, board: isShowBoard ? omit(config.board.config, ['projectKey']) : undefined, /* istanbul ignore next */ diff --git a/frontend/src/context/config/configSlice.ts b/frontend/src/context/config/configSlice.ts index 01ae86d2d4..35e34b952c 100644 --- a/frontend/src/context/config/configSlice.ts +++ b/frontend/src/context/config/configSlice.ts @@ -3,12 +3,13 @@ import { CALENDAR, DORA_METRICS, IMPORT_METRICS_MAPPING, + MAX_TIME_RANGE_AMOUNT, MESSAGE, REQUIRED_DATA, - MAX_TIME_RANGE_AMOUNT, } from '@src/constants/resources'; import { initialPipelineToolState, IPipelineToolState } from '@src/context/config/pipelineTool/pipelineToolSlice'; import { initialSourceControlState, ISourceControl } from '@src/context/config/sourceControl/sourceControlSlice'; +import { SortType } from '@src/containers/ConfigStep/DateRangePicker/DateRangePickerGroup'; import { IBoardState, initialBoardState } from '@src/context/config/board/boardSlice'; import { pipeline } from '@src/context/config/pipelineTool/verifyResponseSlice'; import { createSlice } from '@reduxjs/toolkit'; @@ -29,6 +30,7 @@ export interface BasicConfigState { projectName: string; calendarType: string; dateRange: DateRange; + sortType: SortType; metrics: string[]; }; board: IBoardState; @@ -48,6 +50,7 @@ export const initialBasicConfigState: BasicConfigState = { endDate: null, }, ], + sortType: SortType?.DEFAULT, metrics: [], }, board: initialBoardState, @@ -100,6 +103,9 @@ export const configSlice = createSlice({ updateDateRange: (state, action) => { state.basic.dateRange = action.payload; }, + updateDateRangeSortType: (state, action) => { + state.basic.sortType = action.payload; + }, updateMetrics: (state, action) => { const { metrics, shouldBoardShow, shouldPipelineToolShow, shouldSourceControlShow } = getMetricsInfo( action.payload, @@ -207,6 +213,7 @@ export const { updateProjectName, updateCalendarType, updateDateRange, + updateDateRangeSortType, updateMetrics, updateBoard, updateBoardVerifyState, @@ -225,6 +232,7 @@ export const { export const selectProjectName = (state: RootState) => state.config.basic.projectName; export const selectCalendarType = (state: RootState) => state.config.basic.calendarType; export const selectDateRange = (state: RootState) => state.config.basic.dateRange; +export const selectDateRangeSortType = (state: RootState) => state.config.basic.sortType; export const selectMetrics = (state: RootState) => state.config.basic.metrics; export const isSelectBoardMetrics = (state: RootState) => state.config.basic.metrics.some((metric) => BOARD_METRICS.includes(metric)); From 409a892b96300a8d073baa5731b68d010acd2bdc Mon Sep 17 00:00:00 2001 From: Pengfei Qian Date: Thu, 18 Apr 2024 18:40:28 +0800 Subject: [PATCH 25/81] Revert "Adm-909[frontend] sort time range (#1378)" This reverts commit 7ea514e1e4e779dfa2d1ef9d73119015362a7a12. --- .../constants/fileConfig/fileConfig.test.ts | 2 - .../ConfigStep/DateRangePicker.test.tsx | 105 +++++------------ .../ConfigStep/SortingDateRange.test.tsx | 63 ----------- .../__tests__/context/configSlice.test.ts | 9 -- frontend/__tests__/fixtures.ts | 2 - frontend/__tests__/initialConfigState.ts | 2 - frontend/src/constants/fileConfig.ts | 3 - frontend/src/constants/resources.ts | 6 - .../DateRangePicker/DateRangePicker.tsx | 91 +++++++++------ .../DateRangePicker/DateRangePickerGroup.tsx | 106 +----------------- .../DateRangePicker/SortingDateRange.tsx | 55 --------- .../ConfigStep/DateRangePicker/index.tsx | 50 ++------- .../ConfigStep/DateRangePicker/style.tsx | 37 +----- .../ConfigStep/DateRangePicker/types.ts | 7 -- .../src/containers/MetricsStepper/index.tsx | 3 +- frontend/src/context/config/configSlice.ts | 10 +- 16 files changed, 99 insertions(+), 452 deletions(-) delete mode 100644 frontend/__tests__/containers/ConfigStep/SortingDateRange.test.tsx delete mode 100644 frontend/src/containers/ConfigStep/DateRangePicker/SortingDateRange.tsx diff --git a/frontend/__tests__/constants/fileConfig/fileConfig.test.ts b/frontend/__tests__/constants/fileConfig/fileConfig.test.ts index 722ac3d961..93ec4b8d15 100644 --- a/frontend/__tests__/constants/fileConfig/fileConfig.test.ts +++ b/frontend/__tests__/constants/fileConfig/fileConfig.test.ts @@ -5,13 +5,11 @@ import { CHINA_CALENDAR, DEFAULT_REWORK_SETTINGS, } from '../../fixtures'; -import { SortType } from '@src/containers/ConfigStep/DateRangePicker/DateRangePickerGroup'; import { convertToNewFileConfig } from '@src/constants/fileConfig'; describe('#fileConfig', () => { const BASIC_NEW_CONFIG = { projectName: 'ConfigFileForImporting', - sortType: SortType.DEFAULT, dateRange: [ { startDate: '2023-03-16T00:00:00.000+08:00', diff --git a/frontend/__tests__/containers/ConfigStep/DateRangePicker.test.tsx b/frontend/__tests__/containers/ConfigStep/DateRangePicker.test.tsx index f4ab350c4c..9e961d2c1e 100644 --- a/frontend/__tests__/containers/ConfigStep/DateRangePicker.test.tsx +++ b/frontend/__tests__/containers/ConfigStep/DateRangePicker.test.tsx @@ -36,9 +36,6 @@ const setup = () => { }; describe('DateRangePickerSection', () => { - beforeEach(() => { - setup(); - }); describe('Single range behaviors', () => { const expectDate = (inputDate: HTMLInputElement) => { expect(inputDate.value).toEqual(expect.stringContaining(TODAY.date().toString())); @@ -47,11 +44,15 @@ describe('DateRangePickerSection', () => { }; it('should render DateRangePicker', () => { + setup(); + expect(screen.queryAllByText(START_DATE_LABEL)).toHaveLength(1); expect(screen.queryAllByText(END_DATE_LABEL)).toHaveLength(1); }); it('should show right start date when input a valid date given init start date is null ', async () => { + setup(); + const startDateInput = screen.getByRole('textbox', { name: START_DATE_LABEL }) as HTMLInputElement; await userEvent.type(startDateInput, INPUT_DATE_VALUE); @@ -59,6 +60,8 @@ describe('DateRangePickerSection', () => { }); it('should show right end date when input a valid date given init end date is null ', async () => { + setup(); + const endDateInput = screen.getByRole('textbox', { name: END_DATE_LABEL }) as HTMLInputElement; await userEvent.type(endDateInput, INPUT_DATE_VALUE); @@ -66,6 +69,8 @@ describe('DateRangePickerSection', () => { }); it('should Auto-fill endDate which is after startDate 13 days when fill right startDate ', async () => { + setup(); + const endDate = TODAY.add(13, 'day'); const startDateInput = screen.getByRole('textbox', { name: START_DATE_LABEL }) as HTMLInputElement; const endDateInput = screen.getByRole('textbox', { name: END_DATE_LABEL }) as HTMLInputElement; @@ -77,6 +82,8 @@ describe('DateRangePickerSection', () => { }); it('should Auto-clear endDate when its corresponding startDate is cleared ', async () => { + setup(); + const addButton = screen.getByLabelText('Button for adding date range'); await userEvent.click(addButton); const rangeDate1 = ['03/01/2024', '03/10/2024']; @@ -91,6 +98,8 @@ describe('DateRangePickerSection', () => { }); it('should not auto change startDate when its corresponding endDate changes ', async () => { + setup(); + const startDateInput = screen.getByRole('textbox', { name: START_DATE_LABEL }) as HTMLInputElement; const endDateInput = screen.getByRole('textbox', { name: END_DATE_LABEL }) as HTMLInputElement; const startDate = dayjs('2024-03-20').format('MM/DD/YYYY'); @@ -104,6 +113,8 @@ describe('DateRangePickerSection', () => { }); it('should not Auto-fill endDate which is after startDate 14 days when fill wrong format startDate ', async () => { + setup(); + const startDateInput = screen.getByRole('textbox', { name: START_DATE_LABEL }) as HTMLInputElement; const endDateInput = screen.getByRole('textbox', { name: END_DATE_LABEL }) as HTMLInputElement; await userEvent.type(startDateInput, ERROR_DATE); @@ -113,6 +124,8 @@ describe('DateRangePickerSection', () => { }); it('should dispatch update configuration when change startDate', async () => { + setup(); + const startDateInput = screen.getByRole('textbox', { name: START_DATE_LABEL }) as HTMLInputElement; await userEvent.type(startDateInput, INPUT_DATE_VALUE); @@ -122,6 +135,8 @@ describe('DateRangePickerSection', () => { }); it('should dispatch update configuration when change endDate', async () => { + setup(); + const endDateInput = screen.getByRole('textbox', { name: END_DATE_LABEL }) as HTMLInputElement; await userEvent.type(endDateInput, INPUT_DATE_VALUE); @@ -133,6 +148,8 @@ describe('DateRangePickerSection', () => { describe('Multiple range amount behaviors', () => { it('should not show remove button given there is only one range by default', () => { + setup(); + const removeButton = screen.queryByRole('button', { name: 'Remove' }); const ranges = screen.getAllByLabelText('Range picker row'); @@ -141,6 +158,8 @@ describe('DateRangePickerSection', () => { }); it('should allow user to add up to 6 ranges', async () => { + setup(); + const addButton = screen.getByLabelText('Button for adding date range'); const defaultRanges = screen.getAllByLabelText('Range picker row'); @@ -154,6 +173,8 @@ describe('DateRangePickerSection', () => { }); it('should show remove button when ranges are more than 1 and user is able to remove the range itself by clicking the remove button within that row', async () => { + setup(); + const addButton = screen.getByLabelText('Button for adding date range'); await userEvent.click(addButton); const ranges = screen.getAllByLabelText('Range picker row'); @@ -173,6 +194,8 @@ describe('DateRangePickerSection', () => { }); it('should dispatch update configuration when remove the range', async () => { + setup(); + const addButton = screen.getByLabelText('Button for adding date range'); await userEvent.click(addButton); const ranges = screen.getAllByLabelText('Range picker row'); @@ -193,6 +216,7 @@ describe('DateRangePickerSection', () => { describe('Multiple ranges date interactions', () => { it('should auto fill end date when change star date by cloeset earliest date of other ranges', async () => { + setup(); const rangeDate1 = ['03/12/2024', '03/25/2024']; const rangeDate2 = ['03/08/2024']; @@ -213,6 +237,7 @@ describe('DateRangePickerSection', () => { }); it('should display error message for start-date and end-date respectively when time ranges conflict', async () => { + setup(); const rangeDate1 = ['03/12/2024', '03/25/2024']; const rangeDate2 = ['03/08/2024', '03/26/2024']; @@ -233,78 +258,4 @@ describe('DateRangePickerSection', () => { expect(screen.getByText(TIME_RANGE_ERROR_MESSAGE.END_DATE_INVALID_TEXT)).toBeVisible(); }); }); - - describe('Sort date range behaviors', () => { - it('should not show sort button given only one date range', async () => { - const rangeDate1 = ['03/15/2024', '03/25/2024']; - const ranges = screen.getAllByLabelText('Range picker row'); - const startDate1Input = within(ranges[0]).getByRole('textbox', { name: START_DATE_LABEL }) as HTMLInputElement; - const endDate1Input = within(ranges[0]).getByRole('textbox', { name: END_DATE_LABEL }) as HTMLInputElement; - await userEvent.type(startDate1Input, rangeDate1[0]); - await userEvent.type(endDate1Input, rangeDate1[1]); - const sortButtonContainer = screen.queryByLabelText('Sorting date range'); - expect(sortButtonContainer).toBeNull(); - }); - }); - - it('should show sort button given more than one time range', async () => { - const rangeDate1 = ['03/15/2024', '03/25/2024']; - const rangeDate2 = ['03/08/2024', '03/11/2024']; - - const addButton = screen.getByLabelText('Button for adding date range'); - await userEvent.click(addButton); - const ranges = screen.getAllByLabelText('Range picker row'); - const startDate1Input = within(ranges[0]).getByRole('textbox', { name: START_DATE_LABEL }) as HTMLInputElement; - const endDate1Input = within(ranges[0]).getByRole('textbox', { name: END_DATE_LABEL }) as HTMLInputElement; - const startDate2Input = within(ranges[1]).getByRole('textbox', { name: START_DATE_LABEL }) as HTMLInputElement; - const endDate12nput = within(ranges[1]).getByRole('textbox', { name: END_DATE_LABEL }) as HTMLInputElement; - await userEvent.type(startDate1Input, rangeDate1[0]); - await userEvent.type(endDate1Input, rangeDate1[1]); - await userEvent.type(startDate2Input, rangeDate2[0]); - await userEvent.type(endDate12nput, rangeDate2[1]); - const sortButton = screen.getByLabelText('Sorting date range'); - expect(sortButton).toBeInTheDocument(); - }); - - it('should not show sort button given exist errors in date range', async () => { - const rangeDate1 = ['03/12/2024', '03/25/2024']; - const rangeDate2 = ['03/08/2024', '03/26/2024']; - - const addButton = screen.getByLabelText('Button for adding date range'); - await userEvent.click(addButton); - await userEvent.click(addButton); - const ranges = screen.getAllByLabelText('Range picker row'); - const startDate1Input = within(ranges[0]).getByRole('textbox', { name: START_DATE_LABEL }) as HTMLInputElement; - const endDate1Input = within(ranges[0]).getByRole('textbox', { name: END_DATE_LABEL }) as HTMLInputElement; - const startDate2Input = within(ranges[1]).getByRole('textbox', { name: START_DATE_LABEL }) as HTMLInputElement; - const endDate12nput = within(ranges[1]).getByRole('textbox', { name: END_DATE_LABEL }) as HTMLInputElement; - await userEvent.type(startDate1Input, rangeDate1[0]); - await userEvent.type(endDate1Input, rangeDate1[1]); - await userEvent.type(startDate2Input, rangeDate2[0]); - await userEvent.type(endDate12nput, rangeDate2[1]); - const sortButtonContainer = screen.queryByLabelText('Sorting date range'); - expect(sortButtonContainer).toBeNull(); - }); - - it('should update sort status when handleSortTypeChange is called', async () => { - const rangeDate1 = ['03/15/2024', '03/25/2024']; - const rangeDate2 = ['03/08/2024', '03/11/2024']; - - const addButton = screen.getByLabelText('Button for adding date range'); - await userEvent.click(addButton); - const ranges = screen.getAllByLabelText('Range picker row'); - const startDate1Input = within(ranges[0]).getByRole('textbox', { name: START_DATE_LABEL }) as HTMLInputElement; - const endDate1Input = within(ranges[0]).getByRole('textbox', { name: END_DATE_LABEL }) as HTMLInputElement; - const startDate2Input = within(ranges[1]).getByRole('textbox', { name: START_DATE_LABEL }) as HTMLInputElement; - const endDate12nput = within(ranges[1]).getByRole('textbox', { name: END_DATE_LABEL }) as HTMLInputElement; - await userEvent.type(startDate1Input, rangeDate1[0]); - await userEvent.type(endDate1Input, rangeDate1[1]); - await userEvent.type(startDate2Input, rangeDate2[0]); - await userEvent.type(endDate12nput, rangeDate2[1]); - const sortButton = screen.getByLabelText('sort button'); - await userEvent.click(sortButton); - expect(screen.getByRole('button', { name: 'Descending' })).toBeInTheDocument(); - await userEvent.click(sortButton); - expect(screen.getByRole('button', { name: 'Ascending' })).toBeInTheDocument(); - }); }); diff --git a/frontend/__tests__/containers/ConfigStep/SortingDateRange.test.tsx b/frontend/__tests__/containers/ConfigStep/SortingDateRange.test.tsx deleted file mode 100644 index 694e67a53d..0000000000 --- a/frontend/__tests__/containers/ConfigStep/SortingDateRange.test.tsx +++ /dev/null @@ -1,63 +0,0 @@ -import { SortingDateRange } from '@src/containers/ConfigStep/DateRangePicker/SortingDateRange'; -import { SortType } from '@src/containers/ConfigStep/DateRangePicker/DateRangePickerGroup'; -import { updateDateRangeSortType } from '@src/context/config/configSlice'; -import { setupStore } from '@test/utils/setupStoreUtil'; -import { render, screen } from '@testing-library/react'; -import userEvent from '@testing-library/user-event'; -import { Provider } from 'react-redux'; -import React from 'react'; - -let store = setupStore(); -const setup = () => { - store = setupStore(); - return render( - - {}} sortType={SortType.DEFAULT} /> - , - ); -}; -jest.mock('@src/context/config/configSlice', () => ({ - ...jest.requireActual('@src/context/config/configSlice'), - updateDateRangeSortType: jest.fn().mockReturnValue({ type: 'SHOULD_UPDATE_SORT_STATUS' }), -})); - -describe('SortDateRange button behaviors', () => { - it('should show sort time rang button', () => { - setup(); - const sortButtonContainer = screen.getByLabelText('Sorting date range'); - expect(sortButtonContainer).toBeInTheDocument(); - - const sortTextButton = screen.getByText('Default sort'); - expect(sortTextButton).toBeInTheDocument(); - - const sortButton = screen.getByLabelText('sort button'); - expect(sortButton).toBeInTheDocument(); - }); - - it('should change sort order given SortButton is clicked', async () => { - setup(); - const sortButtonContainer = screen.getByLabelText('Sorting date range'); - expect(sortButtonContainer).toBeInTheDocument(); - - const sortTextButton = screen.getByText('Default sort'); - - expect(sortTextButton).toBeInTheDocument(); - - const sortButton = screen.getByLabelText('sort button'); - await userEvent.click(sortButton); - - expect(updateDateRangeSortType).toHaveBeenCalledTimes(1); - expect(updateDateRangeSortType).toHaveBeenCalledWith(SortType.DESCENDING); - }); - - it('should render right icon with sort status', async () => { - setup(); - const sortButton = screen.getByLabelText('sort button'); - await userEvent.click(sortButton); - const arrowDropDown = screen.getByRole('button', { name: 'Descending' }); - expect(arrowDropDown).toBeInTheDocument(); - await userEvent.click(sortButton); - const arrowDropUp = screen.getByRole('button', { name: 'Ascending' }); - expect(arrowDropUp).toBeInTheDocument(); - }); -}); diff --git a/frontend/__tests__/context/configSlice.test.ts b/frontend/__tests__/context/configSlice.test.ts index 9481daff1c..a301863cb5 100644 --- a/frontend/__tests__/context/configSlice.test.ts +++ b/frontend/__tests__/context/configSlice.test.ts @@ -3,13 +3,11 @@ import configReducer, { selectSteps, updateCalendarType, updateDateRange, - updateDateRangeSortType, updateMetrics, updateProjectCreatedState, updateProjectName, } from '@src/context/config/configSlice'; import { CHINA_CALENDAR, CONFIG_PAGE_VERIFY_IMPORT_ERROR_MESSAGE, REGULAR_CALENDAR, VELOCITY } from '../fixtures'; -import { SortType } from '@src/containers/ConfigStep/DateRangePicker/DateRangePickerGroup'; import { setupStore } from '@test/utils/setupStoreUtil'; import initialConfigState from '../initialConfigState'; @@ -52,13 +50,6 @@ describe('config reducer', () => { expect(config.dateRange[0].endDate).toEqual(''); }); - it('should update date range sort type with given sort type', () => { - const newSortType = SortType.DEFAULT; - const config = configReducer(initialConfigState, updateDateRangeSortType(newSortType)).basic; - - expect(config.sortType).toEqual(newSortType); - }); - it('should isProjectCreated is false when import file', () => { const config = configReducer(initialConfigState, updateProjectCreatedState(false)); diff --git a/frontend/__tests__/fixtures.ts b/frontend/__tests__/fixtures.ts index 636101f1b5..ea347d4c83 100644 --- a/frontend/__tests__/fixtures.ts +++ b/frontend/__tests__/fixtures.ts @@ -1,4 +1,3 @@ -import { SortType } from '@src/containers/ConfigStep/DateRangePicker/DateRangePickerGroup'; import { CSVReportRequestDTO, ReportRequestDTO } from '@src/clients/report/dto/request'; import { ReportResponseDTO } from '@src/clients/report/dto/response'; import { SOURCE_CONTROL_TYPES } from '@src/constants/resources'; @@ -225,7 +224,6 @@ export const MOCK_GENERATE_REPORT_REQUEST_PARAMS: ReportRequestDTO = { export const IMPORTED_NEW_CONFIG_FIXTURE = { projectName: 'ConfigFileForImporting', metrics: ['Velocity', 'Cycle time', 'Classification', 'Lead time for changes'], - sortType: SortType.DEFAULT, dateRange: [ { startDate: '2023-03-16T00:00:00.000+08:00', diff --git a/frontend/__tests__/initialConfigState.ts b/frontend/__tests__/initialConfigState.ts index 4b36c0ce40..dd04ea4754 100644 --- a/frontend/__tests__/initialConfigState.ts +++ b/frontend/__tests__/initialConfigState.ts @@ -1,4 +1,3 @@ -import { SortType } from '@src/containers/ConfigStep/DateRangePicker/DateRangePickerGroup'; import { BOARD_TYPES, PIPELINE_TOOL_TYPES, REGULAR_CALENDAR } from './fixtures'; import { BasicConfigState } from '@src/context/config/configSlice'; import { SOURCE_CONTROL_TYPES } from '@src/constants/resources'; @@ -14,7 +13,6 @@ const initialConfigState: BasicConfigState = { endDate: null, }, ], - sortType: SortType.DEFAULT, metrics: [], }, board: { diff --git a/frontend/src/constants/fileConfig.ts b/frontend/src/constants/fileConfig.ts index 459e33cdff..737dc7ed2a 100644 --- a/frontend/src/constants/fileConfig.ts +++ b/frontend/src/constants/fileConfig.ts @@ -1,4 +1,3 @@ -import { SortType } from '@src/containers/ConfigStep/DateRangePicker/DateRangePickerGroup'; import { CALENDAR, REWORK_TIME_LIST } from '@src/constants/resources'; import { IReworkConfig } from '@src/context/Metrics/metricsSlice'; @@ -63,7 +62,6 @@ export interface NewFileConfig { startDate: string; endDate: string; }[]; - sortType: SortType; calendarType: string; metrics: string[]; board?: { @@ -130,7 +128,6 @@ export const convertToNewFileConfig = (fileConfig: OldFileConfig | NewFileConfig reworkTimesSettings, } = fileConfig; return { - sortType: SortType?.DEFAULT, projectName, dateRange, calendarType: considerHoliday ? CALENDAR.CHINA : CALENDAR.REGULAR, diff --git a/frontend/src/constants/resources.ts b/frontend/src/constants/resources.ts index d94043e214..54dbf122ad 100644 --- a/frontend/src/constants/resources.ts +++ b/frontend/src/constants/resources.ts @@ -429,10 +429,4 @@ export const MAX_TIME_RANGE_AMOUNT = 6; export const START_DATE_INVALID_TEXT = 'Start date is invalid'; export const END_DATE_INVALID_TEXT = 'End date is invalid'; -export enum SORTING_DATE_RANGE_TEXT { - DEFAULT = 'Default sort', - ASCENDING = 'Ascending', - DESCENDING = 'Descending', -} - export const BLOCK_COLUMN_NAME = ['BLOCKED', 'BLOCK']; diff --git a/frontend/src/containers/ConfigStep/DateRangePicker/DateRangePicker.tsx b/frontend/src/containers/ConfigStep/DateRangePicker/DateRangePicker.tsx index 418d94d22a..cb2e263119 100644 --- a/frontend/src/containers/ConfigStep/DateRangePicker/DateRangePicker.tsx +++ b/frontend/src/containers/ConfigStep/DateRangePicker/DateRangePicker.tsx @@ -11,14 +11,21 @@ import { START_DATE_INVALID_TEXT, END_DATE_INVALID_TEXT, } from '@src/constants/resources'; +import { + initDeploymentFrequencySettings, + updateShouldGetBoardConfig, + updateShouldGetPipelineConfig, +} from '@src/context/Metrics/metricsSlice'; import { isDateDisabled, calculateLastAvailableDate } from '@src/containers/ConfigStep/DateRangePicker/validation'; import { IRangePickerProps } from '@src/containers/ConfigStep/DateRangePicker/types'; +import { selectDateRange, updateDateRange } from '@src/context/config/configSlice'; +import { useAppDispatch, useAppSelector } from '@src/hooks/useAppDispatch'; import CalendarTodayIcon from '@mui/icons-material/CalendarToday'; -import { DateValidationError } from '@mui/x-date-pickers'; import { TextField, TextFieldProps } from '@mui/material'; import { Z_INDEX } from '@src/constants/commons'; import { Nullable } from '@src/utils/types'; import dayjs, { Dayjs } from 'dayjs'; +import { useCallback } from 'react'; import isNull from 'lodash/isNull'; const HelperTextForStartDate = (props: TextFieldProps) => ( @@ -29,21 +36,21 @@ const HelperTextForEndDate = (props: TextFieldProps) => ( ); -export const DateRangePicker = ({ - startDate, - endDate, - index, - onError, - onChange, - onRemove, - rangeList, -}: IRangePickerProps) => { - const isShowRemoveButton = rangeList && rangeList.length > 1; - const dateRangeGroupExcludeSelf = rangeList!.filter(({ sortIndex }: { sortIndex: number }) => sortIndex !== index); +export const DateRangePicker = ({ startDate, endDate, index }: IRangePickerProps) => { + const dispatch = useAppDispatch(); + const dateRangeGroup = useAppSelector(selectDateRange); + const isShowRemoveButton = dateRangeGroup.length > 1; + const dateRangeGroupExcludeSelf = dateRangeGroup.filter((_, idx) => idx !== index); const shouldStartDateDisableDate = isDateDisabled.bind(null, dateRangeGroupExcludeSelf); const shouldEndDateDisableDate = isDateDisabled.bind(null, dateRangeGroupExcludeSelf); - const changeStartDate = (value: Nullable, { validationError }: { validationError: DateValidationError }) => { + const dispatchUpdateConfig = useCallback(() => { + dispatch(updateShouldGetBoardConfig(true)); + dispatch(updateShouldGetPipelineConfig(true)); + dispatch(initDeploymentFrequencySettings()); + }, [dispatch]); + + const changeStartDate = (value: Nullable) => { let daysAddToEndDate = DEFAULT_SPRINT_INTERVAL_OFFSET_DAYS; if (value) { const valueDate = dayjs(value).startOf('day').format(DATE_RANGE_FORMAT); @@ -54,36 +61,48 @@ export const DateRangePicker = ({ ? DEFAULT_SPRINT_INTERVAL_OFFSET_DAYS : draftDaysAddition; } + const newDateRangeGroup = dateRangeGroup.map(({ startDate, endDate }, idx) => { + if (idx === index) { + return isNull(value) + ? { + startDate: null, + endDate: null, + } + : { + startDate: value.startOf('date').format(DATE_RANGE_FORMAT), + endDate: value.endOf('date').add(daysAddToEndDate, 'day').format(DATE_RANGE_FORMAT), + }; + } - const result = isNull(value) - ? { - startDate: null, - endDate: null, - } - : { - startDate: value.startOf('date').format(DATE_RANGE_FORMAT), - endDate: value.endOf('date').add(daysAddToEndDate, 'day').format(DATE_RANGE_FORMAT), - }; - isNull(validationError) ? onChange?.(result, index) : onError?.('startDateError', validationError, index); + return { + startDate, + endDate, + }; + }); + dispatch(updateDateRange(newDateRangeGroup)); + dispatchUpdateConfig(); }; - const changeEndDate = (value: Nullable, { validationError }: { validationError: DateValidationError }) => { - const result = isNull(value) - ? { + const changeEndDate = (value: Nullable) => { + const newDateRangeGroup = dateRangeGroup.map(({ startDate, endDate }, idx) => { + if (idx === index) { + return { startDate, - endDate: null, - } - : { - startDate, - endDate: value.endOf('date').format(DATE_RANGE_FORMAT), + endDate: !isNull(value) ? value.endOf('date').format(DATE_RANGE_FORMAT) : null, }; + } - isNull(validationError) ? onChange?.(result, index) : onError?.('endDateError', validationError, index); + return { startDate, endDate }; + }); + dispatch(updateDateRange(newDateRangeGroup)); + dispatchUpdateConfig(); }; - const removeSelfHandler = () => { - onRemove?.(index); - }; + const removeSelfHandler = useCallback(() => { + const newDateRangeGroup = dateRangeGroup.filter((_, idx) => idx !== index); + dispatch(updateDateRange(newDateRangeGroup)); + dispatchUpdateConfig(); + }, [dateRangeGroup, dispatch, index, dispatchUpdateConfig]); return ( @@ -94,7 +113,6 @@ export const DateRangePicker = ({ label='From *' value={startDate ? dayjs(startDate) : null} onChange={changeStartDate} - onError={(err) => onError?.('startDateError', err, index)} slots={{ openPickerIcon: CalendarTodayIcon, textField: HelperTextForStartDate, @@ -113,7 +131,6 @@ export const DateRangePicker = ({ maxDate={dayjs(startDate).add(30, 'day')} minDate={dayjs(startDate)} onChange={changeEndDate} - onError={(err) => onError?.('endDateError', err, index)} slots={{ openPickerIcon: CalendarTodayIcon, textField: HelperTextForEndDate, diff --git a/frontend/src/containers/ConfigStep/DateRangePicker/DateRangePickerGroup.tsx b/frontend/src/containers/ConfigStep/DateRangePicker/DateRangePickerGroup.tsx index 1043d687f9..95881d68d5 100644 --- a/frontend/src/containers/ConfigStep/DateRangePicker/DateRangePickerGroup.tsx +++ b/frontend/src/containers/ConfigStep/DateRangePicker/DateRangePickerGroup.tsx @@ -1,8 +1,3 @@ -import { - initDeploymentFrequencySettings, - updateShouldGetBoardConfig, - updateShouldGetPipelineConfig, -} from '@src/context/Metrics/metricsSlice'; import { DateRangePickerGroupContainer } from '@src/containers/ConfigStep/DateRangePicker/style'; import { DateRangePicker } from '@src/containers/ConfigStep/DateRangePicker/DateRangePicker'; import { ADD_TIME_RANGE_BUTTON_TEXT, MAX_TIME_RANGE_AMOUNT } from '@src/constants/resources'; @@ -11,111 +6,20 @@ import { LocalizationProvider } from '@mui/x-date-pickers/LocalizationProvider'; import { useAppDispatch, useAppSelector } from '@src/hooks/useAppDispatch'; import { AddButton } from '@src/components/Common/AddButtonOneLine'; import { AdapterDayjs } from '@mui/x-date-pickers/AdapterDayjs'; -import { DateValidationError } from '@mui/x-date-pickers'; -import { useState, useEffect } from 'react'; -import sortBy from 'lodash/sortBy'; -import remove from 'lodash/remove'; -import get from 'lodash/get'; -import dayjs from 'dayjs'; -export enum SortType { - DESCENDING = 'DESCENDING', - ASCENDING = 'ASCENDING', - DEFAULT = 'DEFAULT', -} - -export type SortedDateRangeType = { - startDate: string | null; - endDate: string | null; - sortIndex: number; - startDateError: DateValidationError | null; - endDateError: DateValidationError | null; -}; - -const sortFn = { - DEFAULT: ({ sortIndex }: SortedDateRangeType) => sortIndex, - DESCENDING: ({ startDate }: SortedDateRangeType) => -dayjs(startDate).unix(), - ASCENDING: ({ startDate }: SortedDateRangeType) => dayjs(startDate).unix(), -}; - -type Props = { - sortType: SortType; - onChange?: (data: SortedDateRangeType[]) => void; - onError?: (data: SortedDateRangeType[]) => void; -}; - -const fillDateRangeGroup = (item: T, index: number) => ({ - ...item, - startDateError: null, - endDateError: null, - sortIndex: index, -}); - -export const DateRangePickerGroup = ({ sortType, onError }: Props) => { +export const DateRangePickerGroup = () => { const dispatch = useAppDispatch(); const dateRangeGroup = useAppSelector(selectDateRange); const isAddButtonDisabled = dateRangeGroup.length === MAX_TIME_RANGE_AMOUNT; - const [sortedDateRangeList, setSortedDateRangeList] = useState( - dateRangeGroup.map(fillDateRangeGroup), - ); - - useEffect(() => { - const errors = sortedDateRangeList.filter(({ startDateError, endDateError }) => startDateError || endDateError); - onError?.(errors); - }, [onError, sortedDateRangeList]); - - const handleError = (type: string, error: DateValidationError, index: number) => { - setSortedDateRangeList( - sortedDateRangeList.map((item) => ({ ...item, [type]: item.sortIndex === index ? error : null })), - ); - }; - - const dispatchUpdateConfig = () => { - dispatch(updateShouldGetBoardConfig(true)); - dispatch(updateShouldGetPipelineConfig(true)); - dispatch(initDeploymentFrequencySettings()); - }; - const addRangeHandler = () => { - const result = [...sortedDateRangeList, { startDate: null, endDate: null }]; - setSortedDateRangeList(result.map(fillDateRangeGroup)); - dispatch(updateDateRange(result.map(({ startDate, endDate }) => ({ startDate, endDate })))); + const newDateRangeGroup = [...dateRangeGroup, { startDate: null, endDate: null }]; + dispatch(updateDateRange(newDateRangeGroup)); }; - - const handleChange = ( - { startDate, endDate }: { startDate: string | null; endDate: string | null }, - index: number, - ) => { - const result = sortedDateRangeList.map((item) => - item.sortIndex === index ? { ...item, startDate, endDate, startDateError: null, endDateError: null } : item, - ); - setSortedDateRangeList(result); - dispatchUpdateConfig(); - dispatch(updateDateRange(result.map(({ startDate, endDate }) => ({ startDate, endDate })))); - }; - - const handleRemove = (index: number) => { - const result = [...sortedDateRangeList]; - remove(result, ({ sortIndex }) => sortIndex === index); - setSortedDateRangeList(result); - dispatchUpdateConfig(); - dispatch(updateDateRange(result.map(({ startDate, endDate }) => ({ startDate, endDate })))); - }; - return ( - {sortBy(sortedDateRangeList, get(sortFn, sortType)).map(({ startDate, endDate, sortIndex }, index) => ( - + {dateRangeGroup.map(({ startDate, endDate }, index) => ( + ))} void; - sortType: SortType; -}; - -export const SortingDateRange = ({ onChange, sortType }: Props) => { - const dispatch = useAppDispatch(); - const [dateRangeSortType, setDateRangeSortType] = useState(sortType); - - const handleChangeSort = () => { - const totalSortTypes = Object.values(SortType).length; - const currentIndex = Object.values(SortType).indexOf(dateRangeSortType); - const newIndex = (currentIndex + 1) % totalSortTypes; - const newSortType = Object.values(SortType)[newIndex]; - - setDateRangeSortType(newSortType); - dispatch(updateDateRangeSortType(newSortType)); - onChange?.(newSortType); - }; - - return ( - - - {SORTING_DATE_RANGE_TEXT[dateRangeSortType]} - - {dateRangeSortType === SortType.ASCENDING ? ( - - ) : ( - - )} - {dateRangeSortType === SortType.DESCENDING ? ( - - ) : ( - - )} - - - - ); -}; diff --git a/frontend/src/containers/ConfigStep/DateRangePicker/index.tsx b/frontend/src/containers/ConfigStep/DateRangePicker/index.tsx index 59cf8758a5..228097dcd9 100644 --- a/frontend/src/containers/ConfigStep/DateRangePicker/index.tsx +++ b/frontend/src/containers/ConfigStep/DateRangePicker/index.tsx @@ -1,50 +1,18 @@ -import { DateRangePickerGroup, SortType } from '@src/containers/ConfigStep/DateRangePicker/DateRangePickerGroup'; -import { SortedDateRangeType } from '@src/containers/ConfigStep/DateRangePicker/DateRangePickerGroup'; -import { SortingDateRange } from '@src/containers/ConfigStep/DateRangePicker/SortingDateRange'; -import { selectDateRange, selectDateRangeSortType } from '@src/context/config/configSlice'; +import { DateRangePickerGroup } from '@src/containers/ConfigStep/DateRangePicker/DateRangePickerGroup'; import SectionTitleWithTooltip from '@src/components/Common/SectionTitleWithTooltip'; -import { TitleContainer } from '@src/containers/ConfigStep/DateRangePicker/style'; import { TIME_RANGE_TITLE, TIPS } from '@src/constants/resources'; -import { useAppSelector } from '@src/hooks/useAppDispatch'; -import { useMemo, useState } from 'react'; export const DateRangePickerSection = () => { - const dateRangeGroup = useAppSelector(selectDateRange); - const dateRangeGroupSortType = useAppSelector(selectDateRangeSortType); - const [sortType, setSortType] = useState( - dateRangeGroupSortType ? dateRangeGroupSortType : SortType.DEFAULT, - ); - - const [hasError, setHasError] = useState(false); - const isDateRangeValid = useMemo(() => { - return dateRangeGroup.every((dateRange) => { - return dateRange.startDate && dateRange.endDate; - }); - }, [dateRangeGroup]); - - const handleSortTypeChange = (type: SortType) => { - setSortType(type); - }; - - const handleError = (err: SortedDateRangeType[]) => { - setHasError(!!err.length); - }; - return (
- - - {dateRangeGroup.length > 1 && isDateRangeValid && !hasError && ( - - )} - - + +
); }; diff --git a/frontend/src/containers/ConfigStep/DateRangePicker/style.tsx b/frontend/src/containers/ConfigStep/DateRangePicker/style.tsx index 66ec6ba7ae..f5f3d87e08 100644 --- a/frontend/src/containers/ConfigStep/DateRangePicker/style.tsx +++ b/frontend/src/containers/ConfigStep/DateRangePicker/style.tsx @@ -1,8 +1,7 @@ -import { ArrowDropDown, ArrowDropUp } from '@mui/icons-material'; import { BasicButton } from '@src/components/Common/Buttons'; -import { Button, IconButton } from '@mui/material'; import { DatePicker } from '@mui/x-date-pickers'; import { styled } from '@mui/material/styles'; +import { Button } from '@mui/material'; import { theme } from '@src/theme'; export const DateRangePickerGroupContainer = styled('div')({ @@ -15,7 +14,6 @@ export const TitleContainer = styled('div')({ display: 'flex', flexDirection: 'row', alignItems: 'center', - justifyContent: 'space-between', }); export const StyledFeaturedRangePickerContainer = styled('div')({ @@ -62,36 +60,3 @@ export const RemoveButton = styled(BasicButton)({ right: 0, top: '3rem', }); - -export const SortingTextButton = styled(Button)({ - cursor: 'default', - backgroundColor: theme.main.button.disabled.color, - '&:hover': { - backgroundColor: theme.main.button.disabled.color, - }, - color: theme.main.color, -}); - -export const SortingButton = styled(IconButton)({ - display: 'flex', - flexDirection: 'column', - padding: 0, - '& svg': { - margin: '-0.9rem 0', - }, - marginRight: '2.4rem', - fontSize: '2.4rem', - color: theme.main.button.disabled.color, -}); - -export const SortingButtoningContainer = styled('div')({ - display: 'flex', -}); - -export const AscendingIcon = styled(ArrowDropUp)({ - color: theme.main.backgroundColor, -}); - -export const DescendingIcon = styled(ArrowDropDown)({ - color: theme.main.backgroundColor, -}); diff --git a/frontend/src/containers/ConfigStep/DateRangePicker/types.ts b/frontend/src/containers/ConfigStep/DateRangePicker/types.ts index edac53cfae..18eac31ec6 100644 --- a/frontend/src/containers/ConfigStep/DateRangePicker/types.ts +++ b/frontend/src/containers/ConfigStep/DateRangePicker/types.ts @@ -1,13 +1,6 @@ -import { SortedDateRangeType } from '@src/containers/ConfigStep/DateRangePicker/DateRangePickerGroup'; -import { DateValidationError } from '@mui/x-date-pickers'; - export interface IRangePickerProps { startDate: string | null; endDate: string | null; index: number; key?: string | number; - onError?: (type: string, error: DateValidationError, index: number) => void; - onChange?: (data: { startDate: string | null; endDate: string | null }, index: number) => void; - onRemove?: (index: number) => void; - rangeList?: SortedDateRangeType[]; } diff --git a/frontend/src/containers/MetricsStepper/index.tsx b/frontend/src/containers/MetricsStepper/index.tsx index 4e823172bb..9ba7979379 100644 --- a/frontend/src/containers/MetricsStepper/index.tsx +++ b/frontend/src/containers/MetricsStepper/index.tsx @@ -175,13 +175,12 @@ const MetricsStepper = () => { /* istanbul ignore next */ const handleSave = () => { - const { projectName, dateRange, calendarType, metrics, sortType } = config.basic; + const { projectName, dateRange, calendarType, metrics } = config.basic; const configData = { projectName, dateRange, calendarType, metrics, - sortType, board: isShowBoard ? omit(config.board.config, ['projectKey']) : undefined, /* istanbul ignore next */ diff --git a/frontend/src/context/config/configSlice.ts b/frontend/src/context/config/configSlice.ts index 35e34b952c..01ae86d2d4 100644 --- a/frontend/src/context/config/configSlice.ts +++ b/frontend/src/context/config/configSlice.ts @@ -3,13 +3,12 @@ import { CALENDAR, DORA_METRICS, IMPORT_METRICS_MAPPING, - MAX_TIME_RANGE_AMOUNT, MESSAGE, REQUIRED_DATA, + MAX_TIME_RANGE_AMOUNT, } from '@src/constants/resources'; import { initialPipelineToolState, IPipelineToolState } from '@src/context/config/pipelineTool/pipelineToolSlice'; import { initialSourceControlState, ISourceControl } from '@src/context/config/sourceControl/sourceControlSlice'; -import { SortType } from '@src/containers/ConfigStep/DateRangePicker/DateRangePickerGroup'; import { IBoardState, initialBoardState } from '@src/context/config/board/boardSlice'; import { pipeline } from '@src/context/config/pipelineTool/verifyResponseSlice'; import { createSlice } from '@reduxjs/toolkit'; @@ -30,7 +29,6 @@ export interface BasicConfigState { projectName: string; calendarType: string; dateRange: DateRange; - sortType: SortType; metrics: string[]; }; board: IBoardState; @@ -50,7 +48,6 @@ export const initialBasicConfigState: BasicConfigState = { endDate: null, }, ], - sortType: SortType?.DEFAULT, metrics: [], }, board: initialBoardState, @@ -103,9 +100,6 @@ export const configSlice = createSlice({ updateDateRange: (state, action) => { state.basic.dateRange = action.payload; }, - updateDateRangeSortType: (state, action) => { - state.basic.sortType = action.payload; - }, updateMetrics: (state, action) => { const { metrics, shouldBoardShow, shouldPipelineToolShow, shouldSourceControlShow } = getMetricsInfo( action.payload, @@ -213,7 +207,6 @@ export const { updateProjectName, updateCalendarType, updateDateRange, - updateDateRangeSortType, updateMetrics, updateBoard, updateBoardVerifyState, @@ -232,7 +225,6 @@ export const { export const selectProjectName = (state: RootState) => state.config.basic.projectName; export const selectCalendarType = (state: RootState) => state.config.basic.calendarType; export const selectDateRange = (state: RootState) => state.config.basic.dateRange; -export const selectDateRangeSortType = (state: RootState) => state.config.basic.sortType; export const selectMetrics = (state: RootState) => state.config.basic.metrics; export const isSelectBoardMetrics = (state: RootState) => state.config.basic.metrics.some((metric) => BOARD_METRICS.includes(metric)); From b9f0ea867c3ae69937f5884fe77e6424ef00bd05 Mon Sep 17 00:00:00 2001 From: Pengfei Qian Date: Fri, 19 Apr 2024 10:33:06 +0800 Subject: [PATCH 26/81] Adm-909[frontend] sort time range (#1394) * ADM-909:[frontend]add sort button * ADM-909:[frontend]should not show sort button in three situation * [kai.zhou]: refact date range event handle part * [kai.zhou]: demo about sortby type * ADM-909:[frontend]sort time range * ADM-909:[frontend]compatible with import & save * [front][feat]: set sort button shown about date range valid * [front][feat]: fix issue about data range can not to success status * [frontend][kai.zhou]: replace event name onError to onChange * [frontend][kai.zhou]: refactor error check function to parent container * ADM-909:[frontend]add test for configSlice * ADM-909:[frontend]debug handle error * [frontend]: reactor onchange event * [frontend]: fix error status * [frontend]: fix unhandle error * [forntend]: replace redux data to state * ADM-909:[frontend]fix change end date according to test * ADM-909:[frontend]fix change end date when input year the date plus one * ADM-909:[frontend]add test * [frontend]: fix issue about unit test * ADM-909:[frontend]add test for dateRangePickerSection * ADM-909:[frontend]fix type * ADM-909:[frontend]fix test * ADM-909:[frontend]fix comments * ADM-909:[frontend]change with comments * ADM-909:[frontend]change SortType to ISortType * ADM-909:[frontend]fix test * ADM-909:[frontend]changes according to comments * ADM-909:[frontend]rename SortDateRange to SortingDateRange * ADM-909:[frontend]fix lint * ADM-909:[frontend]change ISortedDateRangeType to SortedDateRangeType * ADM-909:[frontend]change to SORTING_DATE_RANGE_TEXT * ADM-909:[frontend]fix e2e test --------- Co-authored-by: kai zhou --- .../constants/fileConfig/fileConfig.test.ts | 2 + .../ConfigStep/DateRangePicker.test.tsx | 105 ++++++++++++----- .../ConfigStep/SortingDateRange.test.tsx | 63 +++++++++++ .../__tests__/context/configSlice.test.ts | 9 ++ frontend/__tests__/fixtures.ts | 2 + frontend/__tests__/initialConfigState.ts | 2 + .../e2e/fixtures/create-new/config-step.ts | 2 + .../e2e/fixtures/create-new/metrics-step.ts | 2 + frontend/src/constants/fileConfig.ts | 3 + frontend/src/constants/resources.ts | 6 + .../DateRangePicker/DateRangePicker.tsx | 91 ++++++--------- .../DateRangePicker/DateRangePickerGroup.tsx | 106 +++++++++++++++++- .../DateRangePicker/SortingDateRange.tsx | 55 +++++++++ .../ConfigStep/DateRangePicker/index.tsx | 50 +++++++-- .../ConfigStep/DateRangePicker/style.tsx | 37 +++++- .../ConfigStep/DateRangePicker/types.ts | 7 ++ .../src/containers/MetricsStepper/index.tsx | 3 +- frontend/src/context/config/configSlice.ts | 10 +- 18 files changed, 456 insertions(+), 99 deletions(-) create mode 100644 frontend/__tests__/containers/ConfigStep/SortingDateRange.test.tsx create mode 100644 frontend/src/containers/ConfigStep/DateRangePicker/SortingDateRange.tsx diff --git a/frontend/__tests__/constants/fileConfig/fileConfig.test.ts b/frontend/__tests__/constants/fileConfig/fileConfig.test.ts index 93ec4b8d15..722ac3d961 100644 --- a/frontend/__tests__/constants/fileConfig/fileConfig.test.ts +++ b/frontend/__tests__/constants/fileConfig/fileConfig.test.ts @@ -5,11 +5,13 @@ import { CHINA_CALENDAR, DEFAULT_REWORK_SETTINGS, } from '../../fixtures'; +import { SortType } from '@src/containers/ConfigStep/DateRangePicker/DateRangePickerGroup'; import { convertToNewFileConfig } from '@src/constants/fileConfig'; describe('#fileConfig', () => { const BASIC_NEW_CONFIG = { projectName: 'ConfigFileForImporting', + sortType: SortType.DEFAULT, dateRange: [ { startDate: '2023-03-16T00:00:00.000+08:00', diff --git a/frontend/__tests__/containers/ConfigStep/DateRangePicker.test.tsx b/frontend/__tests__/containers/ConfigStep/DateRangePicker.test.tsx index 9e961d2c1e..f4ab350c4c 100644 --- a/frontend/__tests__/containers/ConfigStep/DateRangePicker.test.tsx +++ b/frontend/__tests__/containers/ConfigStep/DateRangePicker.test.tsx @@ -36,6 +36,9 @@ const setup = () => { }; describe('DateRangePickerSection', () => { + beforeEach(() => { + setup(); + }); describe('Single range behaviors', () => { const expectDate = (inputDate: HTMLInputElement) => { expect(inputDate.value).toEqual(expect.stringContaining(TODAY.date().toString())); @@ -44,15 +47,11 @@ describe('DateRangePickerSection', () => { }; it('should render DateRangePicker', () => { - setup(); - expect(screen.queryAllByText(START_DATE_LABEL)).toHaveLength(1); expect(screen.queryAllByText(END_DATE_LABEL)).toHaveLength(1); }); it('should show right start date when input a valid date given init start date is null ', async () => { - setup(); - const startDateInput = screen.getByRole('textbox', { name: START_DATE_LABEL }) as HTMLInputElement; await userEvent.type(startDateInput, INPUT_DATE_VALUE); @@ -60,8 +59,6 @@ describe('DateRangePickerSection', () => { }); it('should show right end date when input a valid date given init end date is null ', async () => { - setup(); - const endDateInput = screen.getByRole('textbox', { name: END_DATE_LABEL }) as HTMLInputElement; await userEvent.type(endDateInput, INPUT_DATE_VALUE); @@ -69,8 +66,6 @@ describe('DateRangePickerSection', () => { }); it('should Auto-fill endDate which is after startDate 13 days when fill right startDate ', async () => { - setup(); - const endDate = TODAY.add(13, 'day'); const startDateInput = screen.getByRole('textbox', { name: START_DATE_LABEL }) as HTMLInputElement; const endDateInput = screen.getByRole('textbox', { name: END_DATE_LABEL }) as HTMLInputElement; @@ -82,8 +77,6 @@ describe('DateRangePickerSection', () => { }); it('should Auto-clear endDate when its corresponding startDate is cleared ', async () => { - setup(); - const addButton = screen.getByLabelText('Button for adding date range'); await userEvent.click(addButton); const rangeDate1 = ['03/01/2024', '03/10/2024']; @@ -98,8 +91,6 @@ describe('DateRangePickerSection', () => { }); it('should not auto change startDate when its corresponding endDate changes ', async () => { - setup(); - const startDateInput = screen.getByRole('textbox', { name: START_DATE_LABEL }) as HTMLInputElement; const endDateInput = screen.getByRole('textbox', { name: END_DATE_LABEL }) as HTMLInputElement; const startDate = dayjs('2024-03-20').format('MM/DD/YYYY'); @@ -113,8 +104,6 @@ describe('DateRangePickerSection', () => { }); it('should not Auto-fill endDate which is after startDate 14 days when fill wrong format startDate ', async () => { - setup(); - const startDateInput = screen.getByRole('textbox', { name: START_DATE_LABEL }) as HTMLInputElement; const endDateInput = screen.getByRole('textbox', { name: END_DATE_LABEL }) as HTMLInputElement; await userEvent.type(startDateInput, ERROR_DATE); @@ -124,8 +113,6 @@ describe('DateRangePickerSection', () => { }); it('should dispatch update configuration when change startDate', async () => { - setup(); - const startDateInput = screen.getByRole('textbox', { name: START_DATE_LABEL }) as HTMLInputElement; await userEvent.type(startDateInput, INPUT_DATE_VALUE); @@ -135,8 +122,6 @@ describe('DateRangePickerSection', () => { }); it('should dispatch update configuration when change endDate', async () => { - setup(); - const endDateInput = screen.getByRole('textbox', { name: END_DATE_LABEL }) as HTMLInputElement; await userEvent.type(endDateInput, INPUT_DATE_VALUE); @@ -148,8 +133,6 @@ describe('DateRangePickerSection', () => { describe('Multiple range amount behaviors', () => { it('should not show remove button given there is only one range by default', () => { - setup(); - const removeButton = screen.queryByRole('button', { name: 'Remove' }); const ranges = screen.getAllByLabelText('Range picker row'); @@ -158,8 +141,6 @@ describe('DateRangePickerSection', () => { }); it('should allow user to add up to 6 ranges', async () => { - setup(); - const addButton = screen.getByLabelText('Button for adding date range'); const defaultRanges = screen.getAllByLabelText('Range picker row'); @@ -173,8 +154,6 @@ describe('DateRangePickerSection', () => { }); it('should show remove button when ranges are more than 1 and user is able to remove the range itself by clicking the remove button within that row', async () => { - setup(); - const addButton = screen.getByLabelText('Button for adding date range'); await userEvent.click(addButton); const ranges = screen.getAllByLabelText('Range picker row'); @@ -194,8 +173,6 @@ describe('DateRangePickerSection', () => { }); it('should dispatch update configuration when remove the range', async () => { - setup(); - const addButton = screen.getByLabelText('Button for adding date range'); await userEvent.click(addButton); const ranges = screen.getAllByLabelText('Range picker row'); @@ -216,7 +193,6 @@ describe('DateRangePickerSection', () => { describe('Multiple ranges date interactions', () => { it('should auto fill end date when change star date by cloeset earliest date of other ranges', async () => { - setup(); const rangeDate1 = ['03/12/2024', '03/25/2024']; const rangeDate2 = ['03/08/2024']; @@ -237,7 +213,6 @@ describe('DateRangePickerSection', () => { }); it('should display error message for start-date and end-date respectively when time ranges conflict', async () => { - setup(); const rangeDate1 = ['03/12/2024', '03/25/2024']; const rangeDate2 = ['03/08/2024', '03/26/2024']; @@ -258,4 +233,78 @@ describe('DateRangePickerSection', () => { expect(screen.getByText(TIME_RANGE_ERROR_MESSAGE.END_DATE_INVALID_TEXT)).toBeVisible(); }); }); + + describe('Sort date range behaviors', () => { + it('should not show sort button given only one date range', async () => { + const rangeDate1 = ['03/15/2024', '03/25/2024']; + const ranges = screen.getAllByLabelText('Range picker row'); + const startDate1Input = within(ranges[0]).getByRole('textbox', { name: START_DATE_LABEL }) as HTMLInputElement; + const endDate1Input = within(ranges[0]).getByRole('textbox', { name: END_DATE_LABEL }) as HTMLInputElement; + await userEvent.type(startDate1Input, rangeDate1[0]); + await userEvent.type(endDate1Input, rangeDate1[1]); + const sortButtonContainer = screen.queryByLabelText('Sorting date range'); + expect(sortButtonContainer).toBeNull(); + }); + }); + + it('should show sort button given more than one time range', async () => { + const rangeDate1 = ['03/15/2024', '03/25/2024']; + const rangeDate2 = ['03/08/2024', '03/11/2024']; + + const addButton = screen.getByLabelText('Button for adding date range'); + await userEvent.click(addButton); + const ranges = screen.getAllByLabelText('Range picker row'); + const startDate1Input = within(ranges[0]).getByRole('textbox', { name: START_DATE_LABEL }) as HTMLInputElement; + const endDate1Input = within(ranges[0]).getByRole('textbox', { name: END_DATE_LABEL }) as HTMLInputElement; + const startDate2Input = within(ranges[1]).getByRole('textbox', { name: START_DATE_LABEL }) as HTMLInputElement; + const endDate12nput = within(ranges[1]).getByRole('textbox', { name: END_DATE_LABEL }) as HTMLInputElement; + await userEvent.type(startDate1Input, rangeDate1[0]); + await userEvent.type(endDate1Input, rangeDate1[1]); + await userEvent.type(startDate2Input, rangeDate2[0]); + await userEvent.type(endDate12nput, rangeDate2[1]); + const sortButton = screen.getByLabelText('Sorting date range'); + expect(sortButton).toBeInTheDocument(); + }); + + it('should not show sort button given exist errors in date range', async () => { + const rangeDate1 = ['03/12/2024', '03/25/2024']; + const rangeDate2 = ['03/08/2024', '03/26/2024']; + + const addButton = screen.getByLabelText('Button for adding date range'); + await userEvent.click(addButton); + await userEvent.click(addButton); + const ranges = screen.getAllByLabelText('Range picker row'); + const startDate1Input = within(ranges[0]).getByRole('textbox', { name: START_DATE_LABEL }) as HTMLInputElement; + const endDate1Input = within(ranges[0]).getByRole('textbox', { name: END_DATE_LABEL }) as HTMLInputElement; + const startDate2Input = within(ranges[1]).getByRole('textbox', { name: START_DATE_LABEL }) as HTMLInputElement; + const endDate12nput = within(ranges[1]).getByRole('textbox', { name: END_DATE_LABEL }) as HTMLInputElement; + await userEvent.type(startDate1Input, rangeDate1[0]); + await userEvent.type(endDate1Input, rangeDate1[1]); + await userEvent.type(startDate2Input, rangeDate2[0]); + await userEvent.type(endDate12nput, rangeDate2[1]); + const sortButtonContainer = screen.queryByLabelText('Sorting date range'); + expect(sortButtonContainer).toBeNull(); + }); + + it('should update sort status when handleSortTypeChange is called', async () => { + const rangeDate1 = ['03/15/2024', '03/25/2024']; + const rangeDate2 = ['03/08/2024', '03/11/2024']; + + const addButton = screen.getByLabelText('Button for adding date range'); + await userEvent.click(addButton); + const ranges = screen.getAllByLabelText('Range picker row'); + const startDate1Input = within(ranges[0]).getByRole('textbox', { name: START_DATE_LABEL }) as HTMLInputElement; + const endDate1Input = within(ranges[0]).getByRole('textbox', { name: END_DATE_LABEL }) as HTMLInputElement; + const startDate2Input = within(ranges[1]).getByRole('textbox', { name: START_DATE_LABEL }) as HTMLInputElement; + const endDate12nput = within(ranges[1]).getByRole('textbox', { name: END_DATE_LABEL }) as HTMLInputElement; + await userEvent.type(startDate1Input, rangeDate1[0]); + await userEvent.type(endDate1Input, rangeDate1[1]); + await userEvent.type(startDate2Input, rangeDate2[0]); + await userEvent.type(endDate12nput, rangeDate2[1]); + const sortButton = screen.getByLabelText('sort button'); + await userEvent.click(sortButton); + expect(screen.getByRole('button', { name: 'Descending' })).toBeInTheDocument(); + await userEvent.click(sortButton); + expect(screen.getByRole('button', { name: 'Ascending' })).toBeInTheDocument(); + }); }); diff --git a/frontend/__tests__/containers/ConfigStep/SortingDateRange.test.tsx b/frontend/__tests__/containers/ConfigStep/SortingDateRange.test.tsx new file mode 100644 index 0000000000..694e67a53d --- /dev/null +++ b/frontend/__tests__/containers/ConfigStep/SortingDateRange.test.tsx @@ -0,0 +1,63 @@ +import { SortingDateRange } from '@src/containers/ConfigStep/DateRangePicker/SortingDateRange'; +import { SortType } from '@src/containers/ConfigStep/DateRangePicker/DateRangePickerGroup'; +import { updateDateRangeSortType } from '@src/context/config/configSlice'; +import { setupStore } from '@test/utils/setupStoreUtil'; +import { render, screen } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import { Provider } from 'react-redux'; +import React from 'react'; + +let store = setupStore(); +const setup = () => { + store = setupStore(); + return render( + + {}} sortType={SortType.DEFAULT} /> + , + ); +}; +jest.mock('@src/context/config/configSlice', () => ({ + ...jest.requireActual('@src/context/config/configSlice'), + updateDateRangeSortType: jest.fn().mockReturnValue({ type: 'SHOULD_UPDATE_SORT_STATUS' }), +})); + +describe('SortDateRange button behaviors', () => { + it('should show sort time rang button', () => { + setup(); + const sortButtonContainer = screen.getByLabelText('Sorting date range'); + expect(sortButtonContainer).toBeInTheDocument(); + + const sortTextButton = screen.getByText('Default sort'); + expect(sortTextButton).toBeInTheDocument(); + + const sortButton = screen.getByLabelText('sort button'); + expect(sortButton).toBeInTheDocument(); + }); + + it('should change sort order given SortButton is clicked', async () => { + setup(); + const sortButtonContainer = screen.getByLabelText('Sorting date range'); + expect(sortButtonContainer).toBeInTheDocument(); + + const sortTextButton = screen.getByText('Default sort'); + + expect(sortTextButton).toBeInTheDocument(); + + const sortButton = screen.getByLabelText('sort button'); + await userEvent.click(sortButton); + + expect(updateDateRangeSortType).toHaveBeenCalledTimes(1); + expect(updateDateRangeSortType).toHaveBeenCalledWith(SortType.DESCENDING); + }); + + it('should render right icon with sort status', async () => { + setup(); + const sortButton = screen.getByLabelText('sort button'); + await userEvent.click(sortButton); + const arrowDropDown = screen.getByRole('button', { name: 'Descending' }); + expect(arrowDropDown).toBeInTheDocument(); + await userEvent.click(sortButton); + const arrowDropUp = screen.getByRole('button', { name: 'Ascending' }); + expect(arrowDropUp).toBeInTheDocument(); + }); +}); diff --git a/frontend/__tests__/context/configSlice.test.ts b/frontend/__tests__/context/configSlice.test.ts index a301863cb5..9481daff1c 100644 --- a/frontend/__tests__/context/configSlice.test.ts +++ b/frontend/__tests__/context/configSlice.test.ts @@ -3,11 +3,13 @@ import configReducer, { selectSteps, updateCalendarType, updateDateRange, + updateDateRangeSortType, updateMetrics, updateProjectCreatedState, updateProjectName, } from '@src/context/config/configSlice'; import { CHINA_CALENDAR, CONFIG_PAGE_VERIFY_IMPORT_ERROR_MESSAGE, REGULAR_CALENDAR, VELOCITY } from '../fixtures'; +import { SortType } from '@src/containers/ConfigStep/DateRangePicker/DateRangePickerGroup'; import { setupStore } from '@test/utils/setupStoreUtil'; import initialConfigState from '../initialConfigState'; @@ -50,6 +52,13 @@ describe('config reducer', () => { expect(config.dateRange[0].endDate).toEqual(''); }); + it('should update date range sort type with given sort type', () => { + const newSortType = SortType.DEFAULT; + const config = configReducer(initialConfigState, updateDateRangeSortType(newSortType)).basic; + + expect(config.sortType).toEqual(newSortType); + }); + it('should isProjectCreated is false when import file', () => { const config = configReducer(initialConfigState, updateProjectCreatedState(false)); diff --git a/frontend/__tests__/fixtures.ts b/frontend/__tests__/fixtures.ts index ea347d4c83..636101f1b5 100644 --- a/frontend/__tests__/fixtures.ts +++ b/frontend/__tests__/fixtures.ts @@ -1,3 +1,4 @@ +import { SortType } from '@src/containers/ConfigStep/DateRangePicker/DateRangePickerGroup'; import { CSVReportRequestDTO, ReportRequestDTO } from '@src/clients/report/dto/request'; import { ReportResponseDTO } from '@src/clients/report/dto/response'; import { SOURCE_CONTROL_TYPES } from '@src/constants/resources'; @@ -224,6 +225,7 @@ export const MOCK_GENERATE_REPORT_REQUEST_PARAMS: ReportRequestDTO = { export const IMPORTED_NEW_CONFIG_FIXTURE = { projectName: 'ConfigFileForImporting', metrics: ['Velocity', 'Cycle time', 'Classification', 'Lead time for changes'], + sortType: SortType.DEFAULT, dateRange: [ { startDate: '2023-03-16T00:00:00.000+08:00', diff --git a/frontend/__tests__/initialConfigState.ts b/frontend/__tests__/initialConfigState.ts index dd04ea4754..4b36c0ce40 100644 --- a/frontend/__tests__/initialConfigState.ts +++ b/frontend/__tests__/initialConfigState.ts @@ -1,3 +1,4 @@ +import { SortType } from '@src/containers/ConfigStep/DateRangePicker/DateRangePickerGroup'; import { BOARD_TYPES, PIPELINE_TOOL_TYPES, REGULAR_CALENDAR } from './fixtures'; import { BasicConfigState } from '@src/context/config/configSlice'; import { SOURCE_CONTROL_TYPES } from '@src/constants/resources'; @@ -13,6 +14,7 @@ const initialConfigState: BasicConfigState = { endDate: null, }, ], + sortType: SortType.DEFAULT, metrics: [], }, board: { diff --git a/frontend/e2e/fixtures/create-new/config-step.ts b/frontend/e2e/fixtures/create-new/config-step.ts index 82c45c54c1..df7b1efc67 100644 --- a/frontend/e2e/fixtures/create-new/config-step.ts +++ b/frontend/e2e/fixtures/create-new/config-step.ts @@ -6,6 +6,7 @@ export const config = { endDate: '2024-01-19T23:59:59.999+08:00', }, ], + sortType: 'DEFAULT', calendarType: 'Calendar with Chinese Holiday', metrics: [ 'Velocity', @@ -42,6 +43,7 @@ export const configWithoutBlockColumn = { endDate: '2024-04-08T23:59:59.999+08:00', }, ], + sortType: 'DEFAULT', calendarType: 'Calendar with Chinese Holiday', metrics: ['Cycle time'], board: { diff --git a/frontend/e2e/fixtures/create-new/metrics-step.ts b/frontend/e2e/fixtures/create-new/metrics-step.ts index c0857167b2..627a94a965 100644 --- a/frontend/e2e/fixtures/create-new/metrics-step.ts +++ b/frontend/e2e/fixtures/create-new/metrics-step.ts @@ -6,6 +6,7 @@ export const config = { endDate: '2024-01-19T23:59:59.999+08:00', }, ], + sortType: 'DEFAULT', calendarType: 'Calendar with Chinese Holiday', metrics: [ 'Velocity', @@ -112,6 +113,7 @@ export const modifiedConfig = { startDate: '2024-01-15T00:00:00.000+08:00', endDate: '2024-01-19T23:59:59.999+08:00', }, + sortType: 'DEFAULT', calendarType: 'Calendar with Chinese Holiday', metrics: [ 'Velocity', diff --git a/frontend/src/constants/fileConfig.ts b/frontend/src/constants/fileConfig.ts index 737dc7ed2a..459e33cdff 100644 --- a/frontend/src/constants/fileConfig.ts +++ b/frontend/src/constants/fileConfig.ts @@ -1,3 +1,4 @@ +import { SortType } from '@src/containers/ConfigStep/DateRangePicker/DateRangePickerGroup'; import { CALENDAR, REWORK_TIME_LIST } from '@src/constants/resources'; import { IReworkConfig } from '@src/context/Metrics/metricsSlice'; @@ -62,6 +63,7 @@ export interface NewFileConfig { startDate: string; endDate: string; }[]; + sortType: SortType; calendarType: string; metrics: string[]; board?: { @@ -128,6 +130,7 @@ export const convertToNewFileConfig = (fileConfig: OldFileConfig | NewFileConfig reworkTimesSettings, } = fileConfig; return { + sortType: SortType?.DEFAULT, projectName, dateRange, calendarType: considerHoliday ? CALENDAR.CHINA : CALENDAR.REGULAR, diff --git a/frontend/src/constants/resources.ts b/frontend/src/constants/resources.ts index 54dbf122ad..d94043e214 100644 --- a/frontend/src/constants/resources.ts +++ b/frontend/src/constants/resources.ts @@ -429,4 +429,10 @@ export const MAX_TIME_RANGE_AMOUNT = 6; export const START_DATE_INVALID_TEXT = 'Start date is invalid'; export const END_DATE_INVALID_TEXT = 'End date is invalid'; +export enum SORTING_DATE_RANGE_TEXT { + DEFAULT = 'Default sort', + ASCENDING = 'Ascending', + DESCENDING = 'Descending', +} + export const BLOCK_COLUMN_NAME = ['BLOCKED', 'BLOCK']; diff --git a/frontend/src/containers/ConfigStep/DateRangePicker/DateRangePicker.tsx b/frontend/src/containers/ConfigStep/DateRangePicker/DateRangePicker.tsx index cb2e263119..418d94d22a 100644 --- a/frontend/src/containers/ConfigStep/DateRangePicker/DateRangePicker.tsx +++ b/frontend/src/containers/ConfigStep/DateRangePicker/DateRangePicker.tsx @@ -11,21 +11,14 @@ import { START_DATE_INVALID_TEXT, END_DATE_INVALID_TEXT, } from '@src/constants/resources'; -import { - initDeploymentFrequencySettings, - updateShouldGetBoardConfig, - updateShouldGetPipelineConfig, -} from '@src/context/Metrics/metricsSlice'; import { isDateDisabled, calculateLastAvailableDate } from '@src/containers/ConfigStep/DateRangePicker/validation'; import { IRangePickerProps } from '@src/containers/ConfigStep/DateRangePicker/types'; -import { selectDateRange, updateDateRange } from '@src/context/config/configSlice'; -import { useAppDispatch, useAppSelector } from '@src/hooks/useAppDispatch'; import CalendarTodayIcon from '@mui/icons-material/CalendarToday'; +import { DateValidationError } from '@mui/x-date-pickers'; import { TextField, TextFieldProps } from '@mui/material'; import { Z_INDEX } from '@src/constants/commons'; import { Nullable } from '@src/utils/types'; import dayjs, { Dayjs } from 'dayjs'; -import { useCallback } from 'react'; import isNull from 'lodash/isNull'; const HelperTextForStartDate = (props: TextFieldProps) => ( @@ -36,21 +29,21 @@ const HelperTextForEndDate = (props: TextFieldProps) => ( ); -export const DateRangePicker = ({ startDate, endDate, index }: IRangePickerProps) => { - const dispatch = useAppDispatch(); - const dateRangeGroup = useAppSelector(selectDateRange); - const isShowRemoveButton = dateRangeGroup.length > 1; - const dateRangeGroupExcludeSelf = dateRangeGroup.filter((_, idx) => idx !== index); +export const DateRangePicker = ({ + startDate, + endDate, + index, + onError, + onChange, + onRemove, + rangeList, +}: IRangePickerProps) => { + const isShowRemoveButton = rangeList && rangeList.length > 1; + const dateRangeGroupExcludeSelf = rangeList!.filter(({ sortIndex }: { sortIndex: number }) => sortIndex !== index); const shouldStartDateDisableDate = isDateDisabled.bind(null, dateRangeGroupExcludeSelf); const shouldEndDateDisableDate = isDateDisabled.bind(null, dateRangeGroupExcludeSelf); - const dispatchUpdateConfig = useCallback(() => { - dispatch(updateShouldGetBoardConfig(true)); - dispatch(updateShouldGetPipelineConfig(true)); - dispatch(initDeploymentFrequencySettings()); - }, [dispatch]); - - const changeStartDate = (value: Nullable) => { + const changeStartDate = (value: Nullable, { validationError }: { validationError: DateValidationError }) => { let daysAddToEndDate = DEFAULT_SPRINT_INTERVAL_OFFSET_DAYS; if (value) { const valueDate = dayjs(value).startOf('day').format(DATE_RANGE_FORMAT); @@ -61,48 +54,36 @@ export const DateRangePicker = ({ startDate, endDate, index }: IRangePickerProps ? DEFAULT_SPRINT_INTERVAL_OFFSET_DAYS : draftDaysAddition; } - const newDateRangeGroup = dateRangeGroup.map(({ startDate, endDate }, idx) => { - if (idx === index) { - return isNull(value) - ? { - startDate: null, - endDate: null, - } - : { - startDate: value.startOf('date').format(DATE_RANGE_FORMAT), - endDate: value.endOf('date').add(daysAddToEndDate, 'day').format(DATE_RANGE_FORMAT), - }; - } - return { - startDate, - endDate, - }; - }); - dispatch(updateDateRange(newDateRangeGroup)); - dispatchUpdateConfig(); + const result = isNull(value) + ? { + startDate: null, + endDate: null, + } + : { + startDate: value.startOf('date').format(DATE_RANGE_FORMAT), + endDate: value.endOf('date').add(daysAddToEndDate, 'day').format(DATE_RANGE_FORMAT), + }; + isNull(validationError) ? onChange?.(result, index) : onError?.('startDateError', validationError, index); }; - const changeEndDate = (value: Nullable) => { - const newDateRangeGroup = dateRangeGroup.map(({ startDate, endDate }, idx) => { - if (idx === index) { - return { + const changeEndDate = (value: Nullable, { validationError }: { validationError: DateValidationError }) => { + const result = isNull(value) + ? { startDate, - endDate: !isNull(value) ? value.endOf('date').format(DATE_RANGE_FORMAT) : null, + endDate: null, + } + : { + startDate, + endDate: value.endOf('date').format(DATE_RANGE_FORMAT), }; - } - return { startDate, endDate }; - }); - dispatch(updateDateRange(newDateRangeGroup)); - dispatchUpdateConfig(); + isNull(validationError) ? onChange?.(result, index) : onError?.('endDateError', validationError, index); }; - const removeSelfHandler = useCallback(() => { - const newDateRangeGroup = dateRangeGroup.filter((_, idx) => idx !== index); - dispatch(updateDateRange(newDateRangeGroup)); - dispatchUpdateConfig(); - }, [dateRangeGroup, dispatch, index, dispatchUpdateConfig]); + const removeSelfHandler = () => { + onRemove?.(index); + }; return ( @@ -113,6 +94,7 @@ export const DateRangePicker = ({ startDate, endDate, index }: IRangePickerProps label='From *' value={startDate ? dayjs(startDate) : null} onChange={changeStartDate} + onError={(err) => onError?.('startDateError', err, index)} slots={{ openPickerIcon: CalendarTodayIcon, textField: HelperTextForStartDate, @@ -131,6 +113,7 @@ export const DateRangePicker = ({ startDate, endDate, index }: IRangePickerProps maxDate={dayjs(startDate).add(30, 'day')} minDate={dayjs(startDate)} onChange={changeEndDate} + onError={(err) => onError?.('endDateError', err, index)} slots={{ openPickerIcon: CalendarTodayIcon, textField: HelperTextForEndDate, diff --git a/frontend/src/containers/ConfigStep/DateRangePicker/DateRangePickerGroup.tsx b/frontend/src/containers/ConfigStep/DateRangePicker/DateRangePickerGroup.tsx index 95881d68d5..1043d687f9 100644 --- a/frontend/src/containers/ConfigStep/DateRangePicker/DateRangePickerGroup.tsx +++ b/frontend/src/containers/ConfigStep/DateRangePicker/DateRangePickerGroup.tsx @@ -1,3 +1,8 @@ +import { + initDeploymentFrequencySettings, + updateShouldGetBoardConfig, + updateShouldGetPipelineConfig, +} from '@src/context/Metrics/metricsSlice'; import { DateRangePickerGroupContainer } from '@src/containers/ConfigStep/DateRangePicker/style'; import { DateRangePicker } from '@src/containers/ConfigStep/DateRangePicker/DateRangePicker'; import { ADD_TIME_RANGE_BUTTON_TEXT, MAX_TIME_RANGE_AMOUNT } from '@src/constants/resources'; @@ -6,20 +11,111 @@ import { LocalizationProvider } from '@mui/x-date-pickers/LocalizationProvider'; import { useAppDispatch, useAppSelector } from '@src/hooks/useAppDispatch'; import { AddButton } from '@src/components/Common/AddButtonOneLine'; import { AdapterDayjs } from '@mui/x-date-pickers/AdapterDayjs'; +import { DateValidationError } from '@mui/x-date-pickers'; +import { useState, useEffect } from 'react'; +import sortBy from 'lodash/sortBy'; +import remove from 'lodash/remove'; +import get from 'lodash/get'; +import dayjs from 'dayjs'; -export const DateRangePickerGroup = () => { +export enum SortType { + DESCENDING = 'DESCENDING', + ASCENDING = 'ASCENDING', + DEFAULT = 'DEFAULT', +} + +export type SortedDateRangeType = { + startDate: string | null; + endDate: string | null; + sortIndex: number; + startDateError: DateValidationError | null; + endDateError: DateValidationError | null; +}; + +const sortFn = { + DEFAULT: ({ sortIndex }: SortedDateRangeType) => sortIndex, + DESCENDING: ({ startDate }: SortedDateRangeType) => -dayjs(startDate).unix(), + ASCENDING: ({ startDate }: SortedDateRangeType) => dayjs(startDate).unix(), +}; + +type Props = { + sortType: SortType; + onChange?: (data: SortedDateRangeType[]) => void; + onError?: (data: SortedDateRangeType[]) => void; +}; + +const fillDateRangeGroup = (item: T, index: number) => ({ + ...item, + startDateError: null, + endDateError: null, + sortIndex: index, +}); + +export const DateRangePickerGroup = ({ sortType, onError }: Props) => { const dispatch = useAppDispatch(); const dateRangeGroup = useAppSelector(selectDateRange); const isAddButtonDisabled = dateRangeGroup.length === MAX_TIME_RANGE_AMOUNT; + const [sortedDateRangeList, setSortedDateRangeList] = useState( + dateRangeGroup.map(fillDateRangeGroup), + ); + + useEffect(() => { + const errors = sortedDateRangeList.filter(({ startDateError, endDateError }) => startDateError || endDateError); + onError?.(errors); + }, [onError, sortedDateRangeList]); + + const handleError = (type: string, error: DateValidationError, index: number) => { + setSortedDateRangeList( + sortedDateRangeList.map((item) => ({ ...item, [type]: item.sortIndex === index ? error : null })), + ); + }; + + const dispatchUpdateConfig = () => { + dispatch(updateShouldGetBoardConfig(true)); + dispatch(updateShouldGetPipelineConfig(true)); + dispatch(initDeploymentFrequencySettings()); + }; + const addRangeHandler = () => { - const newDateRangeGroup = [...dateRangeGroup, { startDate: null, endDate: null }]; - dispatch(updateDateRange(newDateRangeGroup)); + const result = [...sortedDateRangeList, { startDate: null, endDate: null }]; + setSortedDateRangeList(result.map(fillDateRangeGroup)); + dispatch(updateDateRange(result.map(({ startDate, endDate }) => ({ startDate, endDate })))); }; + + const handleChange = ( + { startDate, endDate }: { startDate: string | null; endDate: string | null }, + index: number, + ) => { + const result = sortedDateRangeList.map((item) => + item.sortIndex === index ? { ...item, startDate, endDate, startDateError: null, endDateError: null } : item, + ); + setSortedDateRangeList(result); + dispatchUpdateConfig(); + dispatch(updateDateRange(result.map(({ startDate, endDate }) => ({ startDate, endDate })))); + }; + + const handleRemove = (index: number) => { + const result = [...sortedDateRangeList]; + remove(result, ({ sortIndex }) => sortIndex === index); + setSortedDateRangeList(result); + dispatchUpdateConfig(); + dispatch(updateDateRange(result.map(({ startDate, endDate }) => ({ startDate, endDate })))); + }; + return ( - {dateRangeGroup.map(({ startDate, endDate }, index) => ( - + {sortBy(sortedDateRangeList, get(sortFn, sortType)).map(({ startDate, endDate, sortIndex }, index) => ( + ))} void; + sortType: SortType; +}; + +export const SortingDateRange = ({ onChange, sortType }: Props) => { + const dispatch = useAppDispatch(); + const [dateRangeSortType, setDateRangeSortType] = useState(sortType); + + const handleChangeSort = () => { + const totalSortTypes = Object.values(SortType).length; + const currentIndex = Object.values(SortType).indexOf(dateRangeSortType); + const newIndex = (currentIndex + 1) % totalSortTypes; + const newSortType = Object.values(SortType)[newIndex]; + + setDateRangeSortType(newSortType); + dispatch(updateDateRangeSortType(newSortType)); + onChange?.(newSortType); + }; + + return ( + + + {SORTING_DATE_RANGE_TEXT[dateRangeSortType]} + + {dateRangeSortType === SortType.ASCENDING ? ( + + ) : ( + + )} + {dateRangeSortType === SortType.DESCENDING ? ( + + ) : ( + + )} + + + + ); +}; diff --git a/frontend/src/containers/ConfigStep/DateRangePicker/index.tsx b/frontend/src/containers/ConfigStep/DateRangePicker/index.tsx index 228097dcd9..59cf8758a5 100644 --- a/frontend/src/containers/ConfigStep/DateRangePicker/index.tsx +++ b/frontend/src/containers/ConfigStep/DateRangePicker/index.tsx @@ -1,18 +1,50 @@ -import { DateRangePickerGroup } from '@src/containers/ConfigStep/DateRangePicker/DateRangePickerGroup'; +import { DateRangePickerGroup, SortType } from '@src/containers/ConfigStep/DateRangePicker/DateRangePickerGroup'; +import { SortedDateRangeType } from '@src/containers/ConfigStep/DateRangePicker/DateRangePickerGroup'; +import { SortingDateRange } from '@src/containers/ConfigStep/DateRangePicker/SortingDateRange'; +import { selectDateRange, selectDateRangeSortType } from '@src/context/config/configSlice'; import SectionTitleWithTooltip from '@src/components/Common/SectionTitleWithTooltip'; +import { TitleContainer } from '@src/containers/ConfigStep/DateRangePicker/style'; import { TIME_RANGE_TITLE, TIPS } from '@src/constants/resources'; +import { useAppSelector } from '@src/hooks/useAppDispatch'; +import { useMemo, useState } from 'react'; export const DateRangePickerSection = () => { + const dateRangeGroup = useAppSelector(selectDateRange); + const dateRangeGroupSortType = useAppSelector(selectDateRangeSortType); + const [sortType, setSortType] = useState( + dateRangeGroupSortType ? dateRangeGroupSortType : SortType.DEFAULT, + ); + + const [hasError, setHasError] = useState(false); + const isDateRangeValid = useMemo(() => { + return dateRangeGroup.every((dateRange) => { + return dateRange.startDate && dateRange.endDate; + }); + }, [dateRangeGroup]); + + const handleSortTypeChange = (type: SortType) => { + setSortType(type); + }; + + const handleError = (err: SortedDateRangeType[]) => { + setHasError(!!err.length); + }; + return (
- - + + + {dateRangeGroup.length > 1 && isDateRangeValid && !hasError && ( + + )} + +
); }; diff --git a/frontend/src/containers/ConfigStep/DateRangePicker/style.tsx b/frontend/src/containers/ConfigStep/DateRangePicker/style.tsx index f5f3d87e08..66ec6ba7ae 100644 --- a/frontend/src/containers/ConfigStep/DateRangePicker/style.tsx +++ b/frontend/src/containers/ConfigStep/DateRangePicker/style.tsx @@ -1,7 +1,8 @@ +import { ArrowDropDown, ArrowDropUp } from '@mui/icons-material'; import { BasicButton } from '@src/components/Common/Buttons'; +import { Button, IconButton } from '@mui/material'; import { DatePicker } from '@mui/x-date-pickers'; import { styled } from '@mui/material/styles'; -import { Button } from '@mui/material'; import { theme } from '@src/theme'; export const DateRangePickerGroupContainer = styled('div')({ @@ -14,6 +15,7 @@ export const TitleContainer = styled('div')({ display: 'flex', flexDirection: 'row', alignItems: 'center', + justifyContent: 'space-between', }); export const StyledFeaturedRangePickerContainer = styled('div')({ @@ -60,3 +62,36 @@ export const RemoveButton = styled(BasicButton)({ right: 0, top: '3rem', }); + +export const SortingTextButton = styled(Button)({ + cursor: 'default', + backgroundColor: theme.main.button.disabled.color, + '&:hover': { + backgroundColor: theme.main.button.disabled.color, + }, + color: theme.main.color, +}); + +export const SortingButton = styled(IconButton)({ + display: 'flex', + flexDirection: 'column', + padding: 0, + '& svg': { + margin: '-0.9rem 0', + }, + marginRight: '2.4rem', + fontSize: '2.4rem', + color: theme.main.button.disabled.color, +}); + +export const SortingButtoningContainer = styled('div')({ + display: 'flex', +}); + +export const AscendingIcon = styled(ArrowDropUp)({ + color: theme.main.backgroundColor, +}); + +export const DescendingIcon = styled(ArrowDropDown)({ + color: theme.main.backgroundColor, +}); diff --git a/frontend/src/containers/ConfigStep/DateRangePicker/types.ts b/frontend/src/containers/ConfigStep/DateRangePicker/types.ts index 18eac31ec6..edac53cfae 100644 --- a/frontend/src/containers/ConfigStep/DateRangePicker/types.ts +++ b/frontend/src/containers/ConfigStep/DateRangePicker/types.ts @@ -1,6 +1,13 @@ +import { SortedDateRangeType } from '@src/containers/ConfigStep/DateRangePicker/DateRangePickerGroup'; +import { DateValidationError } from '@mui/x-date-pickers'; + export interface IRangePickerProps { startDate: string | null; endDate: string | null; index: number; key?: string | number; + onError?: (type: string, error: DateValidationError, index: number) => void; + onChange?: (data: { startDate: string | null; endDate: string | null }, index: number) => void; + onRemove?: (index: number) => void; + rangeList?: SortedDateRangeType[]; } diff --git a/frontend/src/containers/MetricsStepper/index.tsx b/frontend/src/containers/MetricsStepper/index.tsx index 9ba7979379..4e823172bb 100644 --- a/frontend/src/containers/MetricsStepper/index.tsx +++ b/frontend/src/containers/MetricsStepper/index.tsx @@ -175,12 +175,13 @@ const MetricsStepper = () => { /* istanbul ignore next */ const handleSave = () => { - const { projectName, dateRange, calendarType, metrics } = config.basic; + const { projectName, dateRange, calendarType, metrics, sortType } = config.basic; const configData = { projectName, dateRange, calendarType, metrics, + sortType, board: isShowBoard ? omit(config.board.config, ['projectKey']) : undefined, /* istanbul ignore next */ diff --git a/frontend/src/context/config/configSlice.ts b/frontend/src/context/config/configSlice.ts index 01ae86d2d4..35e34b952c 100644 --- a/frontend/src/context/config/configSlice.ts +++ b/frontend/src/context/config/configSlice.ts @@ -3,12 +3,13 @@ import { CALENDAR, DORA_METRICS, IMPORT_METRICS_MAPPING, + MAX_TIME_RANGE_AMOUNT, MESSAGE, REQUIRED_DATA, - MAX_TIME_RANGE_AMOUNT, } from '@src/constants/resources'; import { initialPipelineToolState, IPipelineToolState } from '@src/context/config/pipelineTool/pipelineToolSlice'; import { initialSourceControlState, ISourceControl } from '@src/context/config/sourceControl/sourceControlSlice'; +import { SortType } from '@src/containers/ConfigStep/DateRangePicker/DateRangePickerGroup'; import { IBoardState, initialBoardState } from '@src/context/config/board/boardSlice'; import { pipeline } from '@src/context/config/pipelineTool/verifyResponseSlice'; import { createSlice } from '@reduxjs/toolkit'; @@ -29,6 +30,7 @@ export interface BasicConfigState { projectName: string; calendarType: string; dateRange: DateRange; + sortType: SortType; metrics: string[]; }; board: IBoardState; @@ -48,6 +50,7 @@ export const initialBasicConfigState: BasicConfigState = { endDate: null, }, ], + sortType: SortType?.DEFAULT, metrics: [], }, board: initialBoardState, @@ -100,6 +103,9 @@ export const configSlice = createSlice({ updateDateRange: (state, action) => { state.basic.dateRange = action.payload; }, + updateDateRangeSortType: (state, action) => { + state.basic.sortType = action.payload; + }, updateMetrics: (state, action) => { const { metrics, shouldBoardShow, shouldPipelineToolShow, shouldSourceControlShow } = getMetricsInfo( action.payload, @@ -207,6 +213,7 @@ export const { updateProjectName, updateCalendarType, updateDateRange, + updateDateRangeSortType, updateMetrics, updateBoard, updateBoardVerifyState, @@ -225,6 +232,7 @@ export const { export const selectProjectName = (state: RootState) => state.config.basic.projectName; export const selectCalendarType = (state: RootState) => state.config.basic.calendarType; export const selectDateRange = (state: RootState) => state.config.basic.dateRange; +export const selectDateRangeSortType = (state: RootState) => state.config.basic.sortType; export const selectMetrics = (state: RootState) => state.config.basic.metrics; export const isSelectBoardMetrics = (state: RootState) => state.config.basic.metrics.some((metric) => BOARD_METRICS.includes(metric)); From 6984484f17f05959f17f9e197da21022eb379fca Mon Sep 17 00:00:00 2001 From: Leiqiuhong <141199516+Leiqiuhong@users.noreply.github.com> Date: Fri, 19 Apr 2024 11:19:52 +0800 Subject: [PATCH 27/81] ADM-913 [frontend]:receive multiple time ranges in metrics page- pipeline (#1393) * ADM-913 fix: remove time for pipeline info * ADM-913 refactor: extract value * ADM-913 feat: send several steps request by time ranges * ADM-913 feat: use allSettled to request api * ADM-913 test: fix unit test * ADM-913 test: add unit test * ADM-913 test: fix test * ADM-913 fix: fix eslint * ADM-913 test: add happy path test for steps res * ADM-913 test: fix test --- .../__tests__/client/MetricsClient.test.ts | 8 +- .../PipelineMetricSelection.test.tsx | 43 ++++++---- .../__tests__/context/metricsSlice.test.ts | 8 ++ .../context/pipelineToolSlice.test.ts | 32 ++++--- frontend/__tests__/fixtures.ts | 24 ++++-- .../hooks/useGetMetricsStepsEffect.test.tsx | 86 ++++++++++++++++--- frontend/src/clients/MetricsClient.ts | 13 ++- frontend/src/clients/pipeline/dto/request.ts | 2 - frontend/src/constants/resources.ts | 2 +- .../PipelineMetricSelection/index.tsx | 17 ++-- frontend/src/context/Metrics/metricsSlice.ts | 8 ++ frontend/src/context/config/configSlice.ts | 17 ++-- .../src/hooks/useGetMetricsStepsEffect.ts | 79 ++++++++++++----- .../src/hooks/useGetPipelineToolInfoEffect.ts | 17 +--- 14 files changed, 245 insertions(+), 111 deletions(-) diff --git a/frontend/__tests__/client/MetricsClient.test.ts b/frontend/__tests__/client/MetricsClient.test.ts index 5f2e476333..0befd29f61 100644 --- a/frontend/__tests__/client/MetricsClient.test.ts +++ b/frontend/__tests__/client/MetricsClient.test.ts @@ -18,7 +18,7 @@ describe('get steps from metrics response', () => { }), ); - const result = await metricsClient.getSteps(params, buildId, organizationId, pipelineType, token); + const result = await metricsClient.getSteps(params[0], buildId, organizationId, pipelineType, token); expect(result).toEqual({ response: ['step1'], haveStep: true }); }); @@ -36,7 +36,7 @@ describe('get steps from metrics response', () => { ); await expect(async () => { - await metricsClient.getSteps(params, buildId, organizationId, pipelineType, token); + await metricsClient.getSteps(params[0], buildId, organizationId, pipelineType, token); }).rejects.toThrow(VERIFY_ERROR_MESSAGE.INTERNAL_SERVER_ERROR); }); @@ -48,14 +48,14 @@ describe('get steps from metrics response', () => { ); await expect(async () => { - await metricsClient.getSteps(params, buildId, organizationId, pipelineType, token); + await metricsClient.getSteps(params[0], buildId, organizationId, pipelineType, token); }).rejects.toThrow(VERIFY_ERROR_MESSAGE.BAD_REQUEST); }); it('should show isNoStep True when getSteps response status 204', async () => { server.use(rest.get(getStepsUrl, (req, res, ctx) => res(ctx.status(HttpStatusCode.NoContent)))); - const result = await metricsClient.getSteps(params, buildId, organizationId, pipelineType, token); + const result = await metricsClient.getSteps(params[0], buildId, organizationId, pipelineType, token); expect(result).toEqual({ branches: [], response: [], haveStep: false, pipelineCrews: [] }); }); diff --git a/frontend/__tests__/containers/MetricsStep/DeploymentFrequencySettings/PipelineMetricSelection.test.tsx b/frontend/__tests__/containers/MetricsStep/DeploymentFrequencySettings/PipelineMetricSelection.test.tsx index 8affbba0be..6e704ee2b4 100644 --- a/frontend/__tests__/containers/MetricsStep/DeploymentFrequencySettings/PipelineMetricSelection.test.tsx +++ b/frontend/__tests__/containers/MetricsStep/DeploymentFrequencySettings/PipelineMetricSelection.test.tsx @@ -38,13 +38,15 @@ jest.mock('@src/context/config/configSlice', () => ({ selectStepsParams: jest.fn().mockReturnValue({ buildId: '', organizationId: '', - params: { - endTime: 1681747200000, - orgName: '', - pipelineName: '', - repository: '', - startTime: 1680537600000, - }, + params: [ + { + endTime: 1681747200000, + orgName: '', + pipelineName: '', + repository: '', + startTime: 1680537600000, + }, + ], pipelineType: 'BuildKite', token: '', }), @@ -146,7 +148,6 @@ describe('PipelineMetricSelection', () => { }); it('should show step selection when select organization and pipelineName', async () => { - metricsClient.getSteps = jest.fn().mockImplementation(() => ['steps1', 'steps2']); const { getByText } = await setup( { ...deploymentFrequencySetting, organization: 'mockOrgName', pipelineName: 'mockName' }, false, @@ -161,7 +162,7 @@ describe('PipelineMetricSelection', () => { it('should show error message pop when getSteps failed', async () => { metricsClient.getSteps = jest.fn().mockImplementation(() => { - throw new Error('error message'); + return Promise.reject('error'); }); const { getByText, getByRole, getAllByRole } = await setup( { id: 0, organization: 'mockOrgName', pipelineName: 'mockName', step: '', branches: [] }, @@ -178,12 +179,14 @@ describe('PipelineMetricSelection', () => { }); await waitFor(() => { - expect(getByText('Failed to get BuildKite steps: error message')).toBeInTheDocument(); + expect(getByText('Failed to get BuildKite steps')).toBeInTheDocument(); }); expect(mockUpdatePipeline).toHaveBeenCalledTimes(2); }); it('should show no steps warning message when getSteps succeed but get no steps', async () => { - metricsClient.getSteps = jest.fn().mockReturnValue({ response: [], haveStep: false }); + metricsClient.getSteps = jest + .fn() + .mockReturnValue({ response: [], haveStep: false, pipelineCrews: [], branches: [] }); const { getByText, getByRole, getAllByRole } = await setup( { id: 0, organization: 'mockOrgName', pipelineName: 'mockName', step: '', branches: [] }, false, @@ -201,7 +204,7 @@ describe('PipelineMetricSelection', () => { await waitFor(() => { expect( getByText( - 'There is no step during this period for this pipeline! Please change the search time in the Config page!', + 'There is no step during these periods for this pipeline! Please change the search time in the Config page!', ), ).toBeInTheDocument(); @@ -210,7 +213,9 @@ describe('PipelineMetricSelection', () => { }); it('should show no steps warning message when getSteps succeed but get no steps and isShowRemoveButton is true', async () => { - metricsClient.getSteps = jest.fn().mockReturnValue({ response: [], haveStep: false }); + metricsClient.getSteps = jest + .fn() + .mockReturnValue({ response: [], haveStep: false, pipelineCrews: [], branches: [] }); const { getByRole, getAllByRole } = await setup( { id: 0, organization: 'mockOrgName', pipelineName: 'mockName', step: '', branches: [] }, true, @@ -231,7 +236,9 @@ describe('PipelineMetricSelection', () => { }); it('should show steps selection when getSteps succeed ', async () => { - metricsClient.getSteps = jest.fn().mockReturnValue({ response: ['steps'], haveStep: true }); + metricsClient.getSteps = jest + .fn() + .mockReturnValue({ response: ['steps'], haveStep: true, pipelineCrews: [], branches: [] }); const { getByRole, getByText, getAllByRole } = await setup( { id: 0, organization: 'mockOrgName', pipelineName: 'mockName', step: '', branches: [] }, false, @@ -257,7 +264,7 @@ describe('PipelineMetricSelection', () => { it('should show branches selection when getSteps succeed ', async () => { metricsClient.getSteps = jest .fn() - .mockReturnValue({ response: ['steps'], haveStep: true, branches: ['branch1', 'branch2'] }); + .mockReturnValue({ response: ['steps'], haveStep: true, branches: ['branch1', 'branch2'], pipelineCrews: [] }); const { getByRole, getByText } = await setup( { id: 0, organization: 'mockOrgName', pipelineName: 'mockName', step: '', branches: ['branch1', 'branch2'] }, false, @@ -279,7 +286,7 @@ describe('PipelineMetricSelection', () => { it('should show not show branches when deployment setting has branches given branches does not match pipeline ', async () => { metricsClient.getSteps = jest .fn() - .mockReturnValue({ response: ['steps'], haveStep: true, branches: ['branch1', 'branch2'] }); + .mockReturnValue({ response: ['steps'], haveStep: true, branches: ['branch1', 'branch2'], pipelineCrews: [] }); const { getByRole, queryByRole, getByText } = await setup( { id: 0, organization: 'mockOrgName3', pipelineName: 'mockName3', step: '', branches: ['branch6', 'branch7'] }, false, @@ -299,7 +306,9 @@ describe('PipelineMetricSelection', () => { }); it('should show duplicated message given duplicated id', async () => { - metricsClient.getSteps = jest.fn().mockReturnValue({ response: ['steps'], haveStep: true }); + metricsClient.getSteps = jest + .fn() + .mockReturnValue({ response: ['steps'], haveStep: true, pipelineCrews: [], branches: [] }); const { getByText } = await setup( { id: 0, organization: 'mockOrgName', pipelineName: 'mockName', step: 'step1', branches: [] }, false, diff --git a/frontend/__tests__/context/metricsSlice.test.ts b/frontend/__tests__/context/metricsSlice.test.ts index 8cfc3c9797..bada2954b3 100644 --- a/frontend/__tests__/context/metricsSlice.test.ts +++ b/frontend/__tests__/context/metricsSlice.test.ts @@ -20,6 +20,7 @@ import saveMetricsSettingReducer, { selectReworkTimesSettings, selectShouldGetBoardConfig, selectShouldGetPipelineConfig, + selectShouldRetryPipelineConfig, selectStepWarningMessage, selectTreatFlagCardAsBlock, setCycleTimeSettingsType, @@ -34,6 +35,7 @@ import saveMetricsSettingReducer, { updateReworkTimesSettings, updateShouldGetBoardConfig, updateShouldGetPipelineConfig, + updateShouldRetryPipelineConfig, updateTreatFlagCardAsBlock, } from '@src/context/Metrics/metricsSlice'; import { @@ -49,6 +51,7 @@ import { store } from '@src/store'; const initState = { shouldGetBoardConfig: true, shouldGetPipeLineConfig: true, + shouldRetryPipelineConfig: false, jiraColumns: [], targetFields: [], users: [], @@ -590,6 +593,11 @@ describe('saveMetricsSetting reducer', () => { expect(savedPipelineCrews.pipelineCrews).toBe(crews); }); + it('should update ShouldRetryPipelineConfig', async () => { + store.dispatch(updateShouldRetryPipelineConfig(true)); + expect(selectShouldRetryPipelineConfig(store.getState())).toEqual(true); + }); + it('should set cycle time setting type', () => { const setCycleTimeSettingsTypeResult = saveMetricsSettingReducer( initState, diff --git a/frontend/__tests__/context/pipelineToolSlice.test.ts b/frontend/__tests__/context/pipelineToolSlice.test.ts index 691ea6963e..ad25905229 100644 --- a/frontend/__tests__/context/pipelineToolSlice.test.ts +++ b/frontend/__tests__/context/pipelineToolSlice.test.ts @@ -238,13 +238,15 @@ describe('pipelineTool reducer', () => { expect(selectStepsParams(store.getState(), 'mockOrgName', 'mockName')).toEqual({ buildId: 'mockId', organizationId: 'mockOrgId', - params: { - endTime: dayjs(MOCK_DATE_RANGE[0].endDate).endOf('date').valueOf(), - orgName: 'mockOrgName', - pipelineName: 'mockName', - repository: 'mockRepository', - startTime: dayjs(MOCK_DATE_RANGE[0].startDate).startOf('date').valueOf(), - }, + params: [ + { + endTime: dayjs(MOCK_DATE_RANGE[0].endDate).endOf('date').valueOf(), + orgName: 'mockOrgName', + pipelineName: 'mockName', + repository: 'mockRepository', + startTime: dayjs(MOCK_DATE_RANGE[0].startDate).startOf('date').valueOf(), + }, + ], pipelineType: 'BuildKite', token: '', }); @@ -254,13 +256,15 @@ describe('pipelineTool reducer', () => { expect(selectStepsParams(store.getState(), '', '')).toEqual({ buildId: '', organizationId: '', - params: { - endTime: dayjs(MOCK_DATE_RANGE[0].endDate).endOf('date').valueOf(), - orgName: '', - pipelineName: '', - repository: '', - startTime: dayjs(MOCK_DATE_RANGE[0].startDate).startOf('date').valueOf(), - }, + params: [ + { + endTime: dayjs(MOCK_DATE_RANGE[0].endDate).endOf('date').valueOf(), + orgName: '', + pipelineName: '', + repository: '', + startTime: dayjs(MOCK_DATE_RANGE[0].startDate).startOf('date').valueOf(), + }, + ], pipelineType: 'BuildKite', token: '', }); diff --git a/frontend/__tests__/fixtures.ts b/frontend/__tests__/fixtures.ts index 636101f1b5..fa15244ef2 100644 --- a/frontend/__tests__/fixtures.ts +++ b/frontend/__tests__/fixtures.ts @@ -2,6 +2,7 @@ import { SortType } from '@src/containers/ConfigStep/DateRangePicker/DateRangePi import { CSVReportRequestDTO, ReportRequestDTO } from '@src/clients/report/dto/request'; import { ReportResponseDTO } from '@src/clients/report/dto/response'; import { SOURCE_CONTROL_TYPES } from '@src/constants/resources'; +import { IStepsParams } from '@src/clients/MetricsClient'; import { METRIC_TYPES } from '@src/constants/commons'; export const PROJECT_NAME = 'Heartbeat'; @@ -368,13 +369,22 @@ export enum PIPELINE_SETTING_TYPES { export const CONFIRM_DIALOG_DESCRIPTION = 'All the filled data will be cleared. Continue to Home page?'; export const MOCK_GET_STEPS_PARAMS = { - params: { - pipelineName: 'mock pipeline name', - repository: 'mock repository', - orgName: 'mock orgName', - startTime: 1212112121212, - endTime: 1313131313131, - }, + params: [ + { + pipelineName: 'mock pipeline name', + repository: 'mock repository', + orgName: 'mock orgName', + startTime: 1212112121212, + endTime: 1313131313131, + }, + { + pipelineName: 'mock pipeline name', + repository: 'mock repository', + orgName: 'mock orgName', + startTime: 1212112121214, + endTime: 1313131313134, + }, + ] as IStepsParams[], buildId: 'mockBuildId', organizationId: 'mockOrganizationId', pipelineType: 'BuildKite', diff --git a/frontend/__tests__/hooks/useGetMetricsStepsEffect.test.tsx b/frontend/__tests__/hooks/useGetMetricsStepsEffect.test.tsx index 413fdce00e..12299ab2ce 100644 --- a/frontend/__tests__/hooks/useGetMetricsStepsEffect.test.tsx +++ b/frontend/__tests__/hooks/useGetMetricsStepsEffect.test.tsx @@ -1,24 +1,78 @@ import { ERROR_MESSAGE_TIME_DURATION, MOCK_GET_STEPS_PARAMS } from '../fixtures'; import { useGetMetricsStepsEffect } from '@src/hooks/useGetMetricsStepsEffect'; -import { InternalServerError } from '@src/errors/InternalServerError'; +import { AXIOS_REQUEST_ERROR_CODE } from '@src/constants/resources'; import { metricsClient } from '@src/clients/MetricsClient'; import { act, renderHook } from '@testing-library/react'; -import { HttpStatusCode } from 'axios'; +import { setupStore } from '@test/utils/setupStoreUtil'; +import { TimeoutError } from '@src/errors/TimeoutError'; +import React, { ReactNode } from 'react'; +import { Provider } from 'react-redux'; + +const mockDispatch = jest.fn(); +jest.mock('@src/context/Metrics/metricsSlice', () => ({ + ...jest.requireActual('@src/context/Metrics/metricsSlice'), + updateShouldRetryPipelineConfig: jest.fn(), +})); + +jest.mock('react-redux', () => ({ + ...jest.requireActual('react-redux'), + useDispatch: () => mockDispatch, +})); describe('use get steps effect', () => { const { params, buildId, organizationId, pipelineType, token } = MOCK_GET_STEPS_PARAMS; + const store = setupStore(); + const wrapper = ({ children }: { children: ReactNode }) => { + return {children}; + }; + + const setup = () => renderHook(() => useGetMetricsStepsEffect(), { wrapper }); it('should init data state when render hook', async () => { const { result } = renderHook(() => useGetMetricsStepsEffect()); expect(result.current.isLoading).toEqual(false); }); + it('should get the union set from steps res', async () => { + metricsClient.getSteps = jest + .fn() + .mockReturnValueOnce({ + response: ['a', 'b', 'c'], + haveStep: true, + branches: ['branchA', 'branchB'], + pipelineCrews: ['crewA', 'crewB'], + }) + .mockReturnValueOnce({ + response: ['a', 'd', 'e'], + haveStep: true, + branches: ['branchC', 'branchD'], + pipelineCrews: [], + }) + .mockReturnValueOnce({ + response: [], + haveStep: false, + branches: [], + pipelineCrews: [], + }); + const { result } = renderHook(() => useGetMetricsStepsEffect()); + let res; + await act(async () => { + res = await result.current.getSteps(params, buildId, organizationId, pipelineType, token); + }); + expect(res).toEqual({ + response: ['a', 'b', 'c', 'd', 'e'], + haveStep: true, + branches: ['branchA', 'branchB', 'branchC', 'branchD'], + pipelineCrews: ['crewA', 'crewB'], + }); + }); + it('should set error message when get steps throw error', async () => { jest.useFakeTimers(); metricsClient.getSteps = jest.fn().mockImplementation(() => { - throw new Error('error'); + return Promise.reject('error'); }); - const { result } = renderHook(() => useGetMetricsStepsEffect()); + const { result } = setup(); expect(result.current.isLoading).toEqual(false); @@ -30,16 +84,28 @@ describe('use get steps effect', () => { expect(result.current.errorMessage).toEqual(''); }); - it('should set error message when get steps response status 500', async () => { + it('should set error message when get steps responses are failed', async () => { metricsClient.getSteps = jest.fn().mockImplementation(() => { - throw new InternalServerError('error message', HttpStatusCode.InternalServerError, 'fake description'); + return Promise.reject('error'); + }); + const { result } = setup(); + await act(async () => { + await result.current.getSteps(params, buildId, organizationId, pipelineType, token); }); - const { result } = renderHook(() => useGetMetricsStepsEffect()); - act(() => { - result.current.getSteps(params, buildId, organizationId, pipelineType, token); + expect(result.current.errorMessage).toEqual('Failed to get BuildKite steps'); + }); + + it('should set error message when get steps responses are timeout', async () => { + metricsClient.getSteps = jest.fn().mockImplementation(() => { + return Promise.reject(new TimeoutError('error', AXIOS_REQUEST_ERROR_CODE.TIMEOUT)); + }); + const { result } = setup(); + await act(async () => { + await result.current.getSteps(params, buildId, organizationId, pipelineType, token); }); - expect(result.current.errorMessage).toEqual('Failed to get BuildKite steps: error message'); + expect(result.current.errorMessage).toEqual('Failed to get BuildKite steps: timeout'); + expect(mockDispatch).toHaveBeenCalledTimes(1); }); }); diff --git a/frontend/src/clients/MetricsClient.ts b/frontend/src/clients/MetricsClient.ts index 902f7f50d1..a7ba261885 100644 --- a/frontend/src/clients/MetricsClient.ts +++ b/frontend/src/clients/MetricsClient.ts @@ -1,7 +1,7 @@ import { HttpClient } from '@src/clients/HttpClient'; import { HttpStatusCode } from 'axios'; -export interface getStepsParams { +export interface IStepsParams { pipelineName: string; repository: string; orgName: string; @@ -9,6 +9,13 @@ export interface getStepsParams { endTime: number; } +export interface IStepsRes { + response: string[]; + haveStep: boolean; + branches: string[]; + pipelineCrews: string[]; +} + export class MetricsClient extends HttpClient { steps: string[] = []; haveStep = true; @@ -16,12 +23,12 @@ export class MetricsClient extends HttpClient { pipelineCrews: string[] = []; getSteps = async ( - params: getStepsParams, + params: IStepsParams, organizationId: string, buildId: string, pipelineType: string, token: string, - ) => { + ): Promise => { this.steps = []; this.haveStep = true; const result = await this.axiosInstance.get( diff --git a/frontend/src/clients/pipeline/dto/request.ts b/frontend/src/clients/pipeline/dto/request.ts index 78c249ff58..f67497cb9e 100644 --- a/frontend/src/clients/pipeline/dto/request.ts +++ b/frontend/src/clients/pipeline/dto/request.ts @@ -6,8 +6,6 @@ export interface IPipelineVerifyRequestDTO { export interface PipelineInfoRequestDTO { type: string; token: string; - startTime: string | number | null; - endTime: string | number | null; } export interface PipelineRequestDTO { diff --git a/frontend/src/constants/resources.ts b/frontend/src/constants/resources.ts index d94043e214..af2c76bf3a 100644 --- a/frontend/src/constants/resources.ts +++ b/frontend/src/constants/resources.ts @@ -272,7 +272,7 @@ export const MESSAGE = { PIPELINE_NAME_WARNING: 'This Pipeline in import data might be removed', STEP_WARNING: 'Selected step of this pipeline in import data might be removed', NO_STEP_WARNING: - 'There is no step during this period for this pipeline! Please change the search time in the Config page!', + 'There is no step during these periods for this pipeline! Please change the search time in the Config page!', ERROR_PAGE: 'Something on internet is not quite right. Perhaps head back to our homepage and try again.', EXPIRE_INFORMATION: (value: number) => `The file will expire in ${value} minutes, please download it in time.`, REPORT_LOADING: 'The report is being generated, please do not refresh the page or all the data will be disappeared.', diff --git a/frontend/src/containers/MetricsStep/DeploymentFrequencySettings/PipelineMetricSelection/index.tsx b/frontend/src/containers/MetricsStep/DeploymentFrequencySettings/PipelineMetricSelection/index.tsx index d4264dd74d..84c373b2d8 100644 --- a/frontend/src/containers/MetricsStep/DeploymentFrequencySettings/PipelineMetricSelection/index.tsx +++ b/frontend/src/containers/MetricsStep/DeploymentFrequencySettings/PipelineMetricSelection/index.tsx @@ -23,8 +23,8 @@ import { MESSAGE, NO_PIPELINE_STEP_ERROR } from '@src/constants/resources'; import { ErrorNotification } from '@src/components/ErrorNotification'; import { shouldMetricsLoad } from '@src/context/stepper/StepperSlice'; import { useAppDispatch, useAppSelector } from '@src/hooks'; -import { useEffect, useMemo, useState } from 'react'; import { Loading } from '@src/components/Loading'; +import { useEffect, useState } from 'react'; import { store } from '@src/store'; interface pipelineMetricSelectionProps { @@ -55,17 +55,18 @@ export const PipelineMetricSelection = ({ const { id, organization, pipelineName, step } = pipelineSetting; const dispatch = useAppDispatch(); const { isLoading, errorMessage, getSteps } = useGetMetricsStepsEffect(); - const organizationNameOptions = selectPipelineOrganizations(store.getState()); - const pipelineNameOptions = selectPipelineNames(store.getState(), organization); - const stepsOptions = selectSteps(store.getState(), organization, pipelineName); - const organizationWarningMessage = selectOrganizationWarningMessage(store.getState(), id); - const pipelineNameWarningMessage = selectPipelineNameWarningMessage(store.getState(), id); - const stepWarningMessage = selectStepWarningMessage(store.getState(), id); + const storeContext = store.getState(); + const organizationNameOptions = selectPipelineOrganizations(storeContext); + const pipelineNameOptions = selectPipelineNames(storeContext, organization); + const stepsOptions = selectSteps(storeContext, organization, pipelineName); + const organizationWarningMessage = selectOrganizationWarningMessage(storeContext, id); + const pipelineNameWarningMessage = selectPipelineNameWarningMessage(storeContext, id); + const stepWarningMessage = selectStepWarningMessage(storeContext, id); const [isShowNoStepWarning, setIsShowNoStepWarning] = useState(false); const shouldLoad = useAppSelector(shouldMetricsLoad); const shouldGetPipelineConfig = useAppSelector(selectShouldGetPipelineConfig); - const validStepValue = useMemo(() => (stepsOptions.includes(step) ? step : ''), [step, stepsOptions]); + const validStepValue = stepsOptions.includes(step) ? step : ''; const handleRemoveClick = () => { onRemovePipeline(id); diff --git a/frontend/src/context/Metrics/metricsSlice.ts b/frontend/src/context/Metrics/metricsSlice.ts index 5dc1a73cdd..b6b23559bb 100644 --- a/frontend/src/context/Metrics/metricsSlice.ts +++ b/frontend/src/context/Metrics/metricsSlice.ts @@ -41,6 +41,7 @@ export interface ICycleTimeSetting { export interface ISavedMetricsSettingState { shouldGetBoardConfig: boolean; shouldGetPipeLineConfig: boolean; + shouldRetryPipelineConfig: boolean; jiraColumns: { key: string; value: { name: string; statuses: string[] } }[]; targetFields: { name: string; key: string; flag: boolean }[]; users: string[]; @@ -77,6 +78,7 @@ export interface ISavedMetricsSettingState { const initialState: ISavedMetricsSettingState = { shouldGetBoardConfig: false, shouldGetPipeLineConfig: false, + shouldRetryPipelineConfig: false, jiraColumns: [], targetFields: [], users: [], @@ -596,6 +598,10 @@ export const metricsSlice = createSlice({ updateFirstTimeRoadMetricsBoardData: (state, action) => { state.firstTimeRoadMetricData = action.payload; }, + + updateShouldRetryPipelineConfig: (state, action) => { + state.shouldRetryPipelineConfig = action.payload; + }, }, }); @@ -623,6 +629,7 @@ export const { updateShouldGetPipelineConfig, updateReworkTimesSettings, updateFirstTimeRoadMetricsBoardData, + updateShouldRetryPipelineConfig, } = metricsSlice.actions; export const selectShouldGetBoardConfig = (state: RootState) => state.metrics.shouldGetBoardConfig; @@ -640,6 +647,7 @@ export const selectAssigneeFilter = (state: RootState) => state.metrics.assignee export const selectCycleTimeWarningMessage = (state: RootState) => state.metrics.cycleTimeWarningMessage; export const selectClassificationWarningMessage = (state: RootState) => state.metrics.classificationWarningMessage; export const selectRealDoneWarningMessage = (state: RootState) => state.metrics.realDoneWarningMessage; +export const selectShouldRetryPipelineConfig = (state: RootState) => state.metrics.shouldRetryPipelineConfig; export const selectOrganizationWarningMessage = (state: RootState, id: number) => { const { deploymentWarningMessage } = state.metrics; diff --git a/frontend/src/context/config/configSlice.ts b/frontend/src/context/config/configSlice.ts index 35e34b952c..882852a496 100644 --- a/frontend/src/context/config/configSlice.ts +++ b/frontend/src/context/config/configSlice.ts @@ -268,22 +268,23 @@ export const selectStepsParams = (state: RootState, organizationName: string, pi (pipeline) => pipeline.name === pipelineName && pipeline.orgName === organizationName, ); - const { startDate, endDate } = state.config.basic.dateRange[0]; const pipelineType = state.config.pipelineTool.config.type; const token = state.config.pipelineTool.config.token; return { - params: { - pipelineName: pipeline?.name ?? '', - repository: pipeline?.repository ?? '', - orgName: pipeline?.orgName ?? '', - startTime: dayjs(startDate).startOf('date').valueOf(), - endTime: dayjs(endDate).endOf('date').valueOf(), - }, buildId: pipeline?.id ?? '', organizationId: pipeline?.orgId ?? '', pipelineType, token, + params: state.config.basic.dateRange.map((dateRange) => { + return { + pipelineName: pipeline?.name ?? '', + repository: pipeline?.repository ?? '', + orgName: pipeline?.orgName ?? '', + startTime: dayjs(dateRange.startDate).startOf('date').valueOf(), + endTime: dayjs(dateRange.endDate).endOf('date').valueOf(), + }; + }), }; }; diff --git a/frontend/src/hooks/useGetMetricsStepsEffect.ts b/frontend/src/hooks/useGetMetricsStepsEffect.ts index f73f7a0120..ed2e679931 100644 --- a/frontend/src/hooks/useGetMetricsStepsEffect.ts +++ b/frontend/src/hooks/useGetMetricsStepsEffect.ts @@ -1,51 +1,86 @@ -import { getStepsParams, metricsClient } from '@src/clients/MetricsClient'; +import { updateShouldRetryPipelineConfig } from '@src/context/Metrics/metricsSlice'; +import { IStepsParams, IStepsRes, metricsClient } from '@src/clients/MetricsClient'; +import { useAppDispatch } from '@src/hooks/useAppDispatch'; +import { TimeoutError } from '@src/errors/TimeoutError'; import { MESSAGE } from '@src/constants/resources'; import { DURATION } from '@src/constants/commons'; import { useState } from 'react'; export interface useGetMetricsStepsEffectInterface { getSteps: ( - params: getStepsParams, + params: IStepsParams[], organizationId: string, buildId: string, pipelineType: string, token: string, - ) => Promise< - | { - haveStep: boolean; - response: string[]; - branches: string[]; - pipelineCrews: string[]; - } - | undefined - >; + ) => Promise; isLoading: boolean; errorMessage: string; } +const TIMEOUT = 'timeout'; + +function isAllTimeoutError(allStepsRes: PromiseSettledResult[]) { + return allStepsRes.every((stepInfo) => { + return (stepInfo as PromiseRejectedResult).reason instanceof TimeoutError; + }); +} + export const useGetMetricsStepsEffect = (): useGetMetricsStepsEffectInterface => { + const dispatch = useAppDispatch(); const [isLoading, setIsLoading] = useState(false); const [errorMessage, setErrorMessage] = useState(''); const getSteps = async ( - params: getStepsParams, + params: IStepsParams[], organizationId: string, buildId: string, pipelineType: string, token: string, ) => { setIsLoading(true); - try { - return await metricsClient.getSteps(params, organizationId, buildId, pipelineType, token); - } catch (e) { - const err = e as Error; - setErrorMessage(`${MESSAGE.GET_STEPS_FAILED} ${pipelineType} steps: ${err.message}`); - setTimeout(() => { - setErrorMessage(''); - }, DURATION.ERROR_MESSAGE_TIME); - } finally { - setIsLoading(false); + const allStepsRes = await Promise.allSettled( + params.map((param) => { + return metricsClient.getSteps(param, organizationId, buildId, pipelineType, token); + }), + ); + setIsLoading(false); + if (allStepsRes.every((stepInfo) => stepInfo.status === 'rejected')) { + if (isAllTimeoutError(allStepsRes)) { + dispatch(updateShouldRetryPipelineConfig(true)); + setErrorMessageAndTime(pipelineType, TIMEOUT); + return; + } + setErrorMessageAndTime(pipelineType); + return; } + + return allStepsRes + .filter((stepInfo) => stepInfo.status === 'fulfilled') + .map((stepInfo) => (stepInfo as PromiseFulfilledResult).value) + .reduce( + (accumulator, currentValue) => { + return { + response: Array.from(new Set([...accumulator.response, ...currentValue.response])), + haveStep: accumulator.haveStep || currentValue.haveStep, + branches: Array.from(new Set([...accumulator.branches, ...currentValue.branches])), + pipelineCrews: Array.from(new Set([...accumulator.pipelineCrews, ...currentValue.pipelineCrews])), + }; + }, + { + response: [], + haveStep: false, + branches: [], + pipelineCrews: [], + } as IStepsRes, + ); + }; + + const setErrorMessageAndTime = (pipelineType: string, errReason?: string) => { + setErrorMessage(`${MESSAGE.GET_STEPS_FAILED} ${pipelineType} steps${errReason ? ': ' + errReason : ''}`); + setTimeout(() => { + setErrorMessage(''); + }, DURATION.ERROR_MESSAGE_TIME); }; return { isLoading, getSteps, errorMessage }; diff --git a/frontend/src/hooks/useGetPipelineToolInfoEffect.ts b/frontend/src/hooks/useGetPipelineToolInfoEffect.ts index 176a53865b..115cbae509 100644 --- a/frontend/src/hooks/useGetPipelineToolInfoEffect.ts +++ b/frontend/src/hooks/useGetPipelineToolInfoEffect.ts @@ -3,15 +3,13 @@ import { isPipelineToolVerified, selectIsProjectCreated, selectPipelineTool, - selectDateRange, } from '@src/context/config/configSlice'; import { pipelineToolClient, IGetPipelineToolInfoResult } from '@src/clients/pipeline/PipelineToolClient'; import { selectShouldGetPipelineConfig, updatePipelineSettings } from '@src/context/Metrics/metricsSlice'; import { clearMetricsPipelineFormMeta } from '@src/context/meta/metaSlice'; -import { useEffect, useState, useRef, useCallback, useMemo } from 'react'; import { shouldMetricsLoad } from '@src/context/stepper/StepperSlice'; +import { useEffect, useState, useRef, useCallback } from 'react'; import { useAppDispatch, useAppSelector } from '@src/hooks'; -import { sortDateRanges } from '@src/utils/util'; export interface IUseVerifyPipeLineToolStateInterface { result: IGetPipelineToolInfoResult; @@ -32,8 +30,6 @@ export const useGetPipelineToolInfoEffect = (): IUseVerifyPipeLineToolStateInter const pipelineToolVerified = useAppSelector(isPipelineToolVerified); const isProjectCreated = useAppSelector(selectIsProjectCreated); const restoredPipelineTool = useAppSelector(selectPipelineTool); - const dateRange = useAppSelector(selectDateRange); - const sortedDateRanges = useMemo(() => sortDateRanges(dateRange), [dateRange]); const shouldLoad = useAppSelector(shouldMetricsLoad); const shouldGetPipelineConfig = useAppSelector(selectShouldGetPipelineConfig); @@ -41,8 +37,6 @@ export const useGetPipelineToolInfoEffect = (): IUseVerifyPipeLineToolStateInter const params = { type: restoredPipelineTool.type, token: restoredPipelineTool.token, - startTime: sortedDateRanges[0]?.startDate, - endTime: sortedDateRanges[0]?.endDate, }; setIsLoading(true); try { @@ -53,14 +47,7 @@ export const useGetPipelineToolInfoEffect = (): IUseVerifyPipeLineToolStateInter } finally { setIsLoading(false); } - }, [ - dispatch, - isProjectCreated, - pipelineToolVerified, - restoredPipelineTool.type, - restoredPipelineTool.token, - sortedDateRanges, - ]); + }, [dispatch, isProjectCreated, pipelineToolVerified, restoredPipelineTool.type, restoredPipelineTool.token]); useEffect(() => { if (!apiTouchedRef.current && !isLoading && shouldLoad && shouldGetPipelineConfig) { From bb3e0b9f64172997bcc4b739332ca6fec62fb5b3 Mon Sep 17 00:00:00 2001 From: yulongcai <141199398+yulongcai@users.noreply.github.com> Date: Fri, 19 Apr 2024 14:11:13 +0800 Subject: [PATCH 28/81] ADM-914:[backend][frontend] feat: set file name with time range when generate file (#1386) * ADM-914:[backend][frontend] feat: set file name with time range when generate file * ADM-914:[backend][frontend]fix: fix code issue and update export url * ADM-914:[backend]fix: update export path * ADM-914:[frontend]fix: fix download url * ADM-914:[backend]fix: check filename * ADM-914:[backend]fix: check invalid time range time stamp * ADM-914:[backend]fix: fix sonar issue * ADM-914:[backend]feat: add start time and end time param in api * ADM-914:[backend]fix: fix sonar issue * ADM-914:[backend]fix: format code * ADM-914:[backend]fix: fix sonar issue * ADM-914:[backend]fix: fix un Security code * ADM-914:[frontend]fix: fix mock url * ADM-914:[backend]fix: fix sonar and call back url * ADM-914:[backend]fix: fix sonar issue * ADM-914:[backend]fix: add pattern for time * ADM-914:[backend]fix: fix sonar issue * ADM-914:[backend]fix: format issue code * ADM-914:[backend]fix: fix sonar error --------- Co-authored-by: Tingyu Dong --- .../controller/report/ReportController.java | 37 ++++-- .../dto/request/GenerateReportRequest.java | 20 ++- .../service/report/CSVFileGenerator.java | 33 +++-- .../report/GenerateReporterService.java | 71 +++++----- .../service/report/KanbanCsvService.java | 9 +- .../service/report/ReportService.java | 36 ++++-- .../src/main/java/heartbeat/util/IdUtil.java | 16 +-- .../main/java/heartbeat/util/TimeUtil.java | 5 + .../report/ReporterControllerTest.java | 36 ++++-- .../request/GenerateReportRequestTest.java | 14 +- .../handler/AsyncExceptionHandlerTest.java | 22 ++-- .../AsyncReportRequestHandlerTest.java | 6 +- .../service/report/CSVFileGeneratorTest.java | 47 ++++--- .../report/GenerateReporterServiceTest.java | 122 +++++++++++------- .../service/report/KanbanCsvServiceTest.java | 51 +++++++- .../service/report/ReportServiceTest.java | 114 +++++++++------- .../test/java/heartbeat/util/IdUtilTest.java | 6 +- frontend/__tests__/fixtures.ts | 2 +- frontend/src/clients/report/CSVClient.ts | 8 +- 19 files changed, 421 insertions(+), 234 deletions(-) diff --git a/backend/src/main/java/heartbeat/controller/report/ReportController.java b/backend/src/main/java/heartbeat/controller/report/ReportController.java index cfb7f506cc..64446c477f 100644 --- a/backend/src/main/java/heartbeat/controller/report/ReportController.java +++ b/backend/src/main/java/heartbeat/controller/report/ReportController.java @@ -6,6 +6,8 @@ import heartbeat.controller.report.dto.response.ReportResponse; import heartbeat.service.report.GenerateReporterService; import heartbeat.service.report.ReportService; +import heartbeat.util.TimeUtil; +import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; @@ -15,12 +17,12 @@ import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.bind.annotation.PostMapping; @RestController @RequiredArgsConstructor @@ -37,22 +39,27 @@ public class ReportController { @Value("${callback.interval}") private Integer interval; - @GetMapping("/{reportType}/{filename}") + @GetMapping("/{reportType}/{timeStamp}") public InputStreamResource exportCSV( @Schema(type = "string", allowableValues = { "metric", "pipeline", "board" }, - accessMode = Schema.AccessMode.READ_ONLY) @PathVariable() ReportType reportType, - @PathVariable String filename) { - log.info("Start to export CSV file_reportType: {}, filename: {}", reportType.getValue(), filename); - InputStreamResource result = reportService.exportCsv(reportType, Long.parseLong(filename)); - log.info("Successfully get CSV file_reportType: {}, filename: {}, _result: {}", reportType.getValue(), filename, - result); + accessMode = Schema.AccessMode.READ_ONLY) @PathVariable ReportType reportType, + @PathVariable String timeStamp, + @Schema(type = "string", example = "20240310", pattern = "^[0-9]{8}$") @Parameter String startTime, + @Schema(type = "string", example = "20240409", pattern = "^[0-9]{8}$") @Parameter String endTime) { + log.info("Start to export CSV file_reportType: {}, filename: {}", reportType.getValue(), timeStamp); + InputStreamResource result = reportService.exportCsv(reportType, timeStamp, startTime, endTime); + log.info("Successfully get CSV file_reportType: {}, filename: {}, _result: {}", reportType.getValue(), + timeStamp, result); return result; } - @GetMapping("/{reportId}") - public ResponseEntity generateReport(@PathVariable String reportId) { - log.info("Start to generate report_reportId: {}", reportId); - ReportResponse reportResponse = generateReporterService.getComposedReportResponse(reportId); + @GetMapping("/{timeStamp}") + public ResponseEntity generateReport(@PathVariable String timeStamp, + @Schema(type = "string", example = "20240310", pattern = "^[0-9]{8}$") @Parameter String startTime, + @Schema(type = "string", example = "20240409", pattern = "^[0-9]{8}$") @Parameter String endTime) { + log.info("Start to generate report_reportId: {}", timeStamp); + ReportResponse reportResponse = generateReporterService.getComposedReportResponse(timeStamp, startTime, + endTime); return ResponseEntity.status(HttpStatus.OK).body(reportResponse); } @@ -60,7 +67,9 @@ public ResponseEntity generateReport(@PathVariable String report public ResponseEntity generateReport(@RequestBody GenerateReportRequest request) { log.info("Start to generate report"); reportService.generateReport(request); - String callbackUrl = "/reports/" + request.getCsvTimeStamp(); + String callbackUrl = "/reports/" + request.getCsvTimeStamp() + "?startTime=" + + TimeUtil.convertToChinaSimpleISOFormat(Long.parseLong(request.getStartTime())) + "&endTime=" + + TimeUtil.convertToChinaSimpleISOFormat(Long.parseLong(request.getEndTime())); log.info("Successfully generate report"); return ResponseEntity.status(HttpStatus.ACCEPTED) .body(CallbackResponse.builder().callbackUrl(callbackUrl).interval(interval).build()); diff --git a/backend/src/main/java/heartbeat/controller/report/dto/request/GenerateReportRequest.java b/backend/src/main/java/heartbeat/controller/report/dto/request/GenerateReportRequest.java index 5444a78e7e..6431c875f0 100644 --- a/backend/src/main/java/heartbeat/controller/report/dto/request/GenerateReportRequest.java +++ b/backend/src/main/java/heartbeat/controller/report/dto/request/GenerateReportRequest.java @@ -4,6 +4,7 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import heartbeat.util.IdUtil; import heartbeat.util.MetricsUtil; +import heartbeat.util.TimeUtil; import jakarta.validation.constraints.NotBlank; import lombok.AllArgsConstructor; import lombok.Builder; @@ -69,18 +70,25 @@ public List getBoardMetrics() { } @JsonIgnore - public String getPipelineReportId() { - return IdUtil.getPipelineReportId(this.csvTimeStamp); + public String getTimeRangeAndTimeStamp() { + return TimeUtil.convertToChinaSimpleISOFormat(Long.parseLong(this.startTime)) + "-" + + TimeUtil.convertToChinaSimpleISOFormat(Long.parseLong(this.endTime)) + "-" + this.csvTimeStamp; + + } + + @JsonIgnore + public String getPipelineReportFileId() { + return IdUtil.getPipelineReportFileId(this.getTimeRangeAndTimeStamp()); } @JsonIgnore - public String getSourceControlReportId() { - return IdUtil.getSourceControlReportId(this.csvTimeStamp); + public String getSourceControlReportFileId() { + return IdUtil.getSourceControlReportFileId(this.getTimeRangeAndTimeStamp()); } @JsonIgnore - public String getBoardReportId() { - return IdUtil.getBoardReportId(this.csvTimeStamp); + public String getBoardReportFileId() { + return IdUtil.getBoardReportFileId(this.getTimeRangeAndTimeStamp()); } @JsonIgnore diff --git a/backend/src/main/java/heartbeat/service/report/CSVFileGenerator.java b/backend/src/main/java/heartbeat/service/report/CSVFileGenerator.java index 349168149d..5e54225b37 100644 --- a/backend/src/main/java/heartbeat/service/report/CSVFileGenerator.java +++ b/backend/src/main/java/heartbeat/service/report/CSVFileGenerator.java @@ -43,6 +43,7 @@ import java.io.FileWriter; import java.io.IOException; import java.io.InputStream; +import java.nio.file.Path; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -65,14 +66,18 @@ public class CSVFileGenerator { public static final String FILE_LOCAL_PATH = "./app/output/csv"; + private static final Path FILE_PATH = new File(FILE_LOCAL_PATH).toPath().normalize(); + private static final String CANCELED_STATUS = "canceled"; private static final String REWORK_FIELD = "Rework"; - private static InputStreamResource readStringFromCsvFile(String fileName) { + public static InputStreamResource readStringFromCsvFile(File file) { + if (!file.toPath().normalize().startsWith(FILE_PATH)) { + throw new IllegalArgumentException("Invalid file path"); + } try { - InputStream inputStream = new FileInputStream(fileName); - + InputStream inputStream = new FileInputStream(file); return new InputStreamResource(inputStream); } catch (IOException e) { @@ -157,14 +162,18 @@ private String[] getRowData(PipelineCSVInfo csvInfo) { pipelineFinishTime, totalTime, prLeadTime, pipelineLeadTime, state, branch, isRevert }; } - public InputStreamResource getDataFromCSV(ReportType reportDataType, long csvTimeStamp) { + public InputStreamResource getDataFromCSV(ReportType reportDataType, String timeRangeAndTimeStamp) { + if (timeRangeAndTimeStamp.contains("..") || timeRangeAndTimeStamp.contains("/") + || timeRangeAndTimeStamp.contains("\\")) { + throw new IllegalArgumentException("Invalid time range time stamp"); + } return switch (reportDataType) { - case METRIC -> readStringFromCsvFile( - CSVFileNameEnum.METRIC.getValue() + FILENAME_SEPARATOR + csvTimeStamp + CSV_EXTENSION); - case PIPELINE -> readStringFromCsvFile( - CSVFileNameEnum.PIPELINE.getValue() + FILENAME_SEPARATOR + csvTimeStamp + CSV_EXTENSION); - default -> readStringFromCsvFile( - CSVFileNameEnum.BOARD.getValue() + FILENAME_SEPARATOR + csvTimeStamp + CSV_EXTENSION); + case METRIC -> readStringFromCsvFile(new File(FILE_LOCAL_PATH, + ReportType.METRIC.getValue() + FILENAME_SEPARATOR + timeRangeAndTimeStamp + CSV_EXTENSION)); + case PIPELINE -> readStringFromCsvFile(new File(FILE_LOCAL_PATH, + ReportType.PIPELINE.getValue() + FILENAME_SEPARATOR + timeRangeAndTimeStamp + CSV_EXTENSION)); + default -> readStringFromCsvFile(new File(FILE_LOCAL_PATH, + ReportType.BOARD.getValue() + FILENAME_SEPARATOR + timeRangeAndTimeStamp + CSV_EXTENSION)); }; } @@ -182,10 +191,10 @@ public void convertBoardDataToCSV(List cardDTOList, List generateCSVForPipeline(request, fetchedData.getBuildKiteData())); } } private void generatePipelineReport(GenerateReportRequest request, FetchedData fetchedData) { - String pipelineReportId = request.getPipelineReportId(); + String pipelineReportId = request.getPipelineReportFileId(); log.info( "Start to generate pipeline report, _metrics: {}, _considerHoliday: {}, _startTime: {}, _endTime: {}, _pipelineReportId: {}", request.getPipelineMetrics(), request.getConsiderHoliday(), request.getStartTime(), @@ -145,12 +147,12 @@ private void generatePipelineReport(GenerateReportRequest request, FetchedData f asyncExceptionHandler.put(pipelineReportId, e); if (List.of(401, 403, 404).contains(e.getStatus())) asyncMetricsDataHandler.updateMetricsDataCompletedInHandler( - IdUtil.getDataCompletedPrefix(request.getCsvTimeStamp()), DORA, false); + IdUtil.getDataCompletedPrefix(request.getTimeRangeAndTimeStamp()), DORA, false); } } private void generateSourceControlReport(GenerateReportRequest request, FetchedData fetchedData) { - String sourceControlReportId = request.getSourceControlReportId(); + String sourceControlReportId = request.getSourceControlReportFileId(); log.info( "Start to generate source control report, _metrics: {}, _considerHoliday: {}, _startTime: {}, _endTime: {}, _sourceControlReportId: {}", request.getSourceControlMetrics(), request.getConsiderHoliday(), request.getStartTime(), @@ -167,7 +169,7 @@ private void generateSourceControlReport(GenerateReportRequest request, FetchedD asyncExceptionHandler.put(sourceControlReportId, e); if (List.of(401, 403, 404).contains(e.getStatus())) asyncMetricsDataHandler.updateMetricsDataCompletedInHandler( - IdUtil.getDataCompletedPrefix(request.getCsvTimeStamp()), DORA, false); + IdUtil.getDataCompletedPrefix(request.getTimeRangeAndTimeStamp()), DORA, false); } } @@ -225,8 +227,8 @@ private synchronized ReportResponse generateBoardReporter(GenerateReportRequest private void generateCsvForBoard(GenerateReportRequest request, FetchedData fetchedData) { kanbanCsvService.generateCsvInfo(request, fetchedData.getCardCollectionInfo().getRealDoneCardCollection(), fetchedData.getCardCollectionInfo().getNonDoneCardCollection()); - asyncMetricsDataHandler - .updateMetricsDataCompletedInHandler(IdUtil.getDataCompletedPrefix(request.getCsvTimeStamp()), BOARD, true); + asyncMetricsDataHandler.updateMetricsDataCompletedInHandler( + IdUtil.getDataCompletedPrefix(request.getTimeRangeAndTimeStamp()), BOARD, true); } private void assembleVelocity(FetchedData fetchedData, ReportResponse reportResponse) { @@ -300,13 +302,13 @@ private void generateCSVForPipeline(GenerateReportRequest request, BuildKiteData List pipelineData = pipelineService.generateCSVForPipeline(request.getStartTime(), request.getEndTime(), buildKiteData, request.getBuildKiteSetting().getDeploymentEnvList()); - csvFileGenerator.convertPipelineDataToCSV(pipelineData, request.getCsvTimeStamp()); - asyncMetricsDataHandler - .updateMetricsDataCompletedInHandler(IdUtil.getDataCompletedPrefix(request.getCsvTimeStamp()), DORA, true); + csvFileGenerator.convertPipelineDataToCSV(pipelineData, request.getTimeRangeAndTimeStamp()); + asyncMetricsDataHandler.updateMetricsDataCompletedInHandler( + IdUtil.getDataCompletedPrefix(request.getTimeRangeAndTimeStamp()), DORA, true); } - public void generateCSVForMetric(ReportResponse reportContent, String csvTimeStamp) { - csvFileGenerator.convertMetricDataToCSV(reportContent, csvTimeStamp); + public void generateCSVForMetric(ReportResponse reportContent, String csvTimeRangeTimeStamp) { + csvFileGenerator.convertMetricDataToCSV(reportContent, csvTimeRangeTimeStamp); } private void saveReporterInHandler(ReportResponse reportContent, String reportId) { @@ -365,30 +367,34 @@ private ReportResponse getReportFromHandler(String reportId) { return asyncReportRequestHandler.getReport(reportId); } - public MetricsDataCompleted checkReportReadyStatus(String reportTimeStamp) { - if (validateExpire(System.currentTimeMillis(), Long.parseLong(reportTimeStamp))) { + public MetricsDataCompleted checkReportReadyStatus(String timeRangeAndTimeStamp) { + String timeStamp = timeRangeAndTimeStamp.substring(timeRangeAndTimeStamp.lastIndexOf(FILENAME_SEPARATOR) + 1); + if (validateExpire(System.currentTimeMillis(), Long.parseLong(timeStamp))) { throw new GenerateReportException("Failed to get report due to report time expires"); } - return asyncMetricsDataHandler.getMetricsDataCompleted(IdUtil.getDataCompletedPrefix(reportTimeStamp)); + return asyncMetricsDataHandler.getMetricsDataCompleted(IdUtil.getDataCompletedPrefix(timeRangeAndTimeStamp)); } - public ReportResponse getComposedReportResponse(String reportId) { - MetricsDataCompleted reportReadyStatus = checkReportReadyStatus(reportId); + public ReportResponse getComposedReportResponse(String timeStamp, String startTime, String endTime) { + String timeRangeAndTimeStamp = startTime + FILENAME_SEPARATOR + endTime + FILENAME_SEPARATOR + timeStamp; + MetricsDataCompleted reportReadyStatus = checkReportReadyStatus(timeRangeAndTimeStamp); - ReportResponse boardReportResponse = getReportFromHandler(IdUtil.getBoardReportId(reportId)); - ReportResponse pipleineReportResponse = getReportFromHandler(IdUtil.getPipelineReportId(reportId)); - ReportResponse sourceControlReportResponse = getReportFromHandler(IdUtil.getSourceControlReportId(reportId)); + ReportResponse boardReportResponse = getReportFromHandler(IdUtil.getBoardReportFileId(timeRangeAndTimeStamp)); + ReportResponse pipelineReportResponse = getReportFromHandler( + IdUtil.getPipelineReportFileId(timeRangeAndTimeStamp)); + ReportResponse sourceControlReportResponse = getReportFromHandler( + IdUtil.getSourceControlReportFileId(timeRangeAndTimeStamp)); - ReportMetricsError reportMetricsError = getReportErrorAndHandleAsyncException(reportId); + ReportMetricsError reportMetricsError = getReportErrorAndHandleAsyncException(timeRangeAndTimeStamp); return ReportResponse.builder() .velocity(getValueOrNull(boardReportResponse, ReportResponse::getVelocity)) .classificationList(getValueOrNull(boardReportResponse, ReportResponse::getClassificationList)) .cycleTime(getValueOrNull(boardReportResponse, ReportResponse::getCycleTime)) .rework(getValueOrNull(boardReportResponse, ReportResponse::getRework)) .exportValidityTime(EXPORT_CSV_VALIDITY_TIME) - .deploymentFrequency(getValueOrNull(pipleineReportResponse, ReportResponse::getDeploymentFrequency)) - .devChangeFailureRate(getValueOrNull(pipleineReportResponse, ReportResponse::getDevChangeFailureRate)) - .devMeanTimeToRecovery(getValueOrNull(pipleineReportResponse, ReportResponse::getDevMeanTimeToRecovery)) + .deploymentFrequency(getValueOrNull(pipelineReportResponse, ReportResponse::getDeploymentFrequency)) + .devChangeFailureRate(getValueOrNull(pipelineReportResponse, ReportResponse::getDevChangeFailureRate)) + .devMeanTimeToRecovery(getValueOrNull(pipelineReportResponse, ReportResponse::getDevMeanTimeToRecovery)) .leadTimeForChanges(getValueOrNull(sourceControlReportResponse, ReportResponse::getLeadTimeForChanges)) .boardMetricsCompleted(reportReadyStatus.boardMetricsCompleted()) .doraMetricsCompleted(reportReadyStatus.doraMetricsCompleted()) @@ -400,9 +406,10 @@ public ReportResponse getComposedReportResponse(String reportId) { } private ReportMetricsError getReportErrorAndHandleAsyncException(String reportId) { - AsyncExceptionDTO boardException = asyncExceptionHandler.get(IdUtil.getBoardReportId(reportId)); - AsyncExceptionDTO pipelineException = asyncExceptionHandler.get(IdUtil.getPipelineReportId(reportId)); - AsyncExceptionDTO sourceControlException = asyncExceptionHandler.get(IdUtil.getSourceControlReportId(reportId)); + AsyncExceptionDTO boardException = asyncExceptionHandler.get(IdUtil.getBoardReportFileId(reportId)); + AsyncExceptionDTO pipelineException = asyncExceptionHandler.get(IdUtil.getPipelineReportFileId(reportId)); + AsyncExceptionDTO sourceControlException = asyncExceptionHandler + .get(IdUtil.getSourceControlReportFileId(reportId)); return ReportMetricsError.builder() .boardMetricsError(handleAsyncExceptionAndGetErrorInfo(boardException)) .pipelineMetricsError(handleAsyncExceptionAndGetErrorInfo(pipelineException)) diff --git a/backend/src/main/java/heartbeat/service/report/KanbanCsvService.java b/backend/src/main/java/heartbeat/service/report/KanbanCsvService.java index c9a0d3e6b2..15022ff53a 100644 --- a/backend/src/main/java/heartbeat/service/report/KanbanCsvService.java +++ b/backend/src/main/java/heartbeat/service/report/KanbanCsvService.java @@ -25,14 +25,12 @@ import heartbeat.service.board.jira.JiraService; import lombok.RequiredArgsConstructor; import lombok.extern.log4j.Log4j2; -import org.apache.commons.collections4.CollectionUtils; import org.springframework.stereotype.Service; import java.net.URI; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; -import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Objects; @@ -41,7 +39,6 @@ import java.util.stream.Stream; import static heartbeat.controller.board.dto.request.CardStepsEnum.BLOCK; -import static heartbeat.controller.board.dto.request.CardStepsEnum.FLAG; import static heartbeat.controller.board.dto.request.CardStepsEnum.reworkJudgmentMap; @Service @@ -104,11 +101,11 @@ public void generateCsvInfo(GenerateReportRequest request, CardCollection realDo } this.generateCSVForBoard(realDoneCardCollection.getJiraCardDTOList(), nonDoneCardCollection.getJiraCardDTOList(), jiraColumns.getJiraColumnResponse(), - jiraBoardSetting.getTargetFields(), request.getCsvTimeStamp(), reworkState, reworkFromStates); + jiraBoardSetting.getTargetFields(), request.getTimeRangeAndTimeStamp(), reworkState, reworkFromStates); } private void generateCSVForBoard(List allDoneCards, List nonDoneCards, - List jiraColumns, List targetFields, String csvTimeStamp, + List jiraColumns, List targetFields, String csvTimeRangeTimeStamp, CardStepsEnum reworkState, List reworkFromStates) { List cardDTOList = new ArrayList<>(); List emptyJiraCard = List.of(JiraCardDTO.builder().build()); @@ -181,7 +178,7 @@ private void generateCSVForBoard(List allDoneCards, List nonDoneCards, List jiraColumns) { diff --git a/backend/src/main/java/heartbeat/service/report/ReportService.java b/backend/src/main/java/heartbeat/service/report/ReportService.java index 3f355ede28..3e8778e3f6 100644 --- a/backend/src/main/java/heartbeat/service/report/ReportService.java +++ b/backend/src/main/java/heartbeat/service/report/ReportService.java @@ -10,6 +10,7 @@ import heartbeat.handler.AsyncMetricsDataHandler; import heartbeat.service.report.calculator.ReportGenerator; import heartbeat.util.IdUtil; +import heartbeat.util.TimeUtil; import lombok.RequiredArgsConstructor; import org.springframework.core.io.InputStreamResource; import org.springframework.stereotype.Service; @@ -37,11 +38,16 @@ public class ReportService { private final ReportGenerator reportGenerator; - public InputStreamResource exportCsv(ReportType reportDataType, long csvTimestamp) { - if (isExpiredTimeStamp(csvTimestamp)) { + private static final char FILENAME_SEPARATOR = '-'; + + public InputStreamResource exportCsv(ReportType reportDataType, String csvTimestamp, String startTime, + String endTime) { + + String timeRangeAndTimeStamp = startTime + FILENAME_SEPARATOR + endTime + FILENAME_SEPARATOR + csvTimestamp; + if (isExpiredTimeStamp(Long.parseLong(csvTimestamp))) { throw new NotFoundException("Failed to fetch CSV data due to CSV not found"); } - return csvFileGenerator.getDataFromCSV(reportDataType, csvTimestamp); + return csvFileGenerator.getDataFromCSV(reportDataType, timeRangeAndTimeStamp); } private boolean isExpiredTimeStamp(long timeStamp) { @@ -50,8 +56,8 @@ private boolean isExpiredTimeStamp(long timeStamp) { public void generateReport(GenerateReportRequest request) { List metricTypes = request.getMetricTypes(); - String timeStamp = request.getCsvTimeStamp(); - initializeMetricsDataCompletedInHandler(metricTypes, timeStamp); + String timeRangeAndTimeStamp = request.getTimeRangeAndTimeStamp(); + initializeMetricsDataCompletedInHandler(metricTypes, timeRangeAndTimeStamp); Map> reportGeneratorMap = reportGenerator .getReportGenerator(generateReporterService); List> threadList = new ArrayList<>(); @@ -66,23 +72,30 @@ public void generateReport(GenerateReportRequest request) { thread.join(); } - ReportResponse reportResponse = generateReporterService.getComposedReportResponse(timeStamp); + ReportResponse reportResponse = generateReporterService.getComposedReportResponse(request.getCsvTimeStamp(), + convertTimeStampToYYYYMMDD(request.getStartTime()), + convertTimeStampToYYYYMMDD(request.getEndTime())); if (isNotGenerateMetricError(reportResponse.getReportMetricsError())) { - generateReporterService.generateCSVForMetric(reportResponse, timeStamp); + generateReporterService.generateCSVForMetric(reportResponse, request.getTimeRangeAndTimeStamp()); } - asyncMetricsDataHandler.updateOverallMetricsCompletedInHandler(IdUtil.getDataCompletedPrefix(timeStamp)); + asyncMetricsDataHandler.updateOverallMetricsCompletedInHandler( + IdUtil.getDataCompletedPrefix(request.getTimeRangeAndTimeStamp())); }); } + private String convertTimeStampToYYYYMMDD(String timeStamp) { + return TimeUtil.convertToChinaSimpleISOFormat(Long.parseLong(timeStamp)); + } + private boolean isNotGenerateMetricError(ReportMetricsError reportMetricsError) { return Objects.isNull(reportMetricsError.getBoardMetricsError()) && Objects.isNull(reportMetricsError.getSourceControlMetricsError()) && Objects.isNull(reportMetricsError.getPipelineMetricsError()); } - private void initializeMetricsDataCompletedInHandler(List metricTypes, String timeStamp) { + private void initializeMetricsDataCompletedInHandler(List metricTypes, String timeRangeAndTimeStamp) { MetricsDataCompleted previousMetricsDataCompleted = asyncMetricsDataHandler - .getMetricsDataCompleted(IdUtil.getDataCompletedPrefix(timeStamp)); + .getMetricsDataCompleted(IdUtil.getDataCompletedPrefix(timeRangeAndTimeStamp)); Boolean initializeBoardMetricsCompleted = null; Boolean initializeDoraMetricsCompleted = null; if (!Objects.isNull(previousMetricsDataCompleted)) { @@ -90,7 +103,8 @@ private void initializeMetricsDataCompletedInHandler(List metricType initializeDoraMetricsCompleted = previousMetricsDataCompleted.doraMetricsCompleted(); } asyncMetricsDataHandler - .putMetricsDataCompleted(IdUtil.getDataCompletedPrefix(timeStamp), MetricsDataCompleted.builder() + .putMetricsDataCompleted(IdUtil.getDataCompletedPrefix(timeRangeAndTimeStamp), MetricsDataCompleted + .builder() .boardMetricsCompleted(metricTypes.contains(BOARD) ? Boolean.FALSE : initializeBoardMetricsCompleted) .doraMetricsCompleted(metricTypes.contains(DORA) ? Boolean.FALSE : initializeDoraMetricsCompleted) .overallMetricCompleted(Boolean.FALSE) diff --git a/backend/src/main/java/heartbeat/util/IdUtil.java b/backend/src/main/java/heartbeat/util/IdUtil.java index d9181768af..de23eb0496 100644 --- a/backend/src/main/java/heartbeat/util/IdUtil.java +++ b/backend/src/main/java/heartbeat/util/IdUtil.java @@ -10,20 +10,20 @@ public interface IdUtil { String DATA_COMPLETED_PREFIX = "dataCompleted-"; - static String getBoardReportId(String timeStamp) { - return BOARD_REPORT_PREFIX + timeStamp; + static String getBoardReportFileId(String timeRangeAndTimeStamp) { + return BOARD_REPORT_PREFIX + timeRangeAndTimeStamp; } - static String getPipelineReportId(String timeStamp) { - return PIPELINE_REPORT_PREFIX + timeStamp; + static String getPipelineReportFileId(String timeRangeAndTimeStamp) { + return PIPELINE_REPORT_PREFIX + timeRangeAndTimeStamp; } - static String getSourceControlReportId(String timeStamp) { - return SOURCE_CONTROL_PREFIX + timeStamp; + static String getSourceControlReportFileId(String timeRangeAndTimeStamp) { + return SOURCE_CONTROL_PREFIX + timeRangeAndTimeStamp; } - static String getDataCompletedPrefix(String timeStamp) { - return DATA_COMPLETED_PREFIX + timeStamp; + static String getDataCompletedPrefix(String timeRangeAndTimeStamp) { + return DATA_COMPLETED_PREFIX + timeRangeAndTimeStamp; } } diff --git a/backend/src/main/java/heartbeat/util/TimeUtil.java b/backend/src/main/java/heartbeat/util/TimeUtil.java index 7e56782ba3..25cf49acfe 100644 --- a/backend/src/main/java/heartbeat/util/TimeUtil.java +++ b/backend/src/main/java/heartbeat/util/TimeUtil.java @@ -32,6 +32,11 @@ static String convertToSimpleISOFormat(Long timestamp) { return dateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); } + static String convertToChinaSimpleISOFormat(Long timestamp) { + LocalDateTime dateTime = LocalDateTime.ofInstant(Instant.ofEpochMilli(timestamp), ZoneId.of("Asia/Shanghai")); + return dateTime.format(DateTimeFormatter.ofPattern("yyyyMMdd")); + } + static String msToHMS(long timeStamp) { long tempTimeStamp = timeStamp; long milliseconds = tempTimeStamp % 1000; diff --git a/backend/src/test/java/heartbeat/controller/report/ReporterControllerTest.java b/backend/src/test/java/heartbeat/controller/report/ReporterControllerTest.java index 9b29650093..b49dc00daf 100644 --- a/backend/src/test/java/heartbeat/controller/report/ReporterControllerTest.java +++ b/backend/src/test/java/heartbeat/controller/report/ReporterControllerTest.java @@ -31,9 +31,9 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.doThrow; +import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import static org.mockito.Mockito.times; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; @@ -58,18 +58,25 @@ class ReporterControllerTest { private final ObjectMapper mapper = new ObjectMapper(); + public static final String START_TIME = "20240310"; + + public static final String END_TIME = "20240409"; + @Test void shouldGetSuccessDataGivenReportId() throws Exception { - String reportId = Long.toString(System.currentTimeMillis()); + String timeStamp = Long.toString(System.currentTimeMillis()); ReportResponse MockReportResponse = ReportResponse.builder() .boardMetricsCompleted(true) .allMetricsCompleted(true) .build(); - when(generateReporterService.getComposedReportResponse(reportId)).thenReturn(MockReportResponse); + when(generateReporterService.getComposedReportResponse(timeStamp, START_TIME, END_TIME)) + .thenReturn(MockReportResponse); String reportResponseString = mockMvc - .perform(get("/reports/{reportId}", reportId).contentType(MediaType.APPLICATION_JSON)) + .perform(get("/reports/{reportId}", timeStamp).param("startTime", START_TIME) + .param("endTime", END_TIME) + .contentType(MediaType.APPLICATION_JSON)) .andExpect(status().isOk()) .andExpect(jsonPath("$.allMetricsCompleted").value(true)) .andReturn() @@ -77,7 +84,7 @@ void shouldGetSuccessDataGivenReportId() throws Exception { .getContentAsString(); ReportResponse response = mapper.readValue(reportResponseString, new TypeReference<>() { }); - verify(generateReporterService).getComposedReportResponse(any()); + verify(generateReporterService).getComposedReportResponse(any(), any(), any()); assertEquals(true, response.getBoardMetricsCompleted()); assertEquals(true, response.getAllMetricsCompleted()); } @@ -87,26 +94,28 @@ void shouldReturn500StatusWhenRequestGenerateReportGivenReportTimeIsExpired() th String reportId = Long.toString(System.currentTimeMillis() - EXPORT_CSV_VALIDITY_TIME - 200L); doThrow(new GenerateReportException("Failed to get report due to report time expires")) .when(generateReporterService) - .getComposedReportResponse(any()); + .getComposedReportResponse(any(), any(), any()); mockMvc.perform(get("/reports/{reportId}", reportId).contentType(MediaType.APPLICATION_JSON)) .andExpect(status().isInternalServerError()) .andExpect(jsonPath("$.message").value("Failed to get report due to report time expires")) .andReturn() .getResponse(); - verify(generateReporterService).getComposedReportResponse(any()); + verify(generateReporterService).getComposedReportResponse(any(), any(), any()); } @Test void shouldReturnWhenExportCsv() throws Exception { - long csvTimeStamp = TimeUtils.mockTimeStamp(2023, 5, 25, 18, 21, 20); + long timeStamp = TimeUtils.mockTimeStamp(2023, 5, 25, 18, 21, 20); String expectedResponse = "csv data"; - when(reporterService.exportCsv(ReportType.PIPELINE, csvTimeStamp)) + when(reporterService.exportCsv(ReportType.PIPELINE, String.valueOf(timeStamp), START_TIME, END_TIME)) .thenReturn(new InputStreamResource(new ByteArrayInputStream(expectedResponse.getBytes()))); MockHttpServletResponse response = mockMvc - .perform(get("/reports/{reportType}/{csvTimeStamp}", ReportType.PIPELINE.getValue(), csvTimeStamp)) + .perform(get("/reports/{reportType}/{timeStamp}", ReportType.PIPELINE.getValue(), timeStamp) + .param("startTime", START_TIME) + .param("endTime", END_TIME)) .andExpect(status().isOk()) .andReturn() .getResponse(); @@ -119,7 +128,9 @@ void shouldReturnCallBackUrlWithAcceptedStatusAndInvokeWhenGenerateReportByType( ObjectMapper mapper = new ObjectMapper(); GenerateReportRequest request = mapper.readValue(new File(REQUEST_FILE_PATH), GenerateReportRequest.class); - String currentTimeStamp = "1685010080107"; + String currentTimeStamp = String.valueOf(TimeUtils.mockTimeStamp(2023, 5, 25, 18, 21, 20)); + String startTime = "20220829"; + String endTme = "20220909"; request.setCsvTimeStamp(currentTimeStamp); doAnswer(invocation -> null).when(reporterService).generateReport(request); @@ -128,7 +139,8 @@ void shouldReturnCallBackUrlWithAcceptedStatusAndInvokeWhenGenerateReportByType( .perform(post("/reports").contentType(MediaType.APPLICATION_JSON) .content(mapper.writeValueAsString(request))) .andExpect(status().isAccepted()) - .andExpect(jsonPath("$.callbackUrl").value("/reports/" + currentTimeStamp)) + .andExpect(jsonPath("$.callbackUrl") + .value("/reports/" + currentTimeStamp + "?startTime=" + startTime + "&endTime=" + endTme)) .andExpect(jsonPath("$.interval").value("10")) .andReturn() .getResponse(); diff --git a/backend/src/test/java/heartbeat/controller/report/dto/request/GenerateReportRequestTest.java b/backend/src/test/java/heartbeat/controller/report/dto/request/GenerateReportRequestTest.java index 12324fde17..e3f9c675c7 100644 --- a/backend/src/test/java/heartbeat/controller/report/dto/request/GenerateReportRequestTest.java +++ b/backend/src/test/java/heartbeat/controller/report/dto/request/GenerateReportRequestTest.java @@ -16,6 +16,8 @@ public class GenerateReportRequestTest { private final GenerateReportRequest request = GenerateReportRequest.builder() .metrics(UPPER_METRICS) .csvTimeStamp("123456789") + .startTime("1710000000000") + .endTime("1712678399999") .build(); @Test @@ -38,13 +40,13 @@ void shouldReturnRelatedMetrics() { @Test void shouldReturnRelatedReportId() { - String boardReportId = request.getBoardReportId(); - String pipelineReportId = request.getPipelineReportId(); - String sourceControlReportId = request.getSourceControlReportId(); + String boardReportId = request.getBoardReportFileId(); + String pipelineReportId = request.getPipelineReportFileId(); + String sourceControlReportId = request.getSourceControlReportFileId(); - Assertions.assertEquals("board-123456789", boardReportId); - Assertions.assertEquals("pipeline-123456789", pipelineReportId); - Assertions.assertEquals("sourceControl-123456789", sourceControlReportId); + Assertions.assertEquals("board-20240310-20240409-123456789", boardReportId); + Assertions.assertEquals("pipeline-20240310-20240409-123456789", pipelineReportId); + Assertions.assertEquals("sourceControl-20240310-20240409-123456789", sourceControlReportId); } } diff --git a/backend/src/test/java/heartbeat/handler/AsyncExceptionHandlerTest.java b/backend/src/test/java/heartbeat/handler/AsyncExceptionHandlerTest.java index 0070b27e6f..bbae219d2e 100644 --- a/backend/src/test/java/heartbeat/handler/AsyncExceptionHandlerTest.java +++ b/backend/src/test/java/heartbeat/handler/AsyncExceptionHandlerTest.java @@ -56,8 +56,8 @@ void shouldDeleteAsyncException() { long fileId = System.currentTimeMillis(); String currentTime = Long.toString(fileId); String expireTime = Long.toString(fileId - 1900000L); - String unExpireFile = IdUtil.getBoardReportId(currentTime); - String expireFile = IdUtil.getBoardReportId(expireTime); + String unExpireFile = IdUtil.getBoardReportFileId(currentTime); + String expireFile = IdUtil.getBoardReportFileId(expireTime); asyncExceptionHandler.put(unExpireFile, new UnauthorizedException("")); asyncExceptionHandler.put(expireFile, new UnauthorizedException("")); @@ -74,8 +74,8 @@ void shouldDeleteAsyncExceptionTmpFile() { long fileId = System.currentTimeMillis(); String currentTime = Long.toString(fileId); String expireTime = Long.toString(fileId - 1900000L); - String unExpireFile = IdUtil.getBoardReportId(currentTime) + ".tmp"; - String expireFile = IdUtil.getBoardReportId(expireTime) + ".tmp"; + String unExpireFile = IdUtil.getBoardReportFileId(currentTime) + ".tmp"; + String expireFile = IdUtil.getBoardReportFileId(expireTime) + ".tmp"; asyncExceptionHandler.put(unExpireFile, new UnauthorizedException("")); asyncExceptionHandler.put(expireFile, new UnauthorizedException("")); @@ -92,8 +92,8 @@ void shouldSafeDeleteAsyncExceptionWhenHaveManyThordToDeleteFile() throws Interr long fileId = System.currentTimeMillis(); String currentTime = Long.toString(fileId); String expireTime = Long.toString(fileId - 1900000L); - String unExpireFile = IdUtil.getBoardReportId(currentTime); - String expireFile = IdUtil.getBoardReportId(expireTime); + String unExpireFile = IdUtil.getBoardReportFileId(currentTime); + String expireFile = IdUtil.getBoardReportFileId(expireTime); asyncExceptionHandler.put(unExpireFile, new UnauthorizedException("")); asyncExceptionHandler.put(expireFile, new UnauthorizedException("")); CyclicBarrier barrier = new CyclicBarrier(3); @@ -125,7 +125,7 @@ void shouldSafeDeleteAsyncExceptionWhenHaveManyThordToDeleteFile() throws Interr void shouldPutAndGetAsyncException() { long currentTimeMillis = System.currentTimeMillis(); String currentTime = Long.toString(currentTimeMillis); - String boardReportId = IdUtil.getBoardReportId(currentTime); + String boardReportId = IdUtil.getBoardReportFileId(currentTime); asyncExceptionHandler.put(boardReportId, new UnauthorizedException("test")); var baseException = asyncExceptionHandler.get(boardReportId); @@ -147,7 +147,7 @@ void shouldThrowExceptionGivenCantWriteFileWhenPutFile() { @Test void shouldThrowExceptionGivenCannotReadFileWhenGetFile() throws IOException { new File("./app/output/error/").mkdirs(); - String boardReportId = IdUtil.getBoardReportId(Long.toString(System.currentTimeMillis())); + String boardReportId = IdUtil.getBoardReportFileId(Long.toString(System.currentTimeMillis())); Path filePath = Paths.get("./app/output/error/" + boardReportId); Files.createFile(filePath); Files.write(filePath, "test".getBytes()); @@ -163,7 +163,7 @@ void shouldCreateTargetDirWhenPutAsyncException() { boolean mkdirs = new File(APP_OUTPUT_ERROR).mkdirs(); long currentTimeMillis = System.currentTimeMillis(); String currentTime = Long.toString(currentTimeMillis); - String boardReportId = IdUtil.getBoardReportId(currentTime); + String boardReportId = IdUtil.getBoardReportFileId(currentTime); asyncExceptionHandler.put(boardReportId, new UnauthorizedException("test")); @@ -177,7 +177,7 @@ void shouldCreateTargetDirWhenPutAsyncException() { void shouldPutAndRemoveAsyncException() { long currentTimeMillis = System.currentTimeMillis(); String currentTime = Long.toString(currentTimeMillis); - String boardReportId = IdUtil.getBoardReportId(currentTime); + String boardReportId = IdUtil.getBoardReportFileId(currentTime); asyncExceptionHandler.put(boardReportId, new UnauthorizedException("test")); AsyncExceptionDTO baseException = asyncExceptionHandler.remove(boardReportId); @@ -190,7 +190,7 @@ void shouldPutAndRemoveAsyncException() { @Test void shouldReturnExceptionGivenWrongFileWhenReadAndRemoveAsyncException() throws IOException { new File("./app/output/error/").mkdirs(); - String boardReportId = IdUtil.getBoardReportId(Long.toString(System.currentTimeMillis())); + String boardReportId = IdUtil.getBoardReportFileId(Long.toString(System.currentTimeMillis())); Path filePath = Paths.get("./app/output/error/" + boardReportId); Files.createFile(filePath); Files.write(filePath, "test".getBytes()); diff --git a/backend/src/test/java/heartbeat/handler/AsyncReportRequestHandlerTest.java b/backend/src/test/java/heartbeat/handler/AsyncReportRequestHandlerTest.java index 5a86093a9e..ac4770be39 100644 --- a/backend/src/test/java/heartbeat/handler/AsyncReportRequestHandlerTest.java +++ b/backend/src/test/java/heartbeat/handler/AsyncReportRequestHandlerTest.java @@ -47,8 +47,8 @@ void shouldDeleteReportWhenReportIsExpire() throws IOException { long currentTimeMillis = System.currentTimeMillis(); String currentTime = Long.toString(currentTimeMillis); String expireTime = Long.toString(currentTimeMillis - 1900000L); - String unExpireFile = IdUtil.getBoardReportId(currentTime); - String expireFile = IdUtil.getBoardReportId(expireTime); + String unExpireFile = IdUtil.getBoardReportFileId(currentTime); + String expireFile = IdUtil.getBoardReportFileId(expireTime); asyncReportRequestHandler.putReport(unExpireFile, ReportResponse.builder().build()); asyncReportRequestHandler.putReport(expireFile, ReportResponse.builder().build()); @@ -64,7 +64,7 @@ void shouldDeleteReportWhenReportIsExpire() throws IOException { void shouldGetAsyncReportWhenPuttingReportIntoAsyncReportRequestHandler() throws IOException { long currentTimeMillis = System.currentTimeMillis(); String currentTime = Long.toString(currentTimeMillis); - String boardReportId = IdUtil.getBoardReportId(currentTime); + String boardReportId = IdUtil.getBoardReportFileId(currentTime); asyncReportRequestHandler.putReport(boardReportId, ReportResponse.builder().build()); diff --git a/backend/src/test/java/heartbeat/service/report/CSVFileGeneratorTest.java b/backend/src/test/java/heartbeat/service/report/CSVFileGeneratorTest.java index 5ae5529d02..12f523280b 100644 --- a/backend/src/test/java/heartbeat/service/report/CSVFileGeneratorTest.java +++ b/backend/src/test/java/heartbeat/service/report/CSVFileGeneratorTest.java @@ -28,6 +28,7 @@ import java.util.List; import java.util.stream.Collectors; +import static heartbeat.tools.TimeUtils.mockTimeStamp; import static org.junit.Assert.assertThrows; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -250,8 +251,7 @@ void shouldHasContentWhenGetDataFromCsvGivenDataTypeIsPipeline() throws IOExcept List pipelineCSVInfos = PipelineCsvFixture.MOCK_PIPELINE_CSV_DATA(); csvFileGenerator.convertPipelineDataToCSV(pipelineCSVInfos, mockTimeStamp); - InputStreamResource inputStreamResource = csvFileGenerator.getDataFromCSV(ReportType.PIPELINE, - Long.parseLong(mockTimeStamp)); + InputStreamResource inputStreamResource = csvFileGenerator.getDataFromCSV(ReportType.PIPELINE, mockTimeStamp); InputStream csvDataInputStream = inputStreamResource.getInputStream(); String csvPipelineData = new BufferedReader(new InputStreamReader(csvDataInputStream)).lines() .collect(Collectors.joining("\n")); @@ -307,7 +307,7 @@ void shouldConvertPipelineDataToCsvGivenTwoOrganizationsPipeline() throws IOExce @Test void shouldThrowExceptionWhenFileNotExist() { List pipelineCSVInfos = PipelineCsvFixture.MOCK_PIPELINE_CSV_DATA(); - assertThrows(FileIOException.class, () -> csvFileGenerator.getDataFromCSV(ReportType.PIPELINE, 123456L)); + assertThrows(FileIOException.class, () -> csvFileGenerator.getDataFromCSV(ReportType.PIPELINE, "123456")); assertThrows(FileIOException.class, () -> csvFileGenerator.convertPipelineDataToCSV(pipelineCSVInfos, "15469:89/033")); } @@ -350,8 +350,7 @@ void shouldGetValueWhenConvertBoardDataToCsvGivenExtraFields() throws IOExceptio List extraFields = BoardCsvFixture.MOCK_EXTRA_FIELDS_WITH_CUSTOM(); csvFileGenerator.convertBoardDataToCSV(cardDTOList, fields, extraFields, mockTimeStamp); - InputStreamResource inputStreamResource = csvFileGenerator.getDataFromCSV(ReportType.BOARD, - Long.parseLong(mockTimeStamp)); + InputStreamResource inputStreamResource = csvFileGenerator.getDataFromCSV(ReportType.BOARD, mockTimeStamp); InputStream csvDataInputStream = inputStreamResource.getInputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(csvDataInputStream)); String header = reader.readLine(); @@ -414,7 +413,7 @@ void shouldThrowExceptionWhenBoardCsvNotExist() { List fields = BoardCsvFixture.MOCK_ALL_FIELDS(); List extraFields = BoardCsvFixture.MOCK_EXTRA_FIELDS(); - assertThrows(FileIOException.class, () -> csvFileGenerator.getDataFromCSV(ReportType.BOARD, 1686710104536L)); + assertThrows(FileIOException.class, () -> csvFileGenerator.getDataFromCSV(ReportType.BOARD, "1686710104536")); assertThrows(FileIOException.class, () -> csvFileGenerator.convertBoardDataToCSV(cardDTOList, fields, extraFields, "15469:89/033")); } @@ -426,8 +425,7 @@ void shouldHasContentWhenGetDataFromCsvGivenDataTypeIsBoard() throws IOException List extraFields = BoardCsvFixture.MOCK_EXTRA_FIELDS(); csvFileGenerator.convertBoardDataToCSV(cardDTOList, fields, extraFields, mockTimeStamp); - InputStreamResource inputStreamResource = csvFileGenerator.getDataFromCSV(ReportType.BOARD, - Long.parseLong(mockTimeStamp)); + InputStreamResource inputStreamResource = csvFileGenerator.getDataFromCSV(ReportType.BOARD, mockTimeStamp); InputStream csvDataInputStream = inputStreamResource.getInputStream(); String boardCsvData = new BufferedReader(new InputStreamReader(csvDataInputStream)).lines() .collect(Collectors.joining("\n")); @@ -480,19 +478,32 @@ void shouldMakeCsvDirWhenNotExistGivenDataTypeIsMetric() throws IOException { void shouldThrowExceptionWhenMetricCsvNotExist() { ReportResponse reportResponse = MetricCsvFixture.MOCK_METRIC_CSV_DATA(); - assertThrows(FileIOException.class, () -> csvFileGenerator.getDataFromCSV(ReportType.METRIC, 1686710104536L)); + assertThrows(FileIOException.class, () -> csvFileGenerator.getDataFromCSV(ReportType.METRIC, "1686710104536")); assertThrows(FileIOException.class, () -> csvFileGenerator.convertMetricDataToCSV(reportResponse, "15469:89/033")); } + @Test + void shouldThrowExceptionWhenTimeStampIsIllegal() { + String mockTimeRangeTimeStampWithBackSlash = mockTimeStamp(2021, 4, 9, 0, 0, 0) + "\\"; + String mockTimeRangeTimeStampWithSlash = mockTimeStamp(2021, 4, 9, 0, 0, 0) + "/"; + String mockTimeRangeTimeStampWithPoint = mockTimeStamp(2021, 4, 9, 0, 0, 0) + ".."; + + assertThrows(IllegalArgumentException.class, + () -> csvFileGenerator.getDataFromCSV(ReportType.METRIC, mockTimeRangeTimeStampWithBackSlash)); + assertThrows(IllegalArgumentException.class, + () -> csvFileGenerator.getDataFromCSV(ReportType.METRIC, mockTimeRangeTimeStampWithSlash)); + assertThrows(IllegalArgumentException.class, + () -> csvFileGenerator.getDataFromCSV(ReportType.METRIC, mockTimeRangeTimeStampWithPoint)); + } + @Test void shouldHasContentWhenGetDataFromCsvGivenDataTypeIsMetric() throws IOException { ReportResponse reportResponse = MetricCsvFixture.MOCK_METRIC_CSV_DATA(); csvFileGenerator.convertMetricDataToCSV(reportResponse, mockTimeStamp); - InputStreamResource inputStreamResource = csvFileGenerator.getDataFromCSV(ReportType.METRIC, - Long.parseLong(mockTimeStamp)); + InputStreamResource inputStreamResource = csvFileGenerator.getDataFromCSV(ReportType.METRIC, mockTimeStamp); InputStream csvDataInputStream = inputStreamResource.getInputStream(); String metricCsvData = new BufferedReader(new InputStreamReader(csvDataInputStream)).lines() .collect(Collectors.joining("\n")); @@ -549,8 +560,7 @@ void shouldHasNoContentWhenGetDataFromCsvGivenDataTypeIsMetricAndResponseIsEmpty ReportResponse reportResponse = MetricCsvFixture.MOCK_EMPTY_METRIC_CSV_DATA(); csvFileGenerator.convertMetricDataToCSV(reportResponse, mockTimeStamp); - InputStreamResource inputStreamResource = csvFileGenerator.getDataFromCSV(ReportType.METRIC, - Long.parseLong(mockTimeStamp)); + InputStreamResource inputStreamResource = csvFileGenerator.getDataFromCSV(ReportType.METRIC, mockTimeStamp); InputStream csvDataInputStream = inputStreamResource.getInputStream(); String metricCsvData = new BufferedReader(new InputStreamReader(csvDataInputStream)).lines() .collect(Collectors.joining("\n")); @@ -567,8 +577,7 @@ void shouldHasNoContentForAveragesWhenGetDataFromCsvGivenDataTypeIsMetricAndTheQ ReportResponse reportResponse = MetricCsvFixture.MOCK_METRIC_CSV_DATA_WITH_ONE_PIPELINE(); csvFileGenerator.convertMetricDataToCSV(reportResponse, mockTimeStamp); - InputStreamResource inputStreamResource = csvFileGenerator.getDataFromCSV(ReportType.METRIC, - Long.parseLong(mockTimeStamp)); + InputStreamResource inputStreamResource = csvFileGenerator.getDataFromCSV(ReportType.METRIC, mockTimeStamp); InputStream csvDataInputStream = inputStreamResource.getInputStream(); String metricCsvData = new BufferedReader(new InputStreamReader(csvDataInputStream)).lines() .collect(Collectors.joining("\n")); @@ -614,4 +623,12 @@ void shouldThrowGenerateReportExceptionWhenGenerateMetricsCsvAndCsvTimeStampInva () -> csvFileGenerator.convertMetricDataToCSV(reportResponse, "../")); } + @Test + void shouldThrowIllegalArgumentExceptionWhenFilePathIsError() { + String fileName = "./app/output/docs/metric-20240310-20240409-127272861371"; + File file = new File(fileName); + + assertThrows(IllegalArgumentException.class, () -> CSVFileGenerator.readStringFromCsvFile(file)); + } + } diff --git a/backend/src/test/java/heartbeat/service/report/GenerateReporterServiceTest.java b/backend/src/test/java/heartbeat/service/report/GenerateReporterServiceTest.java index d7c691e987..f6786fdca1 100644 --- a/backend/src/test/java/heartbeat/service/report/GenerateReporterServiceTest.java +++ b/backend/src/test/java/heartbeat/service/report/GenerateReporterServiceTest.java @@ -144,6 +144,10 @@ class GenerateReporterServiceTest { @Captor ArgumentCaptor exceptionCaptor; + public static final String START_TIME = "20240310"; + + public static final String END_TIME = "20240409"; + @AfterEach void afterEach() { new File(APP_OUTPUT_CSV_PATH).delete(); @@ -169,11 +173,13 @@ void shouldSaveReportResponseWithReworkInfoWhenReworkInfoTimesIsNotEmpty() { ReworkTimesSetting.builder().reworkState("In Dev").excludedStates(List.of()).build()) .build()) .csvTimeStamp(TIMESTAMP) + .startTime("1710000000000") + .endTime("1712678399999") .build(); when(asyncMetricsDataHandler.getMetricsDataCompleted(any())) .thenReturn(MetricsDataCompleted.builder().build()); doAnswer(invocation -> null).when(asyncMetricsDataHandler) - .updateMetricsDataCompletedInHandler(IdUtil.getDataCompletedPrefix(request.getCsvTimeStamp()), + .updateMetricsDataCompletedInHandler(IdUtil.getDataCompletedPrefix(request.getTimeRangeAndTimeStamp()), MetricType.BOARD, true); when(kanbanService.fetchDataFromKanban(request)).thenReturn(FetchedData.CardCollectionInfo.builder() .realDoneCardCollection(CardCollection.builder().build()) @@ -189,10 +195,10 @@ void shouldSaveReportResponseWithReworkInfoWhenReworkInfoTimesIsNotEmpty() { generateReporterService.generateBoardReport(request); - verify(asyncExceptionHandler).remove(request.getBoardReportId()); + verify(asyncExceptionHandler).remove(request.getBoardReportFileId()); verify(kanbanService).fetchDataFromKanban(request); verify(workDay).changeConsiderHolidayMode(false); - verify(asyncReportRequestHandler).putReport(eq(request.getBoardReportId()), + verify(asyncReportRequestHandler).putReport(eq(request.getBoardReportFileId()), responseArgumentCaptor.capture()); ReportResponse response = responseArgumentCaptor.getValue(); assertEquals(2, response.getRework().getFromTesting()); @@ -212,6 +218,8 @@ void shouldSaveReportResponseWithReworkInfoWhenReworkSettingIsNullAndMetricsHasR .buildKiteSetting(BuildKiteSetting.builder().build()) .jiraBoardSetting(JiraBoardSetting.builder().build()) .csvTimeStamp(TIMESTAMP) + .startTime("1710000000000") + .endTime("1712678399999") .build(); when(asyncMetricsDataHandler.getMetricsDataCompleted(any())) .thenReturn(MetricsDataCompleted.builder().build()); @@ -223,10 +231,10 @@ void shouldSaveReportResponseWithReworkInfoWhenReworkSettingIsNullAndMetricsHasR generateReporterService.generateBoardReport(request); - verify(asyncExceptionHandler).remove(request.getBoardReportId()); + verify(asyncExceptionHandler).remove(request.getBoardReportFileId()); verify(kanbanService).fetchDataFromKanban(request); verify(workDay).changeConsiderHolidayMode(false); - verify(asyncReportRequestHandler).putReport(eq(request.getBoardReportId()), + verify(asyncReportRequestHandler).putReport(eq(request.getBoardReportFileId()), responseArgumentCaptor.capture()); ReportResponse response = responseArgumentCaptor.getValue(); assertNull(response.getRework()); @@ -239,18 +247,20 @@ void shouldSaveReportResponseWithoutMetricDataAndUpdateMetricCompletedWhenMetric .metrics(List.of()) .buildKiteSetting(BuildKiteSetting.builder().build()) .csvTimeStamp(TIMESTAMP) + .startTime("1710000000000") + .endTime("1712678399999") .build(); when(asyncMetricsDataHandler.getMetricsDataCompleted(any())) .thenReturn(MetricsDataCompleted.builder().build()); doAnswer(invocation -> null).when(asyncMetricsDataHandler) - .updateMetricsDataCompletedInHandler(IdUtil.getDataCompletedPrefix(request.getCsvTimeStamp()), + .updateMetricsDataCompletedInHandler(IdUtil.getDataCompletedPrefix(request.getTimeRangeAndTimeStamp()), MetricType.BOARD, true); generateReporterService.generateBoardReport(request); verify(kanbanService, never()).fetchDataFromKanban(eq(request)); verify(pipelineService, never()).fetchGitHubData(any()); verify(workDay).changeConsiderHolidayMode(false); - verify(asyncReportRequestHandler).putReport(eq(request.getBoardReportId()), + verify(asyncReportRequestHandler).putReport(eq(request.getBoardReportFileId()), responseArgumentCaptor.capture()); ReportResponse response = responseArgumentCaptor.getValue(); assertEquals(1800000L, response.getExportValidityTime()); @@ -266,22 +276,24 @@ void shouldThrowErrorWhenJiraBoardSettingIsNull() { .metrics(List.of("velocity")) .buildKiteSetting(BuildKiteSetting.builder().build()) .csvTimeStamp(TIMESTAMP) + .startTime("1710000000000") + .endTime("1712678399999") .build(); when(asyncMetricsDataHandler.getMetricsDataCompleted(any())) .thenReturn(MetricsDataCompleted.builder().build()); doAnswer(invocation -> null).when(asyncMetricsDataHandler) - .updateMetricsDataCompletedInHandler(IdUtil.getDataCompletedPrefix(request.getCsvTimeStamp()), + .updateMetricsDataCompletedInHandler(IdUtil.getDataCompletedPrefix(request.getTimeRangeAndTimeStamp()), MetricType.BOARD, true); generateReporterService.generateBoardReport(request); - verify(asyncExceptionHandler).put(eq(request.getBoardReportId()), exceptionCaptor.capture()); + verify(asyncExceptionHandler).put(eq(request.getBoardReportFileId()), exceptionCaptor.capture()); assertEquals("Failed to fetch Jira info due to Jira board setting is null.", exceptionCaptor.getValue().getMessage()); assertEquals(400, exceptionCaptor.getValue().getStatus()); verify(kanbanService, never()).fetchDataFromKanban(eq(request)); verify(workDay).changeConsiderHolidayMode(false); - verify(asyncReportRequestHandler, never()).putReport(eq(request.getBoardReportId()), any()); + verify(asyncReportRequestHandler, never()).putReport(eq(request.getBoardReportFileId()), any()); } @Test @@ -292,11 +304,13 @@ void shouldSaveReportResponseWithVelocityAndUpdateMetricCompletedWhenVelocityMet .buildKiteSetting(BuildKiteSetting.builder().build()) .jiraBoardSetting(JiraBoardSetting.builder().build()) .csvTimeStamp(TIMESTAMP) + .startTime("1710000000000") + .endTime("1712678399999") .build(); when(asyncMetricsDataHandler.getMetricsDataCompleted(any())) .thenReturn(MetricsDataCompleted.builder().build()); doAnswer(invocation -> null).when(asyncMetricsDataHandler) - .updateMetricsDataCompletedInHandler(IdUtil.getDataCompletedPrefix(request.getCsvTimeStamp()), + .updateMetricsDataCompletedInHandler(IdUtil.getDataCompletedPrefix(request.getTimeRangeAndTimeStamp()), MetricType.BOARD, true); when(velocityCalculator.calculateVelocity(any())) .thenReturn(Velocity.builder().velocityForSP(10).velocityForCards(20).build()); @@ -306,11 +320,11 @@ void shouldSaveReportResponseWithVelocityAndUpdateMetricCompletedWhenVelocityMet generateReporterService.generateBoardReport(request); - verify(asyncExceptionHandler).remove(request.getBoardReportId()); + verify(asyncExceptionHandler).remove(request.getBoardReportFileId()); verify(pipelineService, never()).fetchGitHubData(any()); verify(kanbanService).fetchDataFromKanban(eq(request)); verify(workDay).changeConsiderHolidayMode(false); - verify(asyncReportRequestHandler).putReport(eq(request.getBoardReportId()), + verify(asyncReportRequestHandler).putReport(eq(request.getBoardReportFileId()), responseArgumentCaptor.capture()); ReportResponse response = responseArgumentCaptor.getValue(); assertEquals(1800000L, response.getExportValidityTime()); @@ -326,6 +340,8 @@ void shouldSaveReportResponseWithCycleTimeAndUpdateMetricCompletedWhenCycleTimeM .buildKiteSetting(BuildKiteSetting.builder().build()) .jiraBoardSetting(JiraBoardSetting.builder().build()) .csvTimeStamp(TIMESTAMP) + .startTime("1710000000000") + .endTime("1712678399999") .build(); when(asyncMetricsDataHandler.getMetricsDataCompleted(any())) .thenReturn(MetricsDataCompleted.builder().boardMetricsCompleted(true).build()); @@ -345,7 +361,7 @@ void shouldSaveReportResponseWithCycleTimeAndUpdateMetricCompletedWhenCycleTimeM verify(pipelineService, never()).fetchGitHubData(any()); verify(kanbanService).fetchDataFromKanban(eq(request)); verify(workDay).changeConsiderHolidayMode(false); - verify(asyncReportRequestHandler).putReport(eq(request.getBoardReportId()), + verify(asyncReportRequestHandler).putReport(eq(request.getBoardReportFileId()), responseArgumentCaptor.capture()); ReportResponse response = responseArgumentCaptor.getValue(); assertEquals(1800000L, response.getExportValidityTime()); @@ -362,11 +378,13 @@ void shouldSaveReportResponseWithClassificationAndUpdateMetricCompletedWhenClass .buildKiteSetting(BuildKiteSetting.builder().build()) .jiraBoardSetting(JiraBoardSetting.builder().build()) .csvTimeStamp(TIMESTAMP) + .startTime("1710000000000") + .endTime("1712678399999") .build(); when(asyncMetricsDataHandler.getMetricsDataCompleted(any())) .thenReturn(MetricsDataCompleted.builder().build()); doAnswer(invocation -> null).when(asyncMetricsDataHandler) - .updateMetricsDataCompletedInHandler(IdUtil.getDataCompletedPrefix(request.getCsvTimeStamp()), + .updateMetricsDataCompletedInHandler(IdUtil.getDataCompletedPrefix(request.getTimeRangeAndTimeStamp()), MetricType.BOARD, true); List classifications = List.of(Classification.builder().build()); when(classificationCalculator.calculate(any(), any())).thenReturn(classifications); @@ -379,7 +397,7 @@ void shouldSaveReportResponseWithClassificationAndUpdateMetricCompletedWhenClass verify(pipelineService, never()).fetchGitHubData(any()); verify(kanbanService).fetchDataFromKanban(eq(request)); verify(workDay).changeConsiderHolidayMode(false); - verify(asyncReportRequestHandler).putReport(eq(request.getBoardReportId()), + verify(asyncReportRequestHandler).putReport(eq(request.getBoardReportFileId()), responseArgumentCaptor.capture()); ReportResponse response = responseArgumentCaptor.getValue(); assertEquals(1800000L, response.getExportValidityTime()); @@ -394,19 +412,21 @@ void shouldUpdateMetricCompletedWhenExceptionStart4() { .buildKiteSetting(BuildKiteSetting.builder().build()) .jiraBoardSetting(JiraBoardSetting.builder().build()) .csvTimeStamp(TIMESTAMP) + .startTime("1710000000000") + .endTime("1712678399999") .build(); when(kanbanService.fetchDataFromKanban(request)).thenThrow(new NotFoundException("")); when(asyncMetricsDataHandler.getMetricsDataCompleted(any())) .thenReturn(MetricsDataCompleted.builder().build()); doAnswer(invocation -> null).when(asyncMetricsDataHandler) - .updateMetricsDataCompletedInHandler(IdUtil.getDataCompletedPrefix(request.getCsvTimeStamp()), + .updateMetricsDataCompletedInHandler(IdUtil.getDataCompletedPrefix(request.getTimeRangeAndTimeStamp()), MetricType.BOARD, true); generateReporterService.generateBoardReport(request); Awaitility.await() .atMost(5, TimeUnit.SECONDS) - .untilAsserted(() -> verify(asyncExceptionHandler).put(eq(request.getBoardReportId()), any())); + .untilAsserted(() -> verify(asyncExceptionHandler).put(eq(request.getBoardReportFileId()), any())); } @Test @@ -420,6 +440,8 @@ void shouldAsyncToGenerateCsvAndGenerateReportWhenFetchRight() { ReworkTimesSetting.builder().reworkState("To do").excludedStates(List.of("block")).build()) .build()) .csvTimeStamp(TIMESTAMP) + .startTime("1710000000000") + .endTime("1712678399999") .build(); when(kanbanService.fetchDataFromKanban(request)).thenReturn(FetchedData.CardCollectionInfo.builder() .realDoneCardCollection(CardCollection.builder().reworkCardNumber(2).build()) @@ -430,7 +452,7 @@ void shouldAsyncToGenerateCsvAndGenerateReportWhenFetchRight() { when(reworkCalculator.calculateRework(any(), any())) .thenReturn(Rework.builder().totalReworkCards(2).build()); doAnswer(invocation -> null).when(asyncMetricsDataHandler) - .updateMetricsDataCompletedInHandler(IdUtil.getDataCompletedPrefix(request.getCsvTimeStamp()), + .updateMetricsDataCompletedInHandler(IdUtil.getDataCompletedPrefix(request.getTimeRangeAndTimeStamp()), MetricType.BOARD, true); generateReporterService.generateBoardReport(request); @@ -453,6 +475,8 @@ void shouldGenerateCsvFile() { .metrics(List.of()) .buildKiteSetting(BuildKiteSetting.builder().build()) .csvTimeStamp(TIMESTAMP) + .startTime("1710000000000") + .endTime("1712678399999") .build(); when(asyncMetricsDataHandler.getMetricsDataCompleted(any())) .thenReturn(MetricsDataCompleted.builder().doraMetricsCompleted(false).build()); @@ -463,13 +487,13 @@ void shouldGenerateCsvFile() { generateReporterService.generateDoraReport(request); - verify(asyncExceptionHandler).remove(request.getPipelineReportId()); - verify(asyncExceptionHandler).remove(request.getSourceControlReportId()); + verify(asyncExceptionHandler).remove(request.getPipelineReportFileId()); + verify(asyncExceptionHandler).remove(request.getSourceControlReportFileId()); verify(kanbanService, never()).fetchDataFromKanban(eq(request)); Awaitility.await() .atMost(5, TimeUnit.SECONDS) .untilAsserted(() -> verify(csvFileGenerator).convertPipelineDataToCSV(pipelineCSVInfos, - request.getCsvTimeStamp())); + request.getTimeRangeAndTimeStamp())); } @Test @@ -479,6 +503,8 @@ void shouldThrowErrorWhenCodeSettingIsNullButSourceControlMetricsIsNotEmpty() { .metrics(List.of("lead time for changes")) .buildKiteSetting(BuildKiteSetting.builder().build()) .csvTimeStamp(TIMESTAMP) + .startTime("1710000000000") + .endTime("1712678399999") .build(); when(asyncMetricsDataHandler.getMetricsDataCompleted(any())) .thenReturn(MetricsDataCompleted.builder().doraMetricsCompleted(true).build()); @@ -495,11 +521,11 @@ void shouldThrowErrorWhenCodeSettingIsNullButSourceControlMetricsIsNotEmpty() { assertEquals("Failed to fetch Github info due to code base setting is null.", e.getMessage()); } - verify(asyncExceptionHandler).remove(request.getPipelineReportId()); - verify(asyncExceptionHandler).remove(request.getSourceControlReportId()); + verify(asyncExceptionHandler).remove(request.getPipelineReportFileId()); + verify(asyncExceptionHandler).remove(request.getSourceControlReportFileId()); verify(kanbanService, never()).fetchDataFromKanban(eq(request)); verify(csvFileGenerator, never()).convertPipelineDataToCSV(eq(pipelineCSVInfos), - eq(request.getCsvTimeStamp())); + eq(request.getTimeRangeAndTimeStamp())); } @Test @@ -507,6 +533,8 @@ void shouldThrowErrorWhenBuildKiteSettingIsNullButPipelineMetricsIsNotEmpty() { GenerateReportRequest request = GenerateReportRequest.builder() .metrics(List.of("deployment frequency")) .csvTimeStamp(TIMESTAMP) + .startTime("1710000000000") + .endTime("1712678399999") .build(); when(asyncMetricsDataHandler.getMetricsDataCompleted(any())) .thenReturn(MetricsDataCompleted.builder().doraMetricsCompleted(true).build()); @@ -523,11 +551,11 @@ void shouldThrowErrorWhenBuildKiteSettingIsNullButPipelineMetricsIsNotEmpty() { assertEquals(400, e.getStatus()); } - verify(asyncExceptionHandler).remove(request.getPipelineReportId()); - verify(asyncExceptionHandler).remove(request.getSourceControlReportId()); + verify(asyncExceptionHandler).remove(request.getPipelineReportFileId()); + verify(asyncExceptionHandler).remove(request.getSourceControlReportFileId()); verify(kanbanService, never()).fetchDataFromKanban(eq(request)); verify(csvFileGenerator, never()).convertPipelineDataToCSV(eq(pipelineCSVInfos), - eq(request.getCsvTimeStamp())); + eq(request.getTimeRangeAndTimeStamp())); } @Test @@ -558,7 +586,7 @@ void shouldGenerateCsvWithPipelineReportWhenPipeLineMetricIsNotEmpty() { generateReporterService.generateDoraReport(request); verify(workDay).changeConsiderHolidayMode(false); - verify(asyncReportRequestHandler).putReport(eq(request.getPipelineReportId()), + verify(asyncReportRequestHandler).putReport(eq(request.getPipelineReportFileId()), responseArgumentCaptor.capture()); ReportResponse response = responseArgumentCaptor.getValue(); @@ -572,7 +600,7 @@ void shouldGenerateCsvWithPipelineReportWhenPipeLineMetricIsNotEmpty() { Awaitility.await() .atMost(5, TimeUnit.SECONDS) .untilAsserted(() -> verify(csvFileGenerator).convertPipelineDataToCSV(pipelineCSVInfos, - request.getCsvTimeStamp())); + request.getTimeRangeAndTimeStamp())); } @Test @@ -597,7 +625,7 @@ void shouldUpdateMetricCompletedWhenGenerateCsvWithPipelineReportFailed() { generateReporterService.generateDoraReport(request); - verify(asyncExceptionHandler).put(eq(request.getPipelineReportId()), any()); + verify(asyncExceptionHandler).put(eq(request.getPipelineReportFileId()), any()); verify(asyncMetricsDataHandler, times(1)).updateMetricsDataCompletedInHandler(any(), any(), anyBoolean()); } @@ -627,7 +655,7 @@ void shouldGenerateCsvWithSourceControlReportWhenSourceControlMetricIsNotEmpty() generateReporterService.generateDoraReport(request); verify(workDay).changeConsiderHolidayMode(false); - verify(asyncReportRequestHandler).putReport(eq(request.getSourceControlReportId()), + verify(asyncReportRequestHandler).putReport(eq(request.getSourceControlReportFileId()), responseArgumentCaptor.capture()); ReportResponse response = responseArgumentCaptor.getValue(); assertEquals(1800000L, response.getExportValidityTime()); @@ -635,7 +663,7 @@ void shouldGenerateCsvWithSourceControlReportWhenSourceControlMetricIsNotEmpty() Awaitility.await() .atMost(5, TimeUnit.SECONDS) .untilAsserted(() -> verify(csvFileGenerator).convertPipelineDataToCSV(pipelineCSVInfos, - request.getCsvTimeStamp())); + request.getTimeRangeAndTimeStamp())); } @@ -667,7 +695,7 @@ void shouldGenerateCsvWithCachedDataWhenBuildKiteDataAlreadyExisted() { generateReporterService.generateDoraReport(request); verify(workDay, times(2)).changeConsiderHolidayMode(false); - verify(asyncReportRequestHandler).putReport(eq(request.getSourceControlReportId()), + verify(asyncReportRequestHandler).putReport(eq(request.getSourceControlReportFileId()), responseArgumentCaptor.capture()); ReportResponse response = responseArgumentCaptor.getValue(); assertEquals(1800000L, response.getExportValidityTime()); @@ -675,7 +703,7 @@ void shouldGenerateCsvWithCachedDataWhenBuildKiteDataAlreadyExisted() { Awaitility.await() .atMost(5, TimeUnit.SECONDS) .untilAsserted(() -> verify(csvFileGenerator).convertPipelineDataToCSV(pipelineCSVInfos, - request.getCsvTimeStamp())); + request.getTimeRangeAndTimeStamp())); } @Test @@ -701,7 +729,7 @@ void shouldUpdateMetricCompletedWhenGenerateCsvWithSourceControlReportFailed() { generateReporterService.generateDoraReport(request); - verify(asyncExceptionHandler).put(eq(request.getSourceControlReportId()), any()); + verify(asyncExceptionHandler).put(eq(request.getSourceControlReportFileId()), any()); verify(asyncMetricsDataHandler, times(1)).updateMetricsDataCompletedInHandler(any(), any(), anyBoolean()); } @@ -748,7 +776,7 @@ class GetComposedReportResponse { @BeforeEach void setUp() { reportId = String.valueOf(System.currentTimeMillis() - EXPORT_CSV_VALIDITY_TIME + 200); - dataCompletedId = IdUtil.getDataCompletedPrefix(reportId); + dataCompletedId = IdUtil.getDataCompletedPrefix(START_TIME + "-" + END_TIME + "-" + reportId); } @Test @@ -758,7 +786,7 @@ void shouldGetDataFromCache() { .thenReturn(MetricsDataCompleted.builder().boardMetricsCompleted(false).doraMetricsCompleted(true).overallMetricCompleted(false).build()); when(asyncExceptionHandler.get(any())).thenReturn(null); - ReportResponse res = generateReporterService.getComposedReportResponse(reportId); + ReportResponse res = generateReporterService.getComposedReportResponse(reportId, START_TIME, END_TIME); assertEquals(EXPORT_CSV_VALIDITY_TIME, res.getExportValidityTime()); assertFalse(res.getBoardMetricsCompleted()); @@ -774,7 +802,7 @@ void shouldReturnErrorDataWhenExceptionIs404Or403Or401() { .thenReturn(MetricsDataCompleted.builder().boardMetricsCompleted(false).doraMetricsCompleted(true).overallMetricCompleted(false).build()); when(asyncExceptionHandler.get(any())).thenReturn(new AsyncExceptionDTO(new NotFoundException("error"))); - ReportResponse res = generateReporterService.getComposedReportResponse(reportId); + ReportResponse res = generateReporterService.getComposedReportResponse(reportId, START_TIME, END_TIME); assertEquals(EXPORT_CSV_VALIDITY_TIME, res.getExportValidityTime()); assertFalse(res.getAllMetricsCompleted()); @@ -789,7 +817,7 @@ void shouldThrowGenerateReportExceptionWhenErrorIs500() { when(asyncExceptionHandler.get(any())).thenReturn(new AsyncExceptionDTO(new GenerateReportException("errorMessage"))); try { - generateReporterService.getComposedReportResponse(reportId); + generateReporterService.getComposedReportResponse(reportId, START_TIME, END_TIME); fail(); } catch (BaseException e) { @@ -806,7 +834,7 @@ void shouldThrowServiceUnavailableExceptionWhenErrorIs503() { when(asyncExceptionHandler.get(any())).thenReturn(new AsyncExceptionDTO(new ServiceUnavailableException("errorMessage"))); try { - generateReporterService.getComposedReportResponse(reportId); + generateReporterService.getComposedReportResponse(reportId, START_TIME, END_TIME); fail(); } catch (BaseException e) { @@ -822,7 +850,7 @@ void shouldThrowRequestFailedExceptionWhenErrorIsDefault() { .thenReturn(MetricsDataCompleted.builder().boardMetricsCompleted(false).doraMetricsCompleted(true).overallMetricCompleted(false).build()); when(asyncExceptionHandler.get(any())).thenReturn(new AsyncExceptionDTO(new BadRequestException("error"))); try { - generateReporterService.getComposedReportResponse(reportId); + generateReporterService.getComposedReportResponse(reportId, START_TIME, END_TIME); fail(); } catch (BaseException e) { @@ -838,7 +866,7 @@ void shouldGetDataWhenBoardMetricsCompletedIsFalseDoraMetricsCompletedIsNull() { .thenReturn(MetricsDataCompleted.builder().boardMetricsCompleted(false).overallMetricCompleted(false).build()); when(asyncExceptionHandler.get(any())).thenReturn(null); - ReportResponse res = generateReporterService.getComposedReportResponse(reportId); + ReportResponse res = generateReporterService.getComposedReportResponse(reportId, START_TIME, END_TIME); assertEquals(EXPORT_CSV_VALIDITY_TIME, res.getExportValidityTime()); assertFalse(res.getBoardMetricsCompleted()); @@ -853,7 +881,7 @@ void shouldGetDataWhenBoardMetricsCompletedIsNullDoraMetricsCompletedIsFalse() { .thenReturn(MetricsDataCompleted.builder().doraMetricsCompleted(false).overallMetricCompleted(false).build()); when(asyncExceptionHandler.get(any())).thenReturn(null); - ReportResponse res = generateReporterService.getComposedReportResponse(reportId); + ReportResponse res = generateReporterService.getComposedReportResponse(reportId, START_TIME, END_TIME); assertEquals(EXPORT_CSV_VALIDITY_TIME, res.getExportValidityTime()); assertNull(res.getBoardMetricsCompleted()); @@ -868,7 +896,7 @@ void shouldGetDataWhenBoardMetricsCompletedIsTrueDoraMetricsCompletedIsTrueOvera .thenReturn(MetricsDataCompleted.builder().boardMetricsCompleted(true).doraMetricsCompleted(true).overallMetricCompleted(true).build()); when(asyncExceptionHandler.get(any())).thenReturn(null); - ReportResponse res = generateReporterService.getComposedReportResponse(reportId); + ReportResponse res = generateReporterService.getComposedReportResponse(reportId, START_TIME, END_TIME); assertEquals(EXPORT_CSV_VALIDITY_TIME, res.getExportValidityTime()); assertTrue(res.getBoardMetricsCompleted()); @@ -883,7 +911,7 @@ void shouldGetDataWhenBoardMetricsCompletedIsNullDoraMetricsCompletedIsNullOvera .thenReturn(MetricsDataCompleted.builder().overallMetricCompleted(true).build()); when(asyncExceptionHandler.get(any())).thenReturn(null); - ReportResponse res = generateReporterService.getComposedReportResponse(reportId); + ReportResponse res = generateReporterService.getComposedReportResponse(reportId, START_TIME, END_TIME); assertEquals(EXPORT_CSV_VALIDITY_TIME, res.getExportValidityTime()); assertNull(res.getBoardMetricsCompleted()); @@ -898,7 +926,7 @@ void shouldGetDataWhenBoardMetricsCompletedIsNullDoraMetricsCompletedIsNullOvera .thenReturn(MetricsDataCompleted.builder().overallMetricCompleted(false).build()); when(asyncExceptionHandler.get(any())).thenReturn(null); - ReportResponse res = generateReporterService.getComposedReportResponse(reportId); + ReportResponse res = generateReporterService.getComposedReportResponse(reportId, START_TIME,END_TIME); assertEquals(EXPORT_CSV_VALIDITY_TIME, res.getExportValidityTime()); assertNull(res.getBoardMetricsCompleted()); diff --git a/backend/src/test/java/heartbeat/service/report/KanbanCsvServiceTest.java b/backend/src/test/java/heartbeat/service/report/KanbanCsvServiceTest.java index a2bd26c7db..3f7449efba 100644 --- a/backend/src/test/java/heartbeat/service/report/KanbanCsvServiceTest.java +++ b/backend/src/test/java/heartbeat/service/report/KanbanCsvServiceTest.java @@ -38,6 +38,7 @@ import static heartbeat.service.jira.JiraBoardConfigDTOFixture.MOCK_JIRA_BOARD_COLUMN_SETTING_LIST; import static heartbeat.service.report.BoardCsvFixture.MOCK_JIRA_CARD; import static heartbeat.service.report.BoardCsvFixture.MOCK_REWORK_TIMES_INFO_LIST; +import static heartbeat.tools.TimeUtils.mockTimeStamp; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -75,6 +76,12 @@ class KanbanCsvServiceTest { @Captor private ArgumentCaptor> csvNewFieldsCaptor; + public static final String CSV_TIME_STAMP = String.valueOf(mockTimeStamp(2024, 7, 3, 17, 45, 50)); + + public static final String START_TIME = String.valueOf(mockTimeStamp(2024, 3, 10, 0, 0, 0)); + + public static final String END_TIME = String.valueOf(mockTimeStamp(2024, 4, 9, 0, 0, 0)); + @Test void shouldSaveCsvWithoutNonDoneCardsWhenNonDoneCardIsNull() throws URISyntaxException { @@ -89,6 +96,9 @@ void shouldSaveCsvWithoutNonDoneCardsWhenNonDoneCardIsNull() throws URISyntaxExc .targetFields(List.of(TargetField.builder().name("Doing").build(), TargetField.builder().name("Done").build())) .build()) + .csvTimeStamp(CSV_TIME_STAMP) + .startTime(START_TIME) + .endTime(END_TIME) .build(), CardCollection.builder().jiraCardDTOList(List.of(jiraCardDTO)).build(), CardCollection.builder().build()); @@ -112,6 +122,9 @@ void shouldSaveCsvWithoutNonDoneCardsWhenNonDoneCardIsEmpty() throws URISyntaxEx .targetFields(List.of(TargetField.builder().name("Doing").build(), TargetField.builder().name("Done").build())) .build()) + .csvTimeStamp(CSV_TIME_STAMP) + .startTime(START_TIME) + .endTime(END_TIME) .build(), CardCollection.builder().jiraCardDTOList(List.of(jiraCardDTO)).build(), CardCollection.builder().jiraCardDTOList(Lists.list()).build()); @@ -172,6 +185,9 @@ void shouldSaveCsvWithOrderedNonDoneCardsByJiraColumnDescendingWhenNonDoneCardIs .targetFields(List.of(TargetField.builder().name("Doing").build(), TargetField.builder().name("Done").build())) .build()) + .csvTimeStamp(CSV_TIME_STAMP) + .startTime(START_TIME) + .endTime(END_TIME) .build(), CardCollection.builder().jiraCardDTOList(List.of(jiraCardDTO)).build(), CardCollection.builder().jiraCardDTOList(NonDoneJiraCardDTOList).build()); @@ -234,6 +250,9 @@ void shouldSaveCsvWithOrderedNonDoneCardsByJiraColumnDescendingWhenNonDoneCardIs .targetFields(List.of(TargetField.builder().name("Doing").build(), TargetField.builder().name("Done").build())) .build()) + .csvTimeStamp(CSV_TIME_STAMP) + .startTime(START_TIME) + .endTime(END_TIME) .build(), CardCollection.builder().jiraCardDTOList(List.of(jiraCardDTO)).build(), CardCollection.builder().jiraCardDTOList(NonDoneJiraCardDTOList).build()); @@ -278,6 +297,9 @@ void shouldSaveCsvWithOrderedDoneCardsByJiraColumnDescendingWhenDoneCardIsNotEmp .targetFields(List.of(TargetField.builder().name("Doing").build(), TargetField.builder().name("Done").build())) .build()) + .csvTimeStamp(CSV_TIME_STAMP) + .startTime(START_TIME) + .endTime(END_TIME) .build(), CardCollection.builder().jiraCardDTOList(doneJiraCardDTOList).build(), CardCollection.builder().jiraCardDTOList(List.of(jiraCardDTO)).build()); @@ -326,6 +348,9 @@ void shouldSaveCsvWithOrderedDoneCardsByJiraColumnDescendingWhenNonDoneCardIsNot .jiraBoardSetting(JiraBoardSetting.builder() .targetFields(List.of(TargetField.builder().name("Done").build())) .build()) + .csvTimeStamp(CSV_TIME_STAMP) + .startTime(START_TIME) + .endTime(END_TIME) .build(), CardCollection.builder().jiraCardDTOList(doneJiraCardDTOList).build(), CardCollection.builder().jiraCardDTOList(List.of(jiraCardDTO)).build()); @@ -377,6 +402,9 @@ void shouldSaveCsvWithoutOrderedNonDoneCardsByJiraColumnWhenNonDoneCardIsNotEmpt .targetFields(List.of(TargetField.builder().name("Doing").build(), TargetField.builder().name("Done").build())) .build()) + .csvTimeStamp(CSV_TIME_STAMP) + .startTime(START_TIME) + .endTime(END_TIME) .build(), CardCollection.builder().jiraCardDTOList(List.of(jiraCardDTO)).build(), CardCollection.builder().jiraCardDTOList(NonDoneJiraCardDTOList).build()); @@ -426,6 +454,9 @@ void shouldSaveCsvWithOrderedNonDoneCardsByJiraColumnDescendingWhenNonDoneCardIs .targetFields(List.of(TargetField.builder().name("Doing").build(), TargetField.builder().name("Done").build())) .build()) + .csvTimeStamp(CSV_TIME_STAMP) + .startTime(START_TIME) + .endTime(END_TIME) .build(), CardCollection.builder().jiraCardDTOList(List.of(jiraCardDTO)).build(), CardCollection.builder().jiraCardDTOList(NonDoneJiraCardDTOList).build()); @@ -465,6 +496,9 @@ void shouldAddFixedFieldsWhenItIsNotInSettingsFields() throws URISyntaxException TargetField.builder().name("fake-target1").flag(true).key("key-target1").build(), TargetField.builder().name("fake-target2").flag(false).key("key-target2").build())) .build()) + .csvTimeStamp(CSV_TIME_STAMP) + .startTime(START_TIME) + .endTime(END_TIME) .build(), CardCollection.builder().jiraCardDTOList(List.of(jiraCardDTO)).build(), CardCollection.builder().jiraCardDTOList(NonDoneJiraCardDTOList).build()); @@ -506,6 +540,9 @@ void shouldAddFixedFieldsWhenItIsNotInSettingsFieldsAndCardHasOriginCycleTime() TargetField.builder().name("fake-target1").flag(true).key("key-target1").build(), TargetField.builder().name("fake-target2").flag(false).key("key-target2").build())) .build()) + .csvTimeStamp(CSV_TIME_STAMP) + .startTime(START_TIME) + .endTime(END_TIME) .build(), CardCollection.builder().jiraCardDTOList(List.of(jiraCardDTO)).build(), CardCollection.builder().jiraCardDTOList(NonDoneJiraCardDTOList).build()); @@ -548,6 +585,9 @@ void shouldAddFixedFieldsWhenItIsNotInSettingsFieldsAndCardHasOriginCycleTimeAnd TargetField.builder().name("fake-target1").flag(true).key("key-target1").build(), TargetField.builder().name("fake-target2").flag(false).key("key-target2").build())) .build()) + .csvTimeStamp(CSV_TIME_STAMP) + .startTime(START_TIME) + .endTime(END_TIME) .build(), CardCollection.builder().jiraCardDTOList(List.of(jiraCardDTO)).build(), CardCollection.builder().jiraCardDTOList(NonDoneJiraCardDTOList).build()); @@ -597,6 +637,9 @@ void shouldAddFixedFieldsWithCorrectValueFormatWhenCustomFieldValueInstanceOfLis TargetField.builder().name("fake-target6").flag(true).key("json-array").build(), TargetField.builder().name("fake-target7").flag(true).key("json-obj").build())) .build()) + .csvTimeStamp(CSV_TIME_STAMP) + .startTime(START_TIME) + .endTime(END_TIME) .build(), CardCollection.builder().jiraCardDTOList(List.of(doneJiraCardDTO)).build(), CardCollection.builder().jiraCardDTOList(NonDoneJiraCardDTOList).build()); @@ -666,7 +709,9 @@ void shouldAddReworkFieldsWhenGenerateSheetGivenReworkStateAndExcludedStatesAndC .boardColumns(MOCK_JIRA_BOARD_COLUMN_SETTING_LIST()) .treatFlagCardAsBlock(Boolean.TRUE) .build()) - .csvTimeStamp("2022-01-01 00:00:00") + .csvTimeStamp(CSV_TIME_STAMP) + .startTime(START_TIME) + .endTime(END_TIME) .build(), CardCollection.builder().jiraCardDTOList(jiraCardDTOS).build(), CardCollection.builder().jiraCardDTOList(NonDoneJiraCardDTOList).build()); @@ -737,7 +782,9 @@ void shouldAddReworkFieldsWhenGenerateSheetGivenReworkStateAndExcludedStatesAndN .boardColumns(MOCK_JIRA_BOARD_COLUMN_SETTING_LIST()) .treatFlagCardAsBlock(Boolean.FALSE) .build()) - .csvTimeStamp("2022-01-01 00:00:00") + .csvTimeStamp(CSV_TIME_STAMP) + .startTime(START_TIME) + .endTime(END_TIME) .build(), CardCollection.builder().jiraCardDTOList(jiraCardDTOS).build(), CardCollection.builder().jiraCardDTOList(NonDoneJiraCardDTOList).build()); diff --git a/backend/src/test/java/heartbeat/service/report/ReportServiceTest.java b/backend/src/test/java/heartbeat/service/report/ReportServiceTest.java index 4dd300290c..828046e644 100644 --- a/backend/src/test/java/heartbeat/service/report/ReportServiceTest.java +++ b/backend/src/test/java/heartbeat/service/report/ReportServiceTest.java @@ -37,6 +37,7 @@ import static heartbeat.controller.report.dto.request.MetricType.BOARD; import static heartbeat.controller.report.dto.request.MetricType.DORA; import static heartbeat.service.report.scheduler.DeleteExpireCSVScheduler.EXPORT_CSV_VALIDITY_TIME; +import static heartbeat.tools.TimeUtils.mockTimeStamp; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.ArgumentMatchers.any; @@ -68,34 +69,48 @@ public class ReportServiceTest { @Captor ArgumentCaptor metricsDataCompletedArgumentCaptor; + public static final String START_TIME = "20240310"; + + public static final String END_TIME = "20240409"; + @Test void exportCsvShouldCallCsvFileGeneratorToGotTheStreamWhenTimestampIsValid() throws IOException { long validTimestamp = System.currentTimeMillis() - EXPORT_CSV_VALIDITY_TIME + 20000L; - when(csvFileGenerator.getDataFromCSV(ReportType.METRIC, validTimestamp)) + String mockTimeRangeTimeStamp = START_TIME + "-" + END_TIME + "-" + validTimestamp; + when(csvFileGenerator.getDataFromCSV(ReportType.METRIC, mockTimeRangeTimeStamp)) .thenReturn(new InputStreamResource(new ByteArrayInputStream("csv data".getBytes()))); - InputStream result = reportService.exportCsv(ReportType.METRIC, validTimestamp).getInputStream(); + InputStream result = reportService + .exportCsv(ReportType.METRIC, String.valueOf(validTimestamp), START_TIME, END_TIME) + .getInputStream(); String returnData = new BufferedReader(new InputStreamReader(result)).lines().collect(Collectors.joining("\n")); assertEquals(returnData, "csv data"); - verify(csvFileGenerator).getDataFromCSV(ReportType.METRIC, validTimestamp); + verify(csvFileGenerator).getDataFromCSV(ReportType.METRIC, mockTimeRangeTimeStamp); } @Test void exportCsvShouldThrowNotFoundExceptionWhenTimestampIsValid() { - long invalidTimestamp = System.currentTimeMillis() - EXPORT_CSV_VALIDITY_TIME - 20000L; - - assertThrows(NotFoundException.class, () -> reportService.exportCsv(ReportType.METRIC, invalidTimestamp)); - verify(csvFileGenerator, never()).getDataFromCSV(ReportType.METRIC, invalidTimestamp); + String invalidTimestamp = String.valueOf(System.currentTimeMillis() - EXPORT_CSV_VALIDITY_TIME - 20000L); + String mockTimeRangeTimeStamp = START_TIME + "-" + END_TIME + "-" + invalidTimestamp; + assertThrows(NotFoundException.class, + () -> reportService.exportCsv(ReportType.METRIC, invalidTimestamp, START_TIME, END_TIME)); + verify(csvFileGenerator, never()).getDataFromCSV(ReportType.METRIC, mockTimeRangeTimeStamp); } @Nested class GenerateReportByType { - String timeStamp = "1683734399999"; + String timeStamp = String.valueOf(mockTimeStamp(2023, 5, 10, 0, 0, 0)); + + String startTimeStamp = String.valueOf(mockTimeStamp(2024, 3, 10, 0, 0, 0)); + + String endTimeStamp = String.valueOf(mockTimeStamp(2024, 4, 9, 0, 0, 0)); GenerateReportRequest request = GenerateReportRequest.builder() .csvTimeStamp(timeStamp) + .startTime(startTimeStamp) + .endTime(endTimeStamp) .metrics(new ArrayList<>()) .metricTypes(List.of(BOARD)) .build(); @@ -109,7 +124,7 @@ void shouldSuccessfulGenerateBoardReportAndInitializeMetricDataWhenMetricTypesLi .build(); doAnswer(invocation -> null).when(asyncMetricsDataHandler).putMetricsDataCompleted(any(), any()); doAnswer(invocation -> null).when(generateReporterService).generateBoardReport(request); - when(generateReporterService.getComposedReportResponse(any())) + when(generateReporterService.getComposedReportResponse(any(), any(), any())) .thenReturn(ReportResponse.builder().reportMetricsError(ReportMetricsError.builder().build()).build()); when(reportGenerator.getReportGenerator(generateReporterService)).thenReturn(Map.of(BOARD, generateReporterService::generateBoardReport, DORA, generateReporterService::generateDoraReport)); @@ -123,9 +138,10 @@ void shouldSuccessfulGenerateBoardReportAndInitializeMetricDataWhenMetricTypesLi Awaitility.await().atMost(5, TimeUnit.SECONDS).untilAsserted(() -> { verify(generateReporterService).generateBoardReport(request); verify(generateReporterService, never()).generateDoraReport(request); - verify(generateReporterService).getComposedReportResponse(request.getCsvTimeStamp()); - verify(asyncMetricsDataHandler) - .updateOverallMetricsCompletedInHandler(IdUtil.getDataCompletedPrefix(request.getCsvTimeStamp())); + verify(generateReporterService).getComposedReportResponse(request.getCsvTimeStamp(), START_TIME, + END_TIME); + verify(asyncMetricsDataHandler).updateOverallMetricsCompletedInHandler( + IdUtil.getDataCompletedPrefix(request.getTimeRangeAndTimeStamp())); }); } @@ -139,7 +155,7 @@ void shouldSuccessfulGenerateDoraReportWhenMetricTypesListOnlyHasDoraMetricType( doAnswer(invocation -> null).when(asyncMetricsDataHandler).putMetricsDataCompleted(any(), any()); request.setMetricTypes(List.of(DORA)); doAnswer(invocation -> null).when(generateReporterService).generateDoraReport(request); - when(generateReporterService.getComposedReportResponse(any())) + when(generateReporterService.getComposedReportResponse(any(), any(), any())) .thenReturn(ReportResponse.builder().reportMetricsError(ReportMetricsError.builder().build()).build()); when(reportGenerator.getReportGenerator(generateReporterService)).thenReturn(Map.of(BOARD, generateReporterService::generateBoardReport, DORA, generateReporterService::generateDoraReport)); @@ -153,9 +169,10 @@ void shouldSuccessfulGenerateDoraReportWhenMetricTypesListOnlyHasDoraMetricType( Awaitility.await().atMost(5, TimeUnit.SECONDS).untilAsserted(() -> { verify(generateReporterService).generateDoraReport(request); verify(generateReporterService, never()).generateBoardReport(request); - verify(generateReporterService).getComposedReportResponse(request.getCsvTimeStamp()); - verify(asyncMetricsDataHandler) - .updateOverallMetricsCompletedInHandler(IdUtil.getDataCompletedPrefix(request.getCsvTimeStamp())); + verify(generateReporterService).getComposedReportResponse(request.getCsvTimeStamp(), START_TIME, + END_TIME); + verify(asyncMetricsDataHandler).updateOverallMetricsCompletedInHandler( + IdUtil.getDataCompletedPrefix(request.getTimeRangeAndTimeStamp())); }); } @@ -171,7 +188,7 @@ void shouldSuccessfulGenerateDoraReportAndBoardReportGivenMetricTypesListHasDora request.setMetricTypes(List.of(BOARD, DORA)); doAnswer(invocation -> null).when(generateReporterService).generateDoraReport(request); doAnswer(invocation -> null).when(generateReporterService).generateBoardReport(request); - when(generateReporterService.getComposedReportResponse(any())) + when(generateReporterService.getComposedReportResponse(any(), any(), any())) .thenReturn(ReportResponse.builder().reportMetricsError(ReportMetricsError.builder().build()).build()); when(reportGenerator.getReportGenerator(generateReporterService)).thenReturn(Map.of(BOARD, generateReporterService::generateBoardReport, DORA, generateReporterService::generateDoraReport)); @@ -185,9 +202,10 @@ void shouldSuccessfulGenerateDoraReportAndBoardReportGivenMetricTypesListHasDora Awaitility.await().atMost(5, TimeUnit.SECONDS).untilAsserted(() -> { verify(generateReporterService).generateDoraReport(request); verify(generateReporterService).generateBoardReport(request); - verify(generateReporterService).getComposedReportResponse(request.getCsvTimeStamp()); - verify(asyncMetricsDataHandler) - .updateOverallMetricsCompletedInHandler(IdUtil.getDataCompletedPrefix(request.getCsvTimeStamp())); + verify(generateReporterService).getComposedReportResponse(request.getCsvTimeStamp(), START_TIME, + END_TIME); + verify(asyncMetricsDataHandler).updateOverallMetricsCompletedInHandler( + IdUtil.getDataCompletedPrefix(request.getTimeRangeAndTimeStamp())); }); } @@ -203,9 +221,11 @@ void shouldNotGenerateMetricCsvWhenBoardMetricsHasError() { request.setMetricTypes(List.of(BOARD, DORA)); doAnswer(invocation -> null).when(generateReporterService).generateDoraReport(request); doAnswer(invocation -> null).when(generateReporterService).generateBoardReport(request); - when(generateReporterService.getComposedReportResponse(any())).thenReturn(ReportResponse.builder() - .reportMetricsError(ReportMetricsError.builder().boardMetricsError(ErrorInfo.builder().build()).build()) - .build()); + when(generateReporterService.getComposedReportResponse(any(), any(), any())) + .thenReturn(ReportResponse.builder() + .reportMetricsError( + ReportMetricsError.builder().boardMetricsError(ErrorInfo.builder().build()).build()) + .build()); when(reportGenerator.getReportGenerator(generateReporterService)).thenReturn(Map.of(BOARD, generateReporterService::generateBoardReport, DORA, generateReporterService::generateDoraReport)); @@ -218,10 +238,11 @@ void shouldNotGenerateMetricCsvWhenBoardMetricsHasError() { Awaitility.await().atMost(5, TimeUnit.SECONDS).untilAsserted(() -> { verify(generateReporterService).generateDoraReport(request); verify(generateReporterService).generateBoardReport(request); - verify(generateReporterService).getComposedReportResponse(request.getCsvTimeStamp()); + verify(generateReporterService).getComposedReportResponse(request.getCsvTimeStamp(), START_TIME, + END_TIME); verify(generateReporterService, never()).generateCSVForMetric(any(), any()); - verify(asyncMetricsDataHandler, times(1)) - .updateOverallMetricsCompletedInHandler(IdUtil.getDataCompletedPrefix(request.getCsvTimeStamp())); + verify(asyncMetricsDataHandler, times(1)).updateOverallMetricsCompletedInHandler( + IdUtil.getDataCompletedPrefix(request.getTimeRangeAndTimeStamp())); }); } @@ -237,10 +258,11 @@ void shouldNotGenerateMetricCsvWhenPiplineMetricsErrorHasError() { request.setMetricTypes(List.of(BOARD, DORA)); doAnswer(invocation -> null).when(generateReporterService).generateDoraReport(request); doAnswer(invocation -> null).when(generateReporterService).generateBoardReport(request); - when(generateReporterService.getComposedReportResponse(any())).thenReturn(ReportResponse.builder() - .reportMetricsError( - ReportMetricsError.builder().pipelineMetricsError(ErrorInfo.builder().build()).build()) - .build()); + when(generateReporterService.getComposedReportResponse(any(), any(), any())) + .thenReturn(ReportResponse.builder() + .reportMetricsError( + ReportMetricsError.builder().pipelineMetricsError(ErrorInfo.builder().build()).build()) + .build()); when(reportGenerator.getReportGenerator(generateReporterService)).thenReturn(Map.of(BOARD, generateReporterService::generateBoardReport, DORA, generateReporterService::generateDoraReport)); @@ -253,10 +275,11 @@ void shouldNotGenerateMetricCsvWhenPiplineMetricsErrorHasError() { Awaitility.await().atMost(5, TimeUnit.SECONDS).untilAsserted(() -> { verify(generateReporterService).generateDoraReport(request); verify(generateReporterService).generateBoardReport(request); - verify(generateReporterService).getComposedReportResponse(request.getCsvTimeStamp()); + verify(generateReporterService).getComposedReportResponse(request.getCsvTimeStamp(), START_TIME, + END_TIME); verify(generateReporterService, never()).generateCSVForMetric(any(), any()); - verify(asyncMetricsDataHandler, times(1)) - .updateOverallMetricsCompletedInHandler(IdUtil.getDataCompletedPrefix(request.getCsvTimeStamp())); + verify(asyncMetricsDataHandler, times(1)).updateOverallMetricsCompletedInHandler( + IdUtil.getDataCompletedPrefix(request.getTimeRangeAndTimeStamp())); }); } @@ -272,10 +295,11 @@ void shouldNotGenerateMetricCsvWhenSourceControlMetricsErrorHasError() { request.setMetricTypes(List.of(BOARD, DORA)); doAnswer(invocation -> null).when(generateReporterService).generateDoraReport(request); doAnswer(invocation -> null).when(generateReporterService).generateBoardReport(request); - when(generateReporterService.getComposedReportResponse(any())).thenReturn(ReportResponse.builder() - .reportMetricsError( - ReportMetricsError.builder().sourceControlMetricsError(ErrorInfo.builder().build()).build()) - .build()); + when(generateReporterService.getComposedReportResponse(any(), any(), any())) + .thenReturn(ReportResponse.builder() + .reportMetricsError( + ReportMetricsError.builder().sourceControlMetricsError(ErrorInfo.builder().build()).build()) + .build()); when(reportGenerator.getReportGenerator(generateReporterService)).thenReturn(Map.of(BOARD, generateReporterService::generateBoardReport, DORA, generateReporterService::generateDoraReport)); @@ -288,10 +312,11 @@ void shouldNotGenerateMetricCsvWhenSourceControlMetricsErrorHasError() { Awaitility.await().atMost(5, TimeUnit.SECONDS).untilAsserted(() -> { verify(generateReporterService).generateDoraReport(request); verify(generateReporterService).generateBoardReport(request); - verify(generateReporterService).getComposedReportResponse(request.getCsvTimeStamp()); + verify(generateReporterService).getComposedReportResponse(request.getCsvTimeStamp(), START_TIME, + END_TIME); verify(generateReporterService, never()).generateCSVForMetric(any(), any()); - verify(asyncMetricsDataHandler, times(1)) - .updateOverallMetricsCompletedInHandler(IdUtil.getDataCompletedPrefix(request.getCsvTimeStamp())); + verify(asyncMetricsDataHandler, times(1)).updateOverallMetricsCompletedInHandler( + IdUtil.getDataCompletedPrefix(request.getTimeRangeAndTimeStamp())); }); } @@ -313,7 +338,7 @@ void shouldSuccessfulGenerateDoraReportGivenBoardReportHasBeenGeneratedWhenRetry doAnswer(invocation -> null).when(asyncMetricsDataHandler).putMetricsDataCompleted(any(), any()); request.setMetricTypes(List.of(DORA)); doAnswer(invocation -> null).when(generateReporterService).generateDoraReport(request); - when(generateReporterService.getComposedReportResponse(any())) + when(generateReporterService.getComposedReportResponse(any(), any(), any())) .thenReturn(ReportResponse.builder().reportMetricsError(ReportMetricsError.builder().build()).build()); reportService.generateReport(request); @@ -325,10 +350,11 @@ void shouldSuccessfulGenerateDoraReportGivenBoardReportHasBeenGeneratedWhenRetry Awaitility.await().atMost(5, TimeUnit.SECONDS).untilAsserted(() -> { verify(generateReporterService).generateDoraReport(request); verify(generateReporterService, never()).generateBoardReport(request); - verify(generateReporterService).getComposedReportResponse(request.getCsvTimeStamp()); + verify(generateReporterService).getComposedReportResponse(request.getCsvTimeStamp(), START_TIME, + END_TIME); verify(generateReporterService).generateCSVForMetric(any(), any()); - verify(asyncMetricsDataHandler, times(1)) - .updateOverallMetricsCompletedInHandler(IdUtil.getDataCompletedPrefix(request.getCsvTimeStamp())); + verify(asyncMetricsDataHandler, times(1)).updateOverallMetricsCompletedInHandler( + IdUtil.getDataCompletedPrefix(request.getTimeRangeAndTimeStamp())); }); } diff --git a/backend/src/test/java/heartbeat/util/IdUtilTest.java b/backend/src/test/java/heartbeat/util/IdUtilTest.java index af68fe91a4..112457b371 100644 --- a/backend/src/test/java/heartbeat/util/IdUtilTest.java +++ b/backend/src/test/java/heartbeat/util/IdUtilTest.java @@ -10,7 +10,7 @@ void shouldReturnBoardReportId() { String timeStamp = "121322545121"; String expected = "board-121322545121"; - String boardReportId = IdUtil.getBoardReportId(timeStamp); + String boardReportId = IdUtil.getBoardReportFileId(timeStamp); Assertions.assertEquals(expected, boardReportId); } @@ -20,7 +20,7 @@ void shouldReturnPipelineReportId() { String timeStamp = "121322545121"; String expected = "pipeline-121322545121"; - String pipelineReportId = IdUtil.getPipelineReportId(timeStamp); + String pipelineReportId = IdUtil.getPipelineReportFileId(timeStamp); Assertions.assertEquals(expected, pipelineReportId); } @@ -30,7 +30,7 @@ void shouldReturnSourceControlReportId() { String timeStamp = "121322545121"; String expected = "sourceControl-121322545121"; - String sourceControlReportId = IdUtil.getSourceControlReportId(timeStamp); + String sourceControlReportId = IdUtil.getSourceControlReportFileId(timeStamp); Assertions.assertEquals(expected, sourceControlReportId); } diff --git a/frontend/__tests__/fixtures.ts b/frontend/__tests__/fixtures.ts index fa15244ef2..2e09481238 100644 --- a/frontend/__tests__/fixtures.ts +++ b/frontend/__tests__/fixtures.ts @@ -110,7 +110,7 @@ export const MOCK_SOURCE_CONTROL_VERIFY_TOKEN_URL = `${BASE_URL}/source-control/ export const MOCK_SOURCE_CONTROL_VERIFY_BRANCH_URL = `${BASE_URL}/source-control/:type/repos/branches/verify`; export const MOCK_REPORT_URL = `${BASE_URL}/reports`; export const MOCK_VERSION_URL = `${BASE_URL}/version`; -export const MOCK_EXPORT_CSV_URL = `${BASE_URL}/reports/:dataType/:fileName`; +export const MOCK_EXPORT_CSV_URL = `${BASE_URL}/reports/:dataType/:csvTimeStamp`; export const VERSION_RESPONSE = { version: '1.11', diff --git a/frontend/src/clients/report/CSVClient.ts b/frontend/src/clients/report/CSVClient.ts index fccaf92c7f..9d786ce8bb 100644 --- a/frontend/src/clients/report/CSVClient.ts +++ b/frontend/src/clients/report/CSVClient.ts @@ -9,7 +9,13 @@ export class CSVClient extends HttpClient { exportCSVData = async (params: CSVReportRequestDTO) => { await this.axiosInstance - .get(`/reports/${params.dataType}/${params.csvTimeStamp}`, { responseType: 'blob' }) + .get(`/reports/${params.dataType}/${params.csvTimeStamp}`, { + params: { + startTime: this.parseCollectionDateToHumanDate(params.startDate), + endTime: this.parseCollectionDateToHumanDate(params.endDate), + }, + responseType: 'blob', + }) .then((res) => { const exportedFilename = `${params.dataType}-${this.parseCollectionDateToHumanDate( params.startDate, From 50289f012e6141a28f4c1a0b8f7802c869f95d0f Mon Sep 17 00:00:00 2001 From: guzhongren Date: Fri, 19 Apr 2024 23:12:36 +0800 Subject: [PATCH 29/81] fix(e2e): fix e2e case --- frontend/e2e/pages/metrics/metrics-step.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/e2e/pages/metrics/metrics-step.ts b/frontend/e2e/pages/metrics/metrics-step.ts index cd1cad57b1..3cf09d296a 100644 --- a/frontend/e2e/pages/metrics/metrics-step.ts +++ b/frontend/e2e/pages/metrics/metrics-step.ts @@ -585,7 +585,7 @@ export class MetricsStep { async checkPipelineFillNoStep(pipelineSettings: typeof metricsStepData.deployment) { const firstPipelineConfig = pipelineSettings[0]; await expect(this.page.getByRole('alert')).toContainText( - 'There is no step during this period for this pipeline! Please change the search time in the Config page!', + 'There is no step during these periods for this pipeline! Please change the search time in the Config page!', ); await expect(this.pipelineOrganizationSelect).toHaveValue(firstPipelineConfig.organization); await expect(this.pipelineNameSelect).toHaveValue(firstPipelineConfig.pipelineName); From 4c4750a13f1a1f95393ed16dc232bc6c22efd723 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 20 Apr 2024 22:38:45 +0800 Subject: [PATCH 30/81] chore(deps): bump gradle/gradle-build-action from 3.2.1 to 3.3.0 (#1383) Bumps [gradle/gradle-build-action](https://github.com/gradle/gradle-build-action) from 3.2.1 to 3.3.0. - [Release notes](https://github.com/gradle/gradle-build-action/releases) - [Commits](https://github.com/gradle/gradle-build-action/compare/v3.2.1...v3.3.0) --- updated-dependencies: - dependency-name: gradle/gradle-build-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: guzhongren --- .github/workflows/Release.yaml | 2 +- .github/workflows/build-and-deploy.yml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/Release.yaml b/.github/workflows/Release.yaml index 71827c1935..07f818f9ab 100644 --- a/.github/workflows/Release.yaml +++ b/.github/workflows/Release.yaml @@ -24,7 +24,7 @@ jobs: - name: Validate Gradle wrapper uses: gradle/wrapper-validation-action@v3 - name: Set up Gradle - uses: gradle/gradle-build-action@v3.2.1 + uses: gradle/gradle-build-action@v3.3.0 - name: Build run: ./gradlew clean build - uses: actions/upload-artifact@v4 diff --git a/.github/workflows/build-and-deploy.yml b/.github/workflows/build-and-deploy.yml index 3c3e473ee7..a88c15084a 100644 --- a/.github/workflows/build-and-deploy.yml +++ b/.github/workflows/build-and-deploy.yml @@ -91,7 +91,7 @@ jobs: - name: Validate Gradle wrapper uses: gradle/wrapper-validation-action@v3 - name: Set up Gradle - uses: gradle/gradle-build-action@v3.2.1 + uses: gradle/gradle-build-action@v3.3.0 - name: Test and check run: ./gradlew clean check - name: Build @@ -120,7 +120,7 @@ jobs: - name: Validate Gradle wrapper uses: gradle/wrapper-validation-action@v3 - name: Set up Gradle - uses: gradle/gradle-build-action@v3.2.1 + uses: gradle/gradle-build-action@v3.3.0 - name: License check run: ./gradlew clean checkLicense - uses: actions/upload-artifact@v4 From f643b86551e913d859d0ae8820010508f295b4c3 Mon Sep 17 00:00:00 2001 From: neomgb <123063936+neomgb@users.noreply.github.com> Date: Sun, 21 Apr 2024 21:39:19 +0800 Subject: [PATCH 31/81] ADM-913: [frontend] fix: improve test covarage (#1395) * ADM-902: [frontend] fix: improve test covarage * ADM-913: [frontend] fix: remove unused import * ADM-913: [frontend] fix: fix lint issue --------- Co-authored-by: guzhongren --- .../hooks/useGetMetricsStepsEffect.test.tsx | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/frontend/__tests__/hooks/useGetMetricsStepsEffect.test.tsx b/frontend/__tests__/hooks/useGetMetricsStepsEffect.test.tsx index 12299ab2ce..8f2ceb4c23 100644 --- a/frontend/__tests__/hooks/useGetMetricsStepsEffect.test.tsx +++ b/frontend/__tests__/hooks/useGetMetricsStepsEffect.test.tsx @@ -1,10 +1,10 @@ -import { ERROR_MESSAGE_TIME_DURATION, MOCK_GET_STEPS_PARAMS } from '../fixtures'; import { useGetMetricsStepsEffect } from '@src/hooks/useGetMetricsStepsEffect'; import { AXIOS_REQUEST_ERROR_CODE } from '@src/constants/resources'; +import { act, renderHook, waitFor } from '@testing-library/react'; import { metricsClient } from '@src/clients/MetricsClient'; -import { act, renderHook } from '@testing-library/react'; import { setupStore } from '@test/utils/setupStoreUtil'; import { TimeoutError } from '@src/errors/TimeoutError'; +import { MOCK_GET_STEPS_PARAMS } from '../fixtures'; import React, { ReactNode } from 'react'; import { Provider } from 'react-redux'; @@ -76,12 +76,17 @@ describe('use get steps effect', () => { expect(result.current.isLoading).toEqual(false); - act(() => { - result.current.getSteps(params, buildId, organizationId, pipelineType, token); - jest.advanceTimersByTime(ERROR_MESSAGE_TIME_DURATION); + await act(async () => { + await result.current.getSteps(params, buildId, organizationId, pipelineType, token); }); - expect(result.current.errorMessage).toEqual(''); + expect(result.current.errorMessage).toEqual('Failed to get BuildKite steps'); + + jest.runAllTimers(); + + await waitFor(() => { + expect(result.current.errorMessage).toEqual(''); + }); }); it('should set error message when get steps responses are failed', async () => { From 5bd7e1bf9d5d4be27aa388fd47945e2f4d911040 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 21 Apr 2024 22:37:59 +0800 Subject: [PATCH 32/81] chore(deps): update plugin org.sonarqube to v5 (#1400)[backend] Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- backend/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/build.gradle b/backend/build.gradle index e8e3225329..3e4b9eba83 100644 --- a/backend/build.gradle +++ b/backend/build.gradle @@ -6,7 +6,7 @@ plugins { id 'io.spring.dependency-management' version '1.1.4' id "io.spring.javaformat" version "0.0.41" id 'com.github.jk1.dependency-license-report' version '2.7' - id "org.sonarqube" version "4.4.1.3373" + id "org.sonarqube" version "5.0.0.4638" } group = 'com.tw' From 6a0417520cbd131dbe836e6fcd2d28de7ea83be5 Mon Sep 17 00:00:00 2001 From: yulongcai <141199398+yulongcai@users.noreply.github.com> Date: Mon, 22 Apr 2024 15:58:16 +0800 Subject: [PATCH 33/81] fix security issue according sonar (#1405) * security-issue:[backend]fix: fix security issue according sonar * security-issue:[backend]fix: format code * security-issue:[backend]fix: Extraction constant * security-issue:[backend]fix: update file read --- .../java/heartbeat/handler/AsyncExceptionHandler.java | 9 ++++++++- .../heartbeat/handler/AsyncMetricsDataHandler.java | 9 ++++++++- .../heartbeat/handler/AsyncReportRequestHandler.java | 9 ++++++++- .../heartbeat/handler/base/AsyncDataBaseHandler.java | 11 +++++------ .../handler/AsyncReportRequestHandlerTest.java | 5 ----- .../handler/base/AsyncDataBaseHandlerTest.java | 11 +++++++++++ 6 files changed, 40 insertions(+), 14 deletions(-) diff --git a/backend/src/main/java/heartbeat/handler/AsyncExceptionHandler.java b/backend/src/main/java/heartbeat/handler/AsyncExceptionHandler.java index 3cb5c4e8c8..945c68d402 100644 --- a/backend/src/main/java/heartbeat/handler/AsyncExceptionHandler.java +++ b/backend/src/main/java/heartbeat/handler/AsyncExceptionHandler.java @@ -8,6 +8,7 @@ import org.springframework.stereotype.Component; import java.io.File; +import java.nio.file.Path; import static heartbeat.handler.base.FIleType.ERROR; @@ -15,12 +16,18 @@ @RequiredArgsConstructor public class AsyncExceptionHandler extends AsyncDataBaseHandler { + private static final String OUTPUT_FILE_PATH = "./app/output/"; + + private static final String SLASH = "/"; + public void put(String reportId, BaseException e) { createFileByType(ERROR, reportId, new Gson().toJson(new AsyncExceptionDTO(e))); } public AsyncExceptionDTO get(String reportId) { - return readFileByType(ERROR, reportId, AsyncExceptionDTO.class); + Path targetPath = new File(OUTPUT_FILE_PATH).toPath().normalize(); + String fileName = targetPath + SLASH + ERROR.getPath() + reportId; + return readFileByType(new File(fileName), ERROR, reportId, AsyncExceptionDTO.class); } public AsyncExceptionDTO remove(String reportId) { diff --git a/backend/src/main/java/heartbeat/handler/AsyncMetricsDataHandler.java b/backend/src/main/java/heartbeat/handler/AsyncMetricsDataHandler.java index 0cfc91a082..38f7ed6c21 100644 --- a/backend/src/main/java/heartbeat/handler/AsyncMetricsDataHandler.java +++ b/backend/src/main/java/heartbeat/handler/AsyncMetricsDataHandler.java @@ -11,6 +11,7 @@ import org.springframework.stereotype.Component; import java.io.File; +import java.nio.file.Path; import static heartbeat.handler.base.FIleType.METRICS_DATA_COMPLETED; @@ -21,6 +22,10 @@ public class AsyncMetricsDataHandler extends AsyncDataBaseHandler { private static final String GENERATE_REPORT_ERROR = "Failed to update metrics data completed through this timestamp."; + private static final String OUTPUT_FILE_PATH = "./app/output/"; + + private static final String SLASH = "/"; + public void putMetricsDataCompleted(String timeStamp, MetricsDataCompleted metricsDataCompleted) { try { acquireLock(METRICS_DATA_COMPLETED, timeStamp); @@ -32,7 +37,9 @@ public void putMetricsDataCompleted(String timeStamp, MetricsDataCompleted metri } public MetricsDataCompleted getMetricsDataCompleted(String timeStamp) { - return readFileByType(METRICS_DATA_COMPLETED, timeStamp, MetricsDataCompleted.class); + Path targetPath = new File(OUTPUT_FILE_PATH).toPath().normalize(); + String fileName = targetPath + SLASH + METRICS_DATA_COMPLETED.getPath() + timeStamp; + return readFileByType(new File(fileName), METRICS_DATA_COMPLETED, timeStamp, MetricsDataCompleted.class); } public void deleteExpireMetricsDataCompletedFile(long currentTimeStamp, File directory) { diff --git a/backend/src/main/java/heartbeat/handler/AsyncReportRequestHandler.java b/backend/src/main/java/heartbeat/handler/AsyncReportRequestHandler.java index f6173ac8b2..e920620214 100644 --- a/backend/src/main/java/heartbeat/handler/AsyncReportRequestHandler.java +++ b/backend/src/main/java/heartbeat/handler/AsyncReportRequestHandler.java @@ -7,6 +7,7 @@ import org.springframework.stereotype.Component; import java.io.File; +import java.nio.file.Path; import static heartbeat.handler.base.FIleType.REPORT; @@ -14,12 +15,18 @@ @RequiredArgsConstructor public class AsyncReportRequestHandler extends AsyncDataBaseHandler { + private static final String OUTPUT_FILE_PATH = "./app/output/"; + + private static final String SLASH = "/"; + public void putReport(String reportId, ReportResponse e) { createFileByType(REPORT, reportId, new Gson().toJson(e)); } public ReportResponse getReport(String reportId) { - return readFileByType(REPORT, reportId, ReportResponse.class); + Path targetPath = new File(OUTPUT_FILE_PATH).toPath().normalize(); + String fileName = targetPath + SLASH + REPORT.getPath() + reportId; + return readFileByType(new File(fileName), REPORT, reportId, ReportResponse.class); } public void deleteExpireReportFile(long currentTimeStamp, File directory) { diff --git a/backend/src/main/java/heartbeat/handler/base/AsyncDataBaseHandler.java b/backend/src/main/java/heartbeat/handler/base/AsyncDataBaseHandler.java index 9d382729af..d1ead8f3ed 100644 --- a/backend/src/main/java/heartbeat/handler/base/AsyncDataBaseHandler.java +++ b/backend/src/main/java/heartbeat/handler/base/AsyncDataBaseHandler.java @@ -60,11 +60,10 @@ private void createDirToConvertData(FIleType fIleType) { log.info(message); } - protected T readFileByType(FIleType fIleType, String fileId, Class classType) { - String fileName = OUTPUT_FILE_PATH + fIleType.getPath() + fileId; - if (!fileName.contains("..") && fileName.startsWith(OUTPUT_FILE_PATH + fIleType.getPath())) { - if (Files.exists(Path.of(fileName))) { - try (JsonReader reader = new JsonReader(new FileReader(fileName))) { + public T readFileByType(File file, FIleType fIleType, String fileId, Class classType) { + if (file.toPath().normalize().startsWith(new File(OUTPUT_FILE_PATH).toPath().normalize())) { + if (file.exists()) { + try (JsonReader reader = new JsonReader(new FileReader(file))) { return new Gson().fromJson(reader, classType); } catch (IOException | RuntimeException e) { @@ -85,7 +84,7 @@ protected T readAndRemoveFileByType(FIleType fIleType, String fileId, Class< if (!fileName.contains("..") && fileName.startsWith(OUTPUT_FILE_PATH + fIleType.getPath())) { log.info("Start to remove file type: {}, file name: {}", fIleType.getType(), fileId); try { - T t = readFileByType(fIleType, fileId, classType); + T t = readFileByType(new File(fileName), fIleType, fileId, classType); if (Objects.nonNull(t)) { Files.delete(Path.of(fileName)); } diff --git a/backend/src/test/java/heartbeat/handler/AsyncReportRequestHandlerTest.java b/backend/src/test/java/heartbeat/handler/AsyncReportRequestHandlerTest.java index ac4770be39..85740864e6 100644 --- a/backend/src/test/java/heartbeat/handler/AsyncReportRequestHandlerTest.java +++ b/backend/src/test/java/heartbeat/handler/AsyncReportRequestHandlerTest.java @@ -79,9 +79,4 @@ void shouldThrowGenerateReportExceptionGivenFileNameInvalidWhenHandlerPutData() () -> asyncReportRequestHandler.putReport("../", ReportResponse.builder().build())); } - @Test - void shouldThrowGenerateReportExceptionGivenFileNameInvalidWhenHandlerGetData() { - assertThrows(GenerateReportException.class, () -> asyncReportRequestHandler.getReport("../")); - } - } diff --git a/backend/src/test/java/heartbeat/handler/base/AsyncDataBaseHandlerTest.java b/backend/src/test/java/heartbeat/handler/base/AsyncDataBaseHandlerTest.java index 7055f5953d..ababd2b214 100644 --- a/backend/src/test/java/heartbeat/handler/base/AsyncDataBaseHandlerTest.java +++ b/backend/src/test/java/heartbeat/handler/base/AsyncDataBaseHandlerTest.java @@ -1,9 +1,12 @@ package heartbeat.handler.base; +import heartbeat.controller.report.dto.response.ReportResponse; +import heartbeat.exception.GenerateReportException; import org.junit.jupiter.api.Test; import java.io.File; +import static org.junit.Assert.assertThrows; import static org.junit.jupiter.api.Assertions.assertFalse; class AsyncDataBaseHandlerTest { @@ -19,4 +22,12 @@ void shouldReturnFalseGivenCreateFileThrowExceptionWhenTryLock() { assertFalse(result); } + @Test + void shouldReturnGenerateReportExceptionGivenFileNotStartWithRightFilePath() { + File file = new File("./app/input/lock"); + + assertThrows(GenerateReportException.class, + () -> asyncDataBaseHandler.readFileByType(file, FIleType.ERROR, "111", ReportResponse.class)); + } + } From 5628beaaceecb0d88c329d3051060ffef98057f1 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 22 Apr 2024 22:47:58 +0800 Subject: [PATCH 34/81] chore(deps): update dependency license-compliance to v3 (#1399)[frontend] Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- frontend/package.json | 2 +- frontend/pnpm-lock.yaml | 40 ++++++++++++++++++++++++++-------------- 2 files changed, 27 insertions(+), 15 deletions(-) diff --git a/frontend/package.json b/frontend/package.json index aff0ab0335..6fc8453091 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -97,7 +97,7 @@ "identity-obj-proxy": "^3.0.0", "jest": "^29.7.0", "jest-environment-jsdom": "^29.7.0", - "license-compliance": "^2.0.1", + "license-compliance": "^3.0.0", "lint-staged": "^15.2.2", "msw": "^1.3.3", "node-fetch": "^3.3.2", diff --git a/frontend/pnpm-lock.yaml b/frontend/pnpm-lock.yaml index c06c8f3048..1546ad761f 100644 --- a/frontend/pnpm-lock.yaml +++ b/frontend/pnpm-lock.yaml @@ -161,8 +161,8 @@ devDependencies: specifier: ^29.7.0 version: 29.7.0 license-compliance: - specifier: ^2.0.1 - version: 2.0.1(typescript@5.4.5) + specifier: ^3.0.0 + version: 3.0.0(typescript@5.4.5) lint-staged: specifier: ^15.2.2 version: 15.2.2 @@ -4424,6 +4424,11 @@ packages: engines: {node: '>=16'} dev: true + /commander@12.0.0: + resolution: {integrity: sha512-MwVNWlYjDTtOjX5PiD7o5pK0UrFU/OYgcJfjjK4RaHZETNtjJqrZa9Y9ds88+A+f+d5lv+561eZ+yCKoS3gbAA==} + engines: {node: '>=18'} + dev: true + /commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} dev: false @@ -4493,8 +4498,8 @@ packages: yaml: 1.10.2 dev: false - /cosmiconfig@8.3.6(typescript@5.4.5): - resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} + /cosmiconfig@9.0.0(typescript@5.4.5): + resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} engines: {node: '>=14'} peerDependencies: typescript: '>=4.9.5' @@ -4502,10 +4507,10 @@ packages: typescript: optional: true dependencies: + env-paths: 2.2.1 import-fresh: 3.3.0 js-yaml: 4.1.0 parse-json: 5.2.0 - path-type: 4.0.0 typescript: 5.4.5 dev: true @@ -6930,8 +6935,8 @@ packages: resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} dev: true - /joi@17.11.0: - resolution: {integrity: sha512-NgB+lZLNoqISVy1rZocE9PZI36bL/77ie924Ri43yEvi9GUUMPeyVIr8KdFTMUlby1p0PBYMk9spIxEUQYqrJQ==} + /joi@17.12.3: + resolution: {integrity: sha512-2RRziagf555owrm9IRVtdKynOBeITiDpuZqIpgwqXShPncPKNiRQoiGsl/T8SQdq+8ugRzH2LqY67irr2y/d+g==} dependencies: '@hapi/hoek': 9.3.0 '@hapi/topo': 5.1.0 @@ -7107,17 +7112,17 @@ packages: type-check: 0.4.0 dev: true - /license-compliance@2.0.1(typescript@5.4.5): - resolution: {integrity: sha512-c6w74uKnDgvbW3opy8NFMeX1pgWsHl8dLOu7Bc85s9eurXYCzF5x+Sj7gvZJIjtsYu3vQ7aYYpjc23ru+4onPA==} - engines: {node: '>=14.17.0'} + /license-compliance@3.0.0(typescript@5.4.5): + resolution: {integrity: sha512-0kXEr7JSdP+jPSTSEnAiyGvpOoFnkiVXqmTFhXx22+tCay7shTN1mVM7Z+p2F3YNeIhx0tmADglrp5ddWGyHnQ==} + engines: {node: '>=18.20.1'} hasBin: true dependencies: chalk: 4.1.2 - commander: 11.1.0 - cosmiconfig: 8.3.6(typescript@5.4.5) + commander: 12.0.0 + cosmiconfig: 9.0.0(typescript@5.4.5) debug: 4.3.4 - joi: 17.11.0 - spdx-expression-parse: 3.0.1 + joi: 17.12.3 + spdx-expression-parse: 4.0.0 spdx-satisfies: 5.0.1 tslib: 2.6.2 xmlbuilder: 15.1.1 @@ -8571,6 +8576,13 @@ packages: spdx-license-ids: 3.0.17 dev: true + /spdx-expression-parse@4.0.0: + resolution: {integrity: sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==} + dependencies: + spdx-exceptions: 2.5.0 + spdx-license-ids: 3.0.17 + dev: true + /spdx-license-ids@3.0.17: resolution: {integrity: sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==} dev: true From a1254fbf234a9c48f6a28a7a2b8417c46568a39b Mon Sep 17 00:00:00 2001 From: neomgb <123063936+neomgb@users.noreply.github.com> Date: Tue, 23 Apr 2024 16:55:20 +0800 Subject: [PATCH 35/81] AMD-902 [frontend] feat: pipeline configuration need to retain modified data when user change time range or reverified (#1408) * AMD-902 [frontend] feat: when org and pipeline are same,but step is delete,then remove step and branch * AMD-902 [frontend] feat: loading state * ADM-902: [frontend] fix: fix error message issue * AMD-902 [frontend] feat: reset deploymentSettings before load pipeline info * AMD-902 [frontend] fix: rename matchedStep to filterValidStep * AMD-902 [frontend] fix: fix multiple step fetch * AMD-902 [frontend] fix: remove step and branch when change pipeline name * AMD-902 [frontend] feat: remove init deploymentFrequencySettings * AMD-902 [frontend] fix: should fetch info according shouldLoad value * AMD-902 [frontend] fix: should fetch info according shouldLoad value * ADM-902: [frontend] fix: fix multi piplines are empty * ADM-902: [frontend] fix: fix multi org are empty * AMD-902 [frontend] feat: refactor pipelineCrews structure * ADM-902: [frontend] refactor: add empty value process * ADM-902: [frontend] feat: add loading process * AMD-902 [frontend] feat: remove crews in verify response pipelineList * ADM-902: [frontend] fix: fix info loading show crews * ADM-902: [frontend] fix: fix crews render options * ADM-902: [frontend] fix: fix multiple pipeline loading issue * ADM-902: [frontend] fix: fix unit test * ADM-902: [frontend] fix: fix unit test * AMD-902 [frontend] fix: fix prettier * AMD-902 [frontend] test: fix test * AMD-902 [frontend] test: add branch for crews when type is other * ADM-902: [frontend] fix: fix unit test * AMD-902 [frontend] test: add branch for DeploymentFrequencySettings.test.tsx wehn is firstFetch is true * ADM-902: [frontend] fix: fix unit test * AMD-902 [frontend] test: fix test * AMD-902 [frontend] test: fix test should call updateDeploymentFrequencySetting function and clearErrorMessages function when select organization * AMD-902 [frontend] fix: remove log * AMD-902 [frontend] fix: remove log and remove step alert * AMD-902 [frontend] feat: not show step alert when step value is empty string * ADM-902: [frontend] fix: fix unit test * ADM-902: [frontend] fix: fix unit test * ADM-902: [frontend] fix: fix unit test * ADM-902: [frontend] fix: fix merge issue * AMD-902 [frontend] fix: fix type check issues * ADM-902: [frontend] fix: fix unit test * AMD-902 [frontend] fix: rename isStepSelected to isStepEmptyString * AMD-902 [frontend] feat: update pipelineCrews after import file * ADM-902: [frontend] fix: rename test case descriptions * ADM-902: [frontend] fix: fix loading issue * ADM-902: [frontend] fix: fix loading issue * ADM-902: [frontend] fix merge issue * ADM-902: [frontend] fix: fix test * AMD-902-new [frontend] fix: fix lint * AMD-902-new [frontend] fix: remove unused comment --------- Co-authored-by: yp.wu Co-authored-by: yp.wu --- .../components/HomeGuide/HomeGuide.test.tsx | 2 +- .../ConfigStep/DateRangePicker.test.tsx | 9 +- .../ConfigStep/SourceControl.test.tsx | 3 +- .../containers/MetricsStep/Crews.test.tsx | 13 +- .../BranchSelection.test.tsx | 2 +- .../DeploymentFrequencySettings.test.tsx | 88 ++++++++++-- .../PipelineMetricSelection.test.tsx | 5 +- .../SingleSelection.test.tsx | 2 +- .../__tests__/context/metricsSlice.test.ts | 84 +++++++++--- .../context/pipelineToolSlice.test.ts | 8 +- frontend/__tests__/initialConfigState.ts | 1 - .../e2e/fixtures/create-new/metrics-step.ts | 2 + .../import-file/multiple-done-config-file.ts | 1 + .../fixtures/import-file/unhappy-path-file.ts | 1 + frontend/src/components/HomeGuide/index.tsx | 2 + .../DateRangePicker/DateRangePickerGroup.tsx | 7 +- .../ConfigStep/SourceControl/index.tsx | 3 +- .../BranchSelection/index.tsx | 8 +- .../PipelineMetricSelection/index.tsx | 30 ++++- .../SingleSelection/index.tsx | 7 +- .../DeploymentFrequencySettings/index.tsx | 22 ++- frontend/src/context/Metrics/metricsSlice.ts | 126 ++++++++++++------ frontend/src/context/config/configSlice.ts | 22 ++- .../pipelineTool/verifyResponseSlice.ts | 3 +- frontend/src/context/meta/metaSlice.tsx | 10 +- .../src/hooks/useGetPipelineToolInfoEffect.ts | 4 + .../src/hooks/useVerifyPipelineToolEffect.ts | 2 - frontend/src/utils/util.ts | 23 +++- 28 files changed, 361 insertions(+), 129 deletions(-) diff --git a/frontend/__tests__/components/HomeGuide/HomeGuide.test.tsx b/frontend/__tests__/components/HomeGuide/HomeGuide.test.tsx index fb7682d4b9..bcd63ba2b6 100644 --- a/frontend/__tests__/components/HomeGuide/HomeGuide.test.tsx +++ b/frontend/__tests__/components/HomeGuide/HomeGuide.test.tsx @@ -87,7 +87,7 @@ describe('HomeGuide', () => { fireEvent.change(input); await waitFor(() => { - expect(mockedUseAppDispatch).toHaveBeenCalledTimes(4); + expect(mockedUseAppDispatch).toHaveBeenCalledTimes(5); expect(navigateMock).toHaveBeenCalledWith(METRICS_PAGE_ROUTE); }); }); diff --git a/frontend/__tests__/containers/ConfigStep/DateRangePicker.test.tsx b/frontend/__tests__/containers/ConfigStep/DateRangePicker.test.tsx index f4ab350c4c..8d44fde57c 100644 --- a/frontend/__tests__/containers/ConfigStep/DateRangePicker.test.tsx +++ b/frontend/__tests__/containers/ConfigStep/DateRangePicker.test.tsx @@ -1,8 +1,4 @@ -import { - initDeploymentFrequencySettings, - updateShouldGetBoardConfig, - updateShouldGetPipelineConfig, -} from '@src/context/Metrics/metricsSlice'; +import { updateShouldGetBoardConfig, updateShouldGetPipelineConfig } from '@src/context/Metrics/metricsSlice'; import { DateRangePickerSection } from '@src/containers/ConfigStep/DateRangePicker'; import { ERROR_DATE, TIME_RANGE_ERROR_MESSAGE } from '../../fixtures'; import { render, screen, within } from '@testing-library/react'; @@ -118,7 +114,6 @@ describe('DateRangePickerSection', () => { expect(updateShouldGetBoardConfig).toHaveBeenCalledWith(true); expect(updateShouldGetPipelineConfig).toHaveBeenCalledWith(true); - expect(initDeploymentFrequencySettings).toHaveBeenCalled(); }); it('should dispatch update configuration when change endDate', async () => { @@ -127,7 +122,6 @@ describe('DateRangePickerSection', () => { expect(updateShouldGetBoardConfig).toHaveBeenCalledWith(true); expect(updateShouldGetPipelineConfig).toHaveBeenCalledWith(true); - expect(initDeploymentFrequencySettings).toHaveBeenCalled(); }); }); @@ -187,7 +181,6 @@ describe('DateRangePickerSection', () => { expect(updateShouldGetBoardConfig).toHaveBeenCalledWith(true); expect(updateShouldGetPipelineConfig).toHaveBeenCalledWith(true); - expect(initDeploymentFrequencySettings).toHaveBeenCalled(); }); }); diff --git a/frontend/__tests__/containers/ConfigStep/SourceControl.test.tsx b/frontend/__tests__/containers/ConfigStep/SourceControl.test.tsx index 23d32ca6ca..521508bd15 100644 --- a/frontend/__tests__/containers/ConfigStep/SourceControl.test.tsx +++ b/frontend/__tests__/containers/ConfigStep/SourceControl.test.tsx @@ -10,9 +10,9 @@ import { VERIFIED, VERIFY, } from '../../fixtures'; -import { initDeploymentFrequencySettings, updateShouldGetPipelineConfig } from '@src/context/Metrics/metricsSlice'; import { AXIOS_REQUEST_ERROR_CODE, SOURCE_CONTROL_TYPES } from '@src/constants/resources'; import { sourceControlClient } from '@src/clients/sourceControl/SourceControlClient'; +import { updateShouldGetPipelineConfig } from '@src/context/Metrics/metricsSlice'; import { fireEvent, render, screen, waitFor } from '@testing-library/react'; import { SourceControl } from '@src/containers/ConfigStep/SourceControl'; import { setupStore } from '../../utils/setupStoreUtil'; @@ -170,7 +170,6 @@ describe('SourceControl', () => { fillSourceControlFieldsInformation(); expect(updateShouldGetPipelineConfig).toHaveBeenCalledWith(true); - expect(initDeploymentFrequencySettings).toHaveBeenCalled(); }); it('should show error message and error style when token is empty', () => { diff --git a/frontend/__tests__/containers/MetricsStep/Crews.test.tsx b/frontend/__tests__/containers/MetricsStep/Crews.test.tsx index e7ca40166f..38693e6601 100644 --- a/frontend/__tests__/containers/MetricsStep/Crews.test.tsx +++ b/frontend/__tests__/containers/MetricsStep/Crews.test.tsx @@ -13,7 +13,7 @@ const assigneeFilterValues = ['lastAssignee', 'historicalAssignee']; jest.mock('@src/context/Metrics/metricsSlice', () => ({ ...jest.requireActual('@src/context/Metrics/metricsSlice'), - selectMetricsContent: jest.fn().mockReturnValue({ users: ['crew A', 'crew B'] }), + selectMetricsContent: jest.fn().mockReturnValue({ users: ['crew A', 'crew B'], pipelineCrews: ['A', 'B'] }), })); const mockedUseAppDispatch = jest.fn(); @@ -23,10 +23,10 @@ jest.mock('@src/hooks/useAppDispatch', () => ({ let store = setupStore(); -const setup = () => { +const setup = (type?: string) => { return render( - + , ); }; @@ -46,13 +46,18 @@ describe('Crew', () => { expect(screen.getByText(mockTitle)).toBeInTheDocument(); }); - it('should selected all options by default when initializing', () => { + it('should selected all options by default when initializing given type is board', () => { setup(); expect(screen.getByRole('button', { name: 'crew A' })).toBeInTheDocument(); expect(screen.getByRole('button', { name: 'crew B' })).toBeInTheDocument(); }); + it('should selected all options by default when initializing given type is other', () => { + setup('other'); + expect(screen.getByRole('button', { name: 'A' })).toBeInTheDocument(); + expect(screen.getByRole('button', { name: 'B' })).toBeInTheDocument(); + }); it('should show detail options when click Included crews button', async () => { setup(); diff --git a/frontend/__tests__/containers/MetricsStep/DeploymentFrequencySettings/BranchSelection.test.tsx b/frontend/__tests__/containers/MetricsStep/DeploymentFrequencySettings/BranchSelection.test.tsx index 7ae9786bf7..caf16fc35d 100644 --- a/frontend/__tests__/containers/MetricsStep/DeploymentFrequencySettings/BranchSelection.test.tsx +++ b/frontend/__tests__/containers/MetricsStep/DeploymentFrequencySettings/BranchSelection.test.tsx @@ -48,7 +48,7 @@ describe('BranchSelection', () => { return render( - + , ); }; diff --git a/frontend/__tests__/containers/MetricsStep/DeploymentFrequencySettings/DeploymentFrequencySettings.test.tsx b/frontend/__tests__/containers/MetricsStep/DeploymentFrequencySettings/DeploymentFrequencySettings.test.tsx index ba5313cce1..bed2e4a8c1 100644 --- a/frontend/__tests__/containers/MetricsStep/DeploymentFrequencySettings/DeploymentFrequencySettings.test.tsx +++ b/frontend/__tests__/containers/MetricsStep/DeploymentFrequencySettings/DeploymentFrequencySettings.test.tsx @@ -7,10 +7,28 @@ import { DEPLOYMENT_FREQUENCY_SETTINGS, LIST_OPEN, LOADING, ORGANIZATION, REMOVE import { DeploymentFrequencySettings } from '@src/containers/MetricsStep/DeploymentFrequencySettings'; import { IUseVerifyPipeLineToolStateInterface } from '@src/hooks/useGetPipelineToolInfoEffect'; import { TokenAccessAlert } from '@src/containers/MetricsStep/TokenAccessAlert'; -import { act, render, screen, within } from '@testing-library/react'; +import { act, render, screen, waitFor, within } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import { Provider } from 'react-redux'; -import { store } from '@src/store'; + +import { setupStore } from '@test/utils/setupStoreUtil'; + +let mockSelectShouldGetPipelineConfig = true; +let mockSelectPipelineNames: string[] = []; +const mockSelectStepsParams = { + organizationId: 0, + pipelineType: '', + token: '', + params: [ + { + pipelineName: mockSelectPipelineNames, + repository: '', + orgName: '', + startTime: '2024-02-01T00:00:00.000+08:00', + endTime: '2024-02-15T23:59:59.999+08:00', + }, + ], +}; jest.mock('@src/hooks', () => ({ ...jest.requireActual('@src/hooks'), @@ -23,24 +41,24 @@ jest.mock('@src/context/Metrics/metricsSlice', () => ({ deleteADeploymentFrequencySetting: jest.fn(), updateDeploymentFrequencySettings: jest.fn(), selectDeploymentFrequencySettings: jest.fn().mockReturnValue([ - { id: 0, organization: '', pipelineName: '', steps: '', branches: [] }, + { id: 0, organization: 'mockOrgName', pipelineName: '1', steps: '', branches: [] }, { id: 1, organization: '', pipelineName: '', steps: '', branches: [] }, ]), selectOrganizationWarningMessage: jest.fn().mockReturnValue(null), selectPipelineNameWarningMessage: jest.fn().mockReturnValue(null), selectStepWarningMessage: jest.fn().mockReturnValue(null), selectMetricsContent: jest.fn().mockReturnValue({ pipelineCrews: [], users: [] }), - selectShouldGetPipelineConfig: jest.fn().mockReturnValue(true), + selectShouldGetPipelineConfig: jest.fn().mockImplementation(() => mockSelectShouldGetPipelineConfig), })); jest.mock('@src/context/config/configSlice', () => ({ ...jest.requireActual('@src/context/config/configSlice'), - selectPipelineOrganizations: jest.fn().mockReturnValue(['mockOrgName']), - selectPipelineNames: jest.fn().mockReturnValue(['']), + selectPipelineOrganizations: jest.fn().mockReturnValue(['mockOrgName', 'mockOrgName2']), + selectPipelineNames: jest.fn().mockImplementation(() => mockSelectPipelineNames), selectSteps: jest.fn().mockReturnValue(['']), selectBranches: jest.fn().mockReturnValue(['']), selectPipelineCrews: jest.fn().mockReturnValue(['']), - selectStepsParams: jest.fn().mockReturnValue(['']), + selectStepsParams: jest.fn().mockImplementation(() => mockSelectStepsParams), selectDateRange: jest.fn().mockReturnValue(['']), })); @@ -53,6 +71,7 @@ jest.mock('@src/hooks/useMetricsStepValidationCheckContext', () => ({ })); const mockGetPipelineToolInfoOkResponse = { + isFirstFetch: false, isLoading: false, apiCallFunc: jest.fn(), result: { @@ -67,6 +86,7 @@ const mockGetPipelineToolInfoOkResponse = { repository: 'git@github.com:au-heartbeat/Heartbeat.git', steps: [':pipeline: Upload pipeline.yml'], branches: [], + crews: [], }, ], }, @@ -80,15 +100,46 @@ jest.mock('@src/hooks/useGetPipelineToolInfoEffect', () => ({ useGetPipelineToolInfoEffect: () => mockGetPipelineToolInfoSpy, })); describe('DeploymentFrequencySettings', () => { - const setup = () => - render( + let store = null; + const setup = () => { + store = setupStore(); + return render( , ); + }; afterEach(() => { jest.clearAllMocks(); }); + beforeEach(() => { + mockSelectShouldGetPipelineConfig = true; + mockSelectPipelineNames = []; + mockGetPipelineToolInfoSpy = mockGetPipelineToolInfoOkResponse; + }); + + it('should show crew settings when select pipelineName', async () => { + mockSelectPipelineNames = ['Heartbeat']; + const { getAllByRole, getByRole } = await setup(); + await act(async () => { + await userEvent.click(getAllByRole('button', { name: LIST_OPEN })[0]); + }); + + let listBox = within(getByRole('listbox')); + await act(async () => { + await userEvent.click(listBox.getByText('mockOrgName')); + }); + await act(async () => { + await userEvent.click(getAllByRole('button', { name: LIST_OPEN })[1]); + }); + listBox = within(getByRole('listbox')); + await act(async () => { + await userEvent.click(listBox.getByText('Heartbeat')); + }); + waitFor(() => { + expect(screen.getByText('Crew setting (optional)')).toBeInTheDocument(); + }); + }); it('should render DeploymentFrequencySettings component', () => { const { getByText, getAllByText } = setup(); @@ -122,14 +173,21 @@ describe('DeploymentFrequencySettings', () => { }); const listBox = within(getByRole('listbox')); await act(async () => { - await userEvent.click(listBox.getByText('mockOrgName')); + await userEvent.click(listBox.getByText('mockOrgName2')); }); expect(updateDeploymentFrequencySettings).toHaveBeenCalledTimes(1); }); + it('show render crews component when all pipelines load completed', () => { + mockSelectShouldGetPipelineConfig = false; + setup(); + expect(screen.getByText('Crew setting (optional)')).toBeInTheDocument(); + }); + it('should display error UI when get pipeline info client returns non-200 code', () => { mockGetPipelineToolInfoSpy = { + isFirstFetch: false, isLoading: false, apiCallFunc: jest.fn(), result: { @@ -145,6 +203,7 @@ describe('DeploymentFrequencySettings', () => { it('should show loading when get pipeline info client pending', () => { mockGetPipelineToolInfoSpy = { + isFirstFetch: false, isLoading: true, apiCallFunc: jest.fn(), result: { @@ -158,6 +217,15 @@ describe('DeploymentFrequencySettings', () => { expect(screen.getByTestId(LOADING)).toBeInTheDocument(); }); + it('should not show crews part when pipeline is loading', async () => { + mockGetPipelineToolInfoSpy = { + ...mockGetPipelineToolInfoOkResponse, + isFirstFetch: true, + }; + setup(); + expect(screen.queryByText('Crews Setting')).toBeNull(); + }); + it('renders without error when errorDetail is provided', () => { const { queryByLabelText } = render(); expect(queryByLabelText('alert for token access error')).toBeInTheDocument(); diff --git a/frontend/__tests__/containers/MetricsStep/DeploymentFrequencySettings/PipelineMetricSelection.test.tsx b/frontend/__tests__/containers/MetricsStep/DeploymentFrequencySettings/PipelineMetricSelection.test.tsx index 6e704ee2b4..a93c406955 100644 --- a/frontend/__tests__/containers/MetricsStep/DeploymentFrequencySettings/PipelineMetricSelection.test.tsx +++ b/frontend/__tests__/containers/MetricsStep/DeploymentFrequencySettings/PipelineMetricSelection.test.tsx @@ -89,6 +89,7 @@ describe('PipelineMetricSelection', () => { }; const mockHandleClickRemoveButton = jest.fn(); const mockUpdatePipeline = jest.fn(); + const mockSetLoadingCompletedNumber = jest.fn(); const setup = async ( deploymentFrequencySetting: IPipelineConfig, @@ -106,6 +107,8 @@ describe('PipelineMetricSelection', () => { onUpdatePipeline={mockUpdatePipeline} isDuplicated={isDuplicated} isInfoLoading={false} + totalPipelineNumber={2} + setLoadingCompletedNumber={mockSetLoadingCompletedNumber} /> , ); @@ -181,7 +184,7 @@ describe('PipelineMetricSelection', () => { await waitFor(() => { expect(getByText('Failed to get BuildKite steps')).toBeInTheDocument(); }); - expect(mockUpdatePipeline).toHaveBeenCalledTimes(2); + expect(mockUpdatePipeline).toHaveBeenCalledTimes(3); }); it('should show no steps warning message when getSteps succeed but get no steps', async () => { metricsClient.getSteps = jest diff --git a/frontend/__tests__/containers/MetricsStep/DeploymentFrequencySettings/SingleSelection.test.tsx b/frontend/__tests__/containers/MetricsStep/DeploymentFrequencySettings/SingleSelection.test.tsx index 7262668360..5943f07aa0 100644 --- a/frontend/__tests__/containers/MetricsStep/DeploymentFrequencySettings/SingleSelection.test.tsx +++ b/frontend/__tests__/containers/MetricsStep/DeploymentFrequencySettings/SingleSelection.test.tsx @@ -119,6 +119,6 @@ describe('SingleSelection', () => { }); expect(mockOnGetSteps).toHaveBeenCalledTimes(1); - expect(mockUpdatePipeline).toHaveBeenCalledTimes(2); + expect(mockUpdatePipeline).toHaveBeenCalledTimes(3); }); }); diff --git a/frontend/__tests__/context/metricsSlice.test.ts b/frontend/__tests__/context/metricsSlice.test.ts index bada2954b3..7ad58523ba 100644 --- a/frontend/__tests__/context/metricsSlice.test.ts +++ b/frontend/__tests__/context/metricsSlice.test.ts @@ -650,7 +650,7 @@ describe('saveMetricsSetting reducer', () => { ...initState, deploymentFrequencySettings: [{ id: 1, organization: '', pipelineName: '', step: '', branches: [] }], }, - updateDeploymentFrequencySettings({ updateId: 1, label: 'Steps', value: 'value' }), + updateDeploymentFrequencySettings({ updateId: 1, label: 'Step', value: 'value' }), ); expect(updateDeploymentFrequencySettingsResult.deploymentFrequencySettings[0].step).toEqual('value'); @@ -694,7 +694,7 @@ describe('saveMetricsSetting reducer', () => { id: 2, organization: 'mockOrganization2', pipelineName: 'mockPipelineName3', - step: 'mockStep3', + step: '', branches: [], }, ], @@ -719,8 +719,7 @@ describe('saveMetricsSetting reducer', () => { step: 'mockStep1', branches: [], }, - { id: 1, organization: 'mockOrganization1', pipelineName: '', step: 'mockStep2', branches: [] }, - { id: 2, organization: '', pipelineName: '', step: 'mockStep3', branches: [] }, + { id: 1, organization: 'mockOrganization1', pipelineName: '', step: '', branches: [] }, ], leadTimeForChanges: [ { id: 0, organization: 'mockOrganization1', pipelineName: 'mockPipelineName1', step: '', branches: [] }, @@ -753,12 +752,13 @@ describe('saveMetricsSetting reducer', () => { pipelineName: 'mockPipelineName2', step: 'mockStep2', branches: [], + isStepEmptyString: false, }, { id: 2, organization: 'mockOrganization2', pipelineName: 'mockPipelineName3', - step: 'mockStep3', + step: '', branches: [], }, ], @@ -783,8 +783,13 @@ describe('saveMetricsSetting reducer', () => { step: 'mockStep1', branches: [], }, - { id: 1, organization: 'mockOrganization1', pipelineName: '', step: 'mockStep2', branches: [] }, - { id: 2, organization: '', pipelineName: '', step: 'mockStep3', branches: [] }, + { + id: 1, + organization: 'mockOrganization1', + pipelineName: '', + step: '', + branches: [], + }, ], leadTimeForChanges: [ { id: 0, organization: 'mockOrganization1', pipelineName: 'mockPipelineName1', step: '', branches: [] }, @@ -805,7 +810,9 @@ describe('saveMetricsSetting reducer', () => { }, pipelineCrews: [], expectSetting: { - deploymentFrequencySettings: [{ id: 0, organization: '', pipelineName: '', step: '', branches: [] }], + deploymentFrequencySettings: [ + { id: 0, organization: '', pipelineName: '', step: '', branches: [], isStepEmptyString: false }, + ], leadTimeForChanges: [{ id: 0, organization: '', pipelineName: '', step: '', branches: [] }], deploymentWarningMessage: [], leadTimeWarningMessage: [], @@ -824,7 +831,9 @@ describe('saveMetricsSetting reducer', () => { }, pipelineCrews: [], expectSetting: { - deploymentFrequencySettings: [{ id: 1, organization: '', pipelineName: '', step: '', branches: [] }], + deploymentFrequencySettings: [ + { id: 1, organization: '', pipelineName: '', step: '', branches: [], isStepEmptyString: false }, + ], leadTimeForChanges: [{ id: 0, organization: '', pipelineName: '', step: '', branches: [] }], deploymentWarningMessage: [], leadTimeWarningMessage: [], @@ -887,7 +896,7 @@ describe('saveMetricsSetting reducer', () => { id: 0, organization: 'mockOrganization1', pipelineName: 'mockPipelineName1', - step: '', + step: 'mockStep1', branches: ['branch1'], }, { id: 1, organization: 'mockOrganization1', pipelineName: 'mockPipelineName2', step: '', branches: [] }, @@ -929,10 +938,22 @@ describe('saveMetricsSetting reducer', () => { step: 'mockStep1', branches: [], }, - { id: 1, organization: 'mockOrganization1', pipelineName: 'mockPipelineName2', step: '', branches: [] }, + { + id: 1, + organization: 'mockOrganization1', + pipelineName: 'mockPipelineName2', + step: '', + branches: [], + isStepEmptyString: true, + }, ], expectedWarning: [ - { id: 0, organization: null, pipelineName: null, step: null }, + { + id: 0, + organization: null, + pipelineName: null, + step: null, + }, { id: 1, organization: null, pipelineName: null, step: null }, ], }, @@ -947,7 +968,7 @@ describe('saveMetricsSetting reducer', () => { id: 0, organization: 'mockOrganization1', pipelineName: 'mockPipelineName1', - step: '', + step: 'mockStep1', branches: ['branch1'], }, { @@ -955,7 +976,8 @@ describe('saveMetricsSetting reducer', () => { organization: 'mockOrganization1', pipelineName: 'mockPipelineName2', step: '', - branches: ['branch1'], + branches: [], + isStepEmptyString: true, }, ], expectedWarning: [ @@ -979,13 +1001,25 @@ describe('saveMetricsSetting reducer', () => { id: 0, organization: 'mockOrganization1', pipelineName: 'mockPipelineName1', - step: '', + step: 'mockStep1', branches: ['branch1'], }, - { id: 1, organization: 'mockOrganization1', pipelineName: 'mockPipelineName2', step: '', branches: [] }, + { + id: 1, + organization: 'mockOrganization1', + pipelineName: 'mockPipelineName2', + step: '', + branches: [], + isStepEmptyString: true, + }, ], expectedWarning: [ - { id: 0, organization: null, pipelineName: null, step: null }, + { + id: 0, + organization: null, + pipelineName: null, + step: null, + }, { id: 1, organization: null, @@ -1005,10 +1039,17 @@ describe('saveMetricsSetting reducer', () => { id: 0, organization: 'mockOrganization1', pipelineName: 'mockPipelineName1', - step: '', + step: 'mockStep1', branches: ['branch1'], }, - { id: 1, organization: 'mockOrganization1', pipelineName: 'mockPipelineName2', step: '', branches: [] }, + { + id: 1, + organization: 'mockOrganization1', + pipelineName: 'mockPipelineName2', + step: '', + branches: [], + isStepEmptyString: true, + }, ], expectedWarning: [ { id: 0, organization: null, pipelineName: null, step: null }, @@ -1458,6 +1499,7 @@ describe('saveMetricsSetting reducer', () => { orgName: 'mockOrganization1', repository: 'mockRepository1', steps: ['mock step 1', 'mock step 2'], + isStepEmptyString: false, }, ]; const mockSteps = ['mockStep']; @@ -1496,7 +1538,7 @@ describe('saveMetricsSetting reducer', () => { it('should return status of initial state', () => { expect(selectShouldGetBoardConfig(store.getState())).toBeFalsy(); expect(selectShouldGetPipelineConfig(store.getState())).toBeFalsy(); - expect(selectDeploymentFrequencySettings(store.getState()).length).toBeGreaterThan(1); + expect(selectDeploymentFrequencySettings(store.getState()).length).toBeGreaterThan(0); expect(selectReworkTimesSettings(store.getState())).toStrictEqual({ excludeStates: [], reworkState: null }); expect(selectCycleTimeSettings(store.getState())).toEqual([]); expect(selectMetricsContent(store.getState()).assigneeFilter).toEqual('lastAssignee'); @@ -1515,7 +1557,7 @@ describe('saveMetricsSetting reducer', () => { }); it('should return step warning message given its id and type', () => { - expect(selectStepWarningMessage(store.getState(), 0)).toBeNull(); + expect(selectStepWarningMessage(store.getState(), 0)).toEqual(STEP_WARNING_MESSAGE); expect(selectStepWarningMessage(store.getState(), 1)).toEqual(STEP_WARNING_MESSAGE); }); }); diff --git a/frontend/__tests__/context/pipelineToolSlice.test.ts b/frontend/__tests__/context/pipelineToolSlice.test.ts index ad25905229..33a164732c 100644 --- a/frontend/__tests__/context/pipelineToolSlice.test.ts +++ b/frontend/__tests__/context/pipelineToolSlice.test.ts @@ -25,6 +25,7 @@ describe('pipelineTool reducer', () => { orgName: 'mockOrgName', repository: 'mockRepository', steps: ['step1', 'step2'], + crews: [], }, ], }; @@ -38,6 +39,7 @@ describe('pipelineTool reducer', () => { orgName: 'mockOrgName', repository: 'mockRepository', steps: ['step1', 'step2'], + crews: [], }, { id: 'mockId2', @@ -46,6 +48,7 @@ describe('pipelineTool reducer', () => { orgName: 'mockOrgName', repository: 'mockRepository', steps: ['step3', 'step4'], + crews: [], }, ], }; @@ -95,9 +98,9 @@ describe('pipelineTool reducer', () => { repository: 'mock repository url', steps: [], branches: [], + crews: [], }, ], - pipelineCrews: [], }, }, }; @@ -143,9 +146,9 @@ describe('pipelineTool reducer', () => { repository: 'mock repository url', steps: [], branches: [], + crews: [], }, ], - pipelineCrews: [], }, }, }; @@ -168,6 +171,7 @@ describe('pipelineTool reducer', () => { repository: 'mock repository url', steps: [], branches: [], + crews: [], }, ]); }); diff --git a/frontend/__tests__/initialConfigState.ts b/frontend/__tests__/initialConfigState.ts index 4b36c0ce40..b0500db339 100644 --- a/frontend/__tests__/initialConfigState.ts +++ b/frontend/__tests__/initialConfigState.ts @@ -43,7 +43,6 @@ const initialConfigState: BasicConfigState = { isShow: false, verifiedResponse: { pipelineList: [], - pipelineCrews: [], }, }, sourceControl: { diff --git a/frontend/e2e/fixtures/create-new/metrics-step.ts b/frontend/e2e/fixtures/create-new/metrics-step.ts index 627a94a965..d6aa3cdd6e 100644 --- a/frontend/e2e/fixtures/create-new/metrics-step.ts +++ b/frontend/e2e/fixtures/create-new/metrics-step.ts @@ -99,6 +99,7 @@ export const config = { deployment: [ { id: 0, + isStepEmptyString: true, organization: 'Thoughtworks-Heartbeat', pipelineName: 'Heartbeat', step: ':rocket: Deploy prod', @@ -176,6 +177,7 @@ export const modifiedConfig = { pipelineName: 'Heartbeat', step: ':rocket: Deploy prod', branches: ['main', 'gh-pages'], + isStepEmptyString: false, }, ], }; diff --git a/frontend/e2e/fixtures/import-file/multiple-done-config-file.ts b/frontend/e2e/fixtures/import-file/multiple-done-config-file.ts index 78b8e7ff5a..48a50c1905 100644 --- a/frontend/e2e/fixtures/import-file/multiple-done-config-file.ts +++ b/frontend/e2e/fixtures/import-file/multiple-done-config-file.ts @@ -96,6 +96,7 @@ export const importMultipleDoneProjectFromFile = { pipelineName: 'Heartbeat', step: ':rocket: Deploy prod', branches: ['main'], + isStepEmptyString: false, }, ], reworkTimesSettings: { diff --git a/frontend/e2e/fixtures/import-file/unhappy-path-file.ts b/frontend/e2e/fixtures/import-file/unhappy-path-file.ts index 5aacf6847c..757f4286bb 100644 --- a/frontend/e2e/fixtures/import-file/unhappy-path-file.ts +++ b/frontend/e2e/fixtures/import-file/unhappy-path-file.ts @@ -86,6 +86,7 @@ export const importInputWrongProjectFromFile = { pipelineName: 'Heartbeat', step: ':rocket: Deploy prod', branches: ['main', 'ADM-747'], + isStepEmptyString: false, }, ], }; diff --git a/frontend/src/components/HomeGuide/index.tsx b/frontend/src/components/HomeGuide/index.tsx index 8c8247ce26..6ab6df6b2c 100644 --- a/frontend/src/components/HomeGuide/index.tsx +++ b/frontend/src/components/HomeGuide/index.tsx @@ -1,5 +1,6 @@ import { resetMetricData, + savePipelineCrews, setCycleTimeSettingsType, updateMetricsImportedData, } from '@src/context/Metrics/metricsSlice'; @@ -47,6 +48,7 @@ export const HomeGuide = () => { dispatch(updateProjectCreatedState(false)); dispatch(updateBasicConfigState(config)); dispatch(updateMetricsImportedData(config)); + dispatch(savePipelineCrews(config.pipelineCrews)); dispatch(setCycleTimeSettingsType(getCycleTimeSettingsType(config.cycleTime?.type))); navigate(ROUTE.METRICS_PAGE); } else { diff --git a/frontend/src/containers/ConfigStep/DateRangePicker/DateRangePickerGroup.tsx b/frontend/src/containers/ConfigStep/DateRangePicker/DateRangePickerGroup.tsx index 1043d687f9..e52bcadb6e 100644 --- a/frontend/src/containers/ConfigStep/DateRangePicker/DateRangePickerGroup.tsx +++ b/frontend/src/containers/ConfigStep/DateRangePicker/DateRangePickerGroup.tsx @@ -1,8 +1,4 @@ -import { - initDeploymentFrequencySettings, - updateShouldGetBoardConfig, - updateShouldGetPipelineConfig, -} from '@src/context/Metrics/metricsSlice'; +import { updateShouldGetBoardConfig, updateShouldGetPipelineConfig } from '@src/context/Metrics/metricsSlice'; import { DateRangePickerGroupContainer } from '@src/containers/ConfigStep/DateRangePicker/style'; import { DateRangePicker } from '@src/containers/ConfigStep/DateRangePicker/DateRangePicker'; import { ADD_TIME_RANGE_BUTTON_TEXT, MAX_TIME_RANGE_AMOUNT } from '@src/constants/resources'; @@ -73,7 +69,6 @@ export const DateRangePickerGroup = ({ sortType, onError }: Props) => { const dispatchUpdateConfig = () => { dispatch(updateShouldGetBoardConfig(true)); dispatch(updateShouldGetPipelineConfig(true)); - dispatch(initDeploymentFrequencySettings()); }; const addRangeHandler = () => { diff --git a/frontend/src/containers/ConfigStep/SourceControl/index.tsx b/frontend/src/containers/ConfigStep/SourceControl/index.tsx index 69304d3575..39863d0eae 100644 --- a/frontend/src/containers/ConfigStep/SourceControl/index.tsx +++ b/frontend/src/containers/ConfigStep/SourceControl/index.tsx @@ -10,9 +10,9 @@ import { StyledTextField, StyledTypeSelections, } from '@src/components/Common/ConfigForms'; -import { initDeploymentFrequencySettings, updateShouldGetPipelineConfig } from '@src/context/Metrics/metricsSlice'; import { useVerifySourceControlTokenEffect } from '@src/hooks/useVerifySourceControlTokenEffect'; import { CONFIG_TITLE, SOURCE_CONTROL_TYPES, TOKEN_HELPER_TEXT } from '@src/constants/resources'; +import { updateShouldGetPipelineConfig } from '@src/context/Metrics/metricsSlice'; import { ConfigButtonGrop } from '@src/containers/ConfigStep/ConfigButton'; import { useAppDispatch, useAppSelector } from '@src/hooks/useAppDispatch'; import { InputLabel, ListItemText, MenuItem, Select } from '@mui/material'; @@ -71,7 +71,6 @@ export const SourceControl = () => { }), ); dispatch(updateShouldGetPipelineConfig(true)); - dispatch(initDeploymentFrequencySettings()); }; const getNewFields = (value: string) => diff --git a/frontend/src/containers/MetricsStep/DeploymentFrequencySettings/BranchSelection/index.tsx b/frontend/src/containers/MetricsStep/DeploymentFrequencySettings/BranchSelection/index.tsx index afc4020325..4e38543caa 100644 --- a/frontend/src/containers/MetricsStep/DeploymentFrequencySettings/BranchSelection/index.tsx +++ b/frontend/src/containers/MetricsStep/DeploymentFrequencySettings/BranchSelection/index.tsx @@ -20,16 +20,16 @@ export interface BranchSelectionProps { organization: string; pipelineName: string; branches: string[]; + isStepLoading: boolean; onUpdatePipeline: (id: number, label: string, value: string[] | unknown) => void; } export const BranchSelection = (props: BranchSelectionProps) => { const dispatch = useAppDispatch(); - const { id, organization, pipelineName, branches, onUpdatePipeline } = props; + const { id, organization, pipelineName, branches, onUpdatePipeline, isStepLoading } = props; const formMeta = useAppSelector(getFormMeta); const pipelineList = useAppSelector(selectPipelineList); const sourceControlFields = useAppSelector(selectSourceControl); - const currentPipeline = useMemo( () => pipelineList.find((pipeline) => pipeline.name === pipelineName && pipeline.orgName === organization), [organization, pipelineList, pipelineName], @@ -132,10 +132,10 @@ export const BranchSelection = (props: BranchSelectionProps) => { )} renderTags={(selectedOptions, getTagProps) => diff --git a/frontend/src/containers/MetricsStep/DeploymentFrequencySettings/PipelineMetricSelection/index.tsx b/frontend/src/containers/MetricsStep/DeploymentFrequencySettings/PipelineMetricSelection/index.tsx index 84c373b2d8..00611b70e7 100644 --- a/frontend/src/containers/MetricsStep/DeploymentFrequencySettings/PipelineMetricSelection/index.tsx +++ b/frontend/src/containers/MetricsStep/DeploymentFrequencySettings/PipelineMetricSelection/index.tsx @@ -5,13 +5,16 @@ import { updatePipelineStep, updateShouldGetPipelineConfig, selectShouldGetPipelineConfig, + updatePiplineCrews, } from '@src/context/Metrics/metricsSlice'; import { + updatePipelineToolVerifyResponseCrews, selectPipelineNames, selectPipelineOrganizations, selectSteps, selectStepsParams, updatePipelineToolVerifyResponseSteps, + selectPipelineList, } from '@src/context/config/configSlice'; import { SingleSelection } from '@src/containers/MetricsStep/DeploymentFrequencySettings/SingleSelection'; @@ -19,12 +22,13 @@ import { BranchSelection } from '@src/containers/MetricsStep/DeploymentFrequency import { ButtonWrapper, PipelineMetricSelectionWrapper, RemoveButton, WarningMessage } from './style'; import { WarningNotification } from '@src/components/Common/WarningNotification'; import { useGetMetricsStepsEffect } from '@src/hooks/useGetMetricsStepsEffect'; +import { uniqPipelineListCrews, updateResponseCrews } from '@src/utils/util'; import { MESSAGE, NO_PIPELINE_STEP_ERROR } from '@src/constants/resources'; import { ErrorNotification } from '@src/components/ErrorNotification'; import { shouldMetricsLoad } from '@src/context/stepper/StepperSlice'; import { useAppDispatch, useAppSelector } from '@src/hooks'; +import { useEffect, useRef, useState } from 'react'; import { Loading } from '@src/components/Loading'; -import { useEffect, useState } from 'react'; import { store } from '@src/store'; interface pipelineMetricSelectionProps { @@ -41,6 +45,8 @@ interface pipelineMetricSelectionProps { onRemovePipeline: (id: number) => void; onUpdatePipeline: (id: number, label: string, value: string | StringConstructor[] | unknown) => void; isDuplicated: boolean; + setLoadingCompletedNumber: React.Dispatch>; + totalPipelineNumber: number; } export const PipelineMetricSelection = ({ @@ -51,6 +57,8 @@ export const PipelineMetricSelection = ({ onUpdatePipeline, isDuplicated, isInfoLoading, + setLoadingCompletedNumber, + totalPipelineNumber, }: pipelineMetricSelectionProps) => { const { id, organization, pipelineName, step } = pipelineSetting; const dispatch = useAppDispatch(); @@ -64,12 +72,18 @@ export const PipelineMetricSelection = ({ const stepWarningMessage = selectStepWarningMessage(storeContext, id); const [isShowNoStepWarning, setIsShowNoStepWarning] = useState(false); const shouldLoad = useAppSelector(shouldMetricsLoad); + const pipelineList = useAppSelector(selectPipelineList); const shouldGetPipelineConfig = useAppSelector(selectShouldGetPipelineConfig); + const isLoadingRef = useRef(false); const validStepValue = stepsOptions.includes(step) ? step : ''; const handleRemoveClick = () => { + const newCrews = uniqPipelineListCrews(updateResponseCrews(organization, pipelineName, pipelineList)); + dispatch(updatePipelineToolVerifyResponseCrews({ organization, pipelineName })); + dispatch(updatePiplineCrews(newCrews)); onRemovePipeline(id); + setLoadingCompletedNumber((value) => Math.max(value - 1, 0)); }; useEffect(() => { @@ -77,12 +91,22 @@ export const PipelineMetricSelection = ({ // eslint-disable-next-line react-hooks/exhaustive-deps }, [shouldLoad, pipelineName, isInfoLoading, shouldGetPipelineConfig]); + useEffect(() => { + if (isLoadingRef.current && !isLoading) { + setLoadingCompletedNumber((value) => Math.min(totalPipelineNumber, value + 1)); + } else if (!shouldGetPipelineConfig && !isLoading) { + setLoadingCompletedNumber(totalPipelineNumber); + } + isLoadingRef.current = isLoading; + }, [isLoading, setLoadingCompletedNumber, totalPipelineNumber, shouldGetPipelineConfig]); + const handleGetPipelineData = (_pipelineName: string) => { const { params, buildId, organizationId, pipelineType, token } = selectStepsParams( store.getState(), organization, _pipelineName, ); + setLoadingCompletedNumber((value) => Math.max(value - 1, 0)); getSteps(params, organizationId, buildId, pipelineType, token).then((res) => { if (res && !res.haveStep) { isShowRemoveButton && handleRemoveClick(); @@ -143,7 +167,9 @@ export const PipelineMetricSelection = ({ onUpDatePipeline={(id, label, value) => onUpdatePipeline(id, label, value)} /> )} - {organization && pipelineName && } + {organization && pipelineName && ( + + )} {isShowRemoveButton && ( diff --git a/frontend/src/containers/MetricsStep/DeploymentFrequencySettings/SingleSelection/index.tsx b/frontend/src/containers/MetricsStep/DeploymentFrequencySettings/SingleSelection/index.tsx index 5f2a43e800..70082169d3 100644 --- a/frontend/src/containers/MetricsStep/DeploymentFrequencySettings/SingleSelection/index.tsx +++ b/frontend/src/containers/MetricsStep/DeploymentFrequencySettings/SingleSelection/index.tsx @@ -1,9 +1,11 @@ import { selectDeploymentFrequencySettings } from '@src/context/Metrics/metricsSlice'; import { getEmojiUrls, removeExtraEmojiName } from '@src/constants/emojis/emoji'; +import { initSinglePipelineListBranches } from '@src/context/meta/metaSlice'; import { Autocomplete, Box, ListItemText, TextField } from '@mui/material'; import { getDisabledOptions, sortDisabledOptions } from '@src/utils/util'; import { EmojiWrap, StyledAvatar } from '@src/constants/emojis/style'; import { DEFAULT_HELPER_TEXT, Z_INDEX } from '@src/constants/commons'; +import { useAppDispatch } from '@src/hooks/useAppDispatch'; import { FormControlWrapper } from './style'; import { useAppSelector } from '@src/hooks'; import React, { useState } from 'react'; @@ -16,7 +18,7 @@ interface Props { isError?: boolean; errorText?: string; onGetSteps?: (pipelineName: string) => void; - onUpDatePipeline: (id: number, label: string, value: string) => void; + onUpDatePipeline: (id: number, label: string, value: string | []) => void; } export const SingleSelection = ({ @@ -32,11 +34,14 @@ export const SingleSelection = ({ const labelId = `single-selection-${label.toLowerCase().replace(' ', '-')}`; const [inputValue, setInputValue] = useState(value); const deploymentFrequencySettings = useAppSelector(selectDeploymentFrequencySettings); + const dispatch = useAppDispatch(); const handleSelectedOptionsChange = (value: string) => { if (onGetSteps) { onUpDatePipeline(id, 'Step', ''); + onUpDatePipeline(id, 'Branches', []); onGetSteps(value); + dispatch(initSinglePipelineListBranches(id)); } onUpDatePipeline(id, label, value); }; diff --git a/frontend/src/containers/MetricsStep/DeploymentFrequencySettings/index.tsx b/frontend/src/containers/MetricsStep/DeploymentFrequencySettings/index.tsx index c03ae7f5d5..c8c56b6881 100644 --- a/frontend/src/containers/MetricsStep/DeploymentFrequencySettings/index.tsx +++ b/frontend/src/containers/MetricsStep/DeploymentFrequencySettings/index.tsx @@ -19,20 +19,22 @@ import { useAppDispatch, useAppSelector } from '@src/hooks'; import { Crews } from '@src/containers/MetricsStep/Crews'; import { Loading } from '@src/components/Loading'; import { HttpStatusCode } from 'axios'; -import isEmpty from 'lodash/isEmpty'; +import { useState } from 'react'; export const DeploymentFrequencySettings = () => { const dispatch = useAppDispatch(); - const { isLoading, result: pipelineInfoResult, apiCallFunc } = useGetPipelineToolInfoEffect(); + const { isLoading, result: pipelineInfoResult, apiCallFunc, isFirstFetch } = useGetPipelineToolInfoEffect(); const deploymentFrequencySettings = useAppSelector(selectDeploymentFrequencySettings); + const [loadingCompletedNumber, setLoadingCompletedNumber] = useState(0); const { getDuplicatedPipeLineIds } = useMetricsStepValidationCheckContext(); const pipelineCrews = useAppSelector(selectPipelineCrews); const errorDetail = useAppSelector(getErrorDetail) as number; const handleAddPipeline = () => { dispatch(addADeploymentFrequencySetting()); + setLoadingCompletedNumber((value) => value + 1); }; - + const realDeploymentFrequencySettings = isFirstFetch ? [] : deploymentFrequencySettings; const handleRemovePipeline = (id: number) => { dispatch(deleteADeploymentFrequencySetting(id)); dispatch(deleteMetricsPipelineFormMeta(id)); @@ -42,6 +44,10 @@ export const DeploymentFrequencySettings = () => { dispatch(updateDeploymentFrequencySettings({ updateId: id, label, value })); }; + const totalPipelineNumber = realDeploymentFrequencySettings.length; + const shouldShowCrews = + loadingCompletedNumber !== 0 && totalPipelineNumber !== 0 && loadingCompletedNumber === totalPipelineNumber; + return ( <> {isLoading && } @@ -53,22 +59,24 @@ export const DeploymentFrequencySettings = () => { - {deploymentFrequencySettings.map((deploymentFrequencySetting) => ( + {realDeploymentFrequencySettings.map((deploymentFrequencySetting) => ( 1} + isShowRemoveButton={totalPipelineNumber > 1} onRemovePipeline={(id) => handleRemovePipeline(id)} onUpdatePipeline={(id, label, value) => handleUpdatePipeline(id, label, value)} - isDuplicated={getDuplicatedPipeLineIds(deploymentFrequencySettings).includes( + isDuplicated={getDuplicatedPipeLineIds(realDeploymentFrequencySettings).includes( deploymentFrequencySetting.id, )} + totalPipelineNumber={totalPipelineNumber} + setLoadingCompletedNumber={setLoadingCompletedNumber} /> ))} - {!isEmpty(pipelineCrews) && ( + {shouldShowCrews && ( { +const setPipelineCrews = (isProjectCreated: boolean, pipelineCrews: string[], currentCrews: string[]) => { if (_.isEmpty(pipelineCrews)) { return []; } if (isProjectCreated) { return pipelineCrews; } - return pipelineCrews.filter((item: string) => importedPipelineCrews?.includes(item)); + return intersection(pipelineCrews, currentCrews); }; const setSelectTargetFields = ( @@ -336,7 +337,7 @@ export const metricsSlice = createSlice({ return deploymentFrequencySetting.id === updateId ? { ...deploymentFrequencySetting, - [label === 'Steps' ? 'step' : camelCase(label)]: value, + [label === 'Step' ? 'step' : camelCase(label)]: value, } : deploymentFrequencySetting; }); @@ -466,29 +467,63 @@ export const metricsSlice = createSlice({ : ASSIGNEE_FILTER_TYPES.LAST_ASSIGNEE; }, + updatePiplineCrews: (state, action) => { + state.pipelineCrews = intersection(state.pipelineCrews, action.payload); + }, + updatePipelineSettings: (state, action) => { const { pipelineList, isProjectCreated, pipelineCrews } = action.payload; - const { importedDeployment, importedPipelineCrews } = state.importedData; - + const { importedDeployment } = state.importedData; if (pipelineCrews) { - state.pipelineCrews = setPipelineCrews(isProjectCreated, pipelineCrews, importedPipelineCrews); + state.pipelineCrews = setPipelineCrews(isProjectCreated, pipelineCrews, state.pipelineCrews); } const orgNames: Array = _.uniq(pipelineList.map((item: pipeline) => item.orgName)); const filteredPipelineNames = (organization: string) => pipelineList .filter((pipeline: pipeline) => pipeline.orgName.toLowerCase() === organization.toLowerCase()) .map((item: pipeline) => item.name); + + const uniqueResponse = (res: IPipelineConfig[]) => { + let itemsOmitId = uniqWith( + res.map((value) => omit(value, ['id', 'isStepEmptyString'])), + isEqual, + ); + if (itemsOmitId.length > 1) { + itemsOmitId = itemsOmitId.filter( + (item) => !Object.values(item).every((value) => value === '' || !value?.length), + ); + } + return itemsOmitId.length < res.length + ? itemsOmitId.map((item, index) => { + return { + id: index, + ...item, + }; + }) + : res; + }; + const getValidPipelines = (pipelines: IPipelineConfig[]) => { const hasPipeline = pipelines.filter(({ id }) => id !== undefined).length; - return pipelines.length && hasPipeline - ? pipelines.map(({ id, organization, pipelineName, step, branches }) => ({ - id, - organization: orgNames.find((i) => (i as string).toLowerCase() === organization.toLowerCase()) || '', - pipelineName: filteredPipelineNames(organization).includes(pipelineName) ? pipelineName : '', - step: step || '', - branches: branches || [], - })) - : [{ id: 0, organization: '', pipelineName: '', step: '', branches: [] }]; + const res = + pipelines.length && hasPipeline + ? pipelines.map(({ id, organization, pipelineName, step, branches, isStepEmptyString }) => { + const matchedOrganization = + orgNames.find((i) => (i as string).toLowerCase() === organization.toLowerCase()) || ''; + const matchedPipelineName = filteredPipelineNames(organization).includes(pipelineName) + ? pipelineName + : ''; + return { + id, + isStepEmptyString: isStepEmptyString || false, + organization: matchedOrganization, + pipelineName: matchedPipelineName, + step: matchedPipelineName ? step : '', + branches: matchedPipelineName ? branches : [], + }; + }) + : [{ id: 0, organization: '', pipelineName: '', step: '', branches: [], isStepEmptyString: false }]; + return uniqueResponse(res); }; const createPipelineWarning = ({ id, organization, pipelineName }: IPipelineConfig) => { const orgWarning = orgNames.some((i) => (i as string).toLowerCase() === organization.toLowerCase()) @@ -521,47 +556,59 @@ export const metricsSlice = createSlice({ state.deploymentFrequencySettings = getValidPipelines(deploymentSettings); state.deploymentWarningMessage = getPipelinesWarningMessage(deploymentSettings); }, - updatePipelineStep: (state, action) => { const { steps, id, branches, pipelineCrews } = action.payload; - const { importedDeployment, importedPipelineCrews } = state.importedData; - const updatedImportedPipelineStep = importedDeployment.find((pipeline) => pipeline.id === id)?.step ?? ''; - const updatedImportedPipelineBranches = importedDeployment.find((pipeline) => pipeline.id === id)?.branches ?? []; const selectedPipelineStep = state.deploymentFrequencySettings.find((pipeline) => pipeline.id === id)?.step ?? ''; - state.pipelineCrews = _.filter(pipelineCrews, (crew) => importedPipelineCrews.includes(crew)); - const stepWarningMessage = (selectedStep: string) => (steps.includes(selectedStep) ? null : MESSAGE.STEP_WARNING); + const currentCrews = concat(pipelineCrews, state.pipelineCrews); + + state.pipelineCrews = intersection(currentCrews, state.pipelineCrews); + const stepWarningMessage = (selectedStep: string, isStepEmptyString: boolean) => + steps.includes(selectedStep) || isStepEmptyString ? null : MESSAGE.STEP_WARNING; - const validStep = (selectedStep: string): string => (steps.includes(selectedStep) ? selectedStep : ''); + const validStep = (pipeline: IPipelineConfig): string => { + const selectedStep = pipeline.step; + if (!selectedStep) { + pipeline.isStepEmptyString = true; + } + return steps.includes(selectedStep) ? selectedStep : ''; + }; const validBranches = (selectedBranches: string[]): string[] => _.filter(branches, (branch) => selectedBranches.includes(branch)); - const getPipelineSettings = (pipelines: IPipelineConfig[]) => - pipelines.map((pipeline) => - pipeline.id === id + const getPipelineSettings = (pipelines: IPipelineConfig[]) => { + return pipelines.map((pipeline) => { + const filterValidStep = validStep(pipeline); + return pipeline.id === id ? { ...pipeline, - step: validStep(pipeline.step || updatedImportedPipelineStep), - branches: validBranches( - pipeline.branches.length > 0 ? pipeline.branches : updatedImportedPipelineBranches, - ), + step: filterValidStep, + branches: validBranches(pipeline.branches.length > 0 ? pipeline.branches : []), } - : pipeline, - ); + : pipeline; + }); + }; - const getStepWarningMessage = (pipelines: IPipelineWarningMessageConfig[]) => { - return pipelines.map((pipeline) => - pipeline?.id === id + const getStepWarningMessage = ( + pipelinesWarning: IPipelineWarningMessageConfig[], + pipelinesValue: IPipelineConfig[], + ) => { + return pipelinesWarning.map((pipeline) => { + const matchedPipeline = pipelinesValue.find((pipeline) => pipeline.id === id); + return pipeline?.id === id ? { ...pipeline, - step: stepWarningMessage(selectedPipelineStep || updatedImportedPipelineStep), + step: stepWarningMessage(selectedPipelineStep, matchedPipeline?.isStepEmptyString || false), } - : pipeline, - ); + : pipeline; + }); }; + state.deploymentWarningMessage = getStepWarningMessage( + state.deploymentWarningMessage, + state.deploymentFrequencySettings, + ); state.deploymentFrequencySettings = getPipelineSettings(state.deploymentFrequencySettings); - state.deploymentWarningMessage = getStepWarningMessage(state.deploymentWarningMessage); }, deleteADeploymentFrequencySetting: (state, action) => { @@ -621,6 +668,7 @@ export const { updateAssigneeFilter, updateMetricsState, updatePipelineSettings, + updatePiplineCrews, updatePipelineStep, setCycleTimeSettingsType, resetMetricData, diff --git a/frontend/src/context/config/configSlice.ts b/frontend/src/context/config/configSlice.ts index 882852a496..3d1af27439 100644 --- a/frontend/src/context/config/configSlice.ts +++ b/frontend/src/context/config/configSlice.ts @@ -12,9 +12,9 @@ import { initialSourceControlState, ISourceControl } from '@src/context/config/s import { SortType } from '@src/containers/ConfigStep/DateRangePicker/DateRangePickerGroup'; import { IBoardState, initialBoardState } from '@src/context/config/board/boardSlice'; import { pipeline } from '@src/context/config/pipelineTool/verifyResponseSlice'; +import { uniqPipelineListCrews, updateResponseCrews } from '@src/utils/util'; import { createSlice } from '@reduxjs/toolkit'; import type { RootState } from '@src/store'; -import union from 'lodash/union'; import merge from 'lodash/merge'; import { isArray } from 'lodash'; import dayjs from 'dayjs'; @@ -186,14 +186,10 @@ export const configSlice = createSlice({ ...pipeline, branches: branches, steps: steps, + crews: pipelineCrews, } : pipeline, ); - - state.pipelineTool.verifiedResponse.pipelineCrews = union( - state.pipelineTool.verifiedResponse.pipelineCrews, - pipelineCrews, - ); }, updateSourceControlVerifyState: (state, action) => { state.sourceControl.isVerified = action.payload; @@ -205,6 +201,14 @@ export const configSlice = createSlice({ const { githubRepos } = action.payload; state.sourceControl.verifiedResponse.repoList = githubRepos; }, + updatePipelineToolVerifyResponseCrews: (state, action) => { + const { organization, pipelineName } = action.payload; + state.pipelineTool.verifiedResponse.pipelineList = updateResponseCrews( + organization, + pipelineName, + state.pipelineTool.verifiedResponse.pipelineList, + ); + }, resetImportedData: () => initialBasicConfigState, }, }); @@ -227,6 +231,7 @@ export const { updateSourceControlVerifiedResponse, updatePipelineToolVerifyResponseSteps, resetImportedData, + updatePipelineToolVerifyResponseCrews, } = configSlice.actions; export const selectProjectName = (state: RootState) => state.config.basic.projectName; @@ -295,6 +300,9 @@ export const selectSteps = (state: RootState, organizationName: string, pipeline (pipeline) => pipeline.name === pipelineName && pipeline.orgName === organizationName, )?.steps ?? []; -export const selectPipelineCrews = (state: RootState) => state.config.pipelineTool.verifiedResponse.pipelineCrews; +export const selectPipelineCrews = (state: RootState) => { + const { pipelineList } = state.config.pipelineTool.verifiedResponse; + return uniqPipelineListCrews(pipelineList); +}; export default configSlice.reducer; diff --git a/frontend/src/context/config/pipelineTool/verifyResponseSlice.ts b/frontend/src/context/config/pipelineTool/verifyResponseSlice.ts index f8ac16642a..40bffe4887 100644 --- a/frontend/src/context/config/pipelineTool/verifyResponseSlice.ts +++ b/frontend/src/context/config/pipelineTool/verifyResponseSlice.ts @@ -1,6 +1,5 @@ export interface IPipelineToolVerifyResponse { pipelineList: pipeline[]; - pipelineCrews: string[]; } export interface pipeline { @@ -11,9 +10,9 @@ export interface pipeline { repository: string; steps: string[]; branches: string[]; + crews: string[]; } export const initialPipelineToolVerifiedResponseState: IPipelineToolVerifyResponse = { pipelineList: [], - pipelineCrews: [], }; diff --git a/frontend/src/context/meta/metaSlice.tsx b/frontend/src/context/meta/metaSlice.tsx index 66c4db1e1b..8f23face44 100644 --- a/frontend/src/context/meta/metaSlice.tsx +++ b/frontend/src/context/meta/metaSlice.tsx @@ -53,12 +53,19 @@ export const metaSlice = createSlice({ initMetricsPipelineFormMeta: (state, action: PayloadAction) => { const id = action.payload; const branchesFormData = state.form.metrics.pipelines[id]; - if (!branchesFormData) state.form.metrics.pipelines[id] = { branches: [], }; }, + initSinglePipelineListBranches: (state, action: PayloadAction) => { + const id = action.payload; + const branchesFormData = state.form.metrics.pipelines[id]; + if (branchesFormData) + state.form.metrics.pipelines[id] = { + branches: [], + }; + }, clearMetricsPipelineFormMeta: (state) => { state.form.metrics.pipelines = {}; }, @@ -86,6 +93,7 @@ export const { resetFormMeta, updateFormMeta, initMetricsPipelineFormMeta, + initSinglePipelineListBranches, deleteMetricsPipelineFormMeta, updateMetricsPipelineBranchFormMeta, clearMetricsPipelineFormMeta, diff --git a/frontend/src/hooks/useGetPipelineToolInfoEffect.ts b/frontend/src/hooks/useGetPipelineToolInfoEffect.ts index 115cbae509..37320c7e83 100644 --- a/frontend/src/hooks/useGetPipelineToolInfoEffect.ts +++ b/frontend/src/hooks/useGetPipelineToolInfoEffect.ts @@ -15,6 +15,7 @@ export interface IUseVerifyPipeLineToolStateInterface { result: IGetPipelineToolInfoResult; isLoading: boolean; apiCallFunc: () => void; + isFirstFetch: boolean; } export const useGetPipelineToolInfoEffect = (): IUseVerifyPipeLineToolStateInterface => { @@ -32,6 +33,7 @@ export const useGetPipelineToolInfoEffect = (): IUseVerifyPipeLineToolStateInter const restoredPipelineTool = useAppSelector(selectPipelineTool); const shouldLoad = useAppSelector(shouldMetricsLoad); const shouldGetPipelineConfig = useAppSelector(selectShouldGetPipelineConfig); + const [isFirstFetch, setIsFirstFetch] = useState(shouldGetPipelineConfig); const getPipelineToolInfo = useCallback(async () => { const params = { @@ -46,6 +48,7 @@ export const useGetPipelineToolInfoEffect = (): IUseVerifyPipeLineToolStateInter pipelineToolVerified && dispatch(updatePipelineSettings({ ...response.data, isProjectCreated })); } finally { setIsLoading(false); + setIsFirstFetch(false); } }, [dispatch, isProjectCreated, pipelineToolVerified, restoredPipelineTool.type, restoredPipelineTool.token]); @@ -60,6 +63,7 @@ export const useGetPipelineToolInfoEffect = (): IUseVerifyPipeLineToolStateInter return { result: info, isLoading, + isFirstFetch, apiCallFunc: getPipelineToolInfo, }; }; diff --git a/frontend/src/hooks/useVerifyPipelineToolEffect.ts b/frontend/src/hooks/useVerifyPipelineToolEffect.ts index f1301ab2a8..f006acc9d1 100644 --- a/frontend/src/hooks/useVerifyPipelineToolEffect.ts +++ b/frontend/src/hooks/useVerifyPipelineToolEffect.ts @@ -1,4 +1,3 @@ -import { initDeploymentFrequencySettings } from '@src/context/Metrics/metricsSlice'; import { updatePipelineToolVerifyState } from '@src/context/config/configSlice'; import { pipelineToolClient } from '@src/clients/pipeline/PipelineToolClient'; import { IPipelineVerifyRequestDTO } from '@src/clients/pipeline/dto/request'; @@ -20,7 +19,6 @@ export const useVerifyPipelineToolEffect = () => { setIsShowAlert(false); if (response.code === HttpStatusCode.NoContent) { dispatch(updatePipelineToolVerifyState(true)); - dispatch(initDeploymentFrequencySettings()); } else if (response.code === AXIOS_REQUEST_ERROR_CODE.TIMEOUT) { setIsVerifyTimeOut(true); setIsShowAlert(true); diff --git a/frontend/src/utils/util.ts b/frontend/src/utils/util.ts index 3393e8d09f..98351fe3df 100644 --- a/frontend/src/utils/util.ts +++ b/frontend/src/utils/util.ts @@ -2,10 +2,11 @@ import { CYCLE_TIME_LIST, CYCLE_TIME_SETTINGS_TYPES, METRICS_CONSTANTS } from '@ import { CleanedBuildKiteEmoji, OriginBuildKiteEmoji } from '@src/constants/emojis/emoji'; import { ICycleTimeSetting, IPipelineConfig } from '@src/context/Metrics/metricsSlice'; import { ITargetFieldType } from '@src/components/Common/MultiAutoComplete/styles'; +import { pipeline } from '@src/context/config/pipelineTool/verifyResponseSlice'; +import { includes, isEqual, sortBy, uniq, uniqBy } from 'lodash'; import { BoardInfoResponse } from '@src/hooks/useGetBoardInfo'; import { DATE_FORMAT_TEMPLATE } from '@src/constants/template'; import { DateRange } from '@src/context/config/configSlice'; -import { includes, isEqual, sortBy, uniqBy } from 'lodash'; import duration from 'dayjs/plugin/duration'; import dayjs from 'dayjs'; @@ -142,10 +143,10 @@ export const onlyEmptyAndDoneState = (boardingMappingStates: string[]) => isEqual(boardingMappingStates, [METRICS_CONSTANTS.cycleTimeEmptyStr, METRICS_CONSTANTS.doneValue]) || isEqual(boardingMappingStates, [METRICS_CONSTANTS.doneValue, METRICS_CONSTANTS.cycleTimeEmptyStr]); -export function convertCycleTimeSettings( +export const convertCycleTimeSettings = ( cycleTimeSettingsType: CYCLE_TIME_SETTINGS_TYPES, cycleTimeSettings: ICycleTimeSetting[], -) { +) => { if (cycleTimeSettingsType === CYCLE_TIME_SETTINGS_TYPES.BY_COLUMN) { return ([...new Set(cycleTimeSettings.map(({ column }: ICycleTimeSetting) => column))] as string[]).map( (uniqueColumn) => ({ @@ -156,7 +157,21 @@ export function convertCycleTimeSettings( ); } return cycleTimeSettings?.map(({ status, value }: ICycleTimeSetting) => ({ [status]: value })); -} +}; + +export const updateResponseCrews = (organization: string, pipelineName: string, pipelineList: pipeline[]) => { + return pipelineList.map((pipeline) => + pipeline.name === pipelineName && pipeline.orgName === organization + ? { + ...pipeline, + crews: [], + } + : pipeline, + ); +}; + +export const uniqPipelineListCrews = (pipelineList: pipeline[]) => + uniq(pipelineList.flatMap(({ crews }) => crews)).filter((crew) => crew !== undefined); export function existBlockState(cycleTimeSettings: ICycleTimeSetting[]) { return cycleTimeSettings.some(({ value }) => METRICS_CONSTANTS.blockValue === value); From 99274b4b2aa18ed3ce522615a138a7a25ff87b32 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 23 Apr 2024 23:37:11 +0800 Subject: [PATCH 36/81] fix(deps): update dependency org.awaitility:awaitility to v4 (#1402)[backend] Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- backend/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/build.gradle b/backend/build.gradle index 3e4b9eba83..91bb926039 100644 --- a/backend/build.gradle +++ b/backend/build.gradle @@ -51,7 +51,7 @@ dependencies { testAnnotationProcessor 'org.projectlombok:lombok:1.18.32' implementation 'com.opencsv:opencsv:5.9' implementation 'org.apache.commons:commons-text:1.11.0' - implementation 'org.awaitility:awaitility:3.1.6' + implementation 'org.awaitility:awaitility:4.2.1' } tasks.named('test') { From 6a202132b03e6e084b9786847cf984be3dcee18a Mon Sep 17 00:00:00 2001 From: guzhongren Date: Wed, 24 Apr 2024 07:43:58 +0800 Subject: [PATCH 37/81] fix(trivy):ignore trivy[backend] --- .trivyignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.trivyignore b/.trivyignore index 4c9ee83cca..3c0f02da50 100644 --- a/.trivyignore +++ b/.trivyignore @@ -15,3 +15,4 @@ CVE-2024-22201 CVE-2024-22259 CVE-2024-28085 CVE-2024-22262 +CVE-2024-2961 From 527e16db4292fe73faf825c515940f2bfb0434c9 Mon Sep 17 00:00:00 2001 From: guzhongren Date: Wed, 24 Apr 2024 21:57:33 +0800 Subject: [PATCH 38/81] fix(playwright): update e2e base image --- ops/infra/Dockerfile.e2e | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ops/infra/Dockerfile.e2e b/ops/infra/Dockerfile.e2e index 2cd11b3c83..ab02a8cf1d 100644 --- a/ops/infra/Dockerfile.e2e +++ b/ops/infra/Dockerfile.e2e @@ -1,4 +1,4 @@ -FROM mcr.microsoft.com/playwright:latest +FROM jacoblincool/playwright:base COPY ./frontend /app ENV TZ=Asia/Shanghai From 79a8ee43df95e99178f54833f0419d09653693c4 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 24 Apr 2024 22:34:31 +0800 Subject: [PATCH 39/81] fix(deps): update dependency pmd to v7 (#1403)[backend] Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- backend/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/build.gradle b/backend/build.gradle index 91bb926039..6a8ba90194 100644 --- a/backend/build.gradle +++ b/backend/build.gradle @@ -63,7 +63,7 @@ tasks.named('test') { } pmd { - toolVersion = '6.55.0' + toolVersion = '7.0.0' ruleSets = ['java-basic'] ruleSetConfig = resources.text.fromFile("src/main/resources/pmd.xml") } From 9462ea9d9401476f9995625d6131ec98e72ceb56 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 25 Apr 2024 22:35:01 +0800 Subject: [PATCH 40/81] chore(deps): bump gradle/gradle-build-action from 3.3.0 to 3.3.1 (#1406) Bumps [gradle/gradle-build-action](https://github.com/gradle/gradle-build-action) from 3.3.0 to 3.3.1. - [Release notes](https://github.com/gradle/gradle-build-action/releases) - [Commits](https://github.com/gradle/gradle-build-action/compare/v3.3.0...v3.3.1) --- updated-dependencies: - dependency-name: gradle/gradle-build-action dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: guzhongren --- .github/workflows/Release.yaml | 2 +- .github/workflows/build-and-deploy.yml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/Release.yaml b/.github/workflows/Release.yaml index 07f818f9ab..14bd37a3ec 100644 --- a/.github/workflows/Release.yaml +++ b/.github/workflows/Release.yaml @@ -24,7 +24,7 @@ jobs: - name: Validate Gradle wrapper uses: gradle/wrapper-validation-action@v3 - name: Set up Gradle - uses: gradle/gradle-build-action@v3.3.0 + uses: gradle/gradle-build-action@v3.3.1 - name: Build run: ./gradlew clean build - uses: actions/upload-artifact@v4 diff --git a/.github/workflows/build-and-deploy.yml b/.github/workflows/build-and-deploy.yml index a88c15084a..baddaa14aa 100644 --- a/.github/workflows/build-and-deploy.yml +++ b/.github/workflows/build-and-deploy.yml @@ -91,7 +91,7 @@ jobs: - name: Validate Gradle wrapper uses: gradle/wrapper-validation-action@v3 - name: Set up Gradle - uses: gradle/gradle-build-action@v3.3.0 + uses: gradle/gradle-build-action@v3.3.1 - name: Test and check run: ./gradlew clean check - name: Build @@ -120,7 +120,7 @@ jobs: - name: Validate Gradle wrapper uses: gradle/wrapper-validation-action@v3 - name: Set up Gradle - uses: gradle/gradle-build-action@v3.3.0 + uses: gradle/gradle-build-action@v3.3.1 - name: License check run: ./gradlew clean checkLicense - uses: actions/upload-artifact@v4 From 76932ad3454e1b32fc81e3be7057fa48914dd1de Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 25 Apr 2024 23:17:59 +0800 Subject: [PATCH 41/81] fix(deps): update dependency remark-smartypants to v3 (#1404)[docs] Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- docs/package.json | 2 +- docs/pnpm-lock.yaml | 102 +++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 101 insertions(+), 3 deletions(-) diff --git a/docs/package.json b/docs/package.json index b019d98741..f35dbf0716 100644 --- a/docs/package.json +++ b/docs/package.json @@ -112,7 +112,7 @@ "rehype-autolink-headings": "^7.1.0", "rehype-slug": "^6.0.0", "remark-gfm": "^4.0.0", - "remark-smartypants": "^2.1.0", + "remark-smartypants": "^3.0.0", "sass": "^1.72.0" }, "engines": { diff --git a/docs/pnpm-lock.yaml b/docs/pnpm-lock.yaml index 0db8152027..6c31544130 100644 --- a/docs/pnpm-lock.yaml +++ b/docs/pnpm-lock.yaml @@ -39,8 +39,8 @@ dependencies: specifier: ^4.0.0 version: 4.0.0 remark-smartypants: - specifier: ^2.1.0 - version: 2.1.0 + specifier: ^3.0.0 + version: 3.0.1 sass: specifier: ^1.72.0 version: 1.72.0 @@ -1920,6 +1920,13 @@ packages: resolution: {integrity: sha512-ABoYdNQ/kBSsLvZAekMhIPMQ3YUZvavStpKYs7BjLLuKVmIMA0LUgZ7b54zzuWJRbHF80v1cNf4r90Vd6eMQDg==} dependencies: '@types/unist': 2.0.10 + dev: true + + /@types/nlcst@2.0.3: + resolution: {integrity: sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA==} + dependencies: + '@types/unist': 3.0.2 + dev: false /@types/node@17.0.45: resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==} @@ -4806,6 +4813,7 @@ packages: /is-buffer@2.0.5: resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} engines: {node: '>=4'} + dev: true /is-callable@1.2.7: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} @@ -6017,6 +6025,13 @@ packages: resolution: {integrity: sha512-63mVyqaqt0cmn2VcI2aH6kxe1rLAmSROqHMA0i4qqg1tidkfExgpb0FGMikMCn86mw5dFtBtEANfmSSK7TjNHw==} dependencies: '@types/nlcst': 1.0.4 + dev: true + + /nlcst-to-string@4.0.0: + resolution: {integrity: sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA==} + dependencies: + '@types/nlcst': 2.0.3 + dev: false /node-abi@3.56.0: resolution: {integrity: sha512-fZjdhDOeRcaS+rcpve7XuwHBmktS1nS1gzgghwKUQQ8nTy2FdSDr6ZT8k6YhvlJeHmmQMYiT/IH9hfco5zeW2Q==} @@ -6315,6 +6330,18 @@ packages: nlcst-to-string: 3.1.1 unist-util-modify-children: 3.1.1 unist-util-visit-children: 2.0.2 + dev: true + + /parse-latin@7.0.0: + resolution: {integrity: sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ==} + dependencies: + '@types/nlcst': 2.0.3 + '@types/unist': 3.0.2 + nlcst-to-string: 4.0.0 + unist-util-modify-children: 4.0.0 + unist-util-visit-children: 3.0.0 + vfile: 6.0.1 + dev: false /parse-numeric-range@1.3.0: resolution: {integrity: sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==} @@ -6773,6 +6800,17 @@ packages: retext: 8.1.0 retext-smartypants: 5.2.0 unist-util-visit: 5.0.0 + dev: true + + /remark-smartypants@3.0.1: + resolution: {integrity: sha512-qyshfCl2eLO0i0558e79ZJsfojC5wjnYLByjt0FmjJQN6aYwcRxpoj784LZJSoWCdnA2ubh5rLNGb8Uur/wDng==} + engines: {node: '>=16.0.0'} + dependencies: + retext: 9.0.0 + retext-smartypants: 6.1.0 + unified: 11.0.4 + unist-util-visit: 5.0.0 + dev: false /remark-stringify@11.0.0: resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} @@ -6849,6 +6887,15 @@ packages: parse-latin: 5.0.1 unherit: 3.0.1 unified: 10.1.2 + dev: true + + /retext-latin@4.0.0: + resolution: {integrity: sha512-hv9woG7Fy0M9IlRQloq/N6atV82NxLGveq+3H2WOi79dtIYWN8OaxogDm77f8YnVXJL2VD3bbqowu5E3EMhBYA==} + dependencies: + '@types/nlcst': 2.0.3 + parse-latin: 7.0.0 + unified: 11.0.4 + dev: false /retext-smartypants@5.2.0: resolution: {integrity: sha512-Do8oM+SsjrbzT2UNIKgheP0hgUQTDDQYyZaIY3kfq0pdFzoPk+ZClYJ+OERNXveog4xf1pZL4PfRxNoVL7a/jw==} @@ -6857,6 +6904,15 @@ packages: nlcst-to-string: 3.1.1 unified: 10.1.2 unist-util-visit: 4.1.2 + dev: true + + /retext-smartypants@6.1.0: + resolution: {integrity: sha512-LDPXg95346bqFZnDMHo0S7Rq5p64+B+N8Vz733+wPMDtwb9rCOs9LIdIEhrUOU+TAywX9St+ocQWJt8wrzivcQ==} + dependencies: + '@types/nlcst': 2.0.3 + nlcst-to-string: 4.0.0 + unist-util-visit: 5.0.0 + dev: false /retext-stringify@3.1.0: resolution: {integrity: sha512-767TLOaoXFXyOnjx/EggXlb37ZD2u4P1n0GJqVdpipqACsQP+20W+BNpMYrlJkq7hxffnFk+jc6mAK9qrbuB8w==} @@ -6864,6 +6920,15 @@ packages: '@types/nlcst': 1.0.4 nlcst-to-string: 3.1.1 unified: 10.1.2 + dev: true + + /retext-stringify@4.0.0: + resolution: {integrity: sha512-rtfN/0o8kL1e+78+uxPTqu1Klt0yPzKuQ2BfWwwfgIUSayyzxpM1PJzkKt4V8803uB9qSy32MvI7Xep9khTpiA==} + dependencies: + '@types/nlcst': 2.0.3 + nlcst-to-string: 4.0.0 + unified: 11.0.4 + dev: false /retext@8.1.0: resolution: {integrity: sha512-N9/Kq7YTn6ZpzfiGW45WfEGJqFf1IM1q8OsRa1CGzIebCJBNCANDRmOrholiDRGKo/We7ofKR4SEvcGAWEMD3Q==} @@ -6872,6 +6937,16 @@ packages: retext-latin: 3.1.0 retext-stringify: 3.1.0 unified: 10.1.2 + dev: true + + /retext@9.0.0: + resolution: {integrity: sha512-sbMDcpHCNjvlheSgMfEcVrZko3cDzdbe1x/e7G66dFp0Ff7Mldvi2uv6JkJQzdRcvLYE8CA8Oe8siQx8ZOgTcA==} + dependencies: + '@types/nlcst': 2.0.3 + retext-latin: 4.0.0 + retext-stringify: 4.0.0 + unified: 11.0.4 + dev: false /retry@0.13.1: resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} @@ -7676,6 +7751,7 @@ packages: /unherit@3.0.1: resolution: {integrity: sha512-akOOQ/Yln8a2sgcLj4U0Jmx0R5jpIg2IUyRrWOzmEbjBtGzBdHtSeFKgoEcoH4KYIG/Pb8GQ/BwtYm0GCq1Sqg==} + dev: true /unified@10.1.2: resolution: {integrity: sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==} @@ -7687,6 +7763,7 @@ packages: is-plain-obj: 4.1.0 trough: 2.2.0 vfile: 5.3.7 + dev: true /unified@11.0.4: resolution: {integrity: sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ==} @@ -7714,6 +7791,7 @@ packages: resolution: {integrity: sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==} dependencies: '@types/unist': 2.0.10 + dev: true /unist-util-is@6.0.0: resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} @@ -7725,6 +7803,14 @@ packages: dependencies: '@types/unist': 2.0.10 array-iterate: 2.0.1 + dev: true + + /unist-util-modify-children@4.0.0: + resolution: {integrity: sha512-+tdN5fGNddvsQdIzUF3Xx82CU9sMM+fA0dLgR9vOmT0oPT2jH+P1nd5lSqfCfXAw+93NhcXNY2qqvTUtE4cQkw==} + dependencies: + '@types/unist': 3.0.2 + array-iterate: 2.0.1 + dev: false /unist-util-position-from-estree@2.0.0: resolution: {integrity: sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==} @@ -7763,6 +7849,7 @@ packages: resolution: {integrity: sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==} dependencies: '@types/unist': 2.0.10 + dev: true /unist-util-stringify-position@4.0.0: resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} @@ -7773,6 +7860,13 @@ packages: resolution: {integrity: sha512-+LWpMFqyUwLGpsQxpumsQ9o9DG2VGLFrpz+rpVXYIEdPy57GSy5HioC0g3bg/8WP9oCLlapQtklOzQ8uLS496Q==} dependencies: '@types/unist': 2.0.10 + dev: true + + /unist-util-visit-children@3.0.0: + resolution: {integrity: sha512-RgmdTfSBOg04sdPcpTSD1jzoNBjt9a80/ZCzp5cI9n1qPzLZWF9YdvWGN2zmTumP1HWhXKdUWexjy/Wy/lJ7tA==} + dependencies: + '@types/unist': 3.0.2 + dev: false /unist-util-visit-parents@3.1.1: resolution: {integrity: sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==} @@ -7786,6 +7880,7 @@ packages: dependencies: '@types/unist': 2.0.10 unist-util-is: 5.2.1 + dev: true /unist-util-visit-parents@6.0.1: resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} @@ -7807,6 +7902,7 @@ packages: '@types/unist': 2.0.10 unist-util-is: 5.2.1 unist-util-visit-parents: 5.1.3 + dev: true /unist-util-visit@5.0.0: resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} @@ -7867,6 +7963,7 @@ packages: dependencies: '@types/unist': 2.0.10 unist-util-stringify-position: 3.0.3 + dev: true /vfile-message@4.0.2: resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} @@ -7881,6 +7978,7 @@ packages: is-buffer: 2.0.5 unist-util-stringify-position: 3.0.3 vfile-message: 3.1.4 + dev: true /vfile@6.0.1: resolution: {integrity: sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==} From 4017224d465c20329efd73585eadfc93cd5fe8a5 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 25 Apr 2024 23:48:19 +0800 Subject: [PATCH 42/81] fix(deps): update dependency @astrojs/check to v0.5.10 (#1397)[docs] Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- docs/pnpm-lock.yaml | 165 ++++++++++++++++++++++++-------------------- 1 file changed, 92 insertions(+), 73 deletions(-) diff --git a/docs/pnpm-lock.yaml b/docs/pnpm-lock.yaml index 6c31544130..b0448d462c 100644 --- a/docs/pnpm-lock.yaml +++ b/docs/pnpm-lock.yaml @@ -10,7 +10,7 @@ dependencies: version: 1.0.2 '@astrojs/check': specifier: ^0.5.9 - version: 0.5.9(prettier-plugin-astro@0.13.0)(prettier@3.2.5)(typescript@5.4.5) + version: 0.5.10(prettier-plugin-astro@0.13.0)(prettier@3.2.5)(typescript@5.4.5) '@fontsource/ibm-plex-mono': specifier: 5.0.12 version: 5.0.12 @@ -463,13 +463,13 @@ packages: '@jridgewell/trace-mapping': 0.3.25 dev: true - /@astrojs/check@0.5.9(prettier-plugin-astro@0.13.0)(prettier@3.2.5)(typescript@5.4.5): - resolution: {integrity: sha512-+QsQMtYq4oso+gmilJC9HLmdi0glZ+04V/VyyTTPry7n21jqjX9SfgDpLGxMk5cwPC/vwZMkn6ORGPnkZS/L5w==} + /@astrojs/check@0.5.10(prettier-plugin-astro@0.13.0)(prettier@3.2.5)(typescript@5.4.5): + resolution: {integrity: sha512-vliHXM9cu/viGeKiksUM4mXfO816ohWtawTl2ADPgTsd4nUMjFiyAl7xFZhF34yy4hq4qf7jvK1F2PlR3b5I5w==} hasBin: true peerDependencies: typescript: ^5.0.0 dependencies: - '@astrojs/language-server': 2.8.3(prettier-plugin-astro@0.13.0)(prettier@3.2.5)(typescript@5.4.5) + '@astrojs/language-server': 2.8.4(prettier-plugin-astro@0.13.0)(prettier@3.2.5)(typescript@5.4.5) chokidar: 3.6.0 fast-glob: 3.3.2 kleur: 4.1.5 @@ -485,13 +485,18 @@ packages: /@astrojs/compiler@2.7.0: resolution: {integrity: sha512-XpC8MAaWjD1ff6/IfkRq/5k1EFj6zhCNqXRd5J43SVJEBj/Bsmizkm8N0xOYscGcDFQkRgEw6/eKnI5x/1l6aA==} + dev: true + + /@astrojs/compiler@2.7.1: + resolution: {integrity: sha512-/POejAYuj8WEw7ZI0J8JBvevjfp9jQ9Wmu/Bg52RiNwGXkMV7JnYpsenVfHvvf1G7R5sXHGKlTcxlQWhoUTiGQ==} + dev: false /@astrojs/internal-helpers@0.3.0: resolution: {integrity: sha512-tGmHvrhpzuz0JBHaJX8GywN9g4rldVNHtkoVDC3m/DdzBO70jGoVuc0uuNVglRYnsdwkbG0K02Iw3nOOR3/Y4g==} dev: true - /@astrojs/language-server@2.8.3(prettier-plugin-astro@0.13.0)(prettier@3.2.5)(typescript@5.4.5): - resolution: {integrity: sha512-tO47Lcue7OPXfIDbKVDcshwpC13yaWaTVLyiSOnQ2Yng2Z2SgcJf06Cj4xMpJqGp6s7/o/gcQWYUTl2bpkWKig==} + /@astrojs/language-server@2.8.4(prettier-plugin-astro@0.13.0)(prettier@3.2.5)(typescript@5.4.5): + resolution: {integrity: sha512-sJH5vGTBkhgA8+hdhzX78UUp4cFz4Mt7xkEkevD188OS5bDMkaue6hK+dtXWM47mnrXFveXA2u38K7S+5+IRjA==} hasBin: true peerDependencies: prettier: ^3.0.0 @@ -502,23 +507,23 @@ packages: prettier-plugin-astro: optional: true dependencies: - '@astrojs/compiler': 2.7.0 + '@astrojs/compiler': 2.7.1 '@jridgewell/sourcemap-codec': 1.4.15 - '@volar/kit': 2.1.2(typescript@5.4.5) - '@volar/language-core': 2.1.2 - '@volar/language-server': 2.1.2 - '@volar/language-service': 2.1.2 - '@volar/typescript': 2.1.2 + '@volar/kit': 2.1.6(typescript@5.4.5) + '@volar/language-core': 2.1.6 + '@volar/language-server': 2.1.6 + '@volar/language-service': 2.1.6 + '@volar/typescript': 2.1.6 fast-glob: 3.3.2 prettier: 3.2.5 prettier-plugin-astro: 0.13.0 - volar-service-css: 0.0.34(@volar/language-service@2.1.2) - volar-service-emmet: 0.0.34(@volar/language-service@2.1.2) - volar-service-html: 0.0.34(@volar/language-service@2.1.2) - volar-service-prettier: 0.0.34(@volar/language-service@2.1.2)(prettier@3.2.5) - volar-service-typescript: 0.0.34(@volar/language-service@2.1.2) - volar-service-typescript-twoslash-queries: 0.0.34(@volar/language-service@2.1.2) - vscode-html-languageservice: 5.1.2 + volar-service-css: 0.0.34(@volar/language-service@2.1.6) + volar-service-emmet: 0.0.34(@volar/language-service@2.1.6) + volar-service-html: 0.0.34(@volar/language-service@2.1.6) + volar-service-prettier: 0.0.34(@volar/language-service@2.1.6)(prettier@3.2.5) + volar-service-typescript: 0.0.34(@volar/language-service@2.1.6) + volar-service-typescript-twoslash-queries: 0.0.34(@volar/language-service@2.1.6) + vscode-html-languageservice: 5.2.0 vscode-uri: 3.0.8 transitivePeerDependencies: - typescript @@ -2171,32 +2176,32 @@ packages: pretty-format: 29.7.0 dev: true - /@volar/kit@2.1.2(typescript@5.4.5): - resolution: {integrity: sha512-u20R1lCWCgFYBCHC+FR/e9J+P61vUNQpyWt4keAY+zpVHEHsSXVA2xWMJV1l1Iq5Dd0jBUSqrb1zsEya455AzA==} + /@volar/kit@2.1.6(typescript@5.4.5): + resolution: {integrity: sha512-dSuXChDGM0nSG/0fxqlNfadjpAeeo1P1SJPBQ+pDf8H1XrqeJq5gIhxRTEbiS+dyNIG69ATq1CArkbCif+oxJw==} peerDependencies: typescript: '*' dependencies: - '@volar/language-service': 2.1.2 - '@volar/typescript': 2.1.2 + '@volar/language-service': 2.1.6 + '@volar/typescript': 2.1.6 typesafe-path: 0.2.2 typescript: 5.4.5 vscode-languageserver-textdocument: 1.0.11 vscode-uri: 3.0.8 dev: false - /@volar/language-core@2.1.2: - resolution: {integrity: sha512-5qsDp0Gf6fE09UWCeK7bkVn6NxMwC9OqFWQkMMkeej8h8XjyABPdRygC2RCrqDrfVdGijqlMQeXs6yRS+vfZYA==} + /@volar/language-core@2.1.6: + resolution: {integrity: sha512-pAlMCGX/HatBSiDFMdMyqUshkbwWbLxpN/RL7HCQDOo2gYBE+uS+nanosLc1qR6pTQ/U8q00xt8bdrrAFPSC0A==} dependencies: - '@volar/source-map': 2.1.2 + '@volar/source-map': 2.1.6 dev: false - /@volar/language-server@2.1.2: - resolution: {integrity: sha512-5NR5Ztg+OxvDI4oRrjS0/4ZVPumWwhVq5acuK2BJbakG1kJXViYI9NOWiWITMjnliPvf12TEcSrVDBmIq54DOg==} + /@volar/language-server@2.1.6: + resolution: {integrity: sha512-0w+FV8ro37hVb3qE4ONo3VbS5kEQXv4H/D2xCePyY5dRw6XnbJAPFNKvoxI9mxHTPonvIG1si5rN9MSGSKtgZQ==} dependencies: - '@volar/language-core': 2.1.2 - '@volar/language-service': 2.1.2 - '@volar/snapshot-document': 2.1.2 - '@volar/typescript': 2.1.2 + '@volar/language-core': 2.1.6 + '@volar/language-service': 2.1.6 + '@volar/snapshot-document': 2.1.6 + '@volar/typescript': 2.1.6 '@vscode/l10n': 0.0.16 path-browserify: 1.0.1 request-light: 0.7.0 @@ -2206,37 +2211,37 @@ packages: vscode-uri: 3.0.8 dev: false - /@volar/language-service@2.1.2: - resolution: {integrity: sha512-CmVbbKdqzVq+0FT67hfELdHpboqXhKXh6EjypypuFX5ptIRftHZdkaq3/lCCa46EHxS5tvE44jn+s7faN4iRDA==} + /@volar/language-service@2.1.6: + resolution: {integrity: sha512-1OpbbPQ6wUIumwMP5r45y8utVEmvq1n6BC8JHqGKsuFr9RGFIldDBlvA/xuO3MDKhjmmPGPHKb54kg1/YN78ow==} dependencies: - '@volar/language-core': 2.1.2 + '@volar/language-core': 2.1.6 vscode-languageserver-protocol: 3.17.5 vscode-languageserver-textdocument: 1.0.11 vscode-uri: 3.0.8 dev: false - /@volar/snapshot-document@2.1.2: - resolution: {integrity: sha512-ZpJIBZrdm/Gx4jC/zn8H+O6H5vZZwY7B5CMTxl9y8HvcqlePOyDi+VkX8pjQz1VFG9Z5Z+Bau/RL6exqkoVDDA==} + /@volar/snapshot-document@2.1.6: + resolution: {integrity: sha512-YNYk1sCOrGg7VHbZM+1It97q0GWhFxdqIwnxSNFoL0X1LuSRXoCT2DRb/aa1J6aBpPMbKqSFUWHGQEAFUnc4Zw==} dependencies: vscode-languageserver-protocol: 3.17.5 vscode-languageserver-textdocument: 1.0.11 dev: false - /@volar/source-map@2.1.2: - resolution: {integrity: sha512-yFJqsuLm1OaWrsz9E3yd3bJcYIlHqdZ8MbmIoZLrAzMYQDcoF26/INIhgziEXSdyHc8xd7rd/tJdSnUyh0gH4Q==} + /@volar/source-map@2.1.6: + resolution: {integrity: sha512-TeyH8pHHonRCHYI91J7fWUoxi0zWV8whZTVRlsWHSYfjm58Blalkf9LrZ+pj6OiverPTmrHRkBsG17ScQyWECw==} dependencies: muggle-string: 0.4.1 dev: false - /@volar/typescript@2.1.2: - resolution: {integrity: sha512-lhTancZqamvaLvoz0u/uth8dpudENNt2LFZOWCw9JZiX14xRFhdhfzmphiCRb7am9E6qAJSbdS/gMt1utXAoHQ==} + /@volar/typescript@2.1.6: + resolution: {integrity: sha512-JgPGhORHqXuyC3r6skPmPHIZj4LoMmGlYErFTuPNBq9Nhc9VTv7ctHY7A3jMN3ngKEfRrfnUcwXHztvdSQqNfw==} dependencies: - '@volar/language-core': 2.1.2 + '@volar/language-core': 2.1.6 path-browserify: 1.0.1 dev: false - /@vscode/emmet-helper@2.9.2: - resolution: {integrity: sha512-MaGuyW+fa13q3aYsluKqclmh62Hgp0BpKIqS66fCxfOaBcVQ1OnMQxRRgQUYnCkxFISAQlkJ0qWWPyXjro1Qrg==} + /@vscode/emmet-helper@2.9.3: + resolution: {integrity: sha512-rB39LHWWPQYYlYfpv9qCoZOVioPCftKXXqrsyqN1mTWZM6dTnONT63Db+03vgrBbHzJN45IrgS/AGxw9iiqfEw==} dependencies: emmet: 2.4.7 jsonc-parser: 2.3.1 @@ -2677,13 +2682,19 @@ packages: dev: true optional: true - /bare-fs@2.2.3: - resolution: {integrity: sha512-amG72llr9pstfXOBOHve1WjiuKKAMnebcmMbPWDZ7BCevAoJLpugjuAPRsDINEyjT0a6tbaVx3DctkXIRbLuJw==} + /bare-events@2.2.2: + resolution: {integrity: sha512-h7z00dWdG0PYOQEvChhOSWvOfkIKsdZGkWr083FgN/HyoQuebSew/cgirYqh9SCuy/hRvxc5Vy6Fw8xAmYHLkQ==} + requiresBuild: true + dev: true + optional: true + + /bare-fs@2.3.0: + resolution: {integrity: sha512-TNFqa1B4N99pds2a5NYHR15o0ZpdNKbAeKTE/+G6ED/UeOavv8RY3dr/Fu99HW3zU3pXpo2kDNO8Sjsm2esfOw==} requiresBuild: true dependencies: bare-events: 2.2.1 - bare-path: 2.1.1 - streamx: 2.16.1 + bare-path: 2.1.2 + bare-stream: 1.0.0 dev: true optional: true @@ -2693,14 +2704,22 @@ packages: dev: true optional: true - /bare-path@2.1.1: - resolution: {integrity: sha512-OHM+iwRDRMDBsSW7kl3dO62JyHdBKO3B25FB9vNQBPcGHMo4+eA8Yj41Lfbk3pS/seDY+siNge0LdRTulAau/A==} + /bare-path@2.1.2: + resolution: {integrity: sha512-o7KSt4prEphWUHa3QUwCxUI00R86VdjiuxmJK0iNVDHYPGo+HsDaVCnqCmPbf/MiW1ok8F4p3m8RTHlWk8K2ig==} requiresBuild: true dependencies: bare-os: 2.2.1 dev: true optional: true + /bare-stream@1.0.0: + resolution: {integrity: sha512-KhNUoDL40iP4gFaLSsoGE479t0jHijfYdIcxRn/XtezA2BaUD0NRf/JGRpsMq6dMNM+SrCrB0YSSo/5wBY4rOQ==} + requiresBuild: true + dependencies: + streamx: 2.16.1 + dev: true + optional: true + /base-64@1.0.0: resolution: {integrity: sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg==} dev: true @@ -7290,7 +7309,7 @@ packages: fast-fifo: 1.3.2 queue-tick: 1.0.1 optionalDependencies: - bare-events: 2.2.1 + bare-events: 2.2.2 dev: true optional: true @@ -7493,8 +7512,8 @@ packages: pump: 3.0.0 tar-stream: 3.1.7 optionalDependencies: - bare-fs: 2.2.3 - bare-path: 2.1.1 + bare-fs: 2.3.0 + bare-path: 2.1.2 dev: true optional: true @@ -8112,7 +8131,7 @@ packages: - terser dev: true - /volar-service-css@0.0.34(@volar/language-service@2.1.2): + /volar-service-css@0.0.34(@volar/language-service@2.1.6): resolution: {integrity: sha512-C7ua0j80ZD7bsgALAz/cA1bykPehoIa5n+3+Ccr+YLpj0fypqw9iLUmGLX11CqzqNCO2XFGe/1eXB/c+SWrF/g==} peerDependencies: '@volar/language-service': ~2.1.0 @@ -8120,13 +8139,13 @@ packages: '@volar/language-service': optional: true dependencies: - '@volar/language-service': 2.1.2 - vscode-css-languageservice: 6.2.12 + '@volar/language-service': 2.1.6 + vscode-css-languageservice: 6.2.14 vscode-languageserver-textdocument: 1.0.11 vscode-uri: 3.0.8 dev: false - /volar-service-emmet@0.0.34(@volar/language-service@2.1.2): + /volar-service-emmet@0.0.34(@volar/language-service@2.1.6): resolution: {integrity: sha512-ubQvMCmHPp8Ic82LMPkgrp9ot+u2p/RDd0RyT0EykRkZpWsagHUF5HWkVheLfiMyx2rFuWx/+7qZPOgypx6h6g==} peerDependencies: '@volar/language-service': ~2.1.0 @@ -8134,12 +8153,12 @@ packages: '@volar/language-service': optional: true dependencies: - '@volar/language-service': 2.1.2 - '@vscode/emmet-helper': 2.9.2 - vscode-html-languageservice: 5.1.2 + '@volar/language-service': 2.1.6 + '@vscode/emmet-helper': 2.9.3 + vscode-html-languageservice: 5.2.0 dev: false - /volar-service-html@0.0.34(@volar/language-service@2.1.2): + /volar-service-html@0.0.34(@volar/language-service@2.1.6): resolution: {integrity: sha512-kMEneea1tQbiRcyKavqdrSVt8zV06t+0/3pGkjO3gV6sikXTNShIDkdtB4Tq9vE2cQdM50TuS7utVV7iysUxHw==} peerDependencies: '@volar/language-service': ~2.1.0 @@ -8147,13 +8166,13 @@ packages: '@volar/language-service': optional: true dependencies: - '@volar/language-service': 2.1.2 - vscode-html-languageservice: 5.1.2 + '@volar/language-service': 2.1.6 + vscode-html-languageservice: 5.2.0 vscode-languageserver-textdocument: 1.0.11 vscode-uri: 3.0.8 dev: false - /volar-service-prettier@0.0.34(@volar/language-service@2.1.2)(prettier@3.2.5): + /volar-service-prettier@0.0.34(@volar/language-service@2.1.6)(prettier@3.2.5): resolution: {integrity: sha512-BNfJ8FwfPi1Wm/JkuzNjraOLdtKieGksNT/bDyquygVawv1QUzO2HB1hiMKfZGdcSFG5ZL9R0j7bBfRTfXA2gg==} peerDependencies: '@volar/language-service': ~2.1.0 @@ -8164,12 +8183,12 @@ packages: prettier: optional: true dependencies: - '@volar/language-service': 2.1.2 + '@volar/language-service': 2.1.6 prettier: 3.2.5 vscode-uri: 3.0.8 dev: false - /volar-service-typescript-twoslash-queries@0.0.34(@volar/language-service@2.1.2): + /volar-service-typescript-twoslash-queries@0.0.34(@volar/language-service@2.1.6): resolution: {integrity: sha512-XAY2YtWKUp6ht89gxt3L5Dr46LU45d/VlBkj1KXUwNlinpoWiGN4Nm3B6DRF3VoBThAnQgm4c7WD0S+5yTzh+w==} peerDependencies: '@volar/language-service': ~2.1.0 @@ -8177,10 +8196,10 @@ packages: '@volar/language-service': optional: true dependencies: - '@volar/language-service': 2.1.2 + '@volar/language-service': 2.1.6 dev: false - /volar-service-typescript@0.0.34(@volar/language-service@2.1.2): + /volar-service-typescript@0.0.34(@volar/language-service@2.1.6): resolution: {integrity: sha512-NbAry0w8ZXFgGsflvMwmPDCzgJGx3C+eYxFEbldaumkpTAJiywECWiUbPIOfmEHgpOllUKSnhwtLlWFK4YnfQg==} peerDependencies: '@volar/language-service': ~2.1.0 @@ -8188,7 +8207,7 @@ packages: '@volar/language-service': optional: true dependencies: - '@volar/language-service': 2.1.2 + '@volar/language-service': 2.1.6 path-browserify: 1.0.1 semver: 7.6.0 typescript-auto-import-cache: 0.3.2 @@ -8196,8 +8215,8 @@ packages: vscode-nls: 5.2.0 dev: false - /vscode-css-languageservice@6.2.12: - resolution: {integrity: sha512-PS9r7HgNjqzRl3v91sXpCyZPc8UDotNo6gntFNtGCKPhGA9Frk7g/VjX1Mbv3F00pn56D+rxrFzR9ep4cawOgA==} + /vscode-css-languageservice@6.2.14: + resolution: {integrity: sha512-5UPQ9Y1sUTnuMyaMBpO7LrBkqjhEJb5eAwdUlDp+Uez8lry+Tspnk3+3p2qWS4LlNsr4p3v9WkZxUf1ltgFpgw==} dependencies: '@vscode/l10n': 0.0.18 vscode-languageserver-textdocument: 1.0.11 @@ -8205,8 +8224,8 @@ packages: vscode-uri: 3.0.8 dev: false - /vscode-html-languageservice@5.1.2: - resolution: {integrity: sha512-wkWfEx/IIR3s2P5yD4aTGHiOb8IAzFxgkSt1uSC3itJ4oDAm23yG7o0L29JljUdnXDDgLafPAvhv8A2I/8riHw==} + /vscode-html-languageservice@5.2.0: + resolution: {integrity: sha512-cdNMhyw57/SQzgUUGSIMQ66jikqEN6nBNyhx5YuOyj9310+eY9zw8Q0cXpiKzDX8aHYFewQEXRnigl06j/TVwQ==} dependencies: '@vscode/l10n': 0.0.18 vscode-languageserver-textdocument: 1.0.11 From 7fa4296fb25038bfae2f0d1f554d13e3f0f348d7 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 26 Apr 2024 11:07:16 +0800 Subject: [PATCH 43/81] chore(deps): update pnpm to v9 (#1401) [docs] Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- docs/package.json | 2 +- docs/pnpm-lock.yaml | 9793 ++++++++++++++++++++++++------------------- 2 files changed, 5440 insertions(+), 4355 deletions(-) diff --git a/docs/package.json b/docs/package.json index f35dbf0716..fc6f6bbcb8 100644 --- a/docs/package.json +++ b/docs/package.json @@ -121,7 +121,7 @@ "lint-staged": { "**/*": "npm run fix" }, - "packageManager": "pnpm@8.10.0", + "packageManager": "pnpm@9.0.6", "pnpm": { "peerDependencyRules": { "ignoreMissing": [ diff --git a/docs/pnpm-lock.yaml b/docs/pnpm-lock.yaml index b0448d462c..79bca4d640 100644 --- a/docs/pnpm-lock.yaml +++ b/docs/pnpm-lock.yaml @@ -1,255 +1,4384 @@ -lockfileVersion: '6.0' +lockfileVersion: '9.0' settings: autoInstallPeers: true excludeLinksFromLockfile: false -dependencies: - '@akebifiky/remark-simple-plantuml': - specifier: ^1.0.2 - version: 1.0.2 - '@astrojs/check': - specifier: ^0.5.9 - version: 0.5.10(prettier-plugin-astro@0.13.0)(prettier@3.2.5)(typescript@5.4.5) - '@fontsource/ibm-plex-mono': - specifier: 5.0.12 - version: 5.0.12 - '@nanostores/preact': - specifier: ^0.5.1 - version: 0.5.1(nanostores@0.10.0)(preact@10.19.7) - canvas-confetti: - specifier: ^1.9.2 - version: 1.9.2 - jsdoc-api: - specifier: ^8.0.0 - version: 8.0.0 - minimatch: - specifier: ^9.0.3 - version: 9.0.3 - nanostores: - specifier: ^0.10.0 - version: 0.10.0 - rehype-autolink-headings: - specifier: ^7.1.0 - version: 7.1.0 - rehype-slug: - specifier: ^6.0.0 - version: 6.0.0 - remark-gfm: - specifier: ^4.0.0 - version: 4.0.0 - remark-smartypants: - specifier: ^3.0.0 - version: 3.0.1 - sass: - specifier: ^1.72.0 - version: 1.72.0 - -devDependencies: - '@11ty/eleventy-fetch': - specifier: ^4.0.1 - version: 4.0.1 - '@actions/core': - specifier: ^1.10.1 - version: 1.10.1 - '@astrojs/mdx': - specifier: ^2.2.0 - version: 2.2.2(astro@4.5.7) - '@astrojs/preact': - specifier: ^3.1.1 - version: 3.1.1(@babel/core@7.24.3)(preact@10.19.7) - '@astrojs/sitemap': - specifier: 3.1.2 - version: 3.1.2 - '@babel/core': - specifier: ^7.24.3 - version: 7.24.3 - '@docsearch/css': - specifier: ^3.6.0 - version: 3.6.0 - '@docsearch/react': - specifier: ^3.6.0 - version: 3.6.0(@algolia/client-search@4.23.3)(search-insights@2.13.0) - '@types/canvas-confetti': - specifier: ^1.6.4 - version: 1.6.4 - '@types/hast': - specifier: ^3.0.4 - version: 3.0.4 - '@types/html-escaper': - specifier: ^3.0.2 - version: 3.0.2 - '@types/mdast': - specifier: ^4.0.3 - version: 4.0.3 - '@types/node': - specifier: 20.12.7 - version: 20.12.7 - '@typescript-eslint/eslint-plugin': - specifier: ^7.3.1 - version: 7.4.0(@typescript-eslint/parser@7.4.0)(eslint@8.57.0)(typescript@5.4.5) - '@typescript-eslint/parser': - specifier: ^7.3.1 - version: 7.4.0(eslint@8.57.0)(typescript@5.4.5) - algoliasearch: - specifier: ^4.22.1 - version: 4.22.1 - astro: - specifier: ^4.5.7 - version: 4.5.7(@types/node@20.12.7)(sass@1.72.0)(typescript@5.4.5) - astro-auto-import: - specifier: ^0.4.2 - version: 0.4.2(astro@4.5.7) - astro-eslint-parser: - specifier: ^0.16.3 - version: 0.16.3 - astro-expressive-code: - specifier: ^0.33.5 - version: 0.33.5(astro@4.5.7) - astro-og-canvas: - specifier: ^0.4.2 - version: 0.4.2(astro@4.5.7) - bcp-47-normalize: - specifier: ^2.3.0 - version: 2.3.0 - canvaskit-wasm: - specifier: ^0.39.1 - version: 0.39.1 - dedent-js: - specifier: ^1.0.1 - version: 1.0.1 - domhandler: - specifier: ^5.0.3 - version: 5.0.3 - eslint: - specifier: ^8.57.0 - version: 8.57.0 - eslint-plugin-astro: - specifier: ^0.33.0 - version: 0.33.1(eslint@8.57.0) - eslint-plugin-react: - specifier: ^7.34.1 - version: 7.34.1(eslint@8.57.0) - fast-glob: - specifier: ^3.3.2 - version: 3.3.2 - gray-matter: - specifier: ^4.0.3 - version: 4.0.3 - hast-util-from-html: - specifier: ^2.0.1 - version: 2.0.1 - hast-util-to-html: - specifier: ^9.0.0 - version: 9.0.0 - hast-util-to-string: - specifier: ^3.0.0 - version: 3.0.0 - hastscript: - specifier: ^9.0.0 - version: 9.0.0 - html-escaper: - specifier: ^3.0.3 - version: 3.0.3 - htmlparser2: - specifier: ^9.1.0 - version: 9.1.0 - husky: - specifier: ^9.0.11 - version: 9.0.11 - kleur: - specifier: ^4.1.5 - version: 4.1.5 - lint-staged: - specifier: ^15.2.2 - version: 15.2.2 - mdast-util-from-markdown: - specifier: ^2.0.0 - version: 2.0.0 - mdast-util-mdx-jsx: - specifier: ^3.1.2 - version: 3.1.2 - mdast-util-to-hast: - specifier: ^13.1.0 - version: 13.1.0 - mdast-util-to-string: - specifier: ^4.0.0 - version: 4.0.0 - micromark-util-character: - specifier: ^2.1.0 - version: 2.1.0 - micromark-util-symbol: - specifier: ^2.0.0 - version: 2.0.0 - node-fetch: - specifier: ^3.3.2 - version: 3.3.2 - organize-imports-cli: - specifier: ^0.10.0 - version: 0.10.0 - p-retry: - specifier: ^6.2.0 - version: 6.2.0 - parse-numeric-range: - specifier: ^1.3.0 - version: 1.3.0 - preact: - specifier: ^10.19.7 - version: 10.19.7 - prettier: - specifier: ^3.2.5 - version: 3.2.5 - prettier-plugin-astro: - specifier: ^0.13.0 - version: 0.13.0 - prompts: - specifier: ^2.4.2 - version: 2.4.2 - rehype: - specifier: ^13.0.1 - version: 13.0.1 - remark: - specifier: ^15.0.1 - version: 15.0.1 - remark-directive: - specifier: ^3.0.0 - version: 3.0.0 - remove-markdown: - specifier: ^0.5.0 - version: 0.5.0 - simple-git: - specifier: ^3.23.0 - version: 3.23.0 - tsm: - specifier: ^2.3.0 - version: 2.3.0 - typescript: - specifier: ^5.4.2 - version: 5.4.5 - unified: - specifier: ^11.0.4 - version: 11.0.4 - unist-util-remove: - specifier: ^4.0.0 - version: 4.0.0 - unist-util-visit: - specifier: ^5.0.0 - version: 5.0.0 - unist-util-walker: - specifier: ^1.0.0 - version: 1.0.0 - vfile: - specifier: ^6.0.1 - version: 6.0.1 - vitest: - specifier: ^1.4.0 - version: 1.4.0(@types/node@20.12.7)(sass@1.72.0) +importers: + + .: + dependencies: + '@akebifiky/remark-simple-plantuml': + specifier: ^1.0.2 + version: 1.0.2 + '@astrojs/check': + specifier: ^0.5.9 + version: 0.5.10(prettier-plugin-astro@0.13.0)(prettier@3.2.5)(typescript@5.4.5) + '@fontsource/ibm-plex-mono': + specifier: 5.0.12 + version: 5.0.12 + '@nanostores/preact': + specifier: ^0.5.1 + version: 0.5.1(nanostores@0.10.0)(preact@10.19.7) + canvas-confetti: + specifier: ^1.9.2 + version: 1.9.2 + jsdoc-api: + specifier: ^8.0.0 + version: 8.0.0 + minimatch: + specifier: ^9.0.3 + version: 9.0.3 + nanostores: + specifier: ^0.10.0 + version: 0.10.0 + rehype-autolink-headings: + specifier: ^7.1.0 + version: 7.1.0 + rehype-slug: + specifier: ^6.0.0 + version: 6.0.0 + remark-gfm: + specifier: ^4.0.0 + version: 4.0.0 + remark-smartypants: + specifier: ^3.0.0 + version: 3.0.1 + sass: + specifier: ^1.72.0 + version: 1.72.0 + devDependencies: + '@11ty/eleventy-fetch': + specifier: ^4.0.1 + version: 4.0.1 + '@actions/core': + specifier: ^1.10.1 + version: 1.10.1 + '@astrojs/mdx': + specifier: ^2.2.0 + version: 2.2.2(astro@4.5.7) + '@astrojs/preact': + specifier: ^3.1.1 + version: 3.1.1(@babel/core@7.24.3)(preact@10.19.7) + '@astrojs/sitemap': + specifier: 3.1.2 + version: 3.1.2 + '@babel/core': + specifier: ^7.24.3 + version: 7.24.3 + '@docsearch/css': + specifier: ^3.6.0 + version: 3.6.0 + '@docsearch/react': + specifier: ^3.6.0 + version: 3.6.0(@algolia/client-search@4.23.3)(search-insights@2.13.0) + '@types/canvas-confetti': + specifier: ^1.6.4 + version: 1.6.4 + '@types/hast': + specifier: ^3.0.4 + version: 3.0.4 + '@types/html-escaper': + specifier: ^3.0.2 + version: 3.0.2 + '@types/mdast': + specifier: ^4.0.3 + version: 4.0.3 + '@types/node': + specifier: 20.12.7 + version: 20.12.7 + '@typescript-eslint/eslint-plugin': + specifier: ^7.3.1 + version: 7.4.0(@typescript-eslint/parser@7.4.0)(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/parser': + specifier: ^7.3.1 + version: 7.4.0(eslint@8.57.0)(typescript@5.4.5) + algoliasearch: + specifier: ^4.22.1 + version: 4.22.1 + astro: + specifier: ^4.5.7 + version: 4.5.7(@types/node@20.12.7)(sass@1.72.0)(typescript@5.4.5) + astro-auto-import: + specifier: ^0.4.2 + version: 0.4.2(astro@4.5.7) + astro-eslint-parser: + specifier: ^0.16.3 + version: 0.16.3 + astro-expressive-code: + specifier: ^0.33.5 + version: 0.33.5(astro@4.5.7) + astro-og-canvas: + specifier: ^0.4.2 + version: 0.4.2(astro@4.5.7) + bcp-47-normalize: + specifier: ^2.3.0 + version: 2.3.0 + canvaskit-wasm: + specifier: ^0.39.1 + version: 0.39.1 + dedent-js: + specifier: ^1.0.1 + version: 1.0.1 + domhandler: + specifier: ^5.0.3 + version: 5.0.3 + eslint: + specifier: ^8.57.0 + version: 8.57.0 + eslint-plugin-astro: + specifier: ^0.33.0 + version: 0.33.1(eslint@8.57.0) + eslint-plugin-react: + specifier: ^7.34.1 + version: 7.34.1(eslint@8.57.0) + fast-glob: + specifier: ^3.3.2 + version: 3.3.2 + gray-matter: + specifier: ^4.0.3 + version: 4.0.3 + hast-util-from-html: + specifier: ^2.0.1 + version: 2.0.1 + hast-util-to-html: + specifier: ^9.0.0 + version: 9.0.0 + hast-util-to-string: + specifier: ^3.0.0 + version: 3.0.0 + hastscript: + specifier: ^9.0.0 + version: 9.0.0 + html-escaper: + specifier: ^3.0.3 + version: 3.0.3 + htmlparser2: + specifier: ^9.1.0 + version: 9.1.0 + husky: + specifier: ^9.0.11 + version: 9.0.11 + kleur: + specifier: ^4.1.5 + version: 4.1.5 + lint-staged: + specifier: ^15.2.2 + version: 15.2.2 + mdast-util-from-markdown: + specifier: ^2.0.0 + version: 2.0.0 + mdast-util-mdx-jsx: + specifier: ^3.1.2 + version: 3.1.2 + mdast-util-to-hast: + specifier: ^13.1.0 + version: 13.1.0 + mdast-util-to-string: + specifier: ^4.0.0 + version: 4.0.0 + micromark-util-character: + specifier: ^2.1.0 + version: 2.1.0 + micromark-util-symbol: + specifier: ^2.0.0 + version: 2.0.0 + node-fetch: + specifier: ^3.3.2 + version: 3.3.2 + organize-imports-cli: + specifier: ^0.10.0 + version: 0.10.0 + p-retry: + specifier: ^6.2.0 + version: 6.2.0 + parse-numeric-range: + specifier: ^1.3.0 + version: 1.3.0 + preact: + specifier: ^10.19.7 + version: 10.19.7 + prettier: + specifier: ^3.2.5 + version: 3.2.5 + prettier-plugin-astro: + specifier: ^0.13.0 + version: 0.13.0 + prompts: + specifier: ^2.4.2 + version: 2.4.2 + rehype: + specifier: ^13.0.1 + version: 13.0.1 + remark: + specifier: ^15.0.1 + version: 15.0.1 + remark-directive: + specifier: ^3.0.0 + version: 3.0.0 + remove-markdown: + specifier: ^0.5.0 + version: 0.5.0 + simple-git: + specifier: ^3.23.0 + version: 3.23.0 + tsm: + specifier: ^2.3.0 + version: 2.3.0 + typescript: + specifier: ^5.4.2 + version: 5.4.5 + unified: + specifier: ^11.0.4 + version: 11.0.4 + unist-util-remove: + specifier: ^4.0.0 + version: 4.0.0 + unist-util-visit: + specifier: ^5.0.0 + version: 5.0.0 + unist-util-walker: + specifier: ^1.0.0 + version: 1.0.0 + vfile: + specifier: ^6.0.1 + version: 6.0.1 + vitest: + specifier: ^1.4.0 + version: 1.4.0(@types/node@20.12.7)(sass@1.72.0) + +packages: + + '@11ty/eleventy-fetch@4.0.1': + resolution: {integrity: sha512-yIiLM5ziBmg86i4TlXpBdcIygJHvh/GgPJyAiFOckO9H4y9cQDM8eIcJCUQ4Mum0NEVui/OjhEut2R08xw0vlQ==} + engines: {node: '>=14'} + + '@aashutoshrathi/word-wrap@1.2.6': + resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} + engines: {node: '>=0.10.0'} + + '@actions/core@1.10.1': + resolution: {integrity: sha512-3lBR9EDAY+iYIpTnTIXmWcNbX3T2kCkAEQGIQx4NVQ0575nk2k3GRZDTPQG+vVtS2izSLmINlxXf0uLtnrTP+g==} + + '@actions/http-client@2.2.1': + resolution: {integrity: sha512-KhC/cZsq7f8I4LfZSJKgCvEwfkE8o1538VoBeoGzokVLLnbFDEAdFD3UhoMklxo2un9NJVBdANOresx7vTHlHw==} + + '@akebifiky/remark-simple-plantuml@1.0.2': + resolution: {integrity: sha512-y5rWgQvU+DMpLKx1KlXCsgUeqVooqQm1S3hePLF9iecZy6YhKRybznFdvAvoAoiV2GoGhObQDHnneAl93llIcg==} + + '@algolia/autocomplete-core@1.9.3': + resolution: {integrity: sha512-009HdfugtGCdC4JdXUbVJClA0q0zh24yyePn+KUGk3rP7j8FEe/m5Yo/z65gn6nP/cM39PxpzqKrL7A6fP6PPw==} + + '@algolia/autocomplete-plugin-algolia-insights@1.9.3': + resolution: {integrity: sha512-a/yTUkcO/Vyy+JffmAnTWbr4/90cLzw+CC3bRbhnULr/EM0fGNvM13oQQ14f2moLMcVDyAx/leczLlAOovhSZg==} + peerDependencies: + search-insights: '>= 1 < 3' + + '@algolia/autocomplete-preset-algolia@1.9.3': + resolution: {integrity: sha512-d4qlt6YmrLMYy95n5TB52wtNDr6EgAIPH81dvvvW8UmuWRgxEtY0NJiPwl/h95JtG2vmRM804M0DSwMCNZlzRA==} + peerDependencies: + '@algolia/client-search': '>= 4.9.1 < 6' + algoliasearch: '>= 4.9.1 < 6' + + '@algolia/autocomplete-shared@1.9.3': + resolution: {integrity: sha512-Wnm9E4Ye6Rl6sTTqjoymD+l8DjSTHsHboVRYrKgEt8Q7UHm9nYbqhN/i0fhUYA3OAEH7WA8x3jfpnmJm3rKvaQ==} + peerDependencies: + '@algolia/client-search': '>= 4.9.1 < 6' + algoliasearch: '>= 4.9.1 < 6' + + '@algolia/cache-browser-local-storage@4.22.1': + resolution: {integrity: sha512-Sw6IAmOCvvP6QNgY9j+Hv09mvkvEIDKjYW8ow0UDDAxSXy664RBNQk3i/0nt7gvceOJ6jGmOTimaZoY1THmU7g==} + + '@algolia/cache-common@4.22.1': + resolution: {integrity: sha512-TJMBKqZNKYB9TptRRjSUtevJeQVXRmg6rk9qgFKWvOy8jhCPdyNZV1nB3SKGufzvTVbomAukFR8guu/8NRKBTA==} + + '@algolia/cache-common@4.23.3': + resolution: {integrity: sha512-h9XcNI6lxYStaw32pHpB1TMm0RuxphF+Ik4o7tcQiodEdpKK+wKufY6QXtba7t3k8eseirEMVB83uFFF3Nu54A==} + + '@algolia/cache-in-memory@4.22.1': + resolution: {integrity: sha512-ve+6Ac2LhwpufuWavM/aHjLoNz/Z/sYSgNIXsinGofWOysPilQZPUetqLj8vbvi+DHZZaYSEP9H5SRVXnpsNNw==} + + '@algolia/client-account@4.22.1': + resolution: {integrity: sha512-k8m+oegM2zlns/TwZyi4YgCtyToackkOpE+xCaKCYfBfDtdGOaVZCM5YvGPtK+HGaJMIN/DoTL8asbM3NzHonw==} + + '@algolia/client-analytics@4.22.1': + resolution: {integrity: sha512-1ssi9pyxyQNN4a7Ji9R50nSdISIumMFDwKNuwZipB6TkauJ8J7ha/uO60sPJFqQyqvvI+px7RSNRQT3Zrvzieg==} + + '@algolia/client-common@4.22.1': + resolution: {integrity: sha512-IvaL5v9mZtm4k4QHbBGDmU3wa/mKokmqNBqPj0K7lcR8ZDKzUorhcGp/u8PkPC/e0zoHSTvRh7TRkGX3Lm7iOQ==} + + '@algolia/client-common@4.23.3': + resolution: {integrity: sha512-l6EiPxdAlg8CYhroqS5ybfIczsGUIAC47slLPOMDeKSVXYG1n0qGiz4RjAHLw2aD0xzh2EXZ7aRguPfz7UKDKw==} + + '@algolia/client-personalization@4.22.1': + resolution: {integrity: sha512-sl+/klQJ93+4yaqZ7ezOttMQ/nczly/3GmgZXJ1xmoewP5jmdP/X/nV5U7EHHH3hCUEHeN7X1nsIhGPVt9E1cQ==} + + '@algolia/client-search@4.22.1': + resolution: {integrity: sha512-yb05NA4tNaOgx3+rOxAmFztgMTtGBi97X7PC3jyNeGiwkAjOZc2QrdZBYyIdcDLoI09N0gjtpClcackoTN0gPA==} + + '@algolia/client-search@4.23.3': + resolution: {integrity: sha512-P4VAKFHqU0wx9O+q29Q8YVuaowaZ5EM77rxfmGnkHUJggh28useXQdopokgwMeYw2XUht49WX5RcTQ40rZIabw==} + + '@algolia/logger-common@4.22.1': + resolution: {integrity: sha512-OnTFymd2odHSO39r4DSWRFETkBufnY2iGUZNrMXpIhF5cmFE8pGoINNPzwg02QLBlGSaLqdKy0bM8S0GyqPLBg==} + + '@algolia/logger-common@4.23.3': + resolution: {integrity: sha512-y9kBtmJwiZ9ZZ+1Ek66P0M68mHQzKRxkW5kAAXYN/rdzgDN0d2COsViEFufxJ0pb45K4FRcfC7+33YB4BLrZ+g==} + + '@algolia/logger-console@4.22.1': + resolution: {integrity: sha512-O99rcqpVPKN1RlpgD6H3khUWylU24OXlzkavUAMy6QZd1776QAcauE3oP8CmD43nbaTjBexZj2nGsBH9Tc0FVA==} + + '@algolia/requester-browser-xhr@4.22.1': + resolution: {integrity: sha512-dtQGYIg6MteqT1Uay3J/0NDqD+UciHy3QgRbk7bNddOJu+p3hzjTRYESqEnoX/DpEkaNYdRHUKNylsqMpgwaEw==} + + '@algolia/requester-common@4.22.1': + resolution: {integrity: sha512-dgvhSAtg2MJnR+BxrIFqlLtkLlVVhas9HgYKMk2Uxiy5m6/8HZBL40JVAMb2LovoPFs9I/EWIoFVjOrFwzn5Qg==} + + '@algolia/requester-common@4.23.3': + resolution: {integrity: sha512-xloIdr/bedtYEGcXCiF2muajyvRhwop4cMZo+K2qzNht0CMzlRkm8YsDdj5IaBhshqfgmBb3rTg4sL4/PpvLYw==} + + '@algolia/requester-node-http@4.22.1': + resolution: {integrity: sha512-JfmZ3MVFQkAU+zug8H3s8rZ6h0ahHZL/SpMaSasTCGYR5EEJsCc8SI5UZ6raPN2tjxa5bxS13BRpGSBUens7EA==} + + '@algolia/transporter@4.22.1': + resolution: {integrity: sha512-kzWgc2c9IdxMa3YqA6TN0NW5VrKYYW/BELIn7vnLyn+U/RFdZ4lxxt9/8yq3DKV5snvoDzzO4ClyejZRdV3lMQ==} + + '@algolia/transporter@4.23.3': + resolution: {integrity: sha512-Wjl5gttqnf/gQKJA+dafnD0Y6Yw97yvfY8R9h0dQltX1GXTgNs1zWgvtWW0tHl1EgMdhAyw189uWiZMnL3QebQ==} + + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + + '@astrojs/check@0.5.10': + resolution: {integrity: sha512-vliHXM9cu/viGeKiksUM4mXfO816ohWtawTl2ADPgTsd4nUMjFiyAl7xFZhF34yy4hq4qf7jvK1F2PlR3b5I5w==} + hasBin: true + peerDependencies: + typescript: ^5.0.0 + + '@astrojs/compiler@1.8.2': + resolution: {integrity: sha512-o/ObKgtMzl8SlpIdzaxFnt7SATKPxu4oIP/1NL+HDJRzxfJcAkOTAb/ZKMRyULbz4q+1t2/DAebs2Z1QairkZw==} + + '@astrojs/compiler@2.7.0': + resolution: {integrity: sha512-XpC8MAaWjD1ff6/IfkRq/5k1EFj6zhCNqXRd5J43SVJEBj/Bsmizkm8N0xOYscGcDFQkRgEw6/eKnI5x/1l6aA==} + + '@astrojs/compiler@2.7.1': + resolution: {integrity: sha512-/POejAYuj8WEw7ZI0J8JBvevjfp9jQ9Wmu/Bg52RiNwGXkMV7JnYpsenVfHvvf1G7R5sXHGKlTcxlQWhoUTiGQ==} + + '@astrojs/internal-helpers@0.3.0': + resolution: {integrity: sha512-tGmHvrhpzuz0JBHaJX8GywN9g4rldVNHtkoVDC3m/DdzBO70jGoVuc0uuNVglRYnsdwkbG0K02Iw3nOOR3/Y4g==} + + '@astrojs/language-server@2.8.4': + resolution: {integrity: sha512-sJH5vGTBkhgA8+hdhzX78UUp4cFz4Mt7xkEkevD188OS5bDMkaue6hK+dtXWM47mnrXFveXA2u38K7S+5+IRjA==} + hasBin: true + peerDependencies: + prettier: ^3.0.0 + prettier-plugin-astro: '>=0.11.0' + peerDependenciesMeta: + prettier: + optional: true + prettier-plugin-astro: + optional: true + + '@astrojs/markdown-remark@4.3.0': + resolution: {integrity: sha512-iZOgYj/yNDvBRfKqkGuAvjeONhjQPq8Uk3HjyIgcTK5valq03NiUgSc5Ovq00yUVBeYJ/5EDx23c8xqtkkBlPw==} + + '@astrojs/markdown-remark@4.3.2': + resolution: {integrity: sha512-4Oa4VaYiBd0MatB+rWIU/0A8pZH/sK3c2QkRYb+OO2lPl+qzevJtWaZY8hAQc4qurIOlRdn6B6ofDAGhWw+DSg==} + + '@astrojs/mdx@2.2.2': + resolution: {integrity: sha512-5SIFtOctC813HFyqJwBf5TBvlT9sbiOOv+bdvzAoiBSab95dC7PZhss22EvUEx+897c81YoIZ4F9fg4ZkxBFIw==} + engines: {node: '>=18.14.1'} + peerDependencies: + astro: ^4.0.0 + + '@astrojs/preact@3.1.1': + resolution: {integrity: sha512-ASgmVzh4wLyIyynp5CIfDwE45Vg/tIP+Y+5SnQtURmCP1qZpjdUbsw+bGQ0wCSXtjIbzCBa7Kw7Qn0g6WE2W2w==} + engines: {node: '>=18.14.1'} + peerDependencies: + preact: ^10.6.5 + + '@astrojs/prism@3.0.0': + resolution: {integrity: sha512-g61lZupWq1bYbcBnYZqdjndShr/J3l/oFobBKPA3+qMat146zce3nz2kdO4giGbhYDt4gYdhmoBz0vZJ4sIurQ==} + engines: {node: '>=18.14.1'} + + '@astrojs/sitemap@3.1.2': + resolution: {integrity: sha512-FxOJldIl5ltZ5CNjocQxHkAO9orwHBjqtaU28o4smobp9vowS0nbGp+I9CrPxkzWdl1crSDm9vjL9tnvG1DSug==} + + '@astrojs/telemetry@3.0.4': + resolution: {integrity: sha512-A+0c7k/Xy293xx6odsYZuXiaHO0PL+bnDoXOc47sGDF5ffIKdKQGRPFl2NMlCF4L0NqN4Ynbgnaip+pPF0s7pQ==} + engines: {node: '>=18.14.1'} + + '@babel/code-frame@7.24.1': + resolution: {integrity: sha512-bC49z4spJQR3j8vFtJBLqzyzFV0ciuL5HYX7qfSl3KEqeMVV+eTquRvmXxpvB0AMubRrvv7y5DILiLLPi57Ewg==} + engines: {node: '>=6.9.0'} + + '@babel/code-frame@7.24.2': + resolution: {integrity: sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.24.1': + resolution: {integrity: sha512-Pc65opHDliVpRHuKfzI+gSA4zcgr65O4cl64fFJIWEEh8JoHIHh0Oez1Eo8Arz8zq/JhgKodQaxEwUPRtZylVA==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.24.3': + resolution: {integrity: sha512-5FcvN1JHw2sHJChotgx8Ek0lyuh4kCKelgMTTqhYJJtloNvUfpAFMeNQUtdlIaktwrSV9LtCdqwk48wL2wBacQ==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.24.1': + resolution: {integrity: sha512-DfCRfZsBcrPEHUfuBMgbJ1Ut01Y/itOs+hY2nFLgqsqXd52/iSiVq5TITtUasIUgm+IIKdY2/1I7auiQOEeC9A==} + engines: {node: '>=6.9.0'} + + '@babel/helper-annotate-as-pure@7.22.5': + resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.23.6': + resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-environment-visitor@7.22.20': + resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-function-name@7.23.0': + resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-hoist-variables@7.22.5': + resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.24.1': + resolution: {integrity: sha512-HfEWzysMyOa7xI5uQHc/OcZf67/jc+xe/RZlznWQHhbb8Pg1SkRdbK4yEi61aY8wxQA7PkSfoojtLQP/Kpe3og==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.24.3': + resolution: {integrity: sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.23.3': + resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-plugin-utils@7.24.0': + resolution: {integrity: sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==} + engines: {node: '>=6.9.0'} + + '@babel/helper-simple-access@7.22.5': + resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} + engines: {node: '>=6.9.0'} + + '@babel/helper-split-export-declaration@7.22.6': + resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.24.1': + resolution: {integrity: sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.22.20': + resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.23.5': + resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.24.1': + resolution: {integrity: sha512-BpU09QqEe6ZCHuIHFphEFgvNSrubve1FtyMton26ekZ85gRGi6LrTF7zArARp2YvyFxloeiRmtSCq5sjh1WqIg==} + engines: {node: '>=6.9.0'} + + '@babel/highlight@7.24.1': + resolution: {integrity: sha512-EPmDPxidWe/Ex+HTFINpvXdPHRmgSF3T8hGvzondYjmgzTQ/0EbLpSxyt+w3zzlYSk9cNBQNF9k0dT5Z2NiBjw==} + engines: {node: '>=6.9.0'} + + '@babel/highlight@7.24.2': + resolution: {integrity: sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.24.1': + resolution: {integrity: sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-syntax-jsx@7.24.1': + resolution: {integrity: sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx-development@7.22.5': + resolution: {integrity: sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx@7.23.4': + resolution: {integrity: sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/template@7.24.0': + resolution: {integrity: sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.24.1': + resolution: {integrity: sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.24.0': + resolution: {integrity: sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==} + engines: {node: '>=6.9.0'} + + '@ctrl/tinycolor@3.6.1': + resolution: {integrity: sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==} + engines: {node: '>=10'} + + '@docsearch/css@3.6.0': + resolution: {integrity: sha512-+sbxb71sWre+PwDK7X2T8+bhS6clcVMLwBPznX45Qu6opJcgRjAp7gYSDzVFp187J+feSj5dNBN1mJoi6ckkUQ==} + + '@docsearch/react@3.6.0': + resolution: {integrity: sha512-HUFut4ztcVNmqy9gp/wxNbC7pTOHhgVVkHVGCACTuLhUKUhKAF9KYHJtMiLUJxEqiFLQiuri1fWF8zqwM/cu1w==} + peerDependencies: + '@types/react': '>= 16.8.0 < 19.0.0' + react: '>= 16.8.0 < 19.0.0' + react-dom: '>= 16.8.0 < 19.0.0' + search-insights: '>= 1 < 3' + peerDependenciesMeta: + '@types/react': + optional: true + react: + optional: true + react-dom: + optional: true + search-insights: + optional: true + + '@emmetio/abbreviation@2.3.3': + resolution: {integrity: sha512-mgv58UrU3rh4YgbE/TzgLQwJ3pFsHHhCLqY20aJq+9comytTXUDNGG/SMtSeMJdkpxgXSXunBGLD8Boka3JyVA==} + + '@emmetio/css-abbreviation@2.1.8': + resolution: {integrity: sha512-s9yjhJ6saOO/uk1V74eifykk2CBYi01STTK3WlXWGOepyKa23ymJ053+DNQjpFcy1ingpaO7AxCcwLvHFY9tuw==} + + '@emmetio/scanner@1.0.4': + resolution: {integrity: sha512-IqRuJtQff7YHHBk4G8YZ45uB9BaAGcwQeVzgj/zj8/UdOhtQpEIupUhSk8dys6spFIWVZVeK20CzGEnqR5SbqA==} + + '@esbuild/aix-ppc64@0.19.12': + resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + + '@esbuild/aix-ppc64@0.20.2': + resolution: {integrity: sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.19.12': + resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm64@0.20.2': + resolution: {integrity: sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.15.18': + resolution: {integrity: sha512-5GT+kcs2WVGjVs7+boataCkO5Fg0y4kCjzkB5bAip7H4jfnOS3dA6KPiww9W1OEKTKeAcUVhdZGvgI65OXmUnw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-arm@0.19.12': + resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-arm@0.20.2': + resolution: {integrity: sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.19.12': + resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/android-x64@0.20.2': + resolution: {integrity: sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.19.12': + resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-arm64@0.20.2': + resolution: {integrity: sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.19.12': + resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/darwin-x64@0.20.2': + resolution: {integrity: sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.19.12': + resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-arm64@0.20.2': + resolution: {integrity: sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.19.12': + resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.20.2': + resolution: {integrity: sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.19.12': + resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm64@0.20.2': + resolution: {integrity: sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.19.12': + resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-arm@0.20.2': + resolution: {integrity: sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.19.12': + resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-ia32@0.20.2': + resolution: {integrity: sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.15.18': + resolution: {integrity: sha512-L4jVKS82XVhw2nvzLg/19ClLWg0y27ulRwuP7lcyL6AbUWB5aPglXY3M21mauDQMDfRLs8cQmeT03r/+X3cZYQ==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-loong64@0.19.12': + resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-loong64@0.20.2': + resolution: {integrity: sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.19.12': + resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-mips64el@0.20.2': + resolution: {integrity: sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.19.12': + resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-ppc64@0.20.2': + resolution: {integrity: sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.19.12': + resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-riscv64@0.20.2': + resolution: {integrity: sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.19.12': + resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-s390x@0.20.2': + resolution: {integrity: sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.19.12': + resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/linux-x64@0.20.2': + resolution: {integrity: sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-x64@0.19.12': + resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.20.2': + resolution: {integrity: sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-x64@0.19.12': + resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.20.2': + resolution: {integrity: sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.19.12': + resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/sunos-x64@0.20.2': + resolution: {integrity: sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.19.12': + resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-arm64@0.20.2': + resolution: {integrity: sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.19.12': + resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-ia32@0.20.2': + resolution: {integrity: sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.19.12': + resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@esbuild/win32-x64@0.20.2': + resolution: {integrity: sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@eslint-community/eslint-utils@4.4.0': + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.10.0': + resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/eslintrc@2.1.4': + resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@eslint/js@8.57.0': + resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@expressive-code/core@0.33.5': + resolution: {integrity: sha512-KL0EkKAvd7SSIQL3ZIP19xqe4xNjBaQYNvcJC6RmoBUnQpvxaJNFwRxCBEF/X0ftJEMaSG7WTrabZ9c/zFeqmA==} + + '@expressive-code/plugin-frames@0.33.5': + resolution: {integrity: sha512-lFt/gbnZscBSxHovg4XiWohp5nrxk4McS6RGABdj6+0gJcX8/YrFTM23GKBIkaDePxdDidVY0jQYGYDL/RrQHw==} + + '@expressive-code/plugin-shiki@0.33.5': + resolution: {integrity: sha512-LWgttQTUrIPE1X+Lya1qFWiX47tH2AS2hkbj/cZoWkdiSjn6zUvtTypK/2Xn6Rgn6z6ClzpgHvkXRqFn7nAB4A==} + + '@expressive-code/plugin-text-markers@0.33.5': + resolution: {integrity: sha512-JxSHL1MGrJAPNaUMjFXex3K+9NJDbfew9H6PmX8LQ+fm9VNQdtBYTAz/x7nqOk7bkTrtAZK5RfDqUfb8U5M+2A==} + + '@fastify/busboy@2.1.1': + resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} + engines: {node: '>=14'} + + '@fontsource/ibm-plex-mono@5.0.12': + resolution: {integrity: sha512-RamYYYUQk7FX/yVbQqGxyMR+AfX5hfCZsLo5pr5BBUBNf2i3N4AjJ4AWfieqLx1Mdwt2ukzXYojlf9J0G/gaZQ==} + + '@humanwhocodes/config-array@0.11.14': + resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} + engines: {node: '>=10.10.0'} + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/object-schema@2.0.2': + resolution: {integrity: sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==} + + '@jest/schemas@29.6.3': + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jridgewell/gen-mapping@0.3.5': + resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} + engines: {node: '>=6.0.0'} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.4.15': + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + + '@jsdoc/salty@0.2.7': + resolution: {integrity: sha512-mh8LbS9d4Jq84KLw8pzho7XC2q2/IJGiJss3xwRoLD1A+EE16SjN4PfaG4jRCzKegTFLlN0Zd8SdUPE6XdoPFg==} + engines: {node: '>=v12.0.0'} + + '@kwsites/file-exists@1.1.1': + resolution: {integrity: sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==} + + '@kwsites/promise-deferred@1.1.1': + resolution: {integrity: sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==} + + '@mdx-js/mdx@3.0.1': + resolution: {integrity: sha512-eIQ4QTrOWyL3LWEe/bu6Taqzq2HQvHcyTMaOrI95P2/LmJE7AsfPfgJGuFLPVqBUE1BC1rik3VIhU+s9u72arA==} + + '@nanostores/preact@0.5.1': + resolution: {integrity: sha512-kofyeDwzM3TrOd37ay+Xxgk3Cn6jih23dxELc7Mr9IJV55jmWATfNP9b7O/awwCL7CE5z5PfzFnNk/W+tMaWGw==} + engines: {node: ^18.0.0 || >=20.0.0} + peerDependencies: + nanostores: ^0.9.0 || ^0.10.0 + preact: '>=10.0.0' + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@pkgr/core@0.1.1': + resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + + '@preact/preset-vite@2.8.2': + resolution: {integrity: sha512-m3tl+M8IO8jgiHnk+7LSTFl8axdPXloewi7iGVLdmCwf34XOzEUur0bZVewW4DUbUipFjTS2CXu27+5f/oexBA==} + peerDependencies: + '@babel/core': 7.x + vite: 2.x || 3.x || 4.x || 5.x + peerDependenciesMeta: + vite: + optional: true + + '@preact/signals-core@1.5.1': + resolution: {integrity: sha512-dE6f+WCX5ZUDwXzUIWNMhhglmuLpqJhuy3X3xHrhZYI0Hm2LyQwOu0l9mdPiWrVNsE+Q7txOnJPgtIqHCYoBVA==} + + '@preact/signals@1.2.2': + resolution: {integrity: sha512-ColCqdo4cRP18bAuIR4Oik5rDpiyFtPIJIygaYPMEAwTnl4buWkBOflGBSzhYyPyJfKpkwlekrvK+1pzQ2ldWw==} + peerDependencies: + preact: 10.x + + '@prefresh/babel-plugin@0.5.1': + resolution: {integrity: sha512-uG3jGEAysxWoyG3XkYfjYHgaySFrSsaEb4GagLzYaxlydbuREtaX+FTxuIidp241RaLl85XoHg9Ej6E4+V1pcg==} + + '@prefresh/core@1.5.2': + resolution: {integrity: sha512-A/08vkaM1FogrCII5PZKCrygxSsc11obExBScm3JF1CryK2uDS3ZXeni7FeKCx1nYdUkj4UcJxzPzc1WliMzZA==} + peerDependencies: + preact: ^10.0.0 + + '@prefresh/utils@1.2.0': + resolution: {integrity: sha512-KtC/fZw+oqtwOLUFM9UtiitB0JsVX0zLKNyRTA332sqREqSALIIQQxdUCS1P3xR/jT1e2e8/5rwH6gdcMLEmsQ==} + + '@prefresh/vite@2.4.5': + resolution: {integrity: sha512-iForDVJ2M8gQYnm5pHumvTEJjGGc7YNYC0GVKnHFL+GvFfKHfH9Rpq67nUAzNbjuLEpqEOUuQVQajMazWu2ZNQ==} + peerDependencies: + preact: ^10.4.0 + vite: '>=2.0.0' + peerDependenciesMeta: + vite: + optional: true + + '@rollup/pluginutils@4.2.1': + resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==} + engines: {node: '>= 8.0.0'} + + '@rollup/rollup-android-arm-eabi@4.13.0': + resolution: {integrity: sha512-5ZYPOuaAqEH/W3gYsRkxQATBW3Ii1MfaT4EQstTnLKViLi2gLSQmlmtTpGucNP3sXEpOiI5tdGhjdE111ekyEg==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.13.0': + resolution: {integrity: sha512-BSbaCmn8ZadK3UAQdlauSvtaJjhlDEjS5hEVVIN3A4bbl3X+otyf/kOJV08bYiRxfejP3DXFzO2jz3G20107+Q==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.13.0': + resolution: {integrity: sha512-Ovf2evVaP6sW5Ut0GHyUSOqA6tVKfrTHddtmxGQc1CTQa1Cw3/KMCDEEICZBbyppcwnhMwcDce9ZRxdWRpVd6g==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.13.0': + resolution: {integrity: sha512-U+Jcxm89UTK592vZ2J9st9ajRv/hrwHdnvyuJpa5A2ngGSVHypigidkQJP+YiGL6JODiUeMzkqQzbCG3At81Gg==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-linux-arm-gnueabihf@4.13.0': + resolution: {integrity: sha512-8wZidaUJUTIR5T4vRS22VkSMOVooG0F4N+JSwQXWSRiC6yfEsFMLTYRFHvby5mFFuExHa/yAp9juSphQQJAijQ==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.13.0': + resolution: {integrity: sha512-Iu0Kno1vrD7zHQDxOmvweqLkAzjxEVqNhUIXBsZ8hu8Oak7/5VTPrxOEZXYC1nmrBVJp0ZcL2E7lSuuOVaE3+w==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.13.0': + resolution: {integrity: sha512-C31QrW47llgVyrRjIwiOwsHFcaIwmkKi3PCroQY5aVq4H0A5v/vVVAtFsI1nfBngtoRpeREvZOkIhmRwUKkAdw==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.13.0': + resolution: {integrity: sha512-Oq90dtMHvthFOPMl7pt7KmxzX7E71AfyIhh+cPhLY9oko97Zf2C9tt/XJD4RgxhaGeAraAXDtqxvKE1y/j35lA==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.13.0': + resolution: {integrity: sha512-yUD/8wMffnTKuiIsl6xU+4IA8UNhQ/f1sAnQebmE/lyQ8abjsVyDkyRkWop0kdMhKMprpNIhPmYlCxgHrPoXoA==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.13.0': + resolution: {integrity: sha512-9RyNqoFNdF0vu/qqX63fKotBh43fJQeYC98hCaf89DYQpv+xu0D8QFSOS0biA7cGuqJFOc1bJ+m2rhhsKcw1hw==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-win32-arm64-msvc@4.13.0': + resolution: {integrity: sha512-46ue8ymtm/5PUU6pCvjlic0z82qWkxv54GTJZgHrQUuZnVH+tvvSP0LsozIDsCBFO4VjJ13N68wqrKSeScUKdA==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.13.0': + resolution: {integrity: sha512-P5/MqLdLSlqxbeuJ3YDeX37srC8mCflSyTrUsgbU1c/U9j6l2g2GiIdYaGD9QjdMQPMSgYm7hgg0551wHyIluw==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.13.0': + resolution: {integrity: sha512-UKXUQNbO3DOhzLRwHSpa0HnhhCgNODvfoPWv2FCXme8N/ANFfhIPMGuOT+QuKd16+B5yxZ0HdpNlqPvTMS1qfw==} + cpu: [x64] + os: [win32] + + '@shikijs/core@1.2.0': + resolution: {integrity: sha512-OlFvx+nyr5C8zpcMBnSGir0YPD6K11uYhouqhNmm1qLiis4GA7SsGtu07r9gKS9omks8RtQqHrJL4S+lqWK01A==} + + '@shikijs/core@1.2.1': + resolution: {integrity: sha512-KaIS0H4EQ3KI2d++TjYqRNgwp8E3M/68e9veR4QtInzA7kKFgcjeiJqb80fuXW+blDy5fmd11PN9g9soz/3ANQ==} + + '@sinclair/typebox@0.27.8': + resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + + '@ts-morph/common@0.16.0': + resolution: {integrity: sha512-SgJpzkTgZKLKqQniCjLaE3c2L2sdL7UShvmTmPBejAKd2OKV/yfMpQ2IWpAuA+VY5wy7PkSUaEObIqEK6afFuw==} + + '@types/acorn@4.0.6': + resolution: {integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==} + + '@types/babel__core@7.20.5': + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + + '@types/babel__generator@7.6.8': + resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} + + '@types/babel__template@7.4.4': + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + + '@types/babel__traverse@7.20.5': + resolution: {integrity: sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==} + + '@types/canvas-confetti@1.6.4': + resolution: {integrity: sha512-fNyZ/Fdw/Y92X0vv7B+BD6ysHL4xVU5dJcgzgxLdGbn8O3PezZNIJpml44lKM0nsGur+o/6+NZbZeNTt00U1uA==} + + '@types/debug@4.1.12': + resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + + '@types/estree-jsx@1.0.5': + resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} + + '@types/estree@1.0.5': + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + + '@types/hast@2.3.10': + resolution: {integrity: sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==} + + '@types/hast@3.0.4': + resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + + '@types/html-escaper@3.0.2': + resolution: {integrity: sha512-A8vk09eyYzk8J/lFO4OUMKCmRN0rRzfZf4n3Olwapgox/PtTiU8zPYlL1UEkJ/WeHvV6v9Xnj3o/705PKz9r4Q==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/linkify-it@3.0.5': + resolution: {integrity: sha512-yg6E+u0/+Zjva+buc3EIb+29XEg4wltq7cSmd4Uc2EE/1nUVmxyzpX6gUXD0V8jIrG0r7YeOGVIbYRkxeooCtw==} + + '@types/markdown-it@12.2.3': + resolution: {integrity: sha512-GKMHFfv3458yYy+v/N8gjufHO6MSZKCOXpZc5GXIWWy8uldwfmPn98vp81gZ5f9SVw8YYBctgfJ22a2d7AOMeQ==} + + '@types/mdast@4.0.3': + resolution: {integrity: sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==} + + '@types/mdurl@1.0.5': + resolution: {integrity: sha512-6L6VymKTzYSrEf4Nev4Xa1LCHKrlTlYCBMTlQKFuddo1CvQcE52I0mwfOJayueUC7MJuXOeHTcIU683lzd0cUA==} + + '@types/mdx@2.0.12': + resolution: {integrity: sha512-H9VZ9YqE+H28FQVchC83RCs5xQ2J7mAAv6qdDEaWmXEVl3OpdH+xfrSUzQ1lp7U7oSTRZ0RvW08ASPJsYBi7Cw==} + + '@types/ms@0.7.34': + resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} + + '@types/nlcst@1.0.4': + resolution: {integrity: sha512-ABoYdNQ/kBSsLvZAekMhIPMQ3YUZvavStpKYs7BjLLuKVmIMA0LUgZ7b54zzuWJRbHF80v1cNf4r90Vd6eMQDg==} + + '@types/nlcst@2.0.3': + resolution: {integrity: sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA==} + + '@types/node@17.0.45': + resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==} + + '@types/node@18.19.26': + resolution: {integrity: sha512-+wiMJsIwLOYCvUqSdKTrfkS8mpTp+MPINe6+Np4TAGFWWRWiBQ5kSq9nZGCSPkzx9mvT+uEukzpX4MOSCydcvw==} + + '@types/node@20.12.7': + resolution: {integrity: sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==} + + '@types/parse5@6.0.3': + resolution: {integrity: sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==} + + '@types/retry@0.12.2': + resolution: {integrity: sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==} + + '@types/sax@1.2.7': + resolution: {integrity: sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==} + + '@types/semver@7.5.8': + resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} + + '@types/strip-bom@3.0.0': + resolution: {integrity: sha512-xevGOReSYGM7g/kUBZzPqCrR/KYAo+F0yiPc85WFTJa0MSLtyFTVTU6cJu/aV4mid7IffDIWqo69THF2o4JiEQ==} + + '@types/strip-json-comments@0.0.30': + resolution: {integrity: sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==} + + '@types/unist@2.0.10': + resolution: {integrity: sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==} + + '@types/unist@3.0.2': + resolution: {integrity: sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==} + + '@typescript-eslint/eslint-plugin@7.4.0': + resolution: {integrity: sha512-yHMQ/oFaM7HZdVrVm/M2WHaNPgyuJH4WelkSVEWSSsir34kxW2kDJCxlXRhhGWEsMN0WAW/vLpKfKVcm8k+MPw==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + '@typescript-eslint/parser': ^7.0.0 + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/parser@7.4.0': + resolution: {integrity: sha512-ZvKHxHLusweEUVwrGRXXUVzFgnWhigo4JurEj0dGF1tbcGh6buL+ejDdjxOQxv6ytcY1uhun1p2sm8iWStlgLQ==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/scope-manager@5.62.0': + resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@typescript-eslint/scope-manager@7.4.0': + resolution: {integrity: sha512-68VqENG5HK27ypafqLVs8qO+RkNc7TezCduYrx8YJpXq2QGZ30vmNZGJJJC48+MVn4G2dCV8m5ZTVnzRexTVtw==} + engines: {node: ^18.18.0 || >=20.0.0} + + '@typescript-eslint/type-utils@7.4.0': + resolution: {integrity: sha512-247ETeHgr9WTRMqHbbQdzwzhuyaJ8dPTuyuUEMANqzMRB1rj/9qFIuIXK7l0FX9i9FXbHeBQl/4uz6mYuCE7Aw==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/types@5.62.0': + resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@typescript-eslint/types@7.4.0': + resolution: {integrity: sha512-mjQopsbffzJskos5B4HmbsadSJQWaRK0UxqQ7GuNA9Ga4bEKeiO6b2DnB6cM6bpc8lemaPseh0H9B/wyg+J7rw==} + engines: {node: ^18.18.0 || >=20.0.0} + + '@typescript-eslint/typescript-estree@7.4.0': + resolution: {integrity: sha512-A99j5AYoME/UBQ1ucEbbMEmGkN7SE0BvZFreSnTd1luq7yulcHdyGamZKizU7canpGDWGJ+Q6ZA9SyQobipePg==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/utils@7.4.0': + resolution: {integrity: sha512-NQt9QLM4Tt8qrlBVY9lkMYzfYtNz8/6qwZg8pI3cMGlPnj6mOpRxxAm7BMJN9K0AiY+1BwJ5lVC650YJqYOuNg==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + + '@typescript-eslint/visitor-keys@5.62.0': + resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@typescript-eslint/visitor-keys@7.4.0': + resolution: {integrity: sha512-0zkC7YM0iX5Y41homUUeW1CHtZR01K3ybjM1l6QczoMuay0XKtrb93kv95AxUGwdjGr64nNqnOCwmEl616N8CA==} + engines: {node: ^18.18.0 || >=20.0.0} + + '@ungap/structured-clone@1.2.0': + resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + + '@vitest/expect@1.4.0': + resolution: {integrity: sha512-Jths0sWCJZ8BxjKe+p+eKsoqev1/T8lYcrjavEaz8auEJ4jAVY0GwW3JKmdVU4mmNPLPHixh4GNXP7GFtAiDHA==} + + '@vitest/runner@1.4.0': + resolution: {integrity: sha512-EDYVSmesqlQ4RD2VvWo3hQgTJ7ZrFQ2VSJdfiJiArkCerDAGeyF1i6dHkmySqk573jLp6d/cfqCN+7wUB5tLgg==} + + '@vitest/snapshot@1.4.0': + resolution: {integrity: sha512-saAFnt5pPIA5qDGxOHxJ/XxhMFKkUSBJmVt5VgDsAqPTX6JP326r5C/c9UuCMPoXNzuudTPsYDZCoJ5ilpqG2A==} + + '@vitest/spy@1.4.0': + resolution: {integrity: sha512-Ywau/Qs1DzM/8Uc+yA77CwSegizMlcgTJuYGAi0jujOteJOUf1ujunHThYo243KG9nAyWT3L9ifPYZ5+As/+6Q==} + + '@vitest/utils@1.4.0': + resolution: {integrity: sha512-mx3Yd1/6e2Vt/PUC98DcqTirtfxUyAZ32uK82r8rZzbtBeBo+nqgnjx/LvqQdWsrvNtm14VmurNgcf4nqY5gJg==} + + '@volar/kit@2.1.6': + resolution: {integrity: sha512-dSuXChDGM0nSG/0fxqlNfadjpAeeo1P1SJPBQ+pDf8H1XrqeJq5gIhxRTEbiS+dyNIG69ATq1CArkbCif+oxJw==} + peerDependencies: + typescript: '*' + + '@volar/language-core@2.1.6': + resolution: {integrity: sha512-pAlMCGX/HatBSiDFMdMyqUshkbwWbLxpN/RL7HCQDOo2gYBE+uS+nanosLc1qR6pTQ/U8q00xt8bdrrAFPSC0A==} + + '@volar/language-server@2.1.6': + resolution: {integrity: sha512-0w+FV8ro37hVb3qE4ONo3VbS5kEQXv4H/D2xCePyY5dRw6XnbJAPFNKvoxI9mxHTPonvIG1si5rN9MSGSKtgZQ==} + + '@volar/language-service@2.1.6': + resolution: {integrity: sha512-1OpbbPQ6wUIumwMP5r45y8utVEmvq1n6BC8JHqGKsuFr9RGFIldDBlvA/xuO3MDKhjmmPGPHKb54kg1/YN78ow==} + + '@volar/snapshot-document@2.1.6': + resolution: {integrity: sha512-YNYk1sCOrGg7VHbZM+1It97q0GWhFxdqIwnxSNFoL0X1LuSRXoCT2DRb/aa1J6aBpPMbKqSFUWHGQEAFUnc4Zw==} + + '@volar/source-map@2.1.6': + resolution: {integrity: sha512-TeyH8pHHonRCHYI91J7fWUoxi0zWV8whZTVRlsWHSYfjm58Blalkf9LrZ+pj6OiverPTmrHRkBsG17ScQyWECw==} + + '@volar/typescript@2.1.6': + resolution: {integrity: sha512-JgPGhORHqXuyC3r6skPmPHIZj4LoMmGlYErFTuPNBq9Nhc9VTv7ctHY7A3jMN3ngKEfRrfnUcwXHztvdSQqNfw==} + + '@vscode/emmet-helper@2.9.3': + resolution: {integrity: sha512-rB39LHWWPQYYlYfpv9qCoZOVioPCftKXXqrsyqN1mTWZM6dTnONT63Db+03vgrBbHzJN45IrgS/AGxw9iiqfEw==} + + '@vscode/l10n@0.0.16': + resolution: {integrity: sha512-JT5CvrIYYCrmB+dCana8sUqJEcGB1ZDXNLMQ2+42bW995WmNoenijWMUdZfwmuQUTQcEVVIa2OecZzTYWUW9Cg==} + + '@vscode/l10n@0.0.18': + resolution: {integrity: sha512-KYSIHVmslkaCDyw013pphY+d7x1qV8IZupYfeIfzNA+nsaWHbn5uPuQRvdRFsa9zFzGeudPuoGoZ1Op4jrJXIQ==} + + '@webgpu/types@0.1.21': + resolution: {integrity: sha512-pUrWq3V5PiSGFLeLxoGqReTZmiiXwY3jRkIG5sLLKjyqNxrwm/04b4nw7LSmGWJcKk59XOM/YRTUwOzo4MMlow==} + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn-walk@8.3.2: + resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} + engines: {node: '>=0.4.0'} + + acorn@8.11.3: + resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} + engines: {node: '>=0.4.0'} + hasBin: true + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + algoliasearch@4.22.1: + resolution: {integrity: sha512-jwydKFQJKIx9kIZ8Jm44SdpigFwRGPESaxZBaHSV0XWN2yBJAOT4mT7ppvlrpA4UGzz92pqFnVKr/kaZXrcreg==} + + ansi-align@3.0.1: + resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} + + ansi-escapes@6.2.0: + resolution: {integrity: sha512-kzRaCqXnpzWs+3z5ABPQiVke+iq0KXkHo8xiWV4RPTi5Yli0l97BEQuhXV1s7+aSU/fu1kUuxgS4MsQ0fRuygw==} + engines: {node: '>=14.16'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + + ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + arg@5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + + argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + aria-query@5.3.0: + resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} + + array-back@1.0.4: + resolution: {integrity: sha512-1WxbZvrmyhkNoeYcizokbmh5oiOCIfyvGtcqbK3Ls1v1fKcquzxnQSceOx6tzq7jmai2kFLWIpGND2cLhH6TPw==} + engines: {node: '>=0.12.0'} + + array-back@4.0.2: + resolution: {integrity: sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==} + engines: {node: '>=8'} + + array-back@5.0.0: + resolution: {integrity: sha512-kgVWwJReZWmVuWOQKEOohXKJX+nD02JAZ54D1RRWlv8L0NebauKAaFxACKzB74RTclt1+WNz5KHaLRDAPZbDEw==} + engines: {node: '>=10'} + + array-back@6.2.2: + resolution: {integrity: sha512-gUAZ7HPyb4SJczXAMUXMGAvI976JoK3qEx9v1FTmeYuJj0IBiaKttG1ydtGKdkfqWkIkouke7nG8ufGy77+Cvw==} + engines: {node: '>=12.17'} + + array-buffer-byte-length@1.0.1: + resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} + engines: {node: '>= 0.4'} + + array-includes@3.1.7: + resolution: {integrity: sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==} + engines: {node: '>= 0.4'} + + array-iterate@2.0.1: + resolution: {integrity: sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg==} + + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + array.prototype.findlast@1.2.4: + resolution: {integrity: sha512-BMtLxpV+8BD+6ZPFIWmnUBpQoy+A+ujcg4rhp2iwCRJYA7PEh2MS4NL3lz8EiDlLrJPp2hg9qWihr5pd//jcGw==} + engines: {node: '>= 0.4'} + + array.prototype.flat@1.3.2: + resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} + engines: {node: '>= 0.4'} + + array.prototype.flatmap@1.3.2: + resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} + engines: {node: '>= 0.4'} + + array.prototype.toreversed@1.1.2: + resolution: {integrity: sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==} + + array.prototype.tosorted@1.1.3: + resolution: {integrity: sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg==} + + arraybuffer.prototype.slice@1.0.3: + resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} + engines: {node: '>= 0.4'} + + assertion-error@1.1.0: + resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + + astring@1.8.6: + resolution: {integrity: sha512-ISvCdHdlTDlH5IpxQJIex7BWBywFWgjJSVdwst+/iQCoEYnyOaQ95+X1JGshuBjGp6nxKUy1jMgE3zPqN7fQdg==} + hasBin: true + + astro-auto-import@0.4.2: + resolution: {integrity: sha512-ZgWZQ58+EhbEym1+aoUnNyECOy0wsG5uRUs+rVp/7BzHtj1V76J2qkhjaTWLplgNb+8WrzhvTQNxytmXRCW+Ow==} + engines: {node: '>=16.0.0'} + peerDependencies: + astro: ^2.0.0 || ^3.0.0-beta || ^4.0.0-beta + + astro-eslint-parser@0.16.3: + resolution: {integrity: sha512-CGaBseNtunAV2DCpwBXqTKq8+9Tw65XZetMaC0FsMoZuLj0gxNIkbCf2QyKYScVrNOU7/ayfNdVw8ZCSHBiqCg==} + engines: {node: ^14.18.0 || >=16.0.0} + + astro-expressive-code@0.33.5: + resolution: {integrity: sha512-9JAyllueMUN8JTl/h/yTdbKinNmfalEWcV11s3lSf/UJQbAZfWJuy+IlGcArZDI/CmD21GXhFHLqYthpdY33ug==} + peerDependencies: + astro: ^4.0.0-beta || ^3.3.0 + + astro-og-canvas@0.4.2: + resolution: {integrity: sha512-OQsH6Gr2HX9ZRHdVy2OcXVBIPI65WvEtLG/60krnphh8d3ldhuAFunymYaNGcrdSZcYgXkHWejbPt//3qaRidA==} + engines: {node: '>=18.14.1'} + peerDependencies: + astro: ^3.0.0 || ^4.0.0 + + astro@4.5.7: + resolution: {integrity: sha512-Ioeg3TV42dOJvf6GlmykeR3EKZ8+JcnZyJ/X9qDPzVf2OREmtvW0182YCDXQBqwXFRHndZRcHLqinAWjzZYh/A==} + engines: {node: '>=18.14.1', npm: '>=6.14.0'} + hasBin: true + + astrojs-compiler-sync@0.3.5: + resolution: {integrity: sha512-y420rhIIJ2HHDkYeqKArBHSdJNIIGMztLH90KGIX3zjcJyt/cr9Z2wYA8CP5J1w6KE7xqMh0DAkhfjhNDpQb2Q==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + '@astrojs/compiler': '>=0.27.0' + + available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + + axobject-query@4.0.0: + resolution: {integrity: sha512-+60uv1hiVFhHZeO+Lz0RYzsVHy5Wr1ayX0mwda9KPDVLNJgZ1T9Ny7VmFbLDzxsH0D87I86vgj3gFrjTJUYznw==} + + b4a@1.6.6: + resolution: {integrity: sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==} + + babel-plugin-transform-hook-names@1.0.2: + resolution: {integrity: sha512-5gafyjyyBTTdX/tQQ0hRgu4AhNHG/hqWi0ZZmg2xvs2FgRkJXzDNKBZCyoYqgFkovfDrgM8OoKg8karoUvWeCw==} + peerDependencies: + '@babel/core': ^7.12.10 + + bail@2.0.2: + resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + bare-events@2.2.1: + resolution: {integrity: sha512-9GYPpsPFvrWBkelIhOhTWtkeZxVxZOdb3VnFTCzlOo3OjvmTvzLoZFUT8kNFACx0vJej6QPney1Cf9BvzCNE/A==} + + bare-events@2.2.2: + resolution: {integrity: sha512-h7z00dWdG0PYOQEvChhOSWvOfkIKsdZGkWr083FgN/HyoQuebSew/cgirYqh9SCuy/hRvxc5Vy6Fw8xAmYHLkQ==} + + bare-fs@2.3.0: + resolution: {integrity: sha512-TNFqa1B4N99pds2a5NYHR15o0ZpdNKbAeKTE/+G6ED/UeOavv8RY3dr/Fu99HW3zU3pXpo2kDNO8Sjsm2esfOw==} + + bare-os@2.2.1: + resolution: {integrity: sha512-OwPyHgBBMkhC29Hl3O4/YfxW9n7mdTr2+SsO29XBWKKJsbgj3mnorDB80r5TiCQgQstgE5ga1qNYrpes6NvX2w==} + + bare-path@2.1.2: + resolution: {integrity: sha512-o7KSt4prEphWUHa3QUwCxUI00R86VdjiuxmJK0iNVDHYPGo+HsDaVCnqCmPbf/MiW1ok8F4p3m8RTHlWk8K2ig==} + + bare-stream@1.0.0: + resolution: {integrity: sha512-KhNUoDL40iP4gFaLSsoGE479t0jHijfYdIcxRn/XtezA2BaUD0NRf/JGRpsMq6dMNM+SrCrB0YSSo/5wBY4rOQ==} + + base-64@1.0.0: + resolution: {integrity: sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg==} + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + bcp-47-match@2.0.3: + resolution: {integrity: sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ==} + + bcp-47-normalize@2.3.0: + resolution: {integrity: sha512-8I/wfzqQvttUFz7HVJgIZ7+dj3vUaIyIxYXaTRP1YWoSDfzt6TUmxaKZeuXR62qBmYr+nvuWINFRl6pZ5DlN4Q==} + + bcp-47@2.1.0: + resolution: {integrity: sha512-9IIS3UPrvIa1Ej+lVDdDwO7zLehjqsaByECw0bu2RRGP73jALm6FYbzI5gWbgHLvNdkvfXB5YrSbocZdOS0c0w==} + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + + bl@5.1.0: + resolution: {integrity: sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==} + + bluebird@3.7.2: + resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} + + boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + + boxen@7.1.1: + resolution: {integrity: sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==} + engines: {node: '>=14.16'} + + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + + browserslist@4.23.0: + resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + + buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + + cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + + cache-point@2.0.0: + resolution: {integrity: sha512-4gkeHlFpSKgm3vm2gJN5sPqfmijYRFYCQ6tv5cLw0xVmT6r1z1vd4FNnpuOREco3cBs1G709sZ72LdgddKvL5w==} + engines: {node: '>=8'} + + call-bind@1.0.7: + resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} + engines: {node: '>= 0.4'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + camelcase@7.0.1: + resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==} + engines: {node: '>=14.16'} + + caniuse-lite@1.0.30001599: + resolution: {integrity: sha512-LRAQHZ4yT1+f9LemSMeqdMpMxZcc4RMWdj4tiFe3G8tNkWK+E58g+/tzotb5cU6TbcVJLr4fySiAW7XmxQvZQA==} + + canvas-confetti@1.9.2: + resolution: {integrity: sha512-6Xi7aHHzKwxZsem4mCKoqP6YwUG3HamaHHAlz1hTNQPCqXhARFpSXnkC9TWlahHY5CG6hSL5XexNjxK8irVErg==} + + canvaskit-wasm@0.37.2: + resolution: {integrity: sha512-212imazRF98gLOTiU4JAXM7xDvaknI7jaPtAg4ETXGW5rLQs6pomgIvVPUSfoKnQVTdGgzj+B4e+/u0Da20aGg==} + + canvaskit-wasm@0.39.1: + resolution: {integrity: sha512-Gy3lCmhUdKq+8bvDrs9t8+qf7RvcjuQn+we7vTVVyqgOVO1UVfHpsnBxkTZw+R4ApEJ3D5fKySl9TU11hmjl/A==} + + catharsis@0.9.0: + resolution: {integrity: sha512-prMTQVpcns/tzFgFVkVp6ak6RykZyWb3gu8ckUpd6YkTlacOd3DXGJjIpD4Q6zJirizvaiAjSSHlOsA+6sNh2A==} + engines: {node: '>= 10'} + + ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + + chai@4.4.1: + resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==} + engines: {node: '>=4'} + + chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + chalk@5.3.0: + resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + + character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + + character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + + character-entities@2.0.2: + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + + character-reference-invalid@2.0.1: + resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} + + check-error@1.0.3: + resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + chownr@1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + + ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} + + ci-info@4.0.0: + resolution: {integrity: sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==} + engines: {node: '>=8'} + + cli-boxes@3.0.0: + resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} + engines: {node: '>=10'} + + cli-cursor@4.0.0: + resolution: {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + cli-spinners@2.9.2: + resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} + engines: {node: '>=6'} + + cli-truncate@4.0.0: + resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==} + engines: {node: '>=18'} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + clsx@2.1.0: + resolution: {integrity: sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==} + engines: {node: '>=6'} + + code-block-writer@11.0.3: + resolution: {integrity: sha512-NiujjUFB4SwScJq2bwbYUtXbZhBSlY6vYzm++3Q6oC+U+injTqfPYFK8wS9COOmb2lueqp0ZRB4nK1VYeHgNyw==} + + collapse-white-space@2.1.0: + resolution: {integrity: sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==} + + collect-all@1.0.4: + resolution: {integrity: sha512-RKZhRwJtJEP5FWul+gkSMEnaK6H3AGPTTWOiRimCcs+rc/OmQE3Yhy1Q7A7KsdkG3ZXVdZq68Y6ONSdvkeEcKA==} + engines: {node: '>=0.10.0'} + + color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + color-string@1.9.1: + resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + + color@4.2.3: + resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} + engines: {node: '>=12.5.0'} + + colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + + comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + + commander@11.1.0: + resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} + engines: {node: '>=16'} + + commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + common-ancestor-path@1.0.1: + resolution: {integrity: sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==} + + concat-map@0.0.1: + resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + cookie@0.6.0: + resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} + engines: {node: '>= 0.6'} + + cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + + css-select@5.1.0: + resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==} + + css-what@6.1.0: + resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} + engines: {node: '>= 6'} + + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + + data-uri-to-buffer@4.0.1: + resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} + engines: {node: '>= 12'} + + data-view-buffer@1.0.1: + resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} + engines: {node: '>= 0.4'} + + data-view-byte-length@1.0.1: + resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} + engines: {node: '>= 0.4'} + + data-view-byte-offset@1.0.0: + resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} + engines: {node: '>= 0.4'} + + debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decode-named-character-reference@1.0.2: + resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} + + decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + + dedent-js@1.0.1: + resolution: {integrity: sha512-OUepMozQULMLUmhxS95Vudo0jb0UchLimi3+pQ2plj61Fcy8axbP9hbiD4Sz6DPqn6XG3kfmziVfQ1rSys5AJQ==} + + deep-eql@4.1.3: + resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} + engines: {node: '>=6'} + + deep-extend@0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + + detect-libc@2.0.3: + resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} + engines: {node: '>=8'} + + deterministic-object-hash@2.0.2: + resolution: {integrity: sha512-KxektNH63SrbfUyDiwXqRb1rLwKt33AmMv+5Nhsw1kqZ13SJBRTgZHtGbE+hH3a1mVW1cz+4pqSWVPAtLVXTzQ==} + engines: {node: '>=18'} + + devalue@4.3.2: + resolution: {integrity: sha512-KqFl6pOgOW+Y6wJgu80rHpo2/3H07vr8ntR9rkkFIRETewbf5GaYYcakYfiKz89K+sLsuPkQIZaXDMjUObZwWg==} + + devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + + diff-sequences@29.6.3: + resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + diff@5.2.0: + resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} + engines: {node: '>=0.3.1'} + + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + + dlv@1.1.3: + resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + + doctrine@2.1.0: + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} + engines: {node: '>=0.10.0'} + + doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + + dom-serializer@2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + + domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + + domhandler@5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} + + domutils@3.1.0: + resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} + + dset@3.1.3: + resolution: {integrity: sha512-20TuZZHCEZ2O71q9/+8BwKwZ0QtD9D8ObhrihJPr+vLLYlSuAU3/zL4cSlgbfeoGHTjCSJBa7NGcrF9/Bx/WJQ==} + engines: {node: '>=4'} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + editorconfig@0.15.3: + resolution: {integrity: sha512-M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g==} + hasBin: true + + electron-to-chromium@1.4.711: + resolution: {integrity: sha512-hRg81qzvUEibX2lDxnFlVCHACa+LtrCPIsWAxo161LDYIB3jauf57RGsMZV9mvGwE98yGH06icj3zBEoOkxd/w==} + + emmet@2.4.7: + resolution: {integrity: sha512-O5O5QNqtdlnQM2bmKHtJgyChcrFMgQuulI+WdiOw2NArzprUqqxUW6bgYtKvzKgrsYpuLWalOkdhNP+1jluhCA==} + + emoji-regex@10.3.0: + resolution: {integrity: sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + + entities@2.1.0: + resolution: {integrity: sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + es-abstract@1.22.5: + resolution: {integrity: sha512-oW69R+4q2wG+Hc3KZePPZxOiisRIqfKBVo/HLx94QcJeWGU/8sZhCvc829rd1kS366vlJbzBfXf9yWwf0+Ko7w==} + engines: {node: '>= 0.4'} + + es-abstract@1.23.2: + resolution: {integrity: sha512-60s3Xv2T2p1ICykc7c+DNDPLDMm9t4QxCOUU0K9JxiLjM3C1zB9YVdN7tjxrFd4+AkZ8CdX1ovUga4P2+1e+/w==} + engines: {node: '>= 0.4'} + + es-define-property@1.0.0: + resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-iterator-helpers@1.0.18: + resolution: {integrity: sha512-scxAJaewsahbqTYrGKJihhViaM6DDZDDoucfvzNbK0pOren1g/daDQ3IAhzn+1G14rBG7w+i5N+qul60++zlKA==} + engines: {node: '>= 0.4'} + + es-module-lexer@1.4.2: + resolution: {integrity: sha512-7nOqkomXZEaxUDJw21XZNtRk739QvrPSoZoRtbsEfcii00vdzZUh6zh1CQwHhrib8MdEtJfv5rJiGeb4KuV/vw==} + + es-module-lexer@1.5.0: + resolution: {integrity: sha512-pqrTKmwEIgafsYZAGw9kszYzmagcE/n4dbgwGWLEXg7J4QFJVQRBld8j3Q3GNez79jzxZshq0bcT962QHOghjw==} + + es-object-atoms@1.0.0: + resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.0.3: + resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} + engines: {node: '>= 0.4'} + + es-shim-unscopables@1.0.2: + resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} + + es-to-primitive@1.2.1: + resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} + engines: {node: '>= 0.4'} + + esbuild-android-64@0.15.18: + resolution: {integrity: sha512-wnpt3OXRhcjfIDSZu9bnzT4/TNTDsOUvip0foZOUBG7QbSt//w3QV4FInVJxNhKc/ErhUxc5z4QjHtMi7/TbgA==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + esbuild-android-arm64@0.15.18: + resolution: {integrity: sha512-G4xu89B8FCzav9XU8EjsXacCKSG2FT7wW9J6hOc18soEHJdtWu03L3TQDGf0geNxfLTtxENKBzMSq9LlbjS8OQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + esbuild-darwin-64@0.15.18: + resolution: {integrity: sha512-2WAvs95uPnVJPuYKP0Eqx+Dl/jaYseZEUUT1sjg97TJa4oBtbAKnPnl3b5M9l51/nbx7+QAEtuummJZW0sBEmg==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + esbuild-darwin-arm64@0.15.18: + resolution: {integrity: sha512-tKPSxcTJ5OmNb1btVikATJ8NftlyNlc8BVNtyT/UAr62JFOhwHlnoPrhYWz09akBLHI9nElFVfWSTSRsrZiDUA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + esbuild-freebsd-64@0.15.18: + resolution: {integrity: sha512-TT3uBUxkteAjR1QbsmvSsjpKjOX6UkCstr8nMr+q7zi3NuZ1oIpa8U41Y8I8dJH2fJgdC3Dj3CXO5biLQpfdZA==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + esbuild-freebsd-arm64@0.15.18: + resolution: {integrity: sha512-R/oVr+X3Tkh+S0+tL41wRMbdWtpWB8hEAMsOXDumSSa6qJR89U0S/PpLXrGF7Wk/JykfpWNokERUpCeHDl47wA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + esbuild-linux-32@0.15.18: + resolution: {integrity: sha512-lphF3HiCSYtaa9p1DtXndiQEeQDKPl9eN/XNoBf2amEghugNuqXNZA/ZovthNE2aa4EN43WroO0B85xVSjYkbg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + esbuild-linux-64@0.15.18: + resolution: {integrity: sha512-hNSeP97IviD7oxLKFuii5sDPJ+QHeiFTFLoLm7NZQligur8poNOWGIgpQ7Qf8Balb69hptMZzyOBIPtY09GZYw==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + esbuild-linux-arm64@0.15.18: + resolution: {integrity: sha512-54qr8kg/6ilcxd+0V3h9rjT4qmjc0CccMVWrjOEM/pEcUzt8X62HfBSeZfT2ECpM7104mk4yfQXkosY8Quptug==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + esbuild-linux-arm@0.15.18: + resolution: {integrity: sha512-UH779gstRblS4aoS2qpMl3wjg7U0j+ygu3GjIeTonCcN79ZvpPee12Qun3vcdxX+37O5LFxz39XeW2I9bybMVA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + esbuild-linux-mips64le@0.15.18: + resolution: {integrity: sha512-Mk6Ppwzzz3YbMl/ZZL2P0q1tnYqh/trYZ1VfNP47C31yT0K8t9s7Z077QrDA/guU60tGNp2GOwCQnp+DYv7bxQ==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + esbuild-linux-ppc64le@0.15.18: + resolution: {integrity: sha512-b0XkN4pL9WUulPTa/VKHx2wLCgvIAbgwABGnKMY19WhKZPT+8BxhZdqz6EgkqCLld7X5qiCY2F/bfpUUlnFZ9w==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + esbuild-linux-riscv64@0.15.18: + resolution: {integrity: sha512-ba2COaoF5wL6VLZWn04k+ACZjZ6NYniMSQStodFKH/Pu6RxzQqzsmjR1t9QC89VYJxBeyVPTaHuBMCejl3O/xg==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + esbuild-linux-s390x@0.15.18: + resolution: {integrity: sha512-VbpGuXEl5FCs1wDVp93O8UIzl3ZrglgnSQ+Hu79g7hZu6te6/YHgVJxCM2SqfIila0J3k0csfnf8VD2W7u2kzQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + esbuild-netbsd-64@0.15.18: + resolution: {integrity: sha512-98ukeCdvdX7wr1vUYQzKo4kQ0N2p27H7I11maINv73fVEXt2kyh4K4m9f35U1K43Xc2QGXlzAw0K9yoU7JUjOg==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + esbuild-openbsd-64@0.15.18: + resolution: {integrity: sha512-yK5NCcH31Uae076AyQAXeJzt/vxIo9+omZRKj1pauhk3ITuADzuOx5N2fdHrAKPxN+zH3w96uFKlY7yIn490xQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + esbuild-sunos-64@0.15.18: + resolution: {integrity: sha512-On22LLFlBeLNj/YF3FT+cXcyKPEI263nflYlAhz5crxtp3yRG1Ugfr7ITyxmCmjm4vbN/dGrb/B7w7U8yJR9yw==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + esbuild-windows-32@0.15.18: + resolution: {integrity: sha512-o+eyLu2MjVny/nt+E0uPnBxYuJHBvho8vWsC2lV61A7wwTWC3jkN2w36jtA+yv1UgYkHRihPuQsL23hsCYGcOQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + esbuild-windows-64@0.15.18: + resolution: {integrity: sha512-qinug1iTTaIIrCorAUjR0fcBk24fjzEedFYhhispP8Oc7SFvs+XeW3YpAKiKp8dRpizl4YYAhxMjlftAMJiaUw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + esbuild-windows-arm64@0.15.18: + resolution: {integrity: sha512-q9bsYzegpZcLziq0zgUi5KqGVtfhjxGbnksaBFYmWLxeV/S1fK4OLdq2DFYnXcLMjlZw2L0jLsk1eGoB522WXQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + esbuild@0.15.18: + resolution: {integrity: sha512-x/R72SmW3sSFRm5zrrIjAhCeQSAWoni3CmHEqfQrZIQTM3lVCdehdwuIqaOtfC2slvpdlLa62GYoN8SxT23m6Q==} + engines: {node: '>=12'} + hasBin: true + + esbuild@0.19.12: + resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} + engines: {node: '>=12'} + hasBin: true + + esbuild@0.20.2: + resolution: {integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==} + engines: {node: '>=12'} + hasBin: true + + escalade@3.1.2: + resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} + engines: {node: '>=6'} + + escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + escape-string-regexp@2.0.0: + resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} + engines: {node: '>=8'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + + eslint-compat-utils@0.5.0: + resolution: {integrity: sha512-dc6Y8tzEcSYZMHa+CMPLi/hyo1FzNeonbhJL7Ol0ccuKQkwopJcJBA9YL/xmMTLU1eKigXo9vj9nALElWYSowg==} + engines: {node: '>=12'} + peerDependencies: + eslint: '>=6.0.0' + + eslint-plugin-astro@0.33.1: + resolution: {integrity: sha512-wVyxAf8Ulmljv5qJQLgspWe17LR4hLXcksIENtUlEC3W7rleBVEKXS+hIqzBfCbpkBLZpl1tsYes1AGpYHd13w==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + eslint: '>=7.0.0' + + eslint-plugin-react@7.34.1: + resolution: {integrity: sha512-N97CxlouPT1AHt8Jn0mhhN2RrADlUAsk1/atcT2KyA/l9Q/E6ll7OIGwNumFmWfZ9skV3XXccYS19h80rHtgkw==} + engines: {node: '>=4'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + + eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint@8.57.0: + resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + + espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + esquery@1.5.0: + resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + estree-util-attach-comments@3.0.0: + resolution: {integrity: sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==} + + estree-util-build-jsx@3.0.1: + resolution: {integrity: sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==} + + estree-util-is-identifier-name@3.0.0: + resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==} + + estree-util-to-js@2.0.0: + resolution: {integrity: sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==} + + estree-util-visit@2.0.0: + resolution: {integrity: sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==} + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + eventemitter3@4.0.7: + resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + + eventemitter3@5.0.1: + resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + + execa@8.0.1: + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} + engines: {node: '>=16.17'} + + expand-template@2.0.3: + resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} + engines: {node: '>=6'} + + expressive-code@0.33.5: + resolution: {integrity: sha512-UPg2jSvZEfXPiCa4MKtMoMQ5Hwiv7In5/LSCa/ukhjzZqPO48iVsCcEBgXWEUmEAQ02P0z00/xFfBmVnUKH+Zw==} + + extend-shallow@2.0.1: + resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} + engines: {node: '>=0.10.0'} + + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-fifo@1.3.2: + resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} + + fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fastq@1.17.1: + resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + + fetch-blob@3.2.0: + resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} + engines: {node: ^12.20 || >= 14.13} + + file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + + file-set@4.0.2: + resolution: {integrity: sha512-fuxEgzk4L8waGXaAkd8cMr73Pm0FxOVkn8hztzUW7BAHhOGH90viQNXbiOsnecCWmfInqU6YmAMwxRMdKETceQ==} + engines: {node: '>=10'} + + fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + find-yarn-workspace-root2@1.2.16: + resolution: {integrity: sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA==} + + flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} + + flatted@3.3.1: + resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} + + flattie@1.1.1: + resolution: {integrity: sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ==} + engines: {node: '>=8'} + + for-each@0.3.3: + resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + + formdata-polyfill@4.0.10: + resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} + engines: {node: '>=12.20.0'} + + fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + + fs-then-native@2.0.0: + resolution: {integrity: sha512-X712jAOaWXkemQCAmWeg5rOT2i+KOpWz1Z/txk/cW0qlOu2oQ9H61vc5w3X/iyuUEfq/OyaFJ78/cZAQD1/bgA==} + engines: {node: '>=4.0.0'} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + function.prototype.name@1.1.6: + resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} + engines: {node: '>= 0.4'} + + functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-east-asian-width@1.2.0: + resolution: {integrity: sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==} + engines: {node: '>=18'} + + get-func-name@2.0.2: + resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} + + get-intrinsic@1.2.4: + resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} + engines: {node: '>= 0.4'} + + get-stream@8.0.1: + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + engines: {node: '>=16'} + + get-symbol-description@1.0.2: + resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} + engines: {node: '>= 0.4'} + + github-from-package@0.0.0: + resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} + + github-slugger@2.0.0: + resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + + globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + + globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} + + globalthis@1.0.3: + resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} + engines: {node: '>= 0.4'} + + globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + + gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + + gray-matter@4.0.3: + resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==} + engines: {node: '>=6.0'} + + has-bigints@1.0.2: + resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + + has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-proto@1.0.3: + resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} + engines: {node: '>= 0.4'} + + has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + hast-util-from-html@2.0.1: + resolution: {integrity: sha512-RXQBLMl9kjKVNkJTIO6bZyb2n+cUH8LFaSSzo82jiLT6Tfc+Pt7VQCS+/h3YwG4jaNE2TA2sdJisGWR+aJrp0g==} + + hast-util-from-parse5@7.1.2: + resolution: {integrity: sha512-Nz7FfPBuljzsN3tCQ4kCBKqdNhQE2l0Tn+X1ubgKBPRoiDIu1mL08Cfw4k7q71+Duyaw7DXDN+VTAp4Vh3oCOw==} + + hast-util-from-parse5@8.0.1: + resolution: {integrity: sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==} + + hast-util-heading-rank@3.0.0: + resolution: {integrity: sha512-EJKb8oMUXVHcWZTDepnr+WNbfnXKFNf9duMesmr4S8SXTJBJ9M4Yok08pu9vxdJwdlGRhVumk9mEhkEvKGifwA==} + + hast-util-is-element@3.0.0: + resolution: {integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==} + + hast-util-parse-selector@3.1.1: + resolution: {integrity: sha512-jdlwBjEexy1oGz0aJ2f4GKMaVKkA9jwjr4MjAAI22E5fM/TXVZHuS5OpONtdeIkRKqAaryQ2E9xNQxijoThSZA==} + + hast-util-parse-selector@4.0.0: + resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} + + hast-util-raw@7.2.3: + resolution: {integrity: sha512-RujVQfVsOrxzPOPSzZFiwofMArbQke6DJjnFfceiEbFh7S05CbPt0cYN+A5YeD3pso0JQk6O1aHBnx9+Pm2uqg==} + + hast-util-raw@9.0.2: + resolution: {integrity: sha512-PldBy71wO9Uq1kyaMch9AHIghtQvIwxBUkv823pKmkTM3oV1JxtsTNYdevMxvUHqcnOAuO65JKU2+0NOxc2ksA==} + + hast-util-to-estree@3.1.0: + resolution: {integrity: sha512-lfX5g6hqVh9kjS/B9E2gSkvHH4SZNiQFiqWS0x9fENzEl+8W12RqdRxX6d/Cwxi30tPQs3bIO+aolQJNp1bIyw==} + + hast-util-to-html@8.0.4: + resolution: {integrity: sha512-4tpQTUOr9BMjtYyNlt0P50mH7xj0Ks2xpo8M943Vykljf99HW6EzulIoJP1N3eKOSScEHzyzi9dm7/cn0RfGwA==} + + hast-util-to-html@9.0.0: + resolution: {integrity: sha512-IVGhNgg7vANuUA2XKrT6sOIIPgaYZnmLx3l/CCOAK0PtgfoHrZwX7jCSYyFxHTrGmC6S9q8aQQekjp4JPZF+cw==} + + hast-util-to-jsx-runtime@2.3.0: + resolution: {integrity: sha512-H/y0+IWPdsLLS738P8tDnrQ8Z+dj12zQQ6WC11TIM21C8WFVoIxcqWXf2H3hiTVZjF1AWqoimGwrTWecWrnmRQ==} + + hast-util-to-parse5@7.1.0: + resolution: {integrity: sha512-YNRgAJkH2Jky5ySkIqFXTQiaqcAtJyVE+D5lkN6CdtOqrnkLfGYYrEcKuHOJZlp+MwjSwuD3fZuawI+sic/RBw==} + + hast-util-to-parse5@8.0.0: + resolution: {integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==} + + hast-util-to-string@3.0.0: + resolution: {integrity: sha512-OGkAxX1Ua3cbcW6EJ5pT/tslVb90uViVkcJ4ZZIMW/R33DX/AkcJcRrPebPwJkHYwlDHXz4aIwvAAaAdtrACFA==} + + hast-util-to-text@4.0.0: + resolution: {integrity: sha512-EWiE1FSArNBPUo1cKWtzqgnuRQwEeQbQtnFJRYV1hb1BWDgrAlBU0ExptvZMM/KSA82cDpm2sFGf3Dmc5Mza3w==} + + hast-util-whitespace@2.0.1: + resolution: {integrity: sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng==} + + hast-util-whitespace@3.0.0: + resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + + hastscript@7.2.0: + resolution: {integrity: sha512-TtYPq24IldU8iKoJQqvZOuhi5CyCQRAbvDOX0x1eW6rsHSxa/1i2CCiptNTotGHJ3VoHRGmqiv6/D3q113ikkw==} + + hastscript@8.0.0: + resolution: {integrity: sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==} + + hastscript@9.0.0: + resolution: {integrity: sha512-jzaLBGavEDKHrc5EfFImKN7nZKKBdSLIdGvCwDZ9TfzbF2ffXiov8CKE445L2Z1Ek2t/m4SKQ2j6Ipv7NyUolw==} + + he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + + html-escaper@3.0.3: + resolution: {integrity: sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==} + + html-void-elements@2.0.1: + resolution: {integrity: sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==} + + html-void-elements@3.0.0: + resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + + htmlparser2@9.1.0: + resolution: {integrity: sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ==} + + http-cache-semantics@4.1.1: + resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} + + human-signals@5.0.0: + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} + engines: {node: '>=16.17.0'} + + husky@9.0.11: + resolution: {integrity: sha512-AB6lFlbwwyIqMdHYhwPe+kjOC3Oc5P3nThEoW/AaO2BX3vJDjWPFxYLxokUZOo6RNX20He3AaT8sESs9NJcmEw==} + engines: {node: '>=18'} + hasBin: true + + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + ignore@5.3.1: + resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} + engines: {node: '>= 4'} + + immutable@4.3.5: + resolution: {integrity: sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw==} + + import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + + import-meta-resolve@4.0.0: + resolution: {integrity: sha512-okYUR7ZQPH+efeuMJGlq4f8ubUgO50kByRPyt/Cy1Io4PSRsPjxME+YlVaCOx+NIToW7hCsZNFJyTPFFKepRSA==} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + + inline-style-parser@0.1.1: + resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==} + + inline-style-parser@0.2.3: + resolution: {integrity: sha512-qlD8YNDqyTKTyuITrDOffsl6Tdhv+UC4hcdAVuQsK4IMQ99nSgd1MIA/Q+jQYoh9r3hVUXhYh7urSRmXPkW04g==} + + internal-slot@1.0.7: + resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} + engines: {node: '>= 0.4'} + + is-alphabetical@2.0.1: + resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} + + is-alphanumerical@2.0.1: + resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} + + is-array-buffer@3.0.4: + resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} + engines: {node: '>= 0.4'} + + is-arrayish@0.3.2: + resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} + + is-async-function@2.0.0: + resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==} + engines: {node: '>= 0.4'} + + is-bigint@1.0.4: + resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-boolean-object@1.1.2: + resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} + engines: {node: '>= 0.4'} + + is-buffer@2.0.5: + resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} + engines: {node: '>=4'} + + is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + + is-core-module@2.13.1: + resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + + is-data-view@1.0.1: + resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} + engines: {node: '>= 0.4'} + + is-date-object@1.0.5: + resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} + engines: {node: '>= 0.4'} + + is-decimal@2.0.1: + resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} + + is-docker@3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + + is-extendable@0.1.1: + resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} + engines: {node: '>=0.10.0'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-finalizationregistry@1.0.2: + resolution: {integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-fullwidth-code-point@4.0.0: + resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} + engines: {node: '>=12'} + + is-fullwidth-code-point@5.0.0: + resolution: {integrity: sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==} + engines: {node: '>=18'} + + is-generator-function@1.0.10: + resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} + engines: {node: '>= 0.4'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-hexadecimal@2.0.1: + resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + + is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true + + is-interactive@2.0.0: + resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==} + engines: {node: '>=12'} + + is-map@2.0.3: + resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} + engines: {node: '>= 0.4'} + + is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + engines: {node: '>= 0.4'} + + is-network-error@1.1.0: + resolution: {integrity: sha512-tUdRRAnhT+OtCZR/LxZelH/C7QtjtFrTu5tXCA8pl55eTUElUHT+GPYV8MBMBvea/j+NxQqVt3LbWMRir7Gx9g==} + engines: {node: '>=16'} + + is-number-object@1.0.7: + resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} + engines: {node: '>= 0.4'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + + is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + + is-reference@3.0.2: + resolution: {integrity: sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==} + + is-regex@1.1.4: + resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} + engines: {node: '>= 0.4'} + + is-set@2.0.3: + resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} + engines: {node: '>= 0.4'} + + is-shared-array-buffer@1.0.3: + resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} + engines: {node: '>= 0.4'} + + is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + is-string@1.0.7: + resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} + engines: {node: '>= 0.4'} + + is-symbol@1.0.4: + resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} + engines: {node: '>= 0.4'} + + is-typed-array@1.1.13: + resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} + engines: {node: '>= 0.4'} + + is-unicode-supported@1.3.0: + resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} + engines: {node: '>=12'} + + is-weakmap@2.0.2: + resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} + engines: {node: '>= 0.4'} + + is-weakref@1.0.2: + resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + + is-weakset@2.0.3: + resolution: {integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==} + engines: {node: '>= 0.4'} + + is-wsl@3.1.0: + resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} + engines: {node: '>=16'} + + isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + iterator.prototype@1.1.2: + resolution: {integrity: sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-tokens@8.0.3: + resolution: {integrity: sha512-UfJMcSJc+SEXEl9lH/VLHSZbThQyLpw1vLO1Lb+j4RWDvG3N2f7yj3PVQA3cmkTBNldJ9eFnM+xEXxHIXrYiJw==} + + js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + js2xmlparser@4.0.2: + resolution: {integrity: sha512-6n4D8gLlLf1n5mNLQPRfViYzu9RATblzPEtm1SthMX1Pjao0r9YI9nw7ZIfRxQMERS87mcswrg+r/OYrPRX6jA==} + + jsdoc-api@8.0.0: + resolution: {integrity: sha512-Rnhor0suB1Ds1abjmFkFfKeD+kSMRN9oHMTMZoJVUrmtCGDwXty+sWMA9sa4xbe4UyxuPjhC7tavZ40mDKK6QQ==} + engines: {node: '>=12.17'} + + jsdoc@4.0.2: + resolution: {integrity: sha512-e8cIg2z62InH7azBBi3EsSEqrKx+nUtAS5bBcYTSpZFA+vhNPyhv8PTFZ0WsjOPDj04/dOLlm08EDcQJDqaGQg==} + engines: {node: '>=12.0.0'} + hasBin: true + + jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsonc-parser@2.3.1: + resolution: {integrity: sha512-H8jvkz1O50L3dMZCsLqiuB2tA7muqbSg1AtGEkN0leAqGjsUzDJir3Zwr02BhqdcITPg3ei3mZ+HjMocAknhhg==} + + jsonc-parser@3.2.1: + resolution: {integrity: sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==} + + jsx-ast-utils@3.3.5: + resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} + engines: {node: '>=4.0'} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + + klaw@3.0.0: + resolution: {integrity: sha512-0Fo5oir+O9jnXu5EefYbVK+mHMBeEVEy2cmctR1O1NECcCkPRreJKrS6Qt/j3KC2C148Dfo9i3pCmCMsdqGr0g==} + + kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + + kleur@4.1.5: + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + engines: {node: '>=6'} + + kolorist@1.8.0: + resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + lilconfig@3.0.0: + resolution: {integrity: sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==} + engines: {node: '>=14'} + + linkify-it@3.0.3: + resolution: {integrity: sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==} + + lint-staged@15.2.2: + resolution: {integrity: sha512-TiTt93OPh1OZOsb5B7k96A/ATl2AjIZo+vnzFZ6oHK5FuTk63ByDtxGQpHm+kFETjEWqgkF95M8FRXKR/LEBcw==} + engines: {node: '>=18.12.0'} + hasBin: true + + listr2@8.0.1: + resolution: {integrity: sha512-ovJXBXkKGfq+CwmKTjluEqFi3p4h8xvkxGQQAQan22YCgef4KZ1mKGjzfGh6PL6AW5Csw0QiQPNuQyH+6Xk3hA==} + engines: {node: '>=18.0.0'} + + load-yaml-file@0.2.0: + resolution: {integrity: sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==} + engines: {node: '>=6'} + + local-pkg@0.5.0: + resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==} + engines: {node: '>=14'} + + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + log-symbols@5.1.0: + resolution: {integrity: sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==} + engines: {node: '>=12'} + + log-update@6.0.0: + resolution: {integrity: sha512-niTvB4gqvtof056rRIrTZvjNYE4rCUzO6X/X+kYjd7WFxXeJ0NwEFnRxX6ehkvv3jTwrXnNdtAak5XYZuIyPFw==} + engines: {node: '>=18'} + + longest-streak@3.1.0: + resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + + loupe@2.3.7: + resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} + + lru-cache@4.1.5: + resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + + magic-string@0.30.5: + resolution: {integrity: sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==} + engines: {node: '>=12'} + + magic-string@0.30.8: + resolution: {integrity: sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==} + engines: {node: '>=12'} + + markdown-extensions@2.0.0: + resolution: {integrity: sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==} + engines: {node: '>=16'} + + markdown-it-anchor@8.6.7: + resolution: {integrity: sha512-FlCHFwNnutLgVTflOYHPW2pPcl2AACqVzExlkGQNsi4CJgqOHN7YTgDd4LuhgN1BFO3TS0vLAruV1Td6dwWPJA==} + peerDependencies: + '@types/markdown-it': '*' + markdown-it: '*' + + markdown-it@12.3.2: + resolution: {integrity: sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==} + hasBin: true + + markdown-table@3.0.3: + resolution: {integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==} + + marked@4.3.0: + resolution: {integrity: sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==} + engines: {node: '>= 12'} + hasBin: true + + mdast-util-definitions@6.0.0: + resolution: {integrity: sha512-scTllyX6pnYNZH/AIp/0ePz6s4cZtARxImwoPJ7kS42n+MnVsI4XbnG6d4ibehRIldYMWM2LD7ImQblVhUejVQ==} + + mdast-util-directive@3.0.0: + resolution: {integrity: sha512-JUpYOqKI4mM3sZcNxmF/ox04XYFFkNwr0CFlrQIkCwbvH0xzMCqkMqAde9wRd80VAhaUrwFwKm2nxretdT1h7Q==} + + mdast-util-find-and-replace@3.0.1: + resolution: {integrity: sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==} + + mdast-util-from-markdown@2.0.0: + resolution: {integrity: sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==} + + mdast-util-gfm-autolink-literal@2.0.0: + resolution: {integrity: sha512-FyzMsduZZHSc3i0Px3PQcBT4WJY/X/RCtEJKuybiC6sjPqLv7h1yqAkmILZtuxMSsUyaLUWNp71+vQH2zqp5cg==} + + mdast-util-gfm-footnote@2.0.0: + resolution: {integrity: sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ==} + + mdast-util-gfm-strikethrough@2.0.0: + resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==} + + mdast-util-gfm-table@2.0.0: + resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==} + + mdast-util-gfm-task-list-item@2.0.0: + resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==} + + mdast-util-gfm@3.0.0: + resolution: {integrity: sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw==} + + mdast-util-mdx-expression@2.0.0: + resolution: {integrity: sha512-fGCu8eWdKUKNu5mohVGkhBXCXGnOTLuFqOvGMvdikr+J1w7lDJgxThOKpwRWzzbyXAU2hhSwsmssOY4yTokluw==} + + mdast-util-mdx-jsx@3.1.2: + resolution: {integrity: sha512-eKMQDeywY2wlHc97k5eD8VC+9ASMjN8ItEZQNGwJ6E0XWKiW/Z0V5/H8pvoXUf+y+Mj0VIgeRRbujBmFn4FTyA==} + + mdast-util-mdx@3.0.0: + resolution: {integrity: sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==} + + mdast-util-mdxjs-esm@2.0.1: + resolution: {integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==} + + mdast-util-phrasing@4.1.0: + resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} + + mdast-util-to-hast@13.1.0: + resolution: {integrity: sha512-/e2l/6+OdGp/FB+ctrJ9Avz71AN/GRH3oi/3KAx/kMnoUsD6q0woXlDT8lLEeViVKE7oZxE7RXzvO3T8kF2/sA==} + + mdast-util-to-markdown@2.1.0: + resolution: {integrity: sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==} + + mdast-util-to-string@4.0.0: + resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + + mdurl@1.0.1: + resolution: {integrity: sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micromark-core-commonmark@2.0.0: + resolution: {integrity: sha512-jThOz/pVmAYUtkroV3D5c1osFXAMv9e0ypGDOIZuCeAe91/sD6BoE2Sjzt30yuXtwOYUmySOhMas/PVyh02itA==} + + micromark-extension-directive@3.0.0: + resolution: {integrity: sha512-61OI07qpQrERc+0wEysLHMvoiO3s2R56x5u7glHq2Yqq6EHbH4dW25G9GfDdGCDYqA21KE6DWgNSzxSwHc2hSg==} + + micromark-extension-gfm-autolink-literal@2.0.0: + resolution: {integrity: sha512-rTHfnpt/Q7dEAK1Y5ii0W8bhfJlVJFnJMHIPisfPK3gpVNuOP0VnRl96+YJ3RYWV/P4gFeQoGKNlT3RhuvpqAg==} + + micromark-extension-gfm-footnote@2.0.0: + resolution: {integrity: sha512-6Rzu0CYRKDv3BfLAUnZsSlzx3ak6HAoI85KTiijuKIz5UxZxbUI+pD6oHgw+6UtQuiRwnGRhzMmPRv4smcz0fg==} + + micromark-extension-gfm-strikethrough@2.0.0: + resolution: {integrity: sha512-c3BR1ClMp5fxxmwP6AoOY2fXO9U8uFMKs4ADD66ahLTNcwzSCyRVU4k7LPV5Nxo/VJiR4TdzxRQY2v3qIUceCw==} + + micromark-extension-gfm-table@2.0.0: + resolution: {integrity: sha512-PoHlhypg1ItIucOaHmKE8fbin3vTLpDOUg8KAr8gRCF1MOZI9Nquq2i/44wFvviM4WuxJzc3demT8Y3dkfvYrw==} + + micromark-extension-gfm-tagfilter@2.0.0: + resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==} + + micromark-extension-gfm-task-list-item@2.0.1: + resolution: {integrity: sha512-cY5PzGcnULaN5O7T+cOzfMoHjBW7j+T9D2sucA5d/KbsBTPcYdebm9zUd9zzdgJGCwahV+/W78Z3nbulBYVbTw==} + + micromark-extension-gfm@3.0.0: + resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} + + micromark-extension-mdx-expression@3.0.0: + resolution: {integrity: sha512-sI0nwhUDz97xyzqJAbHQhp5TfaxEvZZZ2JDqUo+7NvyIYG6BZ5CPPqj2ogUoPJlmXHBnyZUzISg9+oUmU6tUjQ==} + + micromark-extension-mdx-jsx@3.0.0: + resolution: {integrity: sha512-uvhhss8OGuzR4/N17L1JwvmJIpPhAd8oByMawEKx6NVdBCbesjH4t+vjEp3ZXft9DwvlKSD07fCeI44/N0Vf2w==} + + micromark-extension-mdx-md@2.0.0: + resolution: {integrity: sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==} + + micromark-extension-mdxjs-esm@3.0.0: + resolution: {integrity: sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==} + + micromark-extension-mdxjs@3.0.0: + resolution: {integrity: sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==} + + micromark-factory-destination@2.0.0: + resolution: {integrity: sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==} + + micromark-factory-label@2.0.0: + resolution: {integrity: sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==} + + micromark-factory-mdx-expression@2.0.1: + resolution: {integrity: sha512-F0ccWIUHRLRrYp5TC9ZYXmZo+p2AM13ggbsW4T0b5CRKP8KHVRB8t4pwtBgTxtjRmwrK0Irwm7vs2JOZabHZfg==} + + micromark-factory-space@2.0.0: + resolution: {integrity: sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==} + + micromark-factory-title@2.0.0: + resolution: {integrity: sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==} + + micromark-factory-whitespace@2.0.0: + resolution: {integrity: sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==} + + micromark-util-character@2.1.0: + resolution: {integrity: sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==} + + micromark-util-chunked@2.0.0: + resolution: {integrity: sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==} + + micromark-util-classify-character@2.0.0: + resolution: {integrity: sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==} + + micromark-util-combine-extensions@2.0.0: + resolution: {integrity: sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==} + + micromark-util-decode-numeric-character-reference@2.0.1: + resolution: {integrity: sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==} + + micromark-util-decode-string@2.0.0: + resolution: {integrity: sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==} + + micromark-util-encode@2.0.0: + resolution: {integrity: sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==} + + micromark-util-events-to-acorn@2.0.2: + resolution: {integrity: sha512-Fk+xmBrOv9QZnEDguL9OI9/NQQp6Hz4FuQ4YmCb/5V7+9eAh1s6AYSvL20kHkD67YIg7EpE54TiSlcsf3vyZgA==} + + micromark-util-html-tag-name@2.0.0: + resolution: {integrity: sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==} + + micromark-util-normalize-identifier@2.0.0: + resolution: {integrity: sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==} + + micromark-util-resolve-all@2.0.0: + resolution: {integrity: sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==} + + micromark-util-sanitize-uri@2.0.0: + resolution: {integrity: sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==} + + micromark-util-subtokenize@2.0.0: + resolution: {integrity: sha512-vc93L1t+gpR3p8jxeVdaYlbV2jTYteDje19rNSS/H5dlhxUYll5Fy6vJ2cDwP8RnsXi818yGty1ayP55y3W6fg==} + + micromark-util-symbol@2.0.0: + resolution: {integrity: sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==} + + micromark-util-types@2.0.0: + resolution: {integrity: sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==} + + micromark@4.0.0: + resolution: {integrity: sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==} + + micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + + mime@3.0.0: + resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} + engines: {node: '>=10.0.0'} + hasBin: true + + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + + mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + + minimatch@9.0.3: + resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} + engines: {node: '>=16 || 14 >=14.17'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + mkdirp-classic@0.5.3: + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + + mkdirp2@1.0.5: + resolution: {integrity: sha512-xOE9xbICroUDmG1ye2h4bZ8WBie9EGmACaco8K8cx6RlkJJrxGIqjGqztAI+NMhexXBcdGbSEzI6N3EJPevxZw==} + + mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + + mlly@1.6.1: + resolution: {integrity: sha512-vLgaHvaeunuOXHSmEbZ9izxPx3USsk8KCQ8iC+aTlp5sKRSoZvwhHh5L9VbKSaVC6sJDqbyohIS76E2VmHIPAA==} + + ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + muggle-string@0.4.1: + resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==} + + nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + nanostores@0.10.0: + resolution: {integrity: sha512-Poy5+9wFXOD0jAstn4kv9n686U2BFw48z/W8lms8cS8lcbRz7BU20JxZ3e/kkKQVfRrkm4yLWCUA6GQINdvJCQ==} + engines: {node: ^18.0.0 || >=20.0.0} + + napi-build-utils@1.0.2: + resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + nlcst-to-string@3.1.1: + resolution: {integrity: sha512-63mVyqaqt0cmn2VcI2aH6kxe1rLAmSROqHMA0i4qqg1tidkfExgpb0FGMikMCn86mw5dFtBtEANfmSSK7TjNHw==} + + nlcst-to-string@4.0.0: + resolution: {integrity: sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA==} + + node-abi@3.56.0: + resolution: {integrity: sha512-fZjdhDOeRcaS+rcpve7XuwHBmktS1nS1gzgghwKUQQ8nTy2FdSDr6ZT8k6YhvlJeHmmQMYiT/IH9hfco5zeW2Q==} + engines: {node: '>=10'} + + node-addon-api@6.1.0: + resolution: {integrity: sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==} + + node-domexception@1.0.0: + resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} + engines: {node: '>=10.5.0'} + + node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + + node-fetch@3.3.2: + resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + node-html-parser@6.1.12: + resolution: {integrity: sha512-/bT/Ncmv+fbMGX96XG9g05vFt43m/+SYKIs9oAemQVYyVcZmDAI2Xq/SbNcpOA35eF0Zk2av3Ksf+Xk8Vt8abA==} + + node-releases@2.0.14: + resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + npm-run-path@5.3.0: + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-inspect@1.13.1: + resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + object-to-spawn-args@2.0.1: + resolution: {integrity: sha512-6FuKFQ39cOID+BMZ3QaphcC8Y4cw6LXBLyIgPU+OhIYwviJamPAn+4mITapnSBQrejB+NNp+FMskhD8Cq+Ys3w==} + engines: {node: '>=8.0.0'} + + object.assign@4.1.5: + resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} + engines: {node: '>= 0.4'} + + object.entries@1.1.8: + resolution: {integrity: sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==} + engines: {node: '>= 0.4'} + + object.fromentries@2.0.8: + resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} + engines: {node: '>= 0.4'} + + object.hasown@1.1.3: + resolution: {integrity: sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==} + + object.values@1.2.0: + resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==} + engines: {node: '>= 0.4'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + + onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + + optionator@0.9.3: + resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} + engines: {node: '>= 0.8.0'} + + ora@7.0.1: + resolution: {integrity: sha512-0TUxTiFJWv+JnjWm4o9yvuskpEJLXTcng8MJuKd+SzAzp2o+OP3HWqNhB4OdJRt1Vsd9/mR0oyaEYlOnL7XIRw==} + engines: {node: '>=16'} + + organize-imports-cli@0.10.0: + resolution: {integrity: sha512-cVyNEeiDxX/zA6gdK1QS2rr3TK1VymIkT0LagnAk4f6eE0IC0bo3BeUkMzm3q3GnCJzYC+6lfuMpBE0Cequ7Vg==} + hasBin: true + + p-finally@1.0.0: + resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} + engines: {node: '>=4'} + + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-limit@5.0.0: + resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==} + engines: {node: '>=18'} + + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + p-queue@6.6.2: + resolution: {integrity: sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==} + engines: {node: '>=8'} + + p-queue@8.0.1: + resolution: {integrity: sha512-NXzu9aQJTAzbBqOt2hwsR63ea7yvxJc0PwN/zobNAudYfb1B7R08SzB4TsLeSbUCuG467NhnoT0oO6w1qRO+BA==} + engines: {node: '>=18'} + + p-retry@6.2.0: + resolution: {integrity: sha512-JA6nkq6hKyWLLasXQXUrO4z8BUZGUt/LjlJxx8Gb2+2ntodU/SS63YZ8b0LUTbQ8ZB9iwOfhEPhg4ykKnn2KsA==} + engines: {node: '>=16.17'} + + p-timeout@3.2.0: + resolution: {integrity: sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==} + engines: {node: '>=8'} + + p-timeout@6.1.2: + resolution: {integrity: sha512-UbD77BuZ9Bc9aABo74gfXhNvzC9Tx7SxtHSh1fxvx3jTLLYvmVhiQZZrJzqqU0jKbN32kb5VOKiLEQI/3bIjgQ==} + engines: {node: '>=14.16'} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-entities@4.0.1: + resolution: {integrity: sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==} + + parse-latin@5.0.1: + resolution: {integrity: sha512-b/K8ExXaWC9t34kKeDV8kGXBkXZ1HCSAZRYE7HR14eA1GlXX5L8iWhs8USJNhQU9q5ci413jCKF0gOyovvyRBg==} + + parse-latin@7.0.0: + resolution: {integrity: sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ==} + + parse-numeric-range@1.3.0: + resolution: {integrity: sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==} + + parse5@6.0.1: + resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} + + parse5@7.1.2: + resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} + + path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-to-regexp@6.2.1: + resolution: {integrity: sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + pathe@1.1.2: + resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + + pathval@1.1.1: + resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + + periscopic@3.1.0: + resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==} + + picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + pidtree@0.6.0: + resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} + engines: {node: '>=0.10'} + hasBin: true + + pify@4.0.1: + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + engines: {node: '>=6'} + + pkg-dir@4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} + + pkg-types@1.0.3: + resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==} + + plantuml-encoder@1.4.0: + resolution: {integrity: sha512-sxMwpDw/ySY1WB2CE3+IdMuEcWibJ72DDOsXLkSmEaSzwEUaYBT6DWgOfBiHGCux4q433X6+OEFWjlVqp7gL6g==} + + possible-typed-array-names@1.0.0: + resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} + engines: {node: '>= 0.4'} + + postcss-nested@6.0.1: + resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.2.14 + + postcss-selector-parser@6.0.16: + resolution: {integrity: sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==} + engines: {node: '>=4'} + + postcss@8.4.37: + resolution: {integrity: sha512-7iB/v/r7Woof0glKLH8b1SPHrsX7uhdO+Geb41QpF/+mWZHU3uxxSlN+UXGVit1PawOYDToO+AbZzhBzWRDwbQ==} + engines: {node: ^10 || ^12 || >=14} + + postcss@8.4.38: + resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} + engines: {node: ^10 || ^12 || >=14} + + preact-render-to-string@6.3.1: + resolution: {integrity: sha512-NQ28WrjLtWY6lKDlTxnFpKHZdpjfF+oE6V4tZ0rTrunHrtZp6Dm0oFrcJalt/5PNeqJz4j1DuZDS0Y6rCBoqDA==} + peerDependencies: + preact: '>=10' + + preact-ssr-prepass@1.2.1: + resolution: {integrity: sha512-bLgbUfy8nL+PZghAPpyk9MF+cmXjdwEnxYPaJBmwbzFQqzIz8dQVBqjwB60RqZ9So/vIf6BRfHCiwFGuMCyfbQ==} + peerDependencies: + preact: '>=10 || ^10.0.0-beta.0 || ^10.0.0-alpha.0' + + preact@10.19.7: + resolution: {integrity: sha512-IJOW6cQN1fwfC17HfNOqUtAGyB8wAYshuC+jG1JiL/1+sC4yVyuA3IcF0N9vdodMJjW/lbuEF5qFsJqGNcbHbw==} + + prebuild-install@7.1.2: + resolution: {integrity: sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==} + engines: {node: '>=10'} + hasBin: true + + preferred-pm@3.1.3: + resolution: {integrity: sha512-MkXsENfftWSRpzCzImcp4FRsCc3y1opwB73CfCNWyzMqArju2CrlMHlqB7VexKiPEOjGMbttv1r9fSCn5S610w==} + engines: {node: '>=10'} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + prettier-plugin-astro@0.13.0: + resolution: {integrity: sha512-5HrJNnPmZqTUNoA97zn4gNQv9BgVhv+et03314WpQ9H9N8m2L9OSV798olwmG2YLXPl1iSstlJCR1zB3x5xG4g==} + engines: {node: ^14.15.0 || >=16.0.0} + + prettier@3.2.5: + resolution: {integrity: sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==} + engines: {node: '>=14'} + hasBin: true + + pretty-format@29.7.0: + resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + pretty-format@3.8.0: + resolution: {integrity: sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew==} + + prismjs@1.29.0: + resolution: {integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==} + engines: {node: '>=6'} + + prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + + prop-types@15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + + property-information@6.4.1: + resolution: {integrity: sha512-OHYtXfu5aI2sS2LWFSN5rgJjrQ4pCy8i1jubJLe2QvMF8JJ++HXTUIVWFLfXJoaOfvYYjk2SN8J2wFUWIGXT4w==} + + pseudomap@1.0.2: + resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} + + pump@3.0.0: + resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + queue-tick@1.0.1: + resolution: {integrity: sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==} + + rc@1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true + + react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + + react-is@18.2.0: + resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + reflect.getprototypeof@1.0.6: + resolution: {integrity: sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==} + engines: {node: '>= 0.4'} + + regexp.prototype.flags@1.5.2: + resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} + engines: {node: '>= 0.4'} + + rehype-autolink-headings@7.1.0: + resolution: {integrity: sha512-rItO/pSdvnvsP4QRB1pmPiNHUskikqtPojZKJPPPAVx9Hj8i8TwMBhofrrAYRhYOOBZH9tgmG5lPqDLuIWPWmw==} + + rehype-parse@9.0.0: + resolution: {integrity: sha512-WG7nfvmWWkCR++KEkZevZb/uw41E8TsH4DsY9UxsTbIXCVGbAs4S+r8FrQ+OtH5EEQAs+5UxKC42VinkmpA1Yw==} + + rehype-raw@7.0.0: + resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==} + + rehype-slug@6.0.0: + resolution: {integrity: sha512-lWyvf/jwu+oS5+hL5eClVd3hNdmwM1kAC0BUvEGD19pajQMIzcNUd/k9GsfQ+FfECvX+JE+e9/btsKH0EjJT6A==} + + rehype-stringify@10.0.0: + resolution: {integrity: sha512-1TX1i048LooI9QoecrXy7nGFFbFSufxVRAfc6Y9YMRAi56l+oB0zP51mLSV312uRuvVLPV1opSlJmslozR1XHQ==} + + rehype@13.0.1: + resolution: {integrity: sha512-AcSLS2mItY+0fYu9xKxOu1LhUZeBZZBx8//5HKzF+0XP+eP8+6a5MXn2+DW2kfXR6Dtp1FEXMVrjyKAcvcU8vg==} + + remark-directive@3.0.0: + resolution: {integrity: sha512-l1UyWJ6Eg1VPU7Hm/9tt0zKtReJQNOA4+iDMAxTyZNWnJnFlbS/7zhiel/rogTLQ2vMYwDzSJa4BiVNqGlqIMA==} + + remark-expressive-code@0.33.5: + resolution: {integrity: sha512-E4CZq3AuUXLu6or0AaDKkgsHYqmnm4ZL8/+1/8YgwtKcogHwTMRJfQtxkZpth90QQoNUpsapvm5x5n3Np2OC9w==} + + remark-gfm@4.0.0: + resolution: {integrity: sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA==} + + remark-mdx@3.0.1: + resolution: {integrity: sha512-3Pz3yPQ5Rht2pM5R+0J2MrGoBSrzf+tJG94N+t/ilfdh8YLyyKYtidAYwTveB20BoHAcwIopOUqhcmh2F7hGYA==} + + remark-parse@11.0.0: + resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} + + remark-rehype@11.1.0: + resolution: {integrity: sha512-z3tJrAs2kIs1AqIIy6pzHmAHlF1hWQ+OdY4/hv+Wxe35EhyLKcajL33iUEn3ScxtFox9nUvRufR/Zre8Q08H/g==} + + remark-smartypants@2.1.0: + resolution: {integrity: sha512-qoF6Vz3BjU2tP6OfZqHOvCU0ACmu/6jhGaINSQRI9mM7wCxNQTKB3JUAN4SVoN2ybElEDTxBIABRep7e569iJw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + remark-smartypants@3.0.1: + resolution: {integrity: sha512-qyshfCl2eLO0i0558e79ZJsfojC5wjnYLByjt0FmjJQN6aYwcRxpoj784LZJSoWCdnA2ubh5rLNGb8Uur/wDng==} + engines: {node: '>=16.0.0'} + + remark-stringify@11.0.0: + resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} + + remark@15.0.1: + resolution: {integrity: sha512-Eht5w30ruCXgFmxVUSlNWQ9iiimq07URKeFS3hNc8cUWy1llX4KDWfyEDZRycMc+znsN9Ux5/tJ/BFdgdOwA3A==} + + remove-markdown@0.5.0: + resolution: {integrity: sha512-x917M80K97K5IN1L8lUvFehsfhR8cYjGQ/yAMRI9E7JIKivtl5Emo5iD13DhMr+VojzMCiYk8V2byNPwT/oapg==} + + request-light@0.7.0: + resolution: {integrity: sha512-lMbBMrDoxgsyO+yB3sDcrDuX85yYt7sS8BfQd11jtbW/z5ZWgLZRcEGLsLoYw7I0WSUGQBs8CC8ScIxkTX1+6Q==} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + requizzle@0.2.4: + resolution: {integrity: sha512-JRrFk1D4OQ4SqovXOgdav+K8EAhSB/LJZqCz8tbX0KObcdeM15Ss59ozWMBWmmINMagCwmqn4ZNryUGpBsl6Jw==} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true + + resolve@2.0.0-next.5: + resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} + hasBin: true + + restore-cursor@4.0.0: + resolution: {integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + retext-latin@3.1.0: + resolution: {integrity: sha512-5MrD1tuebzO8ppsja5eEu+ZbBeUNCjoEarn70tkXOS7Bdsdf6tNahsv2bY0Z8VooFF6cw7/6S+d3yI/TMlMVVQ==} + + retext-latin@4.0.0: + resolution: {integrity: sha512-hv9woG7Fy0M9IlRQloq/N6atV82NxLGveq+3H2WOi79dtIYWN8OaxogDm77f8YnVXJL2VD3bbqowu5E3EMhBYA==} + + retext-smartypants@5.2.0: + resolution: {integrity: sha512-Do8oM+SsjrbzT2UNIKgheP0hgUQTDDQYyZaIY3kfq0pdFzoPk+ZClYJ+OERNXveog4xf1pZL4PfRxNoVL7a/jw==} + + retext-smartypants@6.1.0: + resolution: {integrity: sha512-LDPXg95346bqFZnDMHo0S7Rq5p64+B+N8Vz733+wPMDtwb9rCOs9LIdIEhrUOU+TAywX9St+ocQWJt8wrzivcQ==} + + retext-stringify@3.1.0: + resolution: {integrity: sha512-767TLOaoXFXyOnjx/EggXlb37ZD2u4P1n0GJqVdpipqACsQP+20W+BNpMYrlJkq7hxffnFk+jc6mAK9qrbuB8w==} + + retext-stringify@4.0.0: + resolution: {integrity: sha512-rtfN/0o8kL1e+78+uxPTqu1Klt0yPzKuQ2BfWwwfgIUSayyzxpM1PJzkKt4V8803uB9qSy32MvI7Xep9khTpiA==} + + retext@8.1.0: + resolution: {integrity: sha512-N9/Kq7YTn6ZpzfiGW45WfEGJqFf1IM1q8OsRa1CGzIebCJBNCANDRmOrholiDRGKo/We7ofKR4SEvcGAWEMD3Q==} + + retext@9.0.0: + resolution: {integrity: sha512-sbMDcpHCNjvlheSgMfEcVrZko3cDzdbe1x/e7G66dFp0Ff7Mldvi2uv6JkJQzdRcvLYE8CA8Oe8siQx8ZOgTcA==} + + retry@0.13.1: + resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} + engines: {node: '>= 4'} + + reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rfdc@1.3.1: + resolution: {integrity: sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==} + + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true + + rollup@4.13.0: + resolution: {integrity: sha512-3YegKemjoQnYKmsBlOHfMLVPPA5xLkQ8MHLLSw/fBrFaVkEayL51DilPpNNLq1exr98F2B1TzrV0FUlN3gWRPg==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + s.color@0.0.15: + resolution: {integrity: sha512-AUNrbEUHeKY8XsYr/DYpl+qk5+aM+DChopnWOPEzn8YKzOhv4l2zH6LzZms3tOZP3wwdOyc0RmTciyi46HLIuA==} + + safe-array-concat@1.1.2: + resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} + engines: {node: '>=0.4'} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safe-regex-test@1.0.3: + resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} + engines: {node: '>= 0.4'} + + sass-formatter@0.7.9: + resolution: {integrity: sha512-CWZ8XiSim+fJVG0cFLStwDvft1VI7uvXdCNJYXhDvowiv+DsbD1nXLiQ4zrE5UBvj5DWZJ93cwN0NX5PMsr1Pw==} + + sass@1.72.0: + resolution: {integrity: sha512-Gpczt3WA56Ly0Mn8Sl21Vj94s1axi9hDIzDFn9Ph9x3C3p4nNyvsqJoQyVXKou6cBlfFWEgRW4rT8Tb4i3XnVA==} + engines: {node: '>=14.0.0'} + hasBin: true + + sax@1.3.0: + resolution: {integrity: sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==} + + search-insights@2.13.0: + resolution: {integrity: sha512-Orrsjf9trHHxFRuo9/rzm0KIWmgzE8RMlZMzuhZOJ01Rnz3D0YBAe+V6473t6/H6c7irs6Lt48brULAiRWb3Vw==} + + section-matter@1.0.0: + resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==} + engines: {node: '>=4'} + + semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + hasBin: true + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.6.0: + resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} + engines: {node: '>=10'} + hasBin: true + + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} + + sharp@0.32.6: + resolution: {integrity: sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w==} + engines: {node: '>=14.15.0'} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + shiki@1.2.0: + resolution: {integrity: sha512-xLhiTMOIUXCv5DqJ4I70GgQCtdlzsTqFLZWcMHHG3TAieBUbvEGthdrlPDlX4mL/Wszx9C6rEcxU6kMlg4YlxA==} + + shiki@1.2.1: + resolution: {integrity: sha512-u+XW6o0vCkUNlneZb914dLO+AayEIwK5tI62WeS//R5HIXBFiYaj/Hc5xcq27Yh83Grr4JbNtUBV8W6zyK4hWg==} + + side-channel@1.0.6: + resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} + engines: {node: '>= 0.4'} + + siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + + sigmund@1.0.1: + resolution: {integrity: sha512-fCvEXfh6NWpm+YSuY2bpXb/VIihqWA6hLsgboC+0nl71Q7N7o2eaCW8mJa/NLvQhs6jpd3VZV4UiUQlV6+lc8g==} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + simple-concat@1.0.1: + resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} + + simple-get@4.0.1: + resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} + + simple-git@3.23.0: + resolution: {integrity: sha512-P9ggTW8vb/21CAL/AmnACAhqBDfnqSSZVpV7WuFtsFR9HLunf5IqQvk+OXAQTfkcZep8pKnt3DV3o7w3TegEkQ==} + + simple-swizzle@0.2.2: + resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} + + sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + + sitemap@7.1.1: + resolution: {integrity: sha512-mK3aFtjz4VdJN0igpIJrinf3EO8U8mxOPsTBzSsy06UtjZQJ3YY3o3Xa7zSc5nMqcMrRwlChHZ18Kxg0caiPBg==} + engines: {node: '>=12.0.0', npm: '>=5.6.0'} + hasBin: true + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + slice-ansi@5.0.0: + resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} + engines: {node: '>=12'} + + slice-ansi@7.1.0: + resolution: {integrity: sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==} + engines: {node: '>=18'} + + source-map-js@1.1.0: + resolution: {integrity: sha512-9vC2SfsJzlej6MAaMPLu8HiBSHGdRAJ9hVFYN1ibZoNkeanmDmLUcIrj6G9DGL7XMJ54AKg/G75akXl1/izTOw==} + engines: {node: '>=0.10.0'} + + source-map-js@1.2.0: + resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} + engines: {node: '>=0.10.0'} + + source-map@0.7.4: + resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} + engines: {node: '>= 8'} + + space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + + sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + + stack-trace@1.0.0-pre2: + resolution: {integrity: sha512-2ztBJRek8IVofG9DBJqdy2N5kulaacX30Nz7xmkYF6ale9WBVmIy6mFBchvGX7Vx/MyjBhx+Rcxqrj+dbOnQ6A==} + engines: {node: '>=16'} + + stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + + std-env@3.7.0: + resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} + + stdin-discarder@0.1.0: + resolution: {integrity: sha512-xhV7w8S+bUwlPTb4bAOUQhv8/cSS5offJuX8GQGq32ONF0ZtDWKfkdomM3HMRA+LhX6um/FZ0COqlwsjD53LeQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + stream-connect@1.0.2: + resolution: {integrity: sha512-68Kl+79cE0RGKemKkhxTSg8+6AGrqBt+cbZAXevg2iJ6Y3zX4JhA/sZeGzLpxW9cXhmqAcE7KnJCisUmIUfnFQ==} + engines: {node: '>=0.10.0'} + + stream-via@1.0.4: + resolution: {integrity: sha512-DBp0lSvX5G9KGRDTkR/R+a29H+Wk2xItOF+MpZLLNDWbEV9tGPnqLPxHEYjmiz8xGtJHRIqmI+hCjmNzqoA4nQ==} + engines: {node: '>=0.10.0'} + + streamx@2.16.1: + resolution: {integrity: sha512-m9QYj6WygWyWa3H1YY69amr4nVgy61xfjys7xO7kviL5rfIEc2naf+ewFiOA+aEJD7y0JO3h2GoiUv4TDwEGzQ==} + + string-argv@0.3.2: + resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} + engines: {node: '>=0.6.19'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + string-width@6.1.0: + resolution: {integrity: sha512-k01swCJAgQmuADB0YIc+7TuatfNvTBVOoaUWJjTB9R4VJzR5vNWzf5t42ESVZFPS8xTySF7CAdV4t/aaIm3UnQ==} + engines: {node: '>=16'} + + string-width@7.1.0: + resolution: {integrity: sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==} + engines: {node: '>=18'} + + string.prototype.matchall@4.0.10: + resolution: {integrity: sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==} + + string.prototype.trim@1.2.9: + resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} + engines: {node: '>= 0.4'} + + string.prototype.trimend@1.0.8: + resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} + + string.prototype.trimstart@1.0.7: + resolution: {integrity: sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + stringify-entities@4.0.3: + resolution: {integrity: sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g==} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + + strip-bom-string@1.0.0: + resolution: {integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==} + engines: {node: '>=0.10.0'} + + strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + + strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + + strip-json-comments@2.0.1: + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + engines: {node: '>=0.10.0'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + strip-literal@2.0.0: + resolution: {integrity: sha512-f9vHgsCWBq2ugHAkGMiiYY+AYG0D/cbloKKg0nhaaaSNsujdGIpVXCNsrJpCKr5M0f4aI31mr13UjY6GAuXCKA==} + + style-to-object@0.4.4: + resolution: {integrity: sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==} + + style-to-object@1.0.6: + resolution: {integrity: sha512-khxq+Qm3xEyZfKd/y9L3oIWQimxuc4STrQKtQn8aSDRHb8mFgpukgX1hdzfrMEW6JCjyJ8p89x+IUMVnCBI1PA==} + + suf-log@2.5.3: + resolution: {integrity: sha512-KvC8OPjzdNOe+xQ4XWJV2whQA0aM1kGVczMQ8+dStAO6KfEB140JEVQ9dE76ONZ0/Ylf67ni4tILPJB41U0eow==} + + supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + synckit@0.9.0: + resolution: {integrity: sha512-7RnqIMq572L8PeEzKeBINYEJDDxpcH8JEgLwUqBd3TkofhFRbkq4QLR0u+36avGAhCRbk2nnmjcW9SE531hPDg==} + engines: {node: ^14.18.0 || >=16.0.0} + + tar-fs@2.1.1: + resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} + + tar-fs@3.0.5: + resolution: {integrity: sha512-JOgGAmZyMgbqpLwct7ZV8VzkEB6pxXFBVErLtb+XCOqzc6w1xiWKI9GVd6bwk68EX7eJ4DWmfXVmq8K2ziZTGg==} + + tar-stream@2.2.0: + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + engines: {node: '>=6'} + + tar-stream@3.1.7: + resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} + + temp-path@1.0.0: + resolution: {integrity: sha512-TvmyH7kC6ZVTYkqCODjJIbgvu0FKiwQpZ4D1aknE7xpcDf/qEOB8KZEK5ef2pfbVoiBhNWs3yx4y+ESMtNYmlg==} + + text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + + tinybench@2.6.0: + resolution: {integrity: sha512-N8hW3PG/3aOoZAN5V/NSAEDz0ZixDSSt5b/a05iqtpgfLWMSVuCo7w0k2vVvEjdrIoeGqZzweX2WlyioNIHchA==} + + tinypool@0.8.2: + resolution: {integrity: sha512-SUszKYe5wgsxnNOVlBYO6IC+8VGWdVGZWAqUxp3UErNBtptZvWbwyUOyzNL59zigz2rCA92QiL3wvG+JDSdJdQ==} + engines: {node: '>=14.0.0'} + + tinyspy@2.2.1: + resolution: {integrity: sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==} + engines: {node: '>=14.0.0'} + + to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + + trim-lines@3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + + trough@2.2.0: + resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} + + ts-api-utils@1.3.0: + resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} + engines: {node: '>=16'} + peerDependencies: + typescript: '>=4.2.0' + + ts-morph@15.1.0: + resolution: {integrity: sha512-RBsGE2sDzUXFTnv8Ba22QfeuKbgvAGJFuTN7HfmIRUkgT/NaVLfDM/8OFm2NlFkGlWEXdpW5OaFIp1jvqdDuOg==} + + tsconfck@3.0.3: + resolution: {integrity: sha512-4t0noZX9t6GcPTfBAbIbbIU4pfpCwh0ueq3S4O/5qXI1VwK1outmxhe9dOiEWqMz3MW2LKgDTpqWV+37IWuVbA==} + engines: {node: ^18 || >=20} + hasBin: true + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + tsconfig@7.0.0: + resolution: {integrity: sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw==} + + tslib@2.6.2: + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + + tsm@2.3.0: + resolution: {integrity: sha512-++0HFnmmR+gMpDtKTnW3XJ4yv9kVGi20n+NfyQWB9qwJvTaIWY9kBmzek2YUQK5APTQ/1DTrXmm4QtFPmW9Rzw==} + engines: {node: '>=12'} + hasBin: true + + tunnel-agent@0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + + tunnel@0.0.6: + resolution: {integrity: sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==} + engines: {node: '>=0.6.11 <=0.7.0 || >=0.7.3'} + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + + type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + + type-fest@2.19.0: + resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} + engines: {node: '>=12.20'} + + type-fest@3.13.1: + resolution: {integrity: sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==} + engines: {node: '>=14.16'} + + typed-array-buffer@1.0.2: + resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} + engines: {node: '>= 0.4'} + + typed-array-byte-length@1.0.1: + resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} + engines: {node: '>= 0.4'} + + typed-array-byte-offset@1.0.2: + resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} + engines: {node: '>= 0.4'} + + typed-array-length@1.0.5: + resolution: {integrity: sha512-yMi0PlwuznKHxKmcpoOdeLwxBoVPkqZxd7q2FgMkmD3bNwvF5VW0+UlUQ1k1vmktTu4Yu13Q0RIxEP8+B+wloA==} + engines: {node: '>= 0.4'} + + typesafe-path@0.2.2: + resolution: {integrity: sha512-OJabfkAg1WLZSqJAJ0Z6Sdt3utnbzr/jh+NAHoyWHJe8CMSy79Gm085094M9nvTPy22KzTVn5Zq5mbapCI/hPA==} + + typescript-auto-import-cache@0.3.2: + resolution: {integrity: sha512-+laqe5SFL1vN62FPOOJSUDTZxtgsoOXjneYOXIpx5rQ4UMiN89NAtJLpqLqyebv9fgQ/IMeeTX+mQyRnwvJzvg==} + + typescript@5.4.5: + resolution: {integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==} + engines: {node: '>=14.17'} + hasBin: true + + typical@2.6.1: + resolution: {integrity: sha512-ofhi8kjIje6npGozTip9Fr8iecmYfEbS06i0JnIg+rh51KakryWF4+jX8lLKZVhy6N+ID45WYSFCxPOdTWCzNg==} + + uc.micro@1.0.6: + resolution: {integrity: sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==} + + ufo@1.5.2: + resolution: {integrity: sha512-eiutMaL0J2MKdhcOM1tUy13pIrYnyR87fEd8STJQFrrAwImwvlXkxlZEjaKah8r2viPohld08lt73QfLG1NxMg==} + + unbox-primitive@1.0.2: + resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + + underscore@1.13.6: + resolution: {integrity: sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==} + + undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + + undici@5.28.4: + resolution: {integrity: sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==} + engines: {node: '>=14.0'} + + unherit@3.0.1: + resolution: {integrity: sha512-akOOQ/Yln8a2sgcLj4U0Jmx0R5jpIg2IUyRrWOzmEbjBtGzBdHtSeFKgoEcoH4KYIG/Pb8GQ/BwtYm0GCq1Sqg==} + + unified@10.1.2: + resolution: {integrity: sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==} + + unified@11.0.4: + resolution: {integrity: sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ==} + + unist-util-find-after@5.0.0: + resolution: {integrity: sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==} + + unist-util-is@4.1.0: + resolution: {integrity: sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==} + + unist-util-is@5.2.1: + resolution: {integrity: sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==} + + unist-util-is@6.0.0: + resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} + + unist-util-modify-children@3.1.1: + resolution: {integrity: sha512-yXi4Lm+TG5VG+qvokP6tpnk+r1EPwyYL04JWDxLvgvPV40jANh7nm3udk65OOWquvbMDe+PL9+LmkxDpTv/7BA==} + + unist-util-modify-children@4.0.0: + resolution: {integrity: sha512-+tdN5fGNddvsQdIzUF3Xx82CU9sMM+fA0dLgR9vOmT0oPT2jH+P1nd5lSqfCfXAw+93NhcXNY2qqvTUtE4cQkw==} + + unist-util-position-from-estree@2.0.0: + resolution: {integrity: sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==} + + unist-util-position@4.0.4: + resolution: {integrity: sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==} + + unist-util-position@5.0.0: + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + + unist-util-remove-position@5.0.0: + resolution: {integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==} + + unist-util-remove@4.0.0: + resolution: {integrity: sha512-b4gokeGId57UVRX/eVKej5gXqGlc9+trkORhFJpu9raqZkZhU0zm8Doi05+HaiBsMEIJowL+2WtQ5ItjsngPXg==} + + unist-util-stringify-position@3.0.3: + resolution: {integrity: sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==} + + unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + + unist-util-visit-children@2.0.2: + resolution: {integrity: sha512-+LWpMFqyUwLGpsQxpumsQ9o9DG2VGLFrpz+rpVXYIEdPy57GSy5HioC0g3bg/8WP9oCLlapQtklOzQ8uLS496Q==} + + unist-util-visit-children@3.0.0: + resolution: {integrity: sha512-RgmdTfSBOg04sdPcpTSD1jzoNBjt9a80/ZCzp5cI9n1qPzLZWF9YdvWGN2zmTumP1HWhXKdUWexjy/Wy/lJ7tA==} + + unist-util-visit-parents@3.1.1: + resolution: {integrity: sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==} + + unist-util-visit-parents@5.1.3: + resolution: {integrity: sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==} + + unist-util-visit-parents@6.0.1: + resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} + + unist-util-visit@2.0.3: + resolution: {integrity: sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==} + + unist-util-visit@4.1.2: + resolution: {integrity: sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==} + + unist-util-visit@5.0.0: + resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + + unist-util-walker@1.0.0: + resolution: {integrity: sha512-XxadVB7qdSH6LBwhyHozj1VltpnK9m3/Zt/E/WFLaEt9eRQ0RkbsUb0lP9e1anQCEOXxf4X3NYtZQSpzqzTptw==} + + update-browserslist-db@1.0.13: + resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + uuid@8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + hasBin: true + + vfile-location@4.1.0: + resolution: {integrity: sha512-YF23YMyASIIJXpktBa4vIGLJ5Gs88UB/XePgqPmTa7cDA+JeO3yclbpheQYCHjVHBn/yePzrXuygIL+xbvRYHw==} + + vfile-location@5.0.2: + resolution: {integrity: sha512-NXPYyxyBSH7zB5U6+3uDdd6Nybz6o6/od9rk8bp9H8GR3L+cm/fC0uUTbqBmUTnMCUDslAGBOIKNfvvb+gGlDg==} + + vfile-message@3.1.4: + resolution: {integrity: sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==} + + vfile-message@4.0.2: + resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} + + vfile@5.3.7: + resolution: {integrity: sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==} + + vfile@6.0.1: + resolution: {integrity: sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==} + + vite-node@1.4.0: + resolution: {integrity: sha512-VZDAseqjrHgNd4Kh8icYHWzTKSCZMhia7GyHfhtzLW33fZlG9SwsB6CEhgyVOWkJfJ2pFLrp/Gj1FSfAiqH9Lw==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + + vite@5.2.8: + resolution: {integrity: sha512-OyZR+c1CE8yeHw5V5t59aXsUPPVTHMDjEZz8MgguLL/Q7NblxhZUlTu9xSPqlsUO/y+X7dlU05jdhvyycD55DA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + + vitefu@0.2.5: + resolution: {integrity: sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q==} + peerDependencies: + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 + peerDependenciesMeta: + vite: + optional: true + + vitest@1.4.0: + resolution: {integrity: sha512-gujzn0g7fmwf83/WzrDTnncZt2UiXP41mHuFYFrdwaLRVQ6JYQEiME2IfEjU3vcFL3VKa75XhI3lFgn+hfVsQw==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/node': ^18.0.0 || >=20.0.0 + '@vitest/browser': 1.4.0 + '@vitest/ui': 1.4.0 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/node': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + + volar-service-css@0.0.34: + resolution: {integrity: sha512-C7ua0j80ZD7bsgALAz/cA1bykPehoIa5n+3+Ccr+YLpj0fypqw9iLUmGLX11CqzqNCO2XFGe/1eXB/c+SWrF/g==} + peerDependencies: + '@volar/language-service': ~2.1.0 + peerDependenciesMeta: + '@volar/language-service': + optional: true + + volar-service-emmet@0.0.34: + resolution: {integrity: sha512-ubQvMCmHPp8Ic82LMPkgrp9ot+u2p/RDd0RyT0EykRkZpWsagHUF5HWkVheLfiMyx2rFuWx/+7qZPOgypx6h6g==} + peerDependencies: + '@volar/language-service': ~2.1.0 + peerDependenciesMeta: + '@volar/language-service': + optional: true + + volar-service-html@0.0.34: + resolution: {integrity: sha512-kMEneea1tQbiRcyKavqdrSVt8zV06t+0/3pGkjO3gV6sikXTNShIDkdtB4Tq9vE2cQdM50TuS7utVV7iysUxHw==} + peerDependencies: + '@volar/language-service': ~2.1.0 + peerDependenciesMeta: + '@volar/language-service': + optional: true + + volar-service-prettier@0.0.34: + resolution: {integrity: sha512-BNfJ8FwfPi1Wm/JkuzNjraOLdtKieGksNT/bDyquygVawv1QUzO2HB1hiMKfZGdcSFG5ZL9R0j7bBfRTfXA2gg==} + peerDependencies: + '@volar/language-service': ~2.1.0 + prettier: ^2.2 || ^3.0 + peerDependenciesMeta: + '@volar/language-service': + optional: true + prettier: + optional: true + + volar-service-typescript-twoslash-queries@0.0.34: + resolution: {integrity: sha512-XAY2YtWKUp6ht89gxt3L5Dr46LU45d/VlBkj1KXUwNlinpoWiGN4Nm3B6DRF3VoBThAnQgm4c7WD0S+5yTzh+w==} + peerDependencies: + '@volar/language-service': ~2.1.0 + peerDependenciesMeta: + '@volar/language-service': + optional: true + + volar-service-typescript@0.0.34: + resolution: {integrity: sha512-NbAry0w8ZXFgGsflvMwmPDCzgJGx3C+eYxFEbldaumkpTAJiywECWiUbPIOfmEHgpOllUKSnhwtLlWFK4YnfQg==} + peerDependencies: + '@volar/language-service': ~2.1.0 + peerDependenciesMeta: + '@volar/language-service': + optional: true + + vscode-css-languageservice@6.2.14: + resolution: {integrity: sha512-5UPQ9Y1sUTnuMyaMBpO7LrBkqjhEJb5eAwdUlDp+Uez8lry+Tspnk3+3p2qWS4LlNsr4p3v9WkZxUf1ltgFpgw==} + + vscode-html-languageservice@5.2.0: + resolution: {integrity: sha512-cdNMhyw57/SQzgUUGSIMQ66jikqEN6nBNyhx5YuOyj9310+eY9zw8Q0cXpiKzDX8aHYFewQEXRnigl06j/TVwQ==} + + vscode-jsonrpc@8.2.0: + resolution: {integrity: sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==} + engines: {node: '>=14.0.0'} + + vscode-languageserver-protocol@3.17.5: + resolution: {integrity: sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==} + + vscode-languageserver-textdocument@1.0.11: + resolution: {integrity: sha512-X+8T3GoiwTVlJbicx/sIAF+yuJAqz8VvwJyoMVhwEMoEKE/fkDmrqUgDMyBECcM2A2frVZIUj5HI/ErRXCfOeA==} + + vscode-languageserver-types@3.17.5: + resolution: {integrity: sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==} + + vscode-languageserver@9.0.1: + resolution: {integrity: sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==} + hasBin: true + + vscode-nls@5.2.0: + resolution: {integrity: sha512-RAaHx7B14ZU04EU31pT+rKz2/zSl7xMsfIZuo8pd+KZO6PXtQmpevpq3vxvWNcrGbdmhM/rr5Uw5Mz+NBfhVng==} + + vscode-uri@2.1.2: + resolution: {integrity: sha512-8TEXQxlldWAuIODdukIb+TR5s+9Ds40eSJrw+1iDDA9IFORPjMELarNQE3myz5XIkWWpdprmJjm1/SxMlWOC8A==} + + vscode-uri@3.0.8: + resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==} + + walk-back@5.1.0: + resolution: {integrity: sha512-Uhxps5yZcVNbLEAnb+xaEEMdgTXl9qAQDzKYejG2AZ7qPwRQ81lozY9ECDbjLPNWm7YsO1IK5rsP1KoQzXAcGA==} + engines: {node: '>=12.17'} + + web-namespaces@2.0.1: + resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} + + web-streams-polyfill@3.3.3: + resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} + engines: {node: '>= 8'} + + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + + which-boxed-primitive@1.0.2: + resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + + which-builtin-type@1.1.3: + resolution: {integrity: sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==} + engines: {node: '>= 0.4'} + + which-collection@1.0.2: + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} + engines: {node: '>= 0.4'} + + which-pm-runs@1.1.0: + resolution: {integrity: sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA==} + engines: {node: '>=4'} + + which-pm@2.0.0: + resolution: {integrity: sha512-Lhs9Pmyph0p5n5Z3mVnN0yWcbQYUAD7rbQUiMsQxOJ3T57k7RFe35SUwWMf7dsbDZks1uOmw4AecB/JMDj3v/w==} + engines: {node: '>=8.15'} + + which-pm@2.1.1: + resolution: {integrity: sha512-xzzxNw2wMaoCWXiGE8IJ9wuPMU+EYhFksjHxrRT8kMT5SnocBPRg69YAMtyV4D12fP582RA+k3P8H9J5EMdIxQ==} + engines: {node: '>=8.15'} + + which-typed-array@1.1.15: + resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} + engines: {node: '>= 0.4'} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + why-is-node-running@2.2.2: + resolution: {integrity: sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==} + engines: {node: '>=8'} + hasBin: true + + widest-line@4.0.1: + resolution: {integrity: sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==} + engines: {node: '>=12'} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + wrap-ansi@9.0.0: + resolution: {integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==} + engines: {node: '>=18'} -packages: + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - /@11ty/eleventy-fetch@4.0.1: - resolution: {integrity: sha512-yIiLM5ziBmg86i4TlXpBdcIygJHvh/GgPJyAiFOckO9H4y9cQDM8eIcJCUQ4Mum0NEVui/OjhEut2R08xw0vlQ==} - engines: {node: '>=14'} + xmlcreate@2.0.4: + resolution: {integrity: sha512-nquOebG4sngPmGPICTS5EnxqhKbCmz5Ox5hsszI2T6U5qdrJizBc+0ilYSEjTSzU0yZcmvppztXe/5Al5fUwdg==} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yallist@2.1.2: + resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + yaml@2.3.4: + resolution: {integrity: sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==} + engines: {node: '>= 14'} + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + yocto-queue@1.0.0: + resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} + engines: {node: '>=12.20'} + + zod-to-json-schema@3.22.4: + resolution: {integrity: sha512-2Ed5dJ+n/O3cU383xSY28cuVi0BCQhF8nYqWU5paEpl7fVdqdAmiLdqLyfblbNdfOFwFfi/mqU4O1pwc60iBhQ==} + peerDependencies: + zod: ^3.22.4 + + zod@3.22.4: + resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} + + zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + +snapshots: + + '@11ty/eleventy-fetch@4.0.1': dependencies: debug: 4.3.4 flat-cache: 3.2.0 @@ -258,36 +4387,25 @@ packages: transitivePeerDependencies: - encoding - supports-color - dev: true - /@aashutoshrathi/word-wrap@1.2.6: - resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} - engines: {node: '>=0.10.0'} - dev: true + '@aashutoshrathi/word-wrap@1.2.6': {} - /@actions/core@1.10.1: - resolution: {integrity: sha512-3lBR9EDAY+iYIpTnTIXmWcNbX3T2kCkAEQGIQx4NVQ0575nk2k3GRZDTPQG+vVtS2izSLmINlxXf0uLtnrTP+g==} + '@actions/core@1.10.1': dependencies: '@actions/http-client': 2.2.1 uuid: 8.3.2 - dev: true - /@actions/http-client@2.2.1: - resolution: {integrity: sha512-KhC/cZsq7f8I4LfZSJKgCvEwfkE8o1538VoBeoGzokVLLnbFDEAdFD3UhoMklxo2un9NJVBdANOresx7vTHlHw==} + '@actions/http-client@2.2.1': dependencies: tunnel: 0.0.6 undici: 5.28.4 - dev: true - /@akebifiky/remark-simple-plantuml@1.0.2: - resolution: {integrity: sha512-y5rWgQvU+DMpLKx1KlXCsgUeqVooqQm1S3hePLF9iecZy6YhKRybznFdvAvoAoiV2GoGhObQDHnneAl93llIcg==} + '@akebifiky/remark-simple-plantuml@1.0.2': dependencies: plantuml-encoder: 1.4.0 unist-util-visit: 2.0.3 - dev: false - /@algolia/autocomplete-core@1.9.3(@algolia/client-search@4.23.3)(algoliasearch@4.22.1)(search-insights@2.13.0): - resolution: {integrity: sha512-009HdfugtGCdC4JdXUbVJClA0q0zh24yyePn+KUGk3rP7j8FEe/m5Yo/z65gn6nP/cM39PxpzqKrL7A6fP6PPw==} + '@algolia/autocomplete-core@1.9.3(@algolia/client-search@4.23.3)(algoliasearch@4.22.1)(search-insights@2.13.0)': dependencies: '@algolia/autocomplete-plugin-algolia-insights': 1.9.3(@algolia/client-search@4.23.3)(algoliasearch@4.22.1)(search-insights@2.13.0) '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@4.23.3)(algoliasearch@4.22.1) @@ -295,179 +4413,117 @@ packages: - '@algolia/client-search' - algoliasearch - search-insights - dev: true - /@algolia/autocomplete-plugin-algolia-insights@1.9.3(@algolia/client-search@4.23.3)(algoliasearch@4.22.1)(search-insights@2.13.0): - resolution: {integrity: sha512-a/yTUkcO/Vyy+JffmAnTWbr4/90cLzw+CC3bRbhnULr/EM0fGNvM13oQQ14f2moLMcVDyAx/leczLlAOovhSZg==} - peerDependencies: - search-insights: '>= 1 < 3' + '@algolia/autocomplete-plugin-algolia-insights@1.9.3(@algolia/client-search@4.23.3)(algoliasearch@4.22.1)(search-insights@2.13.0)': dependencies: '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@4.23.3)(algoliasearch@4.22.1) search-insights: 2.13.0 transitivePeerDependencies: - '@algolia/client-search' - algoliasearch - dev: true - /@algolia/autocomplete-preset-algolia@1.9.3(@algolia/client-search@4.23.3)(algoliasearch@4.22.1): - resolution: {integrity: sha512-d4qlt6YmrLMYy95n5TB52wtNDr6EgAIPH81dvvvW8UmuWRgxEtY0NJiPwl/h95JtG2vmRM804M0DSwMCNZlzRA==} - peerDependencies: - '@algolia/client-search': '>= 4.9.1 < 6' - algoliasearch: '>= 4.9.1 < 6' + '@algolia/autocomplete-preset-algolia@1.9.3(@algolia/client-search@4.23.3)(algoliasearch@4.22.1)': dependencies: '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@4.23.3)(algoliasearch@4.22.1) '@algolia/client-search': 4.23.3 algoliasearch: 4.22.1 - dev: true - /@algolia/autocomplete-shared@1.9.3(@algolia/client-search@4.23.3)(algoliasearch@4.22.1): - resolution: {integrity: sha512-Wnm9E4Ye6Rl6sTTqjoymD+l8DjSTHsHboVRYrKgEt8Q7UHm9nYbqhN/i0fhUYA3OAEH7WA8x3jfpnmJm3rKvaQ==} - peerDependencies: - '@algolia/client-search': '>= 4.9.1 < 6' - algoliasearch: '>= 4.9.1 < 6' + '@algolia/autocomplete-shared@1.9.3(@algolia/client-search@4.23.3)(algoliasearch@4.22.1)': dependencies: '@algolia/client-search': 4.23.3 algoliasearch: 4.22.1 - dev: true - /@algolia/cache-browser-local-storage@4.22.1: - resolution: {integrity: sha512-Sw6IAmOCvvP6QNgY9j+Hv09mvkvEIDKjYW8ow0UDDAxSXy664RBNQk3i/0nt7gvceOJ6jGmOTimaZoY1THmU7g==} + '@algolia/cache-browser-local-storage@4.22.1': dependencies: '@algolia/cache-common': 4.22.1 - dev: true - /@algolia/cache-common@4.22.1: - resolution: {integrity: sha512-TJMBKqZNKYB9TptRRjSUtevJeQVXRmg6rk9qgFKWvOy8jhCPdyNZV1nB3SKGufzvTVbomAukFR8guu/8NRKBTA==} - dev: true + '@algolia/cache-common@4.22.1': {} - /@algolia/cache-common@4.23.3: - resolution: {integrity: sha512-h9XcNI6lxYStaw32pHpB1TMm0RuxphF+Ik4o7tcQiodEdpKK+wKufY6QXtba7t3k8eseirEMVB83uFFF3Nu54A==} - dev: true + '@algolia/cache-common@4.23.3': {} - /@algolia/cache-in-memory@4.22.1: - resolution: {integrity: sha512-ve+6Ac2LhwpufuWavM/aHjLoNz/Z/sYSgNIXsinGofWOysPilQZPUetqLj8vbvi+DHZZaYSEP9H5SRVXnpsNNw==} + '@algolia/cache-in-memory@4.22.1': dependencies: '@algolia/cache-common': 4.22.1 - dev: true - /@algolia/client-account@4.22.1: - resolution: {integrity: sha512-k8m+oegM2zlns/TwZyi4YgCtyToackkOpE+xCaKCYfBfDtdGOaVZCM5YvGPtK+HGaJMIN/DoTL8asbM3NzHonw==} + '@algolia/client-account@4.22.1': dependencies: '@algolia/client-common': 4.22.1 '@algolia/client-search': 4.22.1 '@algolia/transporter': 4.22.1 - dev: true - /@algolia/client-analytics@4.22.1: - resolution: {integrity: sha512-1ssi9pyxyQNN4a7Ji9R50nSdISIumMFDwKNuwZipB6TkauJ8J7ha/uO60sPJFqQyqvvI+px7RSNRQT3Zrvzieg==} + '@algolia/client-analytics@4.22.1': dependencies: '@algolia/client-common': 4.22.1 '@algolia/client-search': 4.22.1 '@algolia/requester-common': 4.22.1 '@algolia/transporter': 4.22.1 - dev: true - /@algolia/client-common@4.22.1: - resolution: {integrity: sha512-IvaL5v9mZtm4k4QHbBGDmU3wa/mKokmqNBqPj0K7lcR8ZDKzUorhcGp/u8PkPC/e0zoHSTvRh7TRkGX3Lm7iOQ==} + '@algolia/client-common@4.22.1': dependencies: '@algolia/requester-common': 4.22.1 '@algolia/transporter': 4.22.1 - dev: true - /@algolia/client-common@4.23.3: - resolution: {integrity: sha512-l6EiPxdAlg8CYhroqS5ybfIczsGUIAC47slLPOMDeKSVXYG1n0qGiz4RjAHLw2aD0xzh2EXZ7aRguPfz7UKDKw==} + '@algolia/client-common@4.23.3': dependencies: '@algolia/requester-common': 4.23.3 '@algolia/transporter': 4.23.3 - dev: true - /@algolia/client-personalization@4.22.1: - resolution: {integrity: sha512-sl+/klQJ93+4yaqZ7ezOttMQ/nczly/3GmgZXJ1xmoewP5jmdP/X/nV5U7EHHH3hCUEHeN7X1nsIhGPVt9E1cQ==} + '@algolia/client-personalization@4.22.1': dependencies: '@algolia/client-common': 4.22.1 '@algolia/requester-common': 4.22.1 '@algolia/transporter': 4.22.1 - dev: true - /@algolia/client-search@4.22.1: - resolution: {integrity: sha512-yb05NA4tNaOgx3+rOxAmFztgMTtGBi97X7PC3jyNeGiwkAjOZc2QrdZBYyIdcDLoI09N0gjtpClcackoTN0gPA==} + '@algolia/client-search@4.22.1': dependencies: '@algolia/client-common': 4.22.1 '@algolia/requester-common': 4.22.1 '@algolia/transporter': 4.22.1 - dev: true - /@algolia/client-search@4.23.3: - resolution: {integrity: sha512-P4VAKFHqU0wx9O+q29Q8YVuaowaZ5EM77rxfmGnkHUJggh28useXQdopokgwMeYw2XUht49WX5RcTQ40rZIabw==} + '@algolia/client-search@4.23.3': dependencies: '@algolia/client-common': 4.23.3 '@algolia/requester-common': 4.23.3 '@algolia/transporter': 4.23.3 - dev: true - /@algolia/logger-common@4.22.1: - resolution: {integrity: sha512-OnTFymd2odHSO39r4DSWRFETkBufnY2iGUZNrMXpIhF5cmFE8pGoINNPzwg02QLBlGSaLqdKy0bM8S0GyqPLBg==} - dev: true + '@algolia/logger-common@4.22.1': {} - /@algolia/logger-common@4.23.3: - resolution: {integrity: sha512-y9kBtmJwiZ9ZZ+1Ek66P0M68mHQzKRxkW5kAAXYN/rdzgDN0d2COsViEFufxJ0pb45K4FRcfC7+33YB4BLrZ+g==} - dev: true + '@algolia/logger-common@4.23.3': {} - /@algolia/logger-console@4.22.1: - resolution: {integrity: sha512-O99rcqpVPKN1RlpgD6H3khUWylU24OXlzkavUAMy6QZd1776QAcauE3oP8CmD43nbaTjBexZj2nGsBH9Tc0FVA==} + '@algolia/logger-console@4.22.1': dependencies: '@algolia/logger-common': 4.22.1 - dev: true - /@algolia/requester-browser-xhr@4.22.1: - resolution: {integrity: sha512-dtQGYIg6MteqT1Uay3J/0NDqD+UciHy3QgRbk7bNddOJu+p3hzjTRYESqEnoX/DpEkaNYdRHUKNylsqMpgwaEw==} + '@algolia/requester-browser-xhr@4.22.1': dependencies: '@algolia/requester-common': 4.22.1 - dev: true - /@algolia/requester-common@4.22.1: - resolution: {integrity: sha512-dgvhSAtg2MJnR+BxrIFqlLtkLlVVhas9HgYKMk2Uxiy5m6/8HZBL40JVAMb2LovoPFs9I/EWIoFVjOrFwzn5Qg==} - dev: true + '@algolia/requester-common@4.22.1': {} - /@algolia/requester-common@4.23.3: - resolution: {integrity: sha512-xloIdr/bedtYEGcXCiF2muajyvRhwop4cMZo+K2qzNht0CMzlRkm8YsDdj5IaBhshqfgmBb3rTg4sL4/PpvLYw==} - dev: true + '@algolia/requester-common@4.23.3': {} - /@algolia/requester-node-http@4.22.1: - resolution: {integrity: sha512-JfmZ3MVFQkAU+zug8H3s8rZ6h0ahHZL/SpMaSasTCGYR5EEJsCc8SI5UZ6raPN2tjxa5bxS13BRpGSBUens7EA==} + '@algolia/requester-node-http@4.22.1': dependencies: '@algolia/requester-common': 4.22.1 - dev: true - /@algolia/transporter@4.22.1: - resolution: {integrity: sha512-kzWgc2c9IdxMa3YqA6TN0NW5VrKYYW/BELIn7vnLyn+U/RFdZ4lxxt9/8yq3DKV5snvoDzzO4ClyejZRdV3lMQ==} + '@algolia/transporter@4.22.1': dependencies: '@algolia/cache-common': 4.22.1 '@algolia/logger-common': 4.22.1 '@algolia/requester-common': 4.22.1 - dev: true - /@algolia/transporter@4.23.3: - resolution: {integrity: sha512-Wjl5gttqnf/gQKJA+dafnD0Y6Yw97yvfY8R9h0dQltX1GXTgNs1zWgvtWW0tHl1EgMdhAyw189uWiZMnL3QebQ==} + '@algolia/transporter@4.23.3': dependencies: '@algolia/cache-common': 4.23.3 '@algolia/logger-common': 4.23.3 '@algolia/requester-common': 4.23.3 - dev: true - /@ampproject/remapping@2.3.0: - resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} - engines: {node: '>=6.0.0'} + '@ampproject/remapping@2.3.0': dependencies: '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 - dev: true - /@astrojs/check@0.5.10(prettier-plugin-astro@0.13.0)(prettier@3.2.5)(typescript@5.4.5): - resolution: {integrity: sha512-vliHXM9cu/viGeKiksUM4mXfO816ohWtawTl2ADPgTsd4nUMjFiyAl7xFZhF34yy4hq4qf7jvK1F2PlR3b5I5w==} - hasBin: true - peerDependencies: - typescript: ^5.0.0 + '@astrojs/check@0.5.10(prettier-plugin-astro@0.13.0)(prettier@3.2.5)(typescript@5.4.5)': dependencies: '@astrojs/language-server': 2.8.4(prettier-plugin-astro@0.13.0)(prettier@3.2.5)(typescript@5.4.5) chokidar: 3.6.0 @@ -478,34 +4534,16 @@ packages: transitivePeerDependencies: - prettier - prettier-plugin-astro - dev: false - /@astrojs/compiler@1.8.2: - resolution: {integrity: sha512-o/ObKgtMzl8SlpIdzaxFnt7SATKPxu4oIP/1NL+HDJRzxfJcAkOTAb/ZKMRyULbz4q+1t2/DAebs2Z1QairkZw==} + '@astrojs/compiler@1.8.2': {} - /@astrojs/compiler@2.7.0: - resolution: {integrity: sha512-XpC8MAaWjD1ff6/IfkRq/5k1EFj6zhCNqXRd5J43SVJEBj/Bsmizkm8N0xOYscGcDFQkRgEw6/eKnI5x/1l6aA==} - dev: true + '@astrojs/compiler@2.7.0': {} - /@astrojs/compiler@2.7.1: - resolution: {integrity: sha512-/POejAYuj8WEw7ZI0J8JBvevjfp9jQ9Wmu/Bg52RiNwGXkMV7JnYpsenVfHvvf1G7R5sXHGKlTcxlQWhoUTiGQ==} - dev: false + '@astrojs/compiler@2.7.1': {} - /@astrojs/internal-helpers@0.3.0: - resolution: {integrity: sha512-tGmHvrhpzuz0JBHaJX8GywN9g4rldVNHtkoVDC3m/DdzBO70jGoVuc0uuNVglRYnsdwkbG0K02Iw3nOOR3/Y4g==} - dev: true + '@astrojs/internal-helpers@0.3.0': {} - /@astrojs/language-server@2.8.4(prettier-plugin-astro@0.13.0)(prettier@3.2.5)(typescript@5.4.5): - resolution: {integrity: sha512-sJH5vGTBkhgA8+hdhzX78UUp4cFz4Mt7xkEkevD188OS5bDMkaue6hK+dtXWM47mnrXFveXA2u38K7S+5+IRjA==} - hasBin: true - peerDependencies: - prettier: ^3.0.0 - prettier-plugin-astro: '>=0.11.0' - peerDependenciesMeta: - prettier: - optional: true - prettier-plugin-astro: - optional: true + '@astrojs/language-server@2.8.4(prettier-plugin-astro@0.13.0)(prettier@3.2.5)(typescript@5.4.5)': dependencies: '@astrojs/compiler': 2.7.1 '@jridgewell/sourcemap-codec': 1.4.15 @@ -527,10 +4565,8 @@ packages: vscode-uri: 3.0.8 transitivePeerDependencies: - typescript - dev: false - /@astrojs/markdown-remark@4.3.0: - resolution: {integrity: sha512-iZOgYj/yNDvBRfKqkGuAvjeONhjQPq8Uk3HjyIgcTK5valq03NiUgSc5Ovq00yUVBeYJ/5EDx23c8xqtkkBlPw==} + '@astrojs/markdown-remark@4.3.0': dependencies: '@astrojs/prism': 3.0.0 github-slugger: 2.0.0 @@ -552,10 +4588,8 @@ packages: vfile: 6.0.1 transitivePeerDependencies: - supports-color - dev: true - /@astrojs/markdown-remark@4.3.2: - resolution: {integrity: sha512-4Oa4VaYiBd0MatB+rWIU/0A8pZH/sK3c2QkRYb+OO2lPl+qzevJtWaZY8hAQc4qurIOlRdn6B6ofDAGhWw+DSg==} + '@astrojs/markdown-remark@4.3.2': dependencies: '@astrojs/prism': 3.0.0 github-slugger: 2.0.0 @@ -577,13 +4611,8 @@ packages: vfile: 6.0.1 transitivePeerDependencies: - supports-color - dev: true - /@astrojs/mdx@2.2.2(astro@4.5.7): - resolution: {integrity: sha512-5SIFtOctC813HFyqJwBf5TBvlT9sbiOOv+bdvzAoiBSab95dC7PZhss22EvUEx+897c81YoIZ4F9fg4ZkxBFIw==} - engines: {node: '>=18.14.1'} - peerDependencies: - astro: ^4.0.0 + '@astrojs/mdx@2.2.2(astro@4.5.7)': dependencies: '@astrojs/markdown-remark': 4.3.2 '@mdx-js/mdx': 3.0.1 @@ -603,13 +4632,8 @@ packages: vfile: 6.0.1 transitivePeerDependencies: - supports-color - dev: true - /@astrojs/preact@3.1.1(@babel/core@7.24.3)(preact@10.19.7): - resolution: {integrity: sha512-ASgmVzh4wLyIyynp5CIfDwE45Vg/tIP+Y+5SnQtURmCP1qZpjdUbsw+bGQ0wCSXtjIbzCBa7Kw7Qn0g6WE2W2w==} - engines: {node: '>=18.14.1'} - peerDependencies: - preact: ^10.6.5 + '@astrojs/preact@3.1.1(@babel/core@7.24.3)(preact@10.19.7)': dependencies: '@babel/plugin-transform-react-jsx': 7.23.4(@babel/core@7.24.3) '@babel/plugin-transform-react-jsx-development': 7.22.5(@babel/core@7.24.3) @@ -623,25 +4647,17 @@ packages: - '@babel/core' - supports-color - vite - dev: true - /@astrojs/prism@3.0.0: - resolution: {integrity: sha512-g61lZupWq1bYbcBnYZqdjndShr/J3l/oFobBKPA3+qMat146zce3nz2kdO4giGbhYDt4gYdhmoBz0vZJ4sIurQ==} - engines: {node: '>=18.14.1'} + '@astrojs/prism@3.0.0': dependencies: prismjs: 1.29.0 - dev: true - /@astrojs/sitemap@3.1.2: - resolution: {integrity: sha512-FxOJldIl5ltZ5CNjocQxHkAO9orwHBjqtaU28o4smobp9vowS0nbGp+I9CrPxkzWdl1crSDm9vjL9tnvG1DSug==} + '@astrojs/sitemap@3.1.2': dependencies: sitemap: 7.1.1 zod: 3.22.4 - dev: true - /@astrojs/telemetry@3.0.4: - resolution: {integrity: sha512-A+0c7k/Xy293xx6odsYZuXiaHO0PL+bnDoXOc47sGDF5ffIKdKQGRPFl2NMlCF4L0NqN4Ynbgnaip+pPF0s7pQ==} - engines: {node: '>=18.14.1'} + '@astrojs/telemetry@3.0.4': dependencies: ci-info: 3.9.0 debug: 4.3.4 @@ -652,32 +4668,20 @@ packages: which-pm-runs: 1.1.0 transitivePeerDependencies: - supports-color - dev: true - /@babel/code-frame@7.24.1: - resolution: {integrity: sha512-bC49z4spJQR3j8vFtJBLqzyzFV0ciuL5HYX7qfSl3KEqeMVV+eTquRvmXxpvB0AMubRrvv7y5DILiLLPi57Ewg==} - engines: {node: '>=6.9.0'} + '@babel/code-frame@7.24.1': dependencies: '@babel/highlight': 7.24.1 picocolors: 1.0.0 - dev: true - /@babel/code-frame@7.24.2: - resolution: {integrity: sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==} - engines: {node: '>=6.9.0'} + '@babel/code-frame@7.24.2': dependencies: '@babel/highlight': 7.24.2 picocolors: 1.0.0 - dev: true - /@babel/compat-data@7.24.1: - resolution: {integrity: sha512-Pc65opHDliVpRHuKfzI+gSA4zcgr65O4cl64fFJIWEEh8JoHIHh0Oez1Eo8Arz8zq/JhgKodQaxEwUPRtZylVA==} - engines: {node: '>=6.9.0'} - dev: true + '@babel/compat-data@7.24.1': {} - /@babel/core@7.24.3: - resolution: {integrity: sha512-5FcvN1JHw2sHJChotgx8Ek0lyuh4kCKelgMTTqhYJJtloNvUfpAFMeNQUtdlIaktwrSV9LtCdqwk48wL2wBacQ==} - engines: {node: '>=6.9.0'} + '@babel/core@7.24.3': dependencies: '@ampproject/remapping': 2.3.0 '@babel/code-frame': 7.24.2 @@ -696,75 +4700,46 @@ packages: semver: 6.3.1 transitivePeerDependencies: - supports-color - dev: true - /@babel/generator@7.24.1: - resolution: {integrity: sha512-DfCRfZsBcrPEHUfuBMgbJ1Ut01Y/itOs+hY2nFLgqsqXd52/iSiVq5TITtUasIUgm+IIKdY2/1I7auiQOEeC9A==} - engines: {node: '>=6.9.0'} + '@babel/generator@7.24.1': dependencies: '@babel/types': 7.24.0 '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 jsesc: 2.5.2 - dev: true - /@babel/helper-annotate-as-pure@7.22.5: - resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} - engines: {node: '>=6.9.0'} + '@babel/helper-annotate-as-pure@7.22.5': dependencies: '@babel/types': 7.24.0 - dev: true - /@babel/helper-compilation-targets@7.23.6: - resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==} - engines: {node: '>=6.9.0'} + '@babel/helper-compilation-targets@7.23.6': dependencies: '@babel/compat-data': 7.24.1 '@babel/helper-validator-option': 7.23.5 browserslist: 4.23.0 lru-cache: 5.1.1 semver: 6.3.1 - dev: true - /@babel/helper-environment-visitor@7.22.20: - resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} - engines: {node: '>=6.9.0'} - dev: true + '@babel/helper-environment-visitor@7.22.20': {} - /@babel/helper-function-name@7.23.0: - resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} - engines: {node: '>=6.9.0'} + '@babel/helper-function-name@7.23.0': dependencies: '@babel/template': 7.24.0 '@babel/types': 7.24.0 - dev: true - /@babel/helper-hoist-variables@7.22.5: - resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} - engines: {node: '>=6.9.0'} + '@babel/helper-hoist-variables@7.22.5': dependencies: '@babel/types': 7.24.0 - dev: true - /@babel/helper-module-imports@7.24.1: - resolution: {integrity: sha512-HfEWzysMyOa7xI5uQHc/OcZf67/jc+xe/RZlznWQHhbb8Pg1SkRdbK4yEi61aY8wxQA7PkSfoojtLQP/Kpe3og==} - engines: {node: '>=6.9.0'} + '@babel/helper-module-imports@7.24.1': dependencies: '@babel/types': 7.24.0 - dev: true - /@babel/helper-module-imports@7.24.3: - resolution: {integrity: sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==} - engines: {node: '>=6.9.0'} + '@babel/helper-module-imports@7.24.3': dependencies: '@babel/types': 7.24.0 - dev: true - /@babel/helper-module-transforms@7.23.3(@babel/core@7.24.3): - resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 + '@babel/helper-module-transforms@7.23.3(@babel/core@7.24.3)': dependencies: '@babel/core': 7.24.3 '@babel/helper-environment-visitor': 7.22.20 @@ -772,103 +4747,60 @@ packages: '@babel/helper-simple-access': 7.22.5 '@babel/helper-split-export-declaration': 7.22.6 '@babel/helper-validator-identifier': 7.22.20 - dev: true - /@babel/helper-plugin-utils@7.24.0: - resolution: {integrity: sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==} - engines: {node: '>=6.9.0'} - dev: true + '@babel/helper-plugin-utils@7.24.0': {} - /@babel/helper-simple-access@7.22.5: - resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} - engines: {node: '>=6.9.0'} + '@babel/helper-simple-access@7.22.5': dependencies: '@babel/types': 7.24.0 - dev: true - /@babel/helper-split-export-declaration@7.22.6: - resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} - engines: {node: '>=6.9.0'} + '@babel/helper-split-export-declaration@7.22.6': dependencies: '@babel/types': 7.24.0 - dev: true - /@babel/helper-string-parser@7.24.1: - resolution: {integrity: sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==} - engines: {node: '>=6.9.0'} + '@babel/helper-string-parser@7.24.1': {} - /@babel/helper-validator-identifier@7.22.20: - resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} - engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@7.22.20': {} - /@babel/helper-validator-option@7.23.5: - resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} - engines: {node: '>=6.9.0'} - dev: true + '@babel/helper-validator-option@7.23.5': {} - /@babel/helpers@7.24.1: - resolution: {integrity: sha512-BpU09QqEe6ZCHuIHFphEFgvNSrubve1FtyMton26ekZ85gRGi6LrTF7zArARp2YvyFxloeiRmtSCq5sjh1WqIg==} - engines: {node: '>=6.9.0'} + '@babel/helpers@7.24.1': dependencies: '@babel/template': 7.24.0 '@babel/traverse': 7.24.1 '@babel/types': 7.24.0 transitivePeerDependencies: - supports-color - dev: true - /@babel/highlight@7.24.1: - resolution: {integrity: sha512-EPmDPxidWe/Ex+HTFINpvXdPHRmgSF3T8hGvzondYjmgzTQ/0EbLpSxyt+w3zzlYSk9cNBQNF9k0dT5Z2NiBjw==} - engines: {node: '>=6.9.0'} + '@babel/highlight@7.24.1': dependencies: '@babel/helper-validator-identifier': 7.22.20 chalk: 2.4.2 js-tokens: 4.0.0 picocolors: 1.0.0 - dev: true - /@babel/highlight@7.24.2: - resolution: {integrity: sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==} - engines: {node: '>=6.9.0'} + '@babel/highlight@7.24.2': dependencies: '@babel/helper-validator-identifier': 7.22.20 chalk: 2.4.2 js-tokens: 4.0.0 picocolors: 1.0.0 - dev: true - /@babel/parser@7.24.1: - resolution: {integrity: sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg==} - engines: {node: '>=6.0.0'} - hasBin: true + '@babel/parser@7.24.1': dependencies: '@babel/types': 7.24.0 - /@babel/plugin-syntax-jsx@7.24.1(@babel/core@7.24.3): - resolution: {integrity: sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-jsx@7.24.1(@babel/core@7.24.3)': dependencies: '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 - dev: true - /@babel/plugin-transform-react-jsx-development@7.22.5(@babel/core@7.24.3): - resolution: {integrity: sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-react-jsx-development@7.22.5(@babel/core@7.24.3)': dependencies: '@babel/core': 7.24.3 '@babel/plugin-transform-react-jsx': 7.23.4(@babel/core@7.24.3) - dev: true - /@babel/plugin-transform-react-jsx@7.23.4(@babel/core@7.24.3): - resolution: {integrity: sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-react-jsx@7.23.4(@babel/core@7.24.3)': dependencies: '@babel/core': 7.24.3 '@babel/helper-annotate-as-pure': 7.22.5 @@ -876,20 +4808,14 @@ packages: '@babel/helper-plugin-utils': 7.24.0 '@babel/plugin-syntax-jsx': 7.24.1(@babel/core@7.24.3) '@babel/types': 7.24.0 - dev: true - /@babel/template@7.24.0: - resolution: {integrity: sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==} - engines: {node: '>=6.9.0'} + '@babel/template@7.24.0': dependencies: '@babel/code-frame': 7.24.2 '@babel/parser': 7.24.1 '@babel/types': 7.24.0 - dev: true - /@babel/traverse@7.24.1: - resolution: {integrity: sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==} - engines: {node: '>=6.9.0'} + '@babel/traverse@7.24.1': dependencies: '@babel/code-frame': 7.24.1 '@babel/generator': 7.24.1 @@ -903,41 +4829,18 @@ packages: globals: 11.12.0 transitivePeerDependencies: - supports-color - dev: true - /@babel/types@7.24.0: - resolution: {integrity: sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==} - engines: {node: '>=6.9.0'} + '@babel/types@7.24.0': dependencies: '@babel/helper-string-parser': 7.24.1 '@babel/helper-validator-identifier': 7.22.20 to-fast-properties: 2.0.0 - /@ctrl/tinycolor@3.6.1: - resolution: {integrity: sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==} - engines: {node: '>=10'} - dev: true + '@ctrl/tinycolor@3.6.1': {} - /@docsearch/css@3.6.0: - resolution: {integrity: sha512-+sbxb71sWre+PwDK7X2T8+bhS6clcVMLwBPznX45Qu6opJcgRjAp7gYSDzVFp187J+feSj5dNBN1mJoi6ckkUQ==} - dev: true + '@docsearch/css@3.6.0': {} - /@docsearch/react@3.6.0(@algolia/client-search@4.23.3)(search-insights@2.13.0): - resolution: {integrity: sha512-HUFut4ztcVNmqy9gp/wxNbC7pTOHhgVVkHVGCACTuLhUKUhKAF9KYHJtMiLUJxEqiFLQiuri1fWF8zqwM/cu1w==} - peerDependencies: - '@types/react': '>= 16.8.0 < 19.0.0' - react: '>= 16.8.0 < 19.0.0' - react-dom: '>= 16.8.0 < 19.0.0' - search-insights: '>= 1 < 3' - peerDependenciesMeta: - '@types/react': - optional: true - react: - optional: true - react-dom: - optional: true - search-insights: - optional: true + '@docsearch/react@3.6.0(@algolia/client-search@4.23.3)(search-insights@2.13.0)': dependencies: '@algolia/autocomplete-core': 1.9.3(@algolia/client-search@4.23.3)(algoliasearch@4.22.1)(search-insights@2.13.0) '@algolia/autocomplete-preset-algolia': 1.9.3(@algolia/client-search@4.23.3)(algoliasearch@4.22.1) @@ -946,474 +4849,169 @@ packages: search-insights: 2.13.0 transitivePeerDependencies: - '@algolia/client-search' - dev: true - /@emmetio/abbreviation@2.3.3: - resolution: {integrity: sha512-mgv58UrU3rh4YgbE/TzgLQwJ3pFsHHhCLqY20aJq+9comytTXUDNGG/SMtSeMJdkpxgXSXunBGLD8Boka3JyVA==} + '@emmetio/abbreviation@2.3.3': dependencies: '@emmetio/scanner': 1.0.4 - dev: false - /@emmetio/css-abbreviation@2.1.8: - resolution: {integrity: sha512-s9yjhJ6saOO/uk1V74eifykk2CBYi01STTK3WlXWGOepyKa23ymJ053+DNQjpFcy1ingpaO7AxCcwLvHFY9tuw==} + '@emmetio/css-abbreviation@2.1.8': dependencies: '@emmetio/scanner': 1.0.4 - dev: false - /@emmetio/scanner@1.0.4: - resolution: {integrity: sha512-IqRuJtQff7YHHBk4G8YZ45uB9BaAGcwQeVzgj/zj8/UdOhtQpEIupUhSk8dys6spFIWVZVeK20CzGEnqR5SbqA==} - dev: false + '@emmetio/scanner@1.0.4': {} - /@esbuild/aix-ppc64@0.19.12: - resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [aix] - requiresBuild: true - dev: true + '@esbuild/aix-ppc64@0.19.12': optional: true - /@esbuild/aix-ppc64@0.20.2: - resolution: {integrity: sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [aix] - requiresBuild: true - dev: true + '@esbuild/aix-ppc64@0.20.2': optional: true - /@esbuild/android-arm64@0.19.12: - resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true + '@esbuild/android-arm64@0.19.12': optional: true - /@esbuild/android-arm64@0.20.2: - resolution: {integrity: sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true + '@esbuild/android-arm64@0.20.2': optional: true - /@esbuild/android-arm@0.15.18: - resolution: {integrity: sha512-5GT+kcs2WVGjVs7+boataCkO5Fg0y4kCjzkB5bAip7H4jfnOS3dA6KPiww9W1OEKTKeAcUVhdZGvgI65OXmUnw==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - requiresBuild: true - dev: true + '@esbuild/android-arm@0.15.18': optional: true - /@esbuild/android-arm@0.19.12: - resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - requiresBuild: true - dev: true + '@esbuild/android-arm@0.19.12': optional: true - /@esbuild/android-arm@0.20.2: - resolution: {integrity: sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - requiresBuild: true - dev: true + '@esbuild/android-arm@0.20.2': optional: true - /@esbuild/android-x64@0.19.12: - resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - requiresBuild: true - dev: true + '@esbuild/android-x64@0.19.12': optional: true - /@esbuild/android-x64@0.20.2: - resolution: {integrity: sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - requiresBuild: true - dev: true + '@esbuild/android-x64@0.20.2': optional: true - /@esbuild/darwin-arm64@0.19.12: - resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true + '@esbuild/darwin-arm64@0.19.12': optional: true - /@esbuild/darwin-arm64@0.20.2: - resolution: {integrity: sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true + '@esbuild/darwin-arm64@0.20.2': optional: true - /@esbuild/darwin-x64@0.19.12: - resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true + '@esbuild/darwin-x64@0.19.12': optional: true - /@esbuild/darwin-x64@0.20.2: - resolution: {integrity: sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true + '@esbuild/darwin-x64@0.20.2': optional: true - - /@esbuild/freebsd-arm64@0.19.12: - resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - requiresBuild: true - dev: true + + '@esbuild/freebsd-arm64@0.19.12': optional: true - /@esbuild/freebsd-arm64@0.20.2: - resolution: {integrity: sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - requiresBuild: true - dev: true + '@esbuild/freebsd-arm64@0.20.2': optional: true - /@esbuild/freebsd-x64@0.19.12: - resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: true + '@esbuild/freebsd-x64@0.19.12': optional: true - /@esbuild/freebsd-x64@0.20.2: - resolution: {integrity: sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: true + '@esbuild/freebsd-x64@0.20.2': optional: true - /@esbuild/linux-arm64@0.19.12: - resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true + '@esbuild/linux-arm64@0.19.12': optional: true - /@esbuild/linux-arm64@0.20.2: - resolution: {integrity: sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true + '@esbuild/linux-arm64@0.20.2': optional: true - /@esbuild/linux-arm@0.19.12: - resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true + '@esbuild/linux-arm@0.19.12': optional: true - /@esbuild/linux-arm@0.20.2: - resolution: {integrity: sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true + '@esbuild/linux-arm@0.20.2': optional: true - /@esbuild/linux-ia32@0.19.12: - resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - requiresBuild: true - dev: true + '@esbuild/linux-ia32@0.19.12': optional: true - /@esbuild/linux-ia32@0.20.2: - resolution: {integrity: sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - requiresBuild: true - dev: true + '@esbuild/linux-ia32@0.20.2': optional: true - /@esbuild/linux-loong64@0.15.18: - resolution: {integrity: sha512-L4jVKS82XVhw2nvzLg/19ClLWg0y27ulRwuP7lcyL6AbUWB5aPglXY3M21mauDQMDfRLs8cQmeT03r/+X3cZYQ==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - requiresBuild: true - dev: true + '@esbuild/linux-loong64@0.15.18': optional: true - /@esbuild/linux-loong64@0.19.12: - resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - requiresBuild: true - dev: true + '@esbuild/linux-loong64@0.19.12': optional: true - /@esbuild/linux-loong64@0.20.2: - resolution: {integrity: sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - requiresBuild: true - dev: true + '@esbuild/linux-loong64@0.20.2': optional: true - /@esbuild/linux-mips64el@0.19.12: - resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - requiresBuild: true - dev: true + '@esbuild/linux-mips64el@0.19.12': optional: true - /@esbuild/linux-mips64el@0.20.2: - resolution: {integrity: sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - requiresBuild: true - dev: true + '@esbuild/linux-mips64el@0.20.2': optional: true - /@esbuild/linux-ppc64@0.19.12: - resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - requiresBuild: true - dev: true + '@esbuild/linux-ppc64@0.19.12': optional: true - /@esbuild/linux-ppc64@0.20.2: - resolution: {integrity: sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - requiresBuild: true - dev: true + '@esbuild/linux-ppc64@0.20.2': optional: true - /@esbuild/linux-riscv64@0.19.12: - resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: true + '@esbuild/linux-riscv64@0.19.12': optional: true - /@esbuild/linux-riscv64@0.20.2: - resolution: {integrity: sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: true + '@esbuild/linux-riscv64@0.20.2': optional: true - /@esbuild/linux-s390x@0.19.12: - resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - requiresBuild: true - dev: true + '@esbuild/linux-s390x@0.19.12': optional: true - /@esbuild/linux-s390x@0.20.2: - resolution: {integrity: sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - requiresBuild: true - dev: true + '@esbuild/linux-s390x@0.20.2': optional: true - /@esbuild/linux-x64@0.19.12: - resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true + '@esbuild/linux-x64@0.19.12': optional: true - /@esbuild/linux-x64@0.20.2: - resolution: {integrity: sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true + '@esbuild/linux-x64@0.20.2': optional: true - /@esbuild/netbsd-x64@0.19.12: - resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - requiresBuild: true - dev: true + '@esbuild/netbsd-x64@0.19.12': optional: true - /@esbuild/netbsd-x64@0.20.2: - resolution: {integrity: sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - requiresBuild: true - dev: true + '@esbuild/netbsd-x64@0.20.2': optional: true - /@esbuild/openbsd-x64@0.19.12: - resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - requiresBuild: true - dev: true + '@esbuild/openbsd-x64@0.19.12': optional: true - /@esbuild/openbsd-x64@0.20.2: - resolution: {integrity: sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - requiresBuild: true - dev: true + '@esbuild/openbsd-x64@0.20.2': optional: true - /@esbuild/sunos-x64@0.19.12: - resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - requiresBuild: true - dev: true + '@esbuild/sunos-x64@0.19.12': optional: true - /@esbuild/sunos-x64@0.20.2: - resolution: {integrity: sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - requiresBuild: true - dev: true + '@esbuild/sunos-x64@0.20.2': optional: true - /@esbuild/win32-arm64@0.19.12: - resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true + '@esbuild/win32-arm64@0.19.12': optional: true - /@esbuild/win32-arm64@0.20.2: - resolution: {integrity: sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true + '@esbuild/win32-arm64@0.20.2': optional: true - /@esbuild/win32-ia32@0.19.12: - resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true + '@esbuild/win32-ia32@0.19.12': optional: true - /@esbuild/win32-ia32@0.20.2: - resolution: {integrity: sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true + '@esbuild/win32-ia32@0.20.2': optional: true - /@esbuild/win32-x64@0.19.12: - resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true + '@esbuild/win32-x64@0.19.12': optional: true - /@esbuild/win32-x64@0.20.2: - resolution: {integrity: sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true + '@esbuild/win32-x64@0.20.2': optional: true - /@eslint-community/eslint-utils@4.4.0(eslint@8.57.0): - resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + '@eslint-community/eslint-utils@4.4.0(eslint@8.57.0)': dependencies: eslint: 8.57.0 eslint-visitor-keys: 3.4.3 - dev: true - /@eslint-community/regexpp@4.10.0: - resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - dev: true + '@eslint-community/regexpp@4.10.0': {} - /@eslint/eslintrc@2.1.4: - resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@eslint/eslintrc@2.1.4': dependencies: ajv: 6.12.6 debug: 4.3.4 @@ -1426,131 +5024,83 @@ packages: strip-json-comments: 3.1.1 transitivePeerDependencies: - supports-color - dev: true - /@eslint/js@8.57.0: - resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true + '@eslint/js@8.57.0': {} - /@expressive-code/core@0.33.5: - resolution: {integrity: sha512-KL0EkKAvd7SSIQL3ZIP19xqe4xNjBaQYNvcJC6RmoBUnQpvxaJNFwRxCBEF/X0ftJEMaSG7WTrabZ9c/zFeqmA==} + '@expressive-code/core@0.33.5': dependencies: '@ctrl/tinycolor': 3.6.1 hast-util-to-html: 8.0.4 hastscript: 7.2.0 postcss: 8.4.37 postcss-nested: 6.0.1(postcss@8.4.37) - dev: true - /@expressive-code/plugin-frames@0.33.5: - resolution: {integrity: sha512-lFt/gbnZscBSxHovg4XiWohp5nrxk4McS6RGABdj6+0gJcX8/YrFTM23GKBIkaDePxdDidVY0jQYGYDL/RrQHw==} + '@expressive-code/plugin-frames@0.33.5': dependencies: '@expressive-code/core': 0.33.5 hastscript: 7.2.0 - dev: true - /@expressive-code/plugin-shiki@0.33.5: - resolution: {integrity: sha512-LWgttQTUrIPE1X+Lya1qFWiX47tH2AS2hkbj/cZoWkdiSjn6zUvtTypK/2Xn6Rgn6z6ClzpgHvkXRqFn7nAB4A==} + '@expressive-code/plugin-shiki@0.33.5': dependencies: '@expressive-code/core': 0.33.5 shiki: 1.2.1 - dev: true - /@expressive-code/plugin-text-markers@0.33.5: - resolution: {integrity: sha512-JxSHL1MGrJAPNaUMjFXex3K+9NJDbfew9H6PmX8LQ+fm9VNQdtBYTAz/x7nqOk7bkTrtAZK5RfDqUfb8U5M+2A==} + '@expressive-code/plugin-text-markers@0.33.5': dependencies: '@expressive-code/core': 0.33.5 hastscript: 7.2.0 unist-util-visit-parents: 5.1.3 - dev: true - /@fastify/busboy@2.1.1: - resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} - engines: {node: '>=14'} - dev: true + '@fastify/busboy@2.1.1': {} - /@fontsource/ibm-plex-mono@5.0.12: - resolution: {integrity: sha512-RamYYYUQk7FX/yVbQqGxyMR+AfX5hfCZsLo5pr5BBUBNf2i3N4AjJ4AWfieqLx1Mdwt2ukzXYojlf9J0G/gaZQ==} - dev: false + '@fontsource/ibm-plex-mono@5.0.12': {} - /@humanwhocodes/config-array@0.11.14: - resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} - engines: {node: '>=10.10.0'} + '@humanwhocodes/config-array@0.11.14': dependencies: '@humanwhocodes/object-schema': 2.0.2 debug: 4.3.4 minimatch: 3.1.2 transitivePeerDependencies: - supports-color - dev: true - /@humanwhocodes/module-importer@1.0.1: - resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} - engines: {node: '>=12.22'} - dev: true + '@humanwhocodes/module-importer@1.0.1': {} - /@humanwhocodes/object-schema@2.0.2: - resolution: {integrity: sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==} - dev: true + '@humanwhocodes/object-schema@2.0.2': {} - /@jest/schemas@29.6.3: - resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/schemas@29.6.3': dependencies: '@sinclair/typebox': 0.27.8 - dev: true - /@jridgewell/gen-mapping@0.3.5: - resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} - engines: {node: '>=6.0.0'} + '@jridgewell/gen-mapping@0.3.5': dependencies: '@jridgewell/set-array': 1.2.1 '@jridgewell/sourcemap-codec': 1.4.15 '@jridgewell/trace-mapping': 0.3.25 - dev: true - /@jridgewell/resolve-uri@3.1.2: - resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} - engines: {node: '>=6.0.0'} - dev: true + '@jridgewell/resolve-uri@3.1.2': {} - /@jridgewell/set-array@1.2.1: - resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} - engines: {node: '>=6.0.0'} - dev: true + '@jridgewell/set-array@1.2.1': {} - /@jridgewell/sourcemap-codec@1.4.15: - resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + '@jridgewell/sourcemap-codec@1.4.15': {} - /@jridgewell/trace-mapping@0.3.25: - resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + '@jridgewell/trace-mapping@0.3.25': dependencies: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.4.15 - dev: true - /@jsdoc/salty@0.2.7: - resolution: {integrity: sha512-mh8LbS9d4Jq84KLw8pzho7XC2q2/IJGiJss3xwRoLD1A+EE16SjN4PfaG4jRCzKegTFLlN0Zd8SdUPE6XdoPFg==} - engines: {node: '>=v12.0.0'} + '@jsdoc/salty@0.2.7': dependencies: lodash: 4.17.21 - dev: false - /@kwsites/file-exists@1.1.1: - resolution: {integrity: sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==} + '@kwsites/file-exists@1.1.1': dependencies: debug: 4.3.4 transitivePeerDependencies: - supports-color - dev: true - /@kwsites/promise-deferred@1.1.1: - resolution: {integrity: sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==} - dev: true + '@kwsites/promise-deferred@1.1.1': {} - /@mdx-js/mdx@3.0.1: - resolution: {integrity: sha512-eIQ4QTrOWyL3LWEe/bu6Taqzq2HQvHcyTMaOrI95P2/LmJE7AsfPfgJGuFLPVqBUE1BC1rik3VIhU+s9u72arA==} + '@mdx-js/mdx@3.0.1': dependencies: '@types/estree': 1.0.5 '@types/estree-jsx': 1.0.5 @@ -1577,50 +5127,27 @@ packages: vfile: 6.0.1 transitivePeerDependencies: - supports-color - dev: true - /@nanostores/preact@0.5.1(nanostores@0.10.0)(preact@10.19.7): - resolution: {integrity: sha512-kofyeDwzM3TrOd37ay+Xxgk3Cn6jih23dxELc7Mr9IJV55jmWATfNP9b7O/awwCL7CE5z5PfzFnNk/W+tMaWGw==} - engines: {node: ^18.0.0 || >=20.0.0} - peerDependencies: - nanostores: ^0.9.0 || ^0.10.0 - preact: '>=10.0.0' + '@nanostores/preact@0.5.1(nanostores@0.10.0)(preact@10.19.7)': dependencies: nanostores: 0.10.0 preact: 10.19.7 - dev: false - /@nodelib/fs.scandir@2.1.5: - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 run-parallel: 1.2.0 - /@nodelib/fs.stat@2.0.5: - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} + '@nodelib/fs.stat@2.0.5': {} - /@nodelib/fs.walk@1.2.8: - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} + '@nodelib/fs.walk@1.2.8': dependencies: '@nodelib/fs.scandir': 2.1.5 fastq: 1.17.1 - /@pkgr/core@0.1.1: - resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} - engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - dev: true + '@pkgr/core@0.1.1': {} - /@preact/preset-vite@2.8.2(@babel/core@7.24.3)(preact@10.19.7): - resolution: {integrity: sha512-m3tl+M8IO8jgiHnk+7LSTFl8axdPXloewi7iGVLdmCwf34XOzEUur0bZVewW4DUbUipFjTS2CXu27+5f/oexBA==} - peerDependencies: - '@babel/core': 7.x - vite: 2.x || 3.x || 4.x || 5.x - peerDependenciesMeta: - vite: - optional: true + '@preact/preset-vite@2.8.2(@babel/core@7.24.3)(preact@10.19.7)': dependencies: '@babel/core': 7.24.3 '@babel/plugin-transform-react-jsx': 7.23.4(@babel/core@7.24.3) @@ -1638,45 +5165,23 @@ packages: transitivePeerDependencies: - preact - supports-color - dev: true - /@preact/signals-core@1.5.1: - resolution: {integrity: sha512-dE6f+WCX5ZUDwXzUIWNMhhglmuLpqJhuy3X3xHrhZYI0Hm2LyQwOu0l9mdPiWrVNsE+Q7txOnJPgtIqHCYoBVA==} - dev: true + '@preact/signals-core@1.5.1': {} - /@preact/signals@1.2.2(preact@10.19.7): - resolution: {integrity: sha512-ColCqdo4cRP18bAuIR4Oik5rDpiyFtPIJIygaYPMEAwTnl4buWkBOflGBSzhYyPyJfKpkwlekrvK+1pzQ2ldWw==} - peerDependencies: - preact: 10.x + '@preact/signals@1.2.2(preact@10.19.7)': dependencies: '@preact/signals-core': 1.5.1 preact: 10.19.7 - dev: true - /@prefresh/babel-plugin@0.5.1: - resolution: {integrity: sha512-uG3jGEAysxWoyG3XkYfjYHgaySFrSsaEb4GagLzYaxlydbuREtaX+FTxuIidp241RaLl85XoHg9Ej6E4+V1pcg==} - dev: true + '@prefresh/babel-plugin@0.5.1': {} - /@prefresh/core@1.5.2(preact@10.19.7): - resolution: {integrity: sha512-A/08vkaM1FogrCII5PZKCrygxSsc11obExBScm3JF1CryK2uDS3ZXeni7FeKCx1nYdUkj4UcJxzPzc1WliMzZA==} - peerDependencies: - preact: ^10.0.0 + '@prefresh/core@1.5.2(preact@10.19.7)': dependencies: preact: 10.19.7 - dev: true - /@prefresh/utils@1.2.0: - resolution: {integrity: sha512-KtC/fZw+oqtwOLUFM9UtiitB0JsVX0zLKNyRTA332sqREqSALIIQQxdUCS1P3xR/jT1e2e8/5rwH6gdcMLEmsQ==} - dev: true + '@prefresh/utils@1.2.0': {} - /@prefresh/vite@2.4.5(preact@10.19.7): - resolution: {integrity: sha512-iForDVJ2M8gQYnm5pHumvTEJjGGc7YNYC0GVKnHFL+GvFfKHfH9Rpq67nUAzNbjuLEpqEOUuQVQajMazWu2ZNQ==} - peerDependencies: - preact: ^10.4.0 - vite: '>=2.0.0' - peerDependenciesMeta: - vite: - optional: true + '@prefresh/vite@2.4.5(preact@10.19.7)': dependencies: '@babel/core': 7.24.3 '@prefresh/babel-plugin': 0.5.1 @@ -1686,311 +5191,167 @@ packages: preact: 10.19.7 transitivePeerDependencies: - supports-color - dev: true - /@rollup/pluginutils@4.2.1: - resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==} - engines: {node: '>= 8.0.0'} + '@rollup/pluginutils@4.2.1': dependencies: estree-walker: 2.0.2 picomatch: 2.3.1 - dev: true - /@rollup/rollup-android-arm-eabi@4.13.0: - resolution: {integrity: sha512-5ZYPOuaAqEH/W3gYsRkxQATBW3Ii1MfaT4EQstTnLKViLi2gLSQmlmtTpGucNP3sXEpOiI5tdGhjdE111ekyEg==} - cpu: [arm] - os: [android] - requiresBuild: true - dev: true + '@rollup/rollup-android-arm-eabi@4.13.0': optional: true - /@rollup/rollup-android-arm64@4.13.0: - resolution: {integrity: sha512-BSbaCmn8ZadK3UAQdlauSvtaJjhlDEjS5hEVVIN3A4bbl3X+otyf/kOJV08bYiRxfejP3DXFzO2jz3G20107+Q==} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true + '@rollup/rollup-android-arm64@4.13.0': optional: true - /@rollup/rollup-darwin-arm64@4.13.0: - resolution: {integrity: sha512-Ovf2evVaP6sW5Ut0GHyUSOqA6tVKfrTHddtmxGQc1CTQa1Cw3/KMCDEEICZBbyppcwnhMwcDce9ZRxdWRpVd6g==} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true + '@rollup/rollup-darwin-arm64@4.13.0': optional: true - /@rollup/rollup-darwin-x64@4.13.0: - resolution: {integrity: sha512-U+Jcxm89UTK592vZ2J9st9ajRv/hrwHdnvyuJpa5A2ngGSVHypigidkQJP+YiGL6JODiUeMzkqQzbCG3At81Gg==} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true + '@rollup/rollup-darwin-x64@4.13.0': optional: true - /@rollup/rollup-linux-arm-gnueabihf@4.13.0: - resolution: {integrity: sha512-8wZidaUJUTIR5T4vRS22VkSMOVooG0F4N+JSwQXWSRiC6yfEsFMLTYRFHvby5mFFuExHa/yAp9juSphQQJAijQ==} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true + '@rollup/rollup-linux-arm-gnueabihf@4.13.0': optional: true - /@rollup/rollup-linux-arm64-gnu@4.13.0: - resolution: {integrity: sha512-Iu0Kno1vrD7zHQDxOmvweqLkAzjxEVqNhUIXBsZ8hu8Oak7/5VTPrxOEZXYC1nmrBVJp0ZcL2E7lSuuOVaE3+w==} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true + '@rollup/rollup-linux-arm64-gnu@4.13.0': optional: true - /@rollup/rollup-linux-arm64-musl@4.13.0: - resolution: {integrity: sha512-C31QrW47llgVyrRjIwiOwsHFcaIwmkKi3PCroQY5aVq4H0A5v/vVVAtFsI1nfBngtoRpeREvZOkIhmRwUKkAdw==} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true + '@rollup/rollup-linux-arm64-musl@4.13.0': optional: true - /@rollup/rollup-linux-riscv64-gnu@4.13.0: - resolution: {integrity: sha512-Oq90dtMHvthFOPMl7pt7KmxzX7E71AfyIhh+cPhLY9oko97Zf2C9tt/XJD4RgxhaGeAraAXDtqxvKE1y/j35lA==} - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: true + '@rollup/rollup-linux-riscv64-gnu@4.13.0': optional: true - /@rollup/rollup-linux-x64-gnu@4.13.0: - resolution: {integrity: sha512-yUD/8wMffnTKuiIsl6xU+4IA8UNhQ/f1sAnQebmE/lyQ8abjsVyDkyRkWop0kdMhKMprpNIhPmYlCxgHrPoXoA==} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true + '@rollup/rollup-linux-x64-gnu@4.13.0': optional: true - /@rollup/rollup-linux-x64-musl@4.13.0: - resolution: {integrity: sha512-9RyNqoFNdF0vu/qqX63fKotBh43fJQeYC98hCaf89DYQpv+xu0D8QFSOS0biA7cGuqJFOc1bJ+m2rhhsKcw1hw==} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true + '@rollup/rollup-linux-x64-musl@4.13.0': optional: true - /@rollup/rollup-win32-arm64-msvc@4.13.0: - resolution: {integrity: sha512-46ue8ymtm/5PUU6pCvjlic0z82qWkxv54GTJZgHrQUuZnVH+tvvSP0LsozIDsCBFO4VjJ13N68wqrKSeScUKdA==} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true + '@rollup/rollup-win32-arm64-msvc@4.13.0': optional: true - /@rollup/rollup-win32-ia32-msvc@4.13.0: - resolution: {integrity: sha512-P5/MqLdLSlqxbeuJ3YDeX37srC8mCflSyTrUsgbU1c/U9j6l2g2GiIdYaGD9QjdMQPMSgYm7hgg0551wHyIluw==} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true + '@rollup/rollup-win32-ia32-msvc@4.13.0': optional: true - /@rollup/rollup-win32-x64-msvc@4.13.0: - resolution: {integrity: sha512-UKXUQNbO3DOhzLRwHSpa0HnhhCgNODvfoPWv2FCXme8N/ANFfhIPMGuOT+QuKd16+B5yxZ0HdpNlqPvTMS1qfw==} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true + '@rollup/rollup-win32-x64-msvc@4.13.0': optional: true - /@shikijs/core@1.2.0: - resolution: {integrity: sha512-OlFvx+nyr5C8zpcMBnSGir0YPD6K11uYhouqhNmm1qLiis4GA7SsGtu07r9gKS9omks8RtQqHrJL4S+lqWK01A==} - dev: true + '@shikijs/core@1.2.0': {} - /@shikijs/core@1.2.1: - resolution: {integrity: sha512-KaIS0H4EQ3KI2d++TjYqRNgwp8E3M/68e9veR4QtInzA7kKFgcjeiJqb80fuXW+blDy5fmd11PN9g9soz/3ANQ==} - dev: true + '@shikijs/core@1.2.1': {} - /@sinclair/typebox@0.27.8: - resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} - dev: true + '@sinclair/typebox@0.27.8': {} - /@ts-morph/common@0.16.0: - resolution: {integrity: sha512-SgJpzkTgZKLKqQniCjLaE3c2L2sdL7UShvmTmPBejAKd2OKV/yfMpQ2IWpAuA+VY5wy7PkSUaEObIqEK6afFuw==} + '@ts-morph/common@0.16.0': dependencies: fast-glob: 3.3.2 minimatch: 5.1.6 mkdirp: 1.0.4 path-browserify: 1.0.1 - dev: true - /@types/acorn@4.0.6: - resolution: {integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==} + '@types/acorn@4.0.6': dependencies: '@types/estree': 1.0.5 - dev: true - /@types/babel__core@7.20.5: - resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + '@types/babel__core@7.20.5': dependencies: '@babel/parser': 7.24.1 '@babel/types': 7.24.0 '@types/babel__generator': 7.6.8 '@types/babel__template': 7.4.4 '@types/babel__traverse': 7.20.5 - dev: true - /@types/babel__generator@7.6.8: - resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} + '@types/babel__generator@7.6.8': dependencies: '@babel/types': 7.24.0 - dev: true - /@types/babel__template@7.4.4: - resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + '@types/babel__template@7.4.4': dependencies: '@babel/parser': 7.24.1 '@babel/types': 7.24.0 - dev: true - /@types/babel__traverse@7.20.5: - resolution: {integrity: sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==} + '@types/babel__traverse@7.20.5': dependencies: '@babel/types': 7.24.0 - dev: true - /@types/canvas-confetti@1.6.4: - resolution: {integrity: sha512-fNyZ/Fdw/Y92X0vv7B+BD6ysHL4xVU5dJcgzgxLdGbn8O3PezZNIJpml44lKM0nsGur+o/6+NZbZeNTt00U1uA==} - dev: true + '@types/canvas-confetti@1.6.4': {} - /@types/debug@4.1.12: - resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + '@types/debug@4.1.12': dependencies: '@types/ms': 0.7.34 - /@types/estree-jsx@1.0.5: - resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} + '@types/estree-jsx@1.0.5': dependencies: '@types/estree': 1.0.5 - dev: true - /@types/estree@1.0.5: - resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} - dev: true + '@types/estree@1.0.5': {} - /@types/hast@2.3.10: - resolution: {integrity: sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==} + '@types/hast@2.3.10': dependencies: '@types/unist': 2.0.10 - dev: true - /@types/hast@3.0.4: - resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + '@types/hast@3.0.4': dependencies: '@types/unist': 3.0.2 - /@types/html-escaper@3.0.2: - resolution: {integrity: sha512-A8vk09eyYzk8J/lFO4OUMKCmRN0rRzfZf4n3Olwapgox/PtTiU8zPYlL1UEkJ/WeHvV6v9Xnj3o/705PKz9r4Q==} - dev: true + '@types/html-escaper@3.0.2': {} - /@types/json-schema@7.0.15: - resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - dev: true + '@types/json-schema@7.0.15': {} - /@types/linkify-it@3.0.5: - resolution: {integrity: sha512-yg6E+u0/+Zjva+buc3EIb+29XEg4wltq7cSmd4Uc2EE/1nUVmxyzpX6gUXD0V8jIrG0r7YeOGVIbYRkxeooCtw==} - dev: false + '@types/linkify-it@3.0.5': {} - /@types/markdown-it@12.2.3: - resolution: {integrity: sha512-GKMHFfv3458yYy+v/N8gjufHO6MSZKCOXpZc5GXIWWy8uldwfmPn98vp81gZ5f9SVw8YYBctgfJ22a2d7AOMeQ==} + '@types/markdown-it@12.2.3': dependencies: '@types/linkify-it': 3.0.5 '@types/mdurl': 1.0.5 - dev: false - /@types/mdast@4.0.3: - resolution: {integrity: sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==} + '@types/mdast@4.0.3': dependencies: '@types/unist': 3.0.2 - /@types/mdurl@1.0.5: - resolution: {integrity: sha512-6L6VymKTzYSrEf4Nev4Xa1LCHKrlTlYCBMTlQKFuddo1CvQcE52I0mwfOJayueUC7MJuXOeHTcIU683lzd0cUA==} - dev: false + '@types/mdurl@1.0.5': {} - /@types/mdx@2.0.12: - resolution: {integrity: sha512-H9VZ9YqE+H28FQVchC83RCs5xQ2J7mAAv6qdDEaWmXEVl3OpdH+xfrSUzQ1lp7U7oSTRZ0RvW08ASPJsYBi7Cw==} - dev: true + '@types/mdx@2.0.12': {} - /@types/ms@0.7.34: - resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} + '@types/ms@0.7.34': {} - /@types/nlcst@1.0.4: - resolution: {integrity: sha512-ABoYdNQ/kBSsLvZAekMhIPMQ3YUZvavStpKYs7BjLLuKVmIMA0LUgZ7b54zzuWJRbHF80v1cNf4r90Vd6eMQDg==} + '@types/nlcst@1.0.4': dependencies: '@types/unist': 2.0.10 - dev: true - /@types/nlcst@2.0.3: - resolution: {integrity: sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA==} + '@types/nlcst@2.0.3': dependencies: '@types/unist': 3.0.2 - dev: false - /@types/node@17.0.45: - resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==} - dev: true + '@types/node@17.0.45': {} - /@types/node@18.19.26: - resolution: {integrity: sha512-+wiMJsIwLOYCvUqSdKTrfkS8mpTp+MPINe6+Np4TAGFWWRWiBQ5kSq9nZGCSPkzx9mvT+uEukzpX4MOSCydcvw==} + '@types/node@18.19.26': dependencies: undici-types: 5.26.5 - dev: true - /@types/node@20.12.7: - resolution: {integrity: sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==} + '@types/node@20.12.7': dependencies: undici-types: 5.26.5 - dev: true - /@types/parse5@6.0.3: - resolution: {integrity: sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==} - dev: true + '@types/parse5@6.0.3': {} - /@types/retry@0.12.2: - resolution: {integrity: sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==} - dev: true + '@types/retry@0.12.2': {} - /@types/sax@1.2.7: - resolution: {integrity: sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==} + '@types/sax@1.2.7': dependencies: '@types/node': 20.12.7 - dev: true - /@types/semver@7.5.8: - resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} - dev: true + '@types/semver@7.5.8': {} - /@types/strip-bom@3.0.0: - resolution: {integrity: sha512-xevGOReSYGM7g/kUBZzPqCrR/KYAo+F0yiPc85WFTJa0MSLtyFTVTU6cJu/aV4mid7IffDIWqo69THF2o4JiEQ==} - dev: true + '@types/strip-bom@3.0.0': {} - /@types/strip-json-comments@0.0.30: - resolution: {integrity: sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==} - dev: true + '@types/strip-json-comments@0.0.30': {} - /@types/unist@2.0.10: - resolution: {integrity: sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==} + '@types/unist@2.0.10': {} - /@types/unist@3.0.2: - resolution: {integrity: sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==} + '@types/unist@3.0.2': {} - /@typescript-eslint/eslint-plugin@7.4.0(@typescript-eslint/parser@7.4.0)(eslint@8.57.0)(typescript@5.4.5): - resolution: {integrity: sha512-yHMQ/oFaM7HZdVrVm/M2WHaNPgyuJH4WelkSVEWSSsir34kxW2kDJCxlXRhhGWEsMN0WAW/vLpKfKVcm8k+MPw==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - '@typescript-eslint/parser': ^7.0.0 - eslint: ^8.56.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@typescript-eslint/eslint-plugin@7.4.0(@typescript-eslint/parser@7.4.0)(eslint@8.57.0)(typescript@5.4.5)': dependencies: '@eslint-community/regexpp': 4.10.0 '@typescript-eslint/parser': 7.4.0(eslint@8.57.0)(typescript@5.4.5) @@ -2008,17 +5369,8 @@ packages: typescript: 5.4.5 transitivePeerDependencies: - supports-color - dev: true - /@typescript-eslint/parser@7.4.0(eslint@8.57.0)(typescript@5.4.5): - resolution: {integrity: sha512-ZvKHxHLusweEUVwrGRXXUVzFgnWhigo4JurEj0dGF1tbcGh6buL+ejDdjxOQxv6ytcY1uhun1p2sm8iWStlgLQ==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - eslint: ^8.56.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@typescript-eslint/parser@7.4.0(eslint@8.57.0)(typescript@5.4.5)': dependencies: '@typescript-eslint/scope-manager': 7.4.0 '@typescript-eslint/types': 7.4.0 @@ -2029,33 +5381,18 @@ packages: typescript: 5.4.5 transitivePeerDependencies: - supports-color - dev: true - /@typescript-eslint/scope-manager@5.62.0: - resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@typescript-eslint/scope-manager@5.62.0': dependencies: '@typescript-eslint/types': 5.62.0 '@typescript-eslint/visitor-keys': 5.62.0 - dev: true - /@typescript-eslint/scope-manager@7.4.0: - resolution: {integrity: sha512-68VqENG5HK27ypafqLVs8qO+RkNc7TezCduYrx8YJpXq2QGZ30vmNZGJJJC48+MVn4G2dCV8m5ZTVnzRexTVtw==} - engines: {node: ^18.18.0 || >=20.0.0} + '@typescript-eslint/scope-manager@7.4.0': dependencies: '@typescript-eslint/types': 7.4.0 '@typescript-eslint/visitor-keys': 7.4.0 - dev: true - /@typescript-eslint/type-utils@7.4.0(eslint@8.57.0)(typescript@5.4.5): - resolution: {integrity: sha512-247ETeHgr9WTRMqHbbQdzwzhuyaJ8dPTuyuUEMANqzMRB1rj/9qFIuIXK7l0FX9i9FXbHeBQl/4uz6mYuCE7Aw==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - eslint: ^8.56.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@typescript-eslint/type-utils@7.4.0(eslint@8.57.0)(typescript@5.4.5)': dependencies: '@typescript-eslint/typescript-estree': 7.4.0(typescript@5.4.5) '@typescript-eslint/utils': 7.4.0(eslint@8.57.0)(typescript@5.4.5) @@ -2065,26 +5402,12 @@ packages: typescript: 5.4.5 transitivePeerDependencies: - supports-color - dev: true - /@typescript-eslint/types@5.62.0: - resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true + '@typescript-eslint/types@5.62.0': {} - /@typescript-eslint/types@7.4.0: - resolution: {integrity: sha512-mjQopsbffzJskos5B4HmbsadSJQWaRK0UxqQ7GuNA9Ga4bEKeiO6b2DnB6cM6bpc8lemaPseh0H9B/wyg+J7rw==} - engines: {node: ^18.18.0 || >=20.0.0} - dev: true + '@typescript-eslint/types@7.4.0': {} - /@typescript-eslint/typescript-estree@7.4.0(typescript@5.4.5): - resolution: {integrity: sha512-A99j5AYoME/UBQ1ucEbbMEmGkN7SE0BvZFreSnTd1luq7yulcHdyGamZKizU7canpGDWGJ+Q6ZA9SyQobipePg==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@typescript-eslint/typescript-estree@7.4.0(typescript@5.4.5)': dependencies: '@typescript-eslint/types': 7.4.0 '@typescript-eslint/visitor-keys': 7.4.0 @@ -2097,13 +5420,8 @@ packages: typescript: 5.4.5 transitivePeerDependencies: - supports-color - dev: true - /@typescript-eslint/utils@7.4.0(eslint@8.57.0)(typescript@5.4.5): - resolution: {integrity: sha512-NQt9QLM4Tt8qrlBVY9lkMYzfYtNz8/6qwZg8pI3cMGlPnj6mOpRxxAm7BMJN9K0AiY+1BwJ5lVC650YJqYOuNg==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - eslint: ^8.56.0 + '@typescript-eslint/utils@7.4.0(eslint@8.57.0)(typescript@5.4.5)': dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) '@types/json-schema': 7.0.15 @@ -2116,70 +5434,49 @@ packages: transitivePeerDependencies: - supports-color - typescript - dev: true - /@typescript-eslint/visitor-keys@5.62.0: - resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@typescript-eslint/visitor-keys@5.62.0': dependencies: '@typescript-eslint/types': 5.62.0 eslint-visitor-keys: 3.4.3 - dev: true - /@typescript-eslint/visitor-keys@7.4.0: - resolution: {integrity: sha512-0zkC7YM0iX5Y41homUUeW1CHtZR01K3ybjM1l6QczoMuay0XKtrb93kv95AxUGwdjGr64nNqnOCwmEl616N8CA==} - engines: {node: ^18.18.0 || >=20.0.0} + '@typescript-eslint/visitor-keys@7.4.0': dependencies: '@typescript-eslint/types': 7.4.0 eslint-visitor-keys: 3.4.3 - dev: true - /@ungap/structured-clone@1.2.0: - resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + '@ungap/structured-clone@1.2.0': {} - /@vitest/expect@1.4.0: - resolution: {integrity: sha512-Jths0sWCJZ8BxjKe+p+eKsoqev1/T8lYcrjavEaz8auEJ4jAVY0GwW3JKmdVU4mmNPLPHixh4GNXP7GFtAiDHA==} + '@vitest/expect@1.4.0': dependencies: '@vitest/spy': 1.4.0 '@vitest/utils': 1.4.0 chai: 4.4.1 - dev: true - /@vitest/runner@1.4.0: - resolution: {integrity: sha512-EDYVSmesqlQ4RD2VvWo3hQgTJ7ZrFQ2VSJdfiJiArkCerDAGeyF1i6dHkmySqk573jLp6d/cfqCN+7wUB5tLgg==} + '@vitest/runner@1.4.0': dependencies: '@vitest/utils': 1.4.0 p-limit: 5.0.0 pathe: 1.1.2 - dev: true - /@vitest/snapshot@1.4.0: - resolution: {integrity: sha512-saAFnt5pPIA5qDGxOHxJ/XxhMFKkUSBJmVt5VgDsAqPTX6JP326r5C/c9UuCMPoXNzuudTPsYDZCoJ5ilpqG2A==} + '@vitest/snapshot@1.4.0': dependencies: magic-string: 0.30.8 pathe: 1.1.2 pretty-format: 29.7.0 - dev: true - /@vitest/spy@1.4.0: - resolution: {integrity: sha512-Ywau/Qs1DzM/8Uc+yA77CwSegizMlcgTJuYGAi0jujOteJOUf1ujunHThYo243KG9nAyWT3L9ifPYZ5+As/+6Q==} + '@vitest/spy@1.4.0': dependencies: tinyspy: 2.2.1 - dev: true - /@vitest/utils@1.4.0: - resolution: {integrity: sha512-mx3Yd1/6e2Vt/PUC98DcqTirtfxUyAZ32uK82r8rZzbtBeBo+nqgnjx/LvqQdWsrvNtm14VmurNgcf4nqY5gJg==} + '@vitest/utils@1.4.0': dependencies: diff-sequences: 29.6.3 estree-walker: 3.0.3 loupe: 2.3.7 pretty-format: 29.7.0 - dev: true - /@volar/kit@2.1.6(typescript@5.4.5): - resolution: {integrity: sha512-dSuXChDGM0nSG/0fxqlNfadjpAeeo1P1SJPBQ+pDf8H1XrqeJq5gIhxRTEbiS+dyNIG69ATq1CArkbCif+oxJw==} - peerDependencies: - typescript: '*' + '@volar/kit@2.1.6(typescript@5.4.5)': dependencies: '@volar/language-service': 2.1.6 '@volar/typescript': 2.1.6 @@ -2187,16 +5484,12 @@ packages: typescript: 5.4.5 vscode-languageserver-textdocument: 1.0.11 vscode-uri: 3.0.8 - dev: false - /@volar/language-core@2.1.6: - resolution: {integrity: sha512-pAlMCGX/HatBSiDFMdMyqUshkbwWbLxpN/RL7HCQDOo2gYBE+uS+nanosLc1qR6pTQ/U8q00xt8bdrrAFPSC0A==} + '@volar/language-core@2.1.6': dependencies: '@volar/source-map': 2.1.6 - dev: false - /@volar/language-server@2.1.6: - resolution: {integrity: sha512-0w+FV8ro37hVb3qE4ONo3VbS5kEQXv4H/D2xCePyY5dRw6XnbJAPFNKvoxI9mxHTPonvIG1si5rN9MSGSKtgZQ==} + '@volar/language-server@2.1.6': dependencies: '@volar/language-core': 2.1.6 '@volar/language-service': 2.1.6 @@ -2209,89 +5502,58 @@ packages: vscode-languageserver-protocol: 3.17.5 vscode-languageserver-textdocument: 1.0.11 vscode-uri: 3.0.8 - dev: false - /@volar/language-service@2.1.6: - resolution: {integrity: sha512-1OpbbPQ6wUIumwMP5r45y8utVEmvq1n6BC8JHqGKsuFr9RGFIldDBlvA/xuO3MDKhjmmPGPHKb54kg1/YN78ow==} + '@volar/language-service@2.1.6': dependencies: '@volar/language-core': 2.1.6 vscode-languageserver-protocol: 3.17.5 vscode-languageserver-textdocument: 1.0.11 vscode-uri: 3.0.8 - dev: false - /@volar/snapshot-document@2.1.6: - resolution: {integrity: sha512-YNYk1sCOrGg7VHbZM+1It97q0GWhFxdqIwnxSNFoL0X1LuSRXoCT2DRb/aa1J6aBpPMbKqSFUWHGQEAFUnc4Zw==} + '@volar/snapshot-document@2.1.6': dependencies: vscode-languageserver-protocol: 3.17.5 vscode-languageserver-textdocument: 1.0.11 - dev: false - /@volar/source-map@2.1.6: - resolution: {integrity: sha512-TeyH8pHHonRCHYI91J7fWUoxi0zWV8whZTVRlsWHSYfjm58Blalkf9LrZ+pj6OiverPTmrHRkBsG17ScQyWECw==} + '@volar/source-map@2.1.6': dependencies: muggle-string: 0.4.1 - dev: false - /@volar/typescript@2.1.6: - resolution: {integrity: sha512-JgPGhORHqXuyC3r6skPmPHIZj4LoMmGlYErFTuPNBq9Nhc9VTv7ctHY7A3jMN3ngKEfRrfnUcwXHztvdSQqNfw==} + '@volar/typescript@2.1.6': dependencies: '@volar/language-core': 2.1.6 path-browserify: 1.0.1 - dev: false - /@vscode/emmet-helper@2.9.3: - resolution: {integrity: sha512-rB39LHWWPQYYlYfpv9qCoZOVioPCftKXXqrsyqN1mTWZM6dTnONT63Db+03vgrBbHzJN45IrgS/AGxw9iiqfEw==} + '@vscode/emmet-helper@2.9.3': dependencies: emmet: 2.4.7 jsonc-parser: 2.3.1 vscode-languageserver-textdocument: 1.0.11 vscode-languageserver-types: 3.17.5 vscode-uri: 2.1.2 - dev: false - /@vscode/l10n@0.0.16: - resolution: {integrity: sha512-JT5CvrIYYCrmB+dCana8sUqJEcGB1ZDXNLMQ2+42bW995WmNoenijWMUdZfwmuQUTQcEVVIa2OecZzTYWUW9Cg==} - dev: false + '@vscode/l10n@0.0.16': {} - /@vscode/l10n@0.0.18: - resolution: {integrity: sha512-KYSIHVmslkaCDyw013pphY+d7x1qV8IZupYfeIfzNA+nsaWHbn5uPuQRvdRFsa9zFzGeudPuoGoZ1Op4jrJXIQ==} - dev: false + '@vscode/l10n@0.0.18': {} - /@webgpu/types@0.1.21: - resolution: {integrity: sha512-pUrWq3V5PiSGFLeLxoGqReTZmiiXwY3jRkIG5sLLKjyqNxrwm/04b4nw7LSmGWJcKk59XOM/YRTUwOzo4MMlow==} - dev: true + '@webgpu/types@0.1.21': {} - /acorn-jsx@5.3.2(acorn@8.11.3): - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + acorn-jsx@5.3.2(acorn@8.11.3): dependencies: acorn: 8.11.3 - dev: true - /acorn-walk@8.3.2: - resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} - engines: {node: '>=0.4.0'} - dev: true + acorn-walk@8.3.2: {} - /acorn@8.11.3: - resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} - engines: {node: '>=0.4.0'} - hasBin: true - dev: true + acorn@8.11.3: {} - /ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + ajv@6.12.6: dependencies: fast-deep-equal: 3.1.3 fast-json-stable-stringify: 2.1.0 json-schema-traverse: 0.4.1 uri-js: 4.4.1 - dev: true - /algoliasearch@4.22.1: - resolution: {integrity: sha512-jwydKFQJKIx9kIZ8Jm44SdpigFwRGPESaxZBaHSV0XWN2yBJAOT4mT7ppvlrpA4UGzz92pqFnVKr/kaZXrcreg==} + algoliasearch@4.22.1: dependencies: '@algolia/cache-browser-local-storage': 4.22.1 '@algolia/cache-common': 4.22.1 @@ -2307,181 +5569,113 @@ packages: '@algolia/requester-common': 4.22.1 '@algolia/requester-node-http': 4.22.1 '@algolia/transporter': 4.22.1 - dev: true - /ansi-align@3.0.1: - resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} + ansi-align@3.0.1: dependencies: string-width: 4.2.3 - dev: true - /ansi-escapes@6.2.0: - resolution: {integrity: sha512-kzRaCqXnpzWs+3z5ABPQiVke+iq0KXkHo8xiWV4RPTi5Yli0l97BEQuhXV1s7+aSU/fu1kUuxgS4MsQ0fRuygw==} - engines: {node: '>=14.16'} + ansi-escapes@6.2.0: dependencies: type-fest: 3.13.1 - dev: true - /ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} + ansi-regex@5.0.1: {} - /ansi-regex@6.0.1: - resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} - engines: {node: '>=12'} - dev: true + ansi-regex@6.0.1: {} - /ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} + ansi-styles@3.2.1: dependencies: color-convert: 1.9.3 - dev: true - /ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} + ansi-styles@4.3.0: dependencies: color-convert: 2.0.1 - /ansi-styles@5.2.0: - resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} - engines: {node: '>=10'} - dev: true + ansi-styles@5.2.0: {} - /ansi-styles@6.2.1: - resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} - engines: {node: '>=12'} - dev: true + ansi-styles@6.2.1: {} - /anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} + anymatch@3.1.3: dependencies: normalize-path: 3.0.0 picomatch: 2.3.1 - /arg@5.0.2: - resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} - dev: true + arg@5.0.2: {} - /argparse@1.0.10: - resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + argparse@1.0.10: dependencies: sprintf-js: 1.0.3 - dev: true - /argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + argparse@2.0.1: {} - /aria-query@5.3.0: - resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} + aria-query@5.3.0: dependencies: dequal: 2.0.3 - dev: true - /array-back@1.0.4: - resolution: {integrity: sha512-1WxbZvrmyhkNoeYcizokbmh5oiOCIfyvGtcqbK3Ls1v1fKcquzxnQSceOx6tzq7jmai2kFLWIpGND2cLhH6TPw==} - engines: {node: '>=0.12.0'} + array-back@1.0.4: dependencies: typical: 2.6.1 - dev: false - /array-back@4.0.2: - resolution: {integrity: sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==} - engines: {node: '>=8'} - dev: false + array-back@4.0.2: {} - /array-back@5.0.0: - resolution: {integrity: sha512-kgVWwJReZWmVuWOQKEOohXKJX+nD02JAZ54D1RRWlv8L0NebauKAaFxACKzB74RTclt1+WNz5KHaLRDAPZbDEw==} - engines: {node: '>=10'} - dev: false + array-back@5.0.0: {} - /array-back@6.2.2: - resolution: {integrity: sha512-gUAZ7HPyb4SJczXAMUXMGAvI976JoK3qEx9v1FTmeYuJj0IBiaKttG1ydtGKdkfqWkIkouke7nG8ufGy77+Cvw==} - engines: {node: '>=12.17'} - dev: false + array-back@6.2.2: {} - /array-buffer-byte-length@1.0.1: - resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} - engines: {node: '>= 0.4'} + array-buffer-byte-length@1.0.1: dependencies: call-bind: 1.0.7 is-array-buffer: 3.0.4 - dev: true - /array-includes@3.1.7: - resolution: {integrity: sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==} - engines: {node: '>= 0.4'} + array-includes@3.1.7: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.22.5 get-intrinsic: 1.2.4 is-string: 1.0.7 - dev: true - /array-iterate@2.0.1: - resolution: {integrity: sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg==} + array-iterate@2.0.1: {} - /array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} - dev: true + array-union@2.1.0: {} - /array.prototype.findlast@1.2.4: - resolution: {integrity: sha512-BMtLxpV+8BD+6ZPFIWmnUBpQoy+A+ujcg4rhp2iwCRJYA7PEh2MS4NL3lz8EiDlLrJPp2hg9qWihr5pd//jcGw==} - engines: {node: '>= 0.4'} + array.prototype.findlast@1.2.4: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.22.5 es-errors: 1.3.0 es-shim-unscopables: 1.0.2 - dev: true - /array.prototype.flat@1.3.2: - resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} - engines: {node: '>= 0.4'} + array.prototype.flat@1.3.2: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.22.5 es-shim-unscopables: 1.0.2 - dev: true - /array.prototype.flatmap@1.3.2: - resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} - engines: {node: '>= 0.4'} + array.prototype.flatmap@1.3.2: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.22.5 es-shim-unscopables: 1.0.2 - dev: true - /array.prototype.toreversed@1.1.2: - resolution: {integrity: sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==} + array.prototype.toreversed@1.1.2: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.22.5 es-shim-unscopables: 1.0.2 - dev: true - /array.prototype.tosorted@1.1.3: - resolution: {integrity: sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg==} + array.prototype.tosorted@1.1.3: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.22.5 es-errors: 1.3.0 es-shim-unscopables: 1.0.2 - dev: true - /arraybuffer.prototype.slice@1.0.3: - resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} - engines: {node: '>= 0.4'} + arraybuffer.prototype.slice@1.0.3: dependencies: array-buffer-byte-length: 1.0.1 call-bind: 1.0.7 @@ -2491,31 +5685,18 @@ packages: get-intrinsic: 1.2.4 is-array-buffer: 3.0.4 is-shared-array-buffer: 1.0.3 - dev: true - /assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} - dev: true + assertion-error@1.1.0: {} - /astring@1.8.6: - resolution: {integrity: sha512-ISvCdHdlTDlH5IpxQJIex7BWBywFWgjJSVdwst+/iQCoEYnyOaQ95+X1JGshuBjGp6nxKUy1jMgE3zPqN7fQdg==} - hasBin: true - dev: true + astring@1.8.6: {} - /astro-auto-import@0.4.2(astro@4.5.7): - resolution: {integrity: sha512-ZgWZQ58+EhbEym1+aoUnNyECOy0wsG5uRUs+rVp/7BzHtj1V76J2qkhjaTWLplgNb+8WrzhvTQNxytmXRCW+Ow==} - engines: {node: '>=16.0.0'} - peerDependencies: - astro: ^2.0.0 || ^3.0.0-beta || ^4.0.0-beta + astro-auto-import@0.4.2(astro@4.5.7): dependencies: '@types/node': 18.19.26 acorn: 8.11.3 astro: 4.5.7(@types/node@20.12.7)(sass@1.72.0)(typescript@5.4.5) - dev: true - /astro-eslint-parser@0.16.3: - resolution: {integrity: sha512-CGaBseNtunAV2DCpwBXqTKq8+9Tw65XZetMaC0FsMoZuLj0gxNIkbCf2QyKYScVrNOU7/ayfNdVw8ZCSHBiqCg==} - engines: {node: ^14.18.0 || >=16.0.0} + astro-eslint-parser@0.16.3: dependencies: '@astrojs/compiler': 2.7.0 '@typescript-eslint/scope-manager': 5.62.0 @@ -2528,34 +5709,21 @@ packages: semver: 7.6.0 transitivePeerDependencies: - supports-color - dev: true - /astro-expressive-code@0.33.5(astro@4.5.7): - resolution: {integrity: sha512-9JAyllueMUN8JTl/h/yTdbKinNmfalEWcV11s3lSf/UJQbAZfWJuy+IlGcArZDI/CmD21GXhFHLqYthpdY33ug==} - peerDependencies: - astro: ^4.0.0-beta || ^3.3.0 + astro-expressive-code@0.33.5(astro@4.5.7): dependencies: astro: 4.5.7(@types/node@20.12.7)(sass@1.72.0)(typescript@5.4.5) hast-util-to-html: 8.0.4 remark-expressive-code: 0.33.5 - dev: true - /astro-og-canvas@0.4.2(astro@4.5.7): - resolution: {integrity: sha512-OQsH6Gr2HX9ZRHdVy2OcXVBIPI65WvEtLG/60krnphh8d3ldhuAFunymYaNGcrdSZcYgXkHWejbPt//3qaRidA==} - engines: {node: '>=18.14.1'} - peerDependencies: - astro: ^3.0.0 || ^4.0.0 + astro-og-canvas@0.4.2(astro@4.5.7): dependencies: astro: 4.5.7(@types/node@20.12.7)(sass@1.72.0)(typescript@5.4.5) canvaskit-wasm: 0.37.2 deterministic-object-hash: 2.0.2 entities: 4.5.0 - dev: true - /astro@4.5.7(@types/node@20.12.7)(sass@1.72.0)(typescript@5.4.5): - resolution: {integrity: sha512-Ioeg3TV42dOJvf6GlmykeR3EKZ8+JcnZyJ/X9qDPzVf2OREmtvW0182YCDXQBqwXFRHndZRcHLqinAWjzZYh/A==} - engines: {node: '>=18.14.1', npm: '>=6.14.0'} - hasBin: true + astro@4.5.7(@types/node@20.12.7)(sass@1.72.0)(typescript@5.4.5): dependencies: '@astrojs/compiler': 2.7.0 '@astrojs/internal-helpers': 0.3.0 @@ -2631,155 +5799,94 @@ packages: - supports-color - terser - typescript - dev: true - /astrojs-compiler-sync@0.3.5(@astrojs/compiler@2.7.0): - resolution: {integrity: sha512-y420rhIIJ2HHDkYeqKArBHSdJNIIGMztLH90KGIX3zjcJyt/cr9Z2wYA8CP5J1w6KE7xqMh0DAkhfjhNDpQb2Q==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - '@astrojs/compiler': '>=0.27.0' + astrojs-compiler-sync@0.3.5(@astrojs/compiler@2.7.0): dependencies: '@astrojs/compiler': 2.7.0 synckit: 0.9.0 - dev: true - /available-typed-arrays@1.0.7: - resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} - engines: {node: '>= 0.4'} + available-typed-arrays@1.0.7: dependencies: possible-typed-array-names: 1.0.0 - dev: true - /axobject-query@4.0.0: - resolution: {integrity: sha512-+60uv1hiVFhHZeO+Lz0RYzsVHy5Wr1ayX0mwda9KPDVLNJgZ1T9Ny7VmFbLDzxsH0D87I86vgj3gFrjTJUYznw==} + axobject-query@4.0.0: dependencies: dequal: 2.0.3 - dev: true - /b4a@1.6.6: - resolution: {integrity: sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==} - requiresBuild: true - dev: true + b4a@1.6.6: optional: true - /babel-plugin-transform-hook-names@1.0.2(@babel/core@7.24.3): - resolution: {integrity: sha512-5gafyjyyBTTdX/tQQ0hRgu4AhNHG/hqWi0ZZmg2xvs2FgRkJXzDNKBZCyoYqgFkovfDrgM8OoKg8karoUvWeCw==} - peerDependencies: - '@babel/core': ^7.12.10 + babel-plugin-transform-hook-names@1.0.2(@babel/core@7.24.3): dependencies: '@babel/core': 7.24.3 - dev: true - /bail@2.0.2: - resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} + bail@2.0.2: {} - /balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + balanced-match@1.0.2: {} - /bare-events@2.2.1: - resolution: {integrity: sha512-9GYPpsPFvrWBkelIhOhTWtkeZxVxZOdb3VnFTCzlOo3OjvmTvzLoZFUT8kNFACx0vJej6QPney1Cf9BvzCNE/A==} - requiresBuild: true - dev: true + bare-events@2.2.1: optional: true - /bare-events@2.2.2: - resolution: {integrity: sha512-h7z00dWdG0PYOQEvChhOSWvOfkIKsdZGkWr083FgN/HyoQuebSew/cgirYqh9SCuy/hRvxc5Vy6Fw8xAmYHLkQ==} - requiresBuild: true - dev: true + bare-events@2.2.2: optional: true - /bare-fs@2.3.0: - resolution: {integrity: sha512-TNFqa1B4N99pds2a5NYHR15o0ZpdNKbAeKTE/+G6ED/UeOavv8RY3dr/Fu99HW3zU3pXpo2kDNO8Sjsm2esfOw==} - requiresBuild: true + bare-fs@2.3.0: dependencies: bare-events: 2.2.1 bare-path: 2.1.2 bare-stream: 1.0.0 - dev: true optional: true - /bare-os@2.2.1: - resolution: {integrity: sha512-OwPyHgBBMkhC29Hl3O4/YfxW9n7mdTr2+SsO29XBWKKJsbgj3mnorDB80r5TiCQgQstgE5ga1qNYrpes6NvX2w==} - requiresBuild: true - dev: true + bare-os@2.2.1: optional: true - /bare-path@2.1.2: - resolution: {integrity: sha512-o7KSt4prEphWUHa3QUwCxUI00R86VdjiuxmJK0iNVDHYPGo+HsDaVCnqCmPbf/MiW1ok8F4p3m8RTHlWk8K2ig==} - requiresBuild: true + bare-path@2.1.2: dependencies: bare-os: 2.2.1 - dev: true optional: true - /bare-stream@1.0.0: - resolution: {integrity: sha512-KhNUoDL40iP4gFaLSsoGE479t0jHijfYdIcxRn/XtezA2BaUD0NRf/JGRpsMq6dMNM+SrCrB0YSSo/5wBY4rOQ==} - requiresBuild: true + bare-stream@1.0.0: dependencies: streamx: 2.16.1 - dev: true optional: true - /base-64@1.0.0: - resolution: {integrity: sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg==} - dev: true + base-64@1.0.0: {} - /base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - dev: true + base64-js@1.5.1: {} - /bcp-47-match@2.0.3: - resolution: {integrity: sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ==} - dev: true + bcp-47-match@2.0.3: {} - /bcp-47-normalize@2.3.0: - resolution: {integrity: sha512-8I/wfzqQvttUFz7HVJgIZ7+dj3vUaIyIxYXaTRP1YWoSDfzt6TUmxaKZeuXR62qBmYr+nvuWINFRl6pZ5DlN4Q==} + bcp-47-normalize@2.3.0: dependencies: bcp-47: 2.1.0 bcp-47-match: 2.0.3 - dev: true - /bcp-47@2.1.0: - resolution: {integrity: sha512-9IIS3UPrvIa1Ej+lVDdDwO7zLehjqsaByECw0bu2RRGP73jALm6FYbzI5gWbgHLvNdkvfXB5YrSbocZdOS0c0w==} + bcp-47@2.1.0: dependencies: is-alphabetical: 2.0.1 is-alphanumerical: 2.0.1 is-decimal: 2.0.1 - dev: true - /binary-extensions@2.3.0: - resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} - engines: {node: '>=8'} + binary-extensions@2.3.0: {} - /bl@4.1.0: - resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} - requiresBuild: true + bl@4.1.0: dependencies: buffer: 5.7.1 inherits: 2.0.4 readable-stream: 3.6.2 - dev: true optional: true - /bl@5.1.0: - resolution: {integrity: sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==} + bl@5.1.0: dependencies: buffer: 6.0.3 inherits: 2.0.4 readable-stream: 3.6.2 - dev: true - /bluebird@3.7.2: - resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} - dev: false + bluebird@3.7.2: {} - /boolbase@1.0.0: - resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} - dev: true + boolbase@1.0.0: {} - /boxen@7.1.1: - resolution: {integrity: sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==} - engines: {node: '>=14.16'} + boxen@7.1.1: dependencies: ansi-align: 3.0.1 camelcase: 7.0.1 @@ -2789,118 +5896,75 @@ packages: type-fest: 2.19.0 widest-line: 4.0.1 wrap-ansi: 8.1.0 - dev: true - /brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + brace-expansion@1.1.11: dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 - /brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + brace-expansion@2.0.1: dependencies: balanced-match: 1.0.2 - /braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} - engines: {node: '>=8'} + braces@3.0.2: dependencies: fill-range: 7.0.1 - /browserslist@4.23.0: - resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true + browserslist@4.23.0: dependencies: caniuse-lite: 1.0.30001599 electron-to-chromium: 1.4.711 node-releases: 2.0.14 update-browserslist-db: 1.0.13(browserslist@4.23.0) - dev: true - /buffer@5.7.1: - resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} - requiresBuild: true + buffer@5.7.1: dependencies: base64-js: 1.5.1 ieee754: 1.2.1 - dev: true optional: true - /buffer@6.0.3: - resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + buffer@6.0.3: dependencies: base64-js: 1.5.1 ieee754: 1.2.1 - dev: true - /cac@6.7.14: - resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} - engines: {node: '>=8'} - dev: true + cac@6.7.14: {} - /cache-point@2.0.0: - resolution: {integrity: sha512-4gkeHlFpSKgm3vm2gJN5sPqfmijYRFYCQ6tv5cLw0xVmT6r1z1vd4FNnpuOREco3cBs1G709sZ72LdgddKvL5w==} - engines: {node: '>=8'} + cache-point@2.0.0: dependencies: array-back: 4.0.2 fs-then-native: 2.0.0 mkdirp2: 1.0.5 - dev: false - /call-bind@1.0.7: - resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} - engines: {node: '>= 0.4'} + call-bind@1.0.7: dependencies: es-define-property: 1.0.0 es-errors: 1.3.0 function-bind: 1.1.2 get-intrinsic: 1.2.4 set-function-length: 1.2.2 - dev: true - /callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} - dev: true + callsites@3.1.0: {} - /camelcase@7.0.1: - resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==} - engines: {node: '>=14.16'} - dev: true + camelcase@7.0.1: {} - /caniuse-lite@1.0.30001599: - resolution: {integrity: sha512-LRAQHZ4yT1+f9LemSMeqdMpMxZcc4RMWdj4tiFe3G8tNkWK+E58g+/tzotb5cU6TbcVJLr4fySiAW7XmxQvZQA==} - dev: true + caniuse-lite@1.0.30001599: {} - /canvas-confetti@1.9.2: - resolution: {integrity: sha512-6Xi7aHHzKwxZsem4mCKoqP6YwUG3HamaHHAlz1hTNQPCqXhARFpSXnkC9TWlahHY5CG6hSL5XexNjxK8irVErg==} - dev: false + canvas-confetti@1.9.2: {} - /canvaskit-wasm@0.37.2: - resolution: {integrity: sha512-212imazRF98gLOTiU4JAXM7xDvaknI7jaPtAg4ETXGW5rLQs6pomgIvVPUSfoKnQVTdGgzj+B4e+/u0Da20aGg==} - dev: true + canvaskit-wasm@0.37.2: {} - /canvaskit-wasm@0.39.1: - resolution: {integrity: sha512-Gy3lCmhUdKq+8bvDrs9t8+qf7RvcjuQn+we7vTVVyqgOVO1UVfHpsnBxkTZw+R4ApEJ3D5fKySl9TU11hmjl/A==} + canvaskit-wasm@0.39.1: dependencies: '@webgpu/types': 0.1.21 - dev: true - /catharsis@0.9.0: - resolution: {integrity: sha512-prMTQVpcns/tzFgFVkVp6ak6RykZyWb3gu8ckUpd6YkTlacOd3DXGJjIpD4Q6zJirizvaiAjSSHlOsA+6sNh2A==} - engines: {node: '>= 10'} + catharsis@0.9.0: dependencies: lodash: 4.17.21 - dev: false - /ccount@2.0.1: - resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + ccount@2.0.1: {} - /chai@4.4.1: - resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==} - engines: {node: '>=4'} + chai@4.4.1: dependencies: assertion-error: 1.1.0 check-error: 1.0.3 @@ -2909,54 +5973,33 @@ packages: loupe: 2.3.7 pathval: 1.1.1 type-detect: 4.0.8 - dev: true - /chalk@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} + chalk@2.4.2: dependencies: ansi-styles: 3.2.1 escape-string-regexp: 1.0.5 supports-color: 5.5.0 - dev: true - /chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} + chalk@4.1.2: dependencies: ansi-styles: 4.3.0 supports-color: 7.2.0 - dev: true - /chalk@5.3.0: - resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - dev: true + chalk@5.3.0: {} - /character-entities-html4@2.1.0: - resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} - dev: true + character-entities-html4@2.1.0: {} - /character-entities-legacy@3.0.0: - resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} - dev: true + character-entities-legacy@3.0.0: {} - /character-entities@2.0.2: - resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + character-entities@2.0.2: {} - /character-reference-invalid@2.0.1: - resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} - dev: true + character-reference-invalid@2.0.1: {} - /check-error@1.0.3: - resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} + check-error@1.0.3: dependencies: get-func-name: 2.0.2 - dev: true - /chokidar@3.6.0: - resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} - engines: {node: '>= 8.10.0'} + chokidar@3.6.0: dependencies: anymatch: 3.1.3 braces: 3.0.2 @@ -2968,426 +6011,242 @@ packages: optionalDependencies: fsevents: 2.3.3 - /chownr@1.1.4: - resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} - requiresBuild: true - dev: true + chownr@1.1.4: optional: true - /ci-info@3.9.0: - resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} - engines: {node: '>=8'} - dev: true - - /ci-info@4.0.0: - resolution: {integrity: sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==} - engines: {node: '>=8'} - dev: true + ci-info@3.9.0: {} - /cli-boxes@3.0.0: - resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} - engines: {node: '>=10'} - dev: true + ci-info@4.0.0: {} - /cli-cursor@4.0.0: - resolution: {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + cli-boxes@3.0.0: {} + + cli-cursor@4.0.0: dependencies: restore-cursor: 4.0.0 - dev: true - /cli-spinners@2.9.2: - resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} - engines: {node: '>=6'} - dev: true + cli-spinners@2.9.2: {} - /cli-truncate@4.0.0: - resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==} - engines: {node: '>=18'} + cli-truncate@4.0.0: dependencies: slice-ansi: 5.0.0 string-width: 7.1.0 - dev: true - /cliui@8.0.1: - resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} - engines: {node: '>=12'} + cliui@8.0.1: dependencies: string-width: 4.2.3 strip-ansi: 6.0.1 wrap-ansi: 7.0.0 - dev: false - /clsx@2.1.0: - resolution: {integrity: sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==} - engines: {node: '>=6'} - dev: true + clsx@2.1.0: {} - /code-block-writer@11.0.3: - resolution: {integrity: sha512-NiujjUFB4SwScJq2bwbYUtXbZhBSlY6vYzm++3Q6oC+U+injTqfPYFK8wS9COOmb2lueqp0ZRB4nK1VYeHgNyw==} - dev: true + code-block-writer@11.0.3: {} - /collapse-white-space@2.1.0: - resolution: {integrity: sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==} - dev: true + collapse-white-space@2.1.0: {} - /collect-all@1.0.4: - resolution: {integrity: sha512-RKZhRwJtJEP5FWul+gkSMEnaK6H3AGPTTWOiRimCcs+rc/OmQE3Yhy1Q7A7KsdkG3ZXVdZq68Y6ONSdvkeEcKA==} - engines: {node: '>=0.10.0'} + collect-all@1.0.4: dependencies: stream-connect: 1.0.2 stream-via: 1.0.4 - dev: false - /color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + color-convert@1.9.3: dependencies: color-name: 1.1.3 - dev: true - /color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} + color-convert@2.0.1: dependencies: color-name: 1.1.4 - /color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - dev: true + color-name@1.1.3: {} - /color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - requiresBuild: true + color-name@1.1.4: {} - /color-string@1.9.1: - resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} - requiresBuild: true + color-string@1.9.1: dependencies: color-name: 1.1.4 simple-swizzle: 0.2.2 - dev: true optional: true - /color@4.2.3: - resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} - engines: {node: '>=12.5.0'} - requiresBuild: true + color@4.2.3: dependencies: color-convert: 2.0.1 color-string: 1.9.1 - dev: true optional: true - /colorette@2.0.20: - resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} - dev: true + colorette@2.0.20: {} - /comma-separated-tokens@2.0.3: - resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} - dev: true + comma-separated-tokens@2.0.3: {} - /commander@11.1.0: - resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} - engines: {node: '>=16'} - dev: true + commander@11.1.0: {} - /commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - dev: true + commander@2.20.3: {} - /common-ancestor-path@1.0.1: - resolution: {integrity: sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==} - dev: true + common-ancestor-path@1.0.1: {} - /concat-map@0.0.1: - resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=} + concat-map@0.0.1: {} - /convert-source-map@2.0.0: - resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - dev: true + convert-source-map@2.0.0: {} - /cookie@0.6.0: - resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} - engines: {node: '>= 0.6'} - dev: true + cookie@0.6.0: {} - /cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} - engines: {node: '>= 8'} + cross-spawn@7.0.3: dependencies: path-key: 3.1.1 shebang-command: 2.0.0 which: 2.0.2 - dev: true - /css-select@5.1.0: - resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==} + css-select@5.1.0: dependencies: boolbase: 1.0.0 css-what: 6.1.0 domhandler: 5.0.3 domutils: 3.1.0 nth-check: 2.1.1 - dev: true - /css-what@6.1.0: - resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} - engines: {node: '>= 6'} - dev: true + css-what@6.1.0: {} - /cssesc@3.0.0: - resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} - engines: {node: '>=4'} - hasBin: true - dev: true + cssesc@3.0.0: {} - /data-uri-to-buffer@4.0.1: - resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} - engines: {node: '>= 12'} - dev: true + data-uri-to-buffer@4.0.1: {} - /data-view-buffer@1.0.1: - resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} - engines: {node: '>= 0.4'} + data-view-buffer@1.0.1: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 is-data-view: 1.0.1 - dev: true - /data-view-byte-length@1.0.1: - resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} - engines: {node: '>= 0.4'} + data-view-byte-length@1.0.1: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 is-data-view: 1.0.1 - dev: true - /data-view-byte-offset@1.0.0: - resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} - engines: {node: '>= 0.4'} + data-view-byte-offset@1.0.0: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 is-data-view: 1.0.1 - dev: true - /debug@4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true + debug@4.3.4: dependencies: ms: 2.1.2 - /decode-named-character-reference@1.0.2: - resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} + decode-named-character-reference@1.0.2: dependencies: character-entities: 2.0.2 - /decompress-response@6.0.0: - resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} - engines: {node: '>=10'} - requiresBuild: true + decompress-response@6.0.0: dependencies: mimic-response: 3.1.0 - dev: true optional: true - /dedent-js@1.0.1: - resolution: {integrity: sha512-OUepMozQULMLUmhxS95Vudo0jb0UchLimi3+pQ2plj61Fcy8axbP9hbiD4Sz6DPqn6XG3kfmziVfQ1rSys5AJQ==} - dev: true + dedent-js@1.0.1: {} - /deep-eql@4.1.3: - resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} - engines: {node: '>=6'} + deep-eql@4.1.3: dependencies: type-detect: 4.0.8 - dev: true - /deep-extend@0.6.0: - resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} - engines: {node: '>=4.0.0'} - requiresBuild: true - dev: true + deep-extend@0.6.0: optional: true - /deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - dev: true + deep-is@0.1.4: {} - /define-data-property@1.1.4: - resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} - engines: {node: '>= 0.4'} + define-data-property@1.1.4: dependencies: es-define-property: 1.0.0 es-errors: 1.3.0 gopd: 1.0.1 - dev: true - /define-properties@1.2.1: - resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} - engines: {node: '>= 0.4'} + define-properties@1.2.1: dependencies: define-data-property: 1.1.4 has-property-descriptors: 1.0.2 object-keys: 1.1.1 - dev: true - /dequal@2.0.3: - resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} - engines: {node: '>=6'} + dequal@2.0.3: {} - /detect-libc@2.0.3: - resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} - engines: {node: '>=8'} - requiresBuild: true - dev: true + detect-libc@2.0.3: optional: true - /deterministic-object-hash@2.0.2: - resolution: {integrity: sha512-KxektNH63SrbfUyDiwXqRb1rLwKt33AmMv+5Nhsw1kqZ13SJBRTgZHtGbE+hH3a1mVW1cz+4pqSWVPAtLVXTzQ==} - engines: {node: '>=18'} + deterministic-object-hash@2.0.2: dependencies: base-64: 1.0.0 - dev: true - /devalue@4.3.2: - resolution: {integrity: sha512-KqFl6pOgOW+Y6wJgu80rHpo2/3H07vr8ntR9rkkFIRETewbf5GaYYcakYfiKz89K+sLsuPkQIZaXDMjUObZwWg==} - dev: true + devalue@4.3.2: {} - /devlop@1.1.0: - resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + devlop@1.1.0: dependencies: dequal: 2.0.3 - /diff-sequences@29.6.3: - resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dev: true + diff-sequences@29.6.3: {} - /diff@5.2.0: - resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} - engines: {node: '>=0.3.1'} - dev: true + diff@5.2.0: {} - /dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} + dir-glob@3.0.1: dependencies: path-type: 4.0.0 - dev: true - /dlv@1.1.3: - resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} - dev: true + dlv@1.1.3: {} - /doctrine@2.1.0: - resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} - engines: {node: '>=0.10.0'} + doctrine@2.1.0: dependencies: esutils: 2.0.3 - dev: true - /doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} + doctrine@3.0.0: dependencies: esutils: 2.0.3 - dev: true - /dom-serializer@2.0.0: - resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + dom-serializer@2.0.0: dependencies: domelementtype: 2.3.0 domhandler: 5.0.3 entities: 4.5.0 - dev: true - /domelementtype@2.3.0: - resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} - dev: true + domelementtype@2.3.0: {} - /domhandler@5.0.3: - resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} - engines: {node: '>= 4'} + domhandler@5.0.3: dependencies: domelementtype: 2.3.0 - dev: true - /domutils@3.1.0: - resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} + domutils@3.1.0: dependencies: dom-serializer: 2.0.0 domelementtype: 2.3.0 domhandler: 5.0.3 - dev: true - /dset@3.1.3: - resolution: {integrity: sha512-20TuZZHCEZ2O71q9/+8BwKwZ0QtD9D8ObhrihJPr+vLLYlSuAU3/zL4cSlgbfeoGHTjCSJBa7NGcrF9/Bx/WJQ==} - engines: {node: '>=4'} - dev: true + dset@3.1.3: {} - /eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - dev: true + eastasianwidth@0.2.0: {} - /editorconfig@0.15.3: - resolution: {integrity: sha512-M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g==} - hasBin: true + editorconfig@0.15.3: dependencies: commander: 2.20.3 lru-cache: 4.1.5 semver: 5.7.2 sigmund: 1.0.1 - dev: true - /electron-to-chromium@1.4.711: - resolution: {integrity: sha512-hRg81qzvUEibX2lDxnFlVCHACa+LtrCPIsWAxo161LDYIB3jauf57RGsMZV9mvGwE98yGH06icj3zBEoOkxd/w==} - dev: true + electron-to-chromium@1.4.711: {} - /emmet@2.4.7: - resolution: {integrity: sha512-O5O5QNqtdlnQM2bmKHtJgyChcrFMgQuulI+WdiOw2NArzprUqqxUW6bgYtKvzKgrsYpuLWalOkdhNP+1jluhCA==} + emmet@2.4.7: dependencies: '@emmetio/abbreviation': 2.3.3 '@emmetio/css-abbreviation': 2.1.8 - dev: false - /emoji-regex@10.3.0: - resolution: {integrity: sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==} - dev: true + emoji-regex@10.3.0: {} - /emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + emoji-regex@8.0.0: {} - /emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - dev: true + emoji-regex@9.2.2: {} - /end-of-stream@1.4.4: - resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} - requiresBuild: true + end-of-stream@1.4.4: dependencies: once: 1.4.0 - dev: true optional: true - /entities@2.1.0: - resolution: {integrity: sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==} - dev: false + entities@2.1.0: {} - /entities@4.5.0: - resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} - engines: {node: '>=0.12'} - dev: true + entities@4.5.0: {} - /es-abstract@1.22.5: - resolution: {integrity: sha512-oW69R+4q2wG+Hc3KZePPZxOiisRIqfKBVo/HLx94QcJeWGU/8sZhCvc829rd1kS366vlJbzBfXf9yWwf0+Ko7w==} - engines: {node: '>= 0.4'} + es-abstract@1.22.5: dependencies: array-buffer-byte-length: 1.0.1 arraybuffer.prototype.slice: 1.0.3 @@ -3430,11 +6289,8 @@ packages: typed-array-length: 1.0.5 unbox-primitive: 1.0.2 which-typed-array: 1.1.15 - dev: true - /es-abstract@1.23.2: - resolution: {integrity: sha512-60s3Xv2T2p1ICykc7c+DNDPLDMm9t4QxCOUU0K9JxiLjM3C1zB9YVdN7tjxrFd4+AkZ8CdX1ovUga4P2+1e+/w==} - engines: {node: '>= 0.4'} + es-abstract@1.23.2: dependencies: array-buffer-byte-length: 1.0.1 arraybuffer.prototype.slice: 1.0.3 @@ -3482,23 +6338,14 @@ packages: typed-array-length: 1.0.5 unbox-primitive: 1.0.2 which-typed-array: 1.1.15 - dev: true - /es-define-property@1.0.0: - resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} - engines: {node: '>= 0.4'} + es-define-property@1.0.0: dependencies: get-intrinsic: 1.2.4 - dev: true - /es-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} - engines: {node: '>= 0.4'} - dev: true + es-errors@1.3.0: {} - /es-iterator-helpers@1.0.18: - resolution: {integrity: sha512-scxAJaewsahbqTYrGKJihhViaM6DDZDDoucfvzNbK0pOren1g/daDQ3IAhzn+1G14rBG7w+i5N+qul60++zlKA==} - engines: {node: '>= 0.4'} + es-iterator-helpers@1.0.18: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 @@ -3514,232 +6361,92 @@ packages: internal-slot: 1.0.7 iterator.prototype: 1.1.2 safe-array-concat: 1.1.2 - dev: true - /es-module-lexer@1.4.2: - resolution: {integrity: sha512-7nOqkomXZEaxUDJw21XZNtRk739QvrPSoZoRtbsEfcii00vdzZUh6zh1CQwHhrib8MdEtJfv5rJiGeb4KuV/vw==} - dev: true + es-module-lexer@1.4.2: {} - /es-module-lexer@1.5.0: - resolution: {integrity: sha512-pqrTKmwEIgafsYZAGw9kszYzmagcE/n4dbgwGWLEXg7J4QFJVQRBld8j3Q3GNez79jzxZshq0bcT962QHOghjw==} - dev: true + es-module-lexer@1.5.0: {} - /es-object-atoms@1.0.0: - resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} - engines: {node: '>= 0.4'} + es-object-atoms@1.0.0: dependencies: es-errors: 1.3.0 - dev: true - /es-set-tostringtag@2.0.3: - resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} - engines: {node: '>= 0.4'} + es-set-tostringtag@2.0.3: dependencies: get-intrinsic: 1.2.4 has-tostringtag: 1.0.2 hasown: 2.0.2 - dev: true - /es-shim-unscopables@1.0.2: - resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} + es-shim-unscopables@1.0.2: dependencies: hasown: 2.0.2 - dev: true - /es-to-primitive@1.2.1: - resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} - engines: {node: '>= 0.4'} + es-to-primitive@1.2.1: dependencies: is-callable: 1.2.7 is-date-object: 1.0.5 is-symbol: 1.0.4 - dev: true - /esbuild-android-64@0.15.18: - resolution: {integrity: sha512-wnpt3OXRhcjfIDSZu9bnzT4/TNTDsOUvip0foZOUBG7QbSt//w3QV4FInVJxNhKc/ErhUxc5z4QjHtMi7/TbgA==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - requiresBuild: true - dev: true + esbuild-android-64@0.15.18: optional: true - /esbuild-android-arm64@0.15.18: - resolution: {integrity: sha512-G4xu89B8FCzav9XU8EjsXacCKSG2FT7wW9J6hOc18soEHJdtWu03L3TQDGf0geNxfLTtxENKBzMSq9LlbjS8OQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true + esbuild-android-arm64@0.15.18: optional: true - /esbuild-darwin-64@0.15.18: - resolution: {integrity: sha512-2WAvs95uPnVJPuYKP0Eqx+Dl/jaYseZEUUT1sjg97TJa4oBtbAKnPnl3b5M9l51/nbx7+QAEtuummJZW0sBEmg==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true + esbuild-darwin-64@0.15.18: optional: true - /esbuild-darwin-arm64@0.15.18: - resolution: {integrity: sha512-tKPSxcTJ5OmNb1btVikATJ8NftlyNlc8BVNtyT/UAr62JFOhwHlnoPrhYWz09akBLHI9nElFVfWSTSRsrZiDUA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true + esbuild-darwin-arm64@0.15.18: optional: true - /esbuild-freebsd-64@0.15.18: - resolution: {integrity: sha512-TT3uBUxkteAjR1QbsmvSsjpKjOX6UkCstr8nMr+q7zi3NuZ1oIpa8U41Y8I8dJH2fJgdC3Dj3CXO5biLQpfdZA==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: true + esbuild-freebsd-64@0.15.18: optional: true - /esbuild-freebsd-arm64@0.15.18: - resolution: {integrity: sha512-R/oVr+X3Tkh+S0+tL41wRMbdWtpWB8hEAMsOXDumSSa6qJR89U0S/PpLXrGF7Wk/JykfpWNokERUpCeHDl47wA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - requiresBuild: true - dev: true + esbuild-freebsd-arm64@0.15.18: optional: true - /esbuild-linux-32@0.15.18: - resolution: {integrity: sha512-lphF3HiCSYtaa9p1DtXndiQEeQDKPl9eN/XNoBf2amEghugNuqXNZA/ZovthNE2aa4EN43WroO0B85xVSjYkbg==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - requiresBuild: true - dev: true + esbuild-linux-32@0.15.18: optional: true - /esbuild-linux-64@0.15.18: - resolution: {integrity: sha512-hNSeP97IviD7oxLKFuii5sDPJ+QHeiFTFLoLm7NZQligur8poNOWGIgpQ7Qf8Balb69hptMZzyOBIPtY09GZYw==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true + esbuild-linux-64@0.15.18: optional: true - /esbuild-linux-arm64@0.15.18: - resolution: {integrity: sha512-54qr8kg/6ilcxd+0V3h9rjT4qmjc0CccMVWrjOEM/pEcUzt8X62HfBSeZfT2ECpM7104mk4yfQXkosY8Quptug==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true + esbuild-linux-arm64@0.15.18: optional: true - /esbuild-linux-arm@0.15.18: - resolution: {integrity: sha512-UH779gstRblS4aoS2qpMl3wjg7U0j+ygu3GjIeTonCcN79ZvpPee12Qun3vcdxX+37O5LFxz39XeW2I9bybMVA==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true + esbuild-linux-arm@0.15.18: optional: true - /esbuild-linux-mips64le@0.15.18: - resolution: {integrity: sha512-Mk6Ppwzzz3YbMl/ZZL2P0q1tnYqh/trYZ1VfNP47C31yT0K8t9s7Z077QrDA/guU60tGNp2GOwCQnp+DYv7bxQ==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - requiresBuild: true - dev: true + esbuild-linux-mips64le@0.15.18: optional: true - /esbuild-linux-ppc64le@0.15.18: - resolution: {integrity: sha512-b0XkN4pL9WUulPTa/VKHx2wLCgvIAbgwABGnKMY19WhKZPT+8BxhZdqz6EgkqCLld7X5qiCY2F/bfpUUlnFZ9w==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - requiresBuild: true - dev: true + esbuild-linux-ppc64le@0.15.18: optional: true - /esbuild-linux-riscv64@0.15.18: - resolution: {integrity: sha512-ba2COaoF5wL6VLZWn04k+ACZjZ6NYniMSQStodFKH/Pu6RxzQqzsmjR1t9QC89VYJxBeyVPTaHuBMCejl3O/xg==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: true + esbuild-linux-riscv64@0.15.18: optional: true - /esbuild-linux-s390x@0.15.18: - resolution: {integrity: sha512-VbpGuXEl5FCs1wDVp93O8UIzl3ZrglgnSQ+Hu79g7hZu6te6/YHgVJxCM2SqfIila0J3k0csfnf8VD2W7u2kzQ==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - requiresBuild: true - dev: true + esbuild-linux-s390x@0.15.18: optional: true - /esbuild-netbsd-64@0.15.18: - resolution: {integrity: sha512-98ukeCdvdX7wr1vUYQzKo4kQ0N2p27H7I11maINv73fVEXt2kyh4K4m9f35U1K43Xc2QGXlzAw0K9yoU7JUjOg==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - requiresBuild: true - dev: true + esbuild-netbsd-64@0.15.18: optional: true - /esbuild-openbsd-64@0.15.18: - resolution: {integrity: sha512-yK5NCcH31Uae076AyQAXeJzt/vxIo9+omZRKj1pauhk3ITuADzuOx5N2fdHrAKPxN+zH3w96uFKlY7yIn490xQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - requiresBuild: true - dev: true + esbuild-openbsd-64@0.15.18: optional: true - /esbuild-sunos-64@0.15.18: - resolution: {integrity: sha512-On22LLFlBeLNj/YF3FT+cXcyKPEI263nflYlAhz5crxtp3yRG1Ugfr7ITyxmCmjm4vbN/dGrb/B7w7U8yJR9yw==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - requiresBuild: true - dev: true + esbuild-sunos-64@0.15.18: optional: true - /esbuild-windows-32@0.15.18: - resolution: {integrity: sha512-o+eyLu2MjVny/nt+E0uPnBxYuJHBvho8vWsC2lV61A7wwTWC3jkN2w36jtA+yv1UgYkHRihPuQsL23hsCYGcOQ==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true + esbuild-windows-32@0.15.18: optional: true - /esbuild-windows-64@0.15.18: - resolution: {integrity: sha512-qinug1iTTaIIrCorAUjR0fcBk24fjzEedFYhhispP8Oc7SFvs+XeW3YpAKiKp8dRpizl4YYAhxMjlftAMJiaUw==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true + esbuild-windows-64@0.15.18: optional: true - /esbuild-windows-arm64@0.15.18: - resolution: {integrity: sha512-q9bsYzegpZcLziq0zgUi5KqGVtfhjxGbnksaBFYmWLxeV/S1fK4OLdq2DFYnXcLMjlZw2L0jLsk1eGoB522WXQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true + esbuild-windows-arm64@0.15.18: optional: true - /esbuild@0.15.18: - resolution: {integrity: sha512-x/R72SmW3sSFRm5zrrIjAhCeQSAWoni3CmHEqfQrZIQTM3lVCdehdwuIqaOtfC2slvpdlLa62GYoN8SxT23m6Q==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true + esbuild@0.15.18: optionalDependencies: '@esbuild/android-arm': 0.15.18 '@esbuild/linux-loong64': 0.15.18 @@ -3763,13 +6470,8 @@ packages: esbuild-windows-32: 0.15.18 esbuild-windows-64: 0.15.18 esbuild-windows-arm64: 0.15.18 - dev: true - /esbuild@0.19.12: - resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true + esbuild@0.19.12: optionalDependencies: '@esbuild/aix-ppc64': 0.19.12 '@esbuild/android-arm': 0.19.12 @@ -3794,13 +6496,8 @@ packages: '@esbuild/win32-arm64': 0.19.12 '@esbuild/win32-ia32': 0.19.12 '@esbuild/win32-x64': 0.19.12 - dev: true - /esbuild@0.20.2: - resolution: {integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true + esbuild@0.20.2: optionalDependencies: '@esbuild/aix-ppc64': 0.20.2 '@esbuild/android-arm': 0.20.2 @@ -3825,46 +6522,23 @@ packages: '@esbuild/win32-arm64': 0.20.2 '@esbuild/win32-ia32': 0.20.2 '@esbuild/win32-x64': 0.20.2 - dev: true - /escalade@3.1.2: - resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} - engines: {node: '>=6'} + escalade@3.1.2: {} - /escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} - dev: true + escape-string-regexp@1.0.5: {} - /escape-string-regexp@2.0.0: - resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} - engines: {node: '>=8'} - dev: false + escape-string-regexp@2.0.0: {} - /escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - dev: true + escape-string-regexp@4.0.0: {} - /escape-string-regexp@5.0.0: - resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} - engines: {node: '>=12'} + escape-string-regexp@5.0.0: {} - /eslint-compat-utils@0.5.0(eslint@8.57.0): - resolution: {integrity: sha512-dc6Y8tzEcSYZMHa+CMPLi/hyo1FzNeonbhJL7Ol0ccuKQkwopJcJBA9YL/xmMTLU1eKigXo9vj9nALElWYSowg==} - engines: {node: '>=12'} - peerDependencies: - eslint: '>=6.0.0' + eslint-compat-utils@0.5.0(eslint@8.57.0): dependencies: eslint: 8.57.0 semver: 7.6.0 - dev: true - /eslint-plugin-astro@0.33.1(eslint@8.57.0): - resolution: {integrity: sha512-wVyxAf8Ulmljv5qJQLgspWe17LR4hLXcksIENtUlEC3W7rleBVEKXS+hIqzBfCbpkBLZpl1tsYes1AGpYHd13w==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - eslint: '>=7.0.0' + eslint-plugin-astro@0.33.1(eslint@8.57.0): dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) '@jridgewell/sourcemap-codec': 1.4.15 @@ -3877,13 +6551,8 @@ packages: postcss-selector-parser: 6.0.16 transitivePeerDependencies: - supports-color - dev: true - /eslint-plugin-react@7.34.1(eslint@8.57.0): - resolution: {integrity: sha512-N97CxlouPT1AHt8Jn0mhhN2RrADlUAsk1/atcT2KyA/l9Q/E6ll7OIGwNumFmWfZ9skV3XXccYS19h80rHtgkw==} - engines: {node: '>=4'} - peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + eslint-plugin-react@7.34.1(eslint@8.57.0): dependencies: array-includes: 3.1.7 array.prototype.findlast: 1.2.4 @@ -3904,25 +6573,15 @@ packages: resolve: 2.0.0-next.5 semver: 6.3.1 string.prototype.matchall: 4.0.10 - dev: true - /eslint-scope@7.2.2: - resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + eslint-scope@7.2.2: dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 - dev: true - /eslint-visitor-keys@3.4.3: - resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true + eslint-visitor-keys@3.4.3: {} - /eslint@8.57.0: - resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - hasBin: true + eslint@8.57.0: dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) '@eslint-community/regexpp': 4.10.0 @@ -3964,102 +6623,62 @@ packages: text-table: 0.2.0 transitivePeerDependencies: - supports-color - dev: true - /espree@9.6.1: - resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + espree@9.6.1: dependencies: acorn: 8.11.3 acorn-jsx: 5.3.2(acorn@8.11.3) eslint-visitor-keys: 3.4.3 - dev: true - /esprima@4.0.1: - resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} - engines: {node: '>=4'} - hasBin: true - dev: true + esprima@4.0.1: {} - /esquery@1.5.0: - resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} - engines: {node: '>=0.10'} + esquery@1.5.0: dependencies: estraverse: 5.3.0 - dev: true - /esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} + esrecurse@4.3.0: dependencies: estraverse: 5.3.0 - dev: true - /estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} - dev: true + estraverse@5.3.0: {} - /estree-util-attach-comments@3.0.0: - resolution: {integrity: sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==} + estree-util-attach-comments@3.0.0: dependencies: '@types/estree': 1.0.5 - dev: true - /estree-util-build-jsx@3.0.1: - resolution: {integrity: sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==} + estree-util-build-jsx@3.0.1: dependencies: '@types/estree-jsx': 1.0.5 devlop: 1.1.0 estree-util-is-identifier-name: 3.0.0 estree-walker: 3.0.3 - dev: true - /estree-util-is-identifier-name@3.0.0: - resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==} - dev: true + estree-util-is-identifier-name@3.0.0: {} - /estree-util-to-js@2.0.0: - resolution: {integrity: sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==} + estree-util-to-js@2.0.0: dependencies: '@types/estree-jsx': 1.0.5 astring: 1.8.6 source-map: 0.7.4 - dev: true - /estree-util-visit@2.0.0: - resolution: {integrity: sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==} + estree-util-visit@2.0.0: dependencies: '@types/estree-jsx': 1.0.5 '@types/unist': 3.0.2 - dev: true - /estree-walker@2.0.2: - resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} - dev: true + estree-walker@2.0.2: {} - /estree-walker@3.0.3: - resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + estree-walker@3.0.3: dependencies: '@types/estree': 1.0.5 - dev: true - /esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} - dev: true + esutils@2.0.3: {} - /eventemitter3@4.0.7: - resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} - dev: true + eventemitter3@4.0.7: {} - /eventemitter3@5.0.1: - resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} - dev: true + eventemitter3@5.0.1: {} - /execa@8.0.1: - resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} - engines: {node: '>=16.17'} + execa@8.0.1: dependencies: cross-spawn: 7.0.3 get-stream: 8.0.1 @@ -4070,47 +6689,29 @@ packages: onetime: 6.0.0 signal-exit: 4.1.0 strip-final-newline: 3.0.0 - dev: true - /expand-template@2.0.3: - resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} - engines: {node: '>=6'} - requiresBuild: true - dev: true + expand-template@2.0.3: optional: true - /expressive-code@0.33.5: - resolution: {integrity: sha512-UPg2jSvZEfXPiCa4MKtMoMQ5Hwiv7In5/LSCa/ukhjzZqPO48iVsCcEBgXWEUmEAQ02P0z00/xFfBmVnUKH+Zw==} + expressive-code@0.33.5: dependencies: '@expressive-code/core': 0.33.5 '@expressive-code/plugin-frames': 0.33.5 '@expressive-code/plugin-shiki': 0.33.5 '@expressive-code/plugin-text-markers': 0.33.5 - dev: true - /extend-shallow@2.0.1: - resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} - engines: {node: '>=0.10.0'} + extend-shallow@2.0.1: dependencies: is-extendable: 0.1.1 - dev: true - /extend@3.0.2: - resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + extend@3.0.2: {} - /fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - dev: true + fast-deep-equal@3.1.3: {} - /fast-fifo@1.3.2: - resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} - requiresBuild: true - dev: true + fast-fifo@1.3.2: optional: true - /fast-glob@3.3.2: - resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} - engines: {node: '>=8.6.0'} + fast-glob@3.3.2: dependencies: '@nodelib/fs.stat': 2.0.5 '@nodelib/fs.walk': 1.2.8 @@ -4118,209 +6719,124 @@ packages: merge2: 1.4.1 micromatch: 4.0.5 - /fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - dev: true + fast-json-stable-stringify@2.1.0: {} - /fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - dev: true + fast-levenshtein@2.0.6: {} - /fastq@1.17.1: - resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + fastq@1.17.1: dependencies: reusify: 1.0.4 - /fetch-blob@3.2.0: - resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} - engines: {node: ^12.20 || >= 14.13} + fetch-blob@3.2.0: dependencies: node-domexception: 1.0.0 web-streams-polyfill: 3.3.3 - dev: true - /file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} + file-entry-cache@6.0.1: dependencies: flat-cache: 3.2.0 - dev: true - /file-set@4.0.2: - resolution: {integrity: sha512-fuxEgzk4L8waGXaAkd8cMr73Pm0FxOVkn8hztzUW7BAHhOGH90viQNXbiOsnecCWmfInqU6YmAMwxRMdKETceQ==} - engines: {node: '>=10'} + file-set@4.0.2: dependencies: array-back: 5.0.0 glob: 7.2.3 - dev: false - /fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} - engines: {node: '>=8'} + fill-range@7.0.1: dependencies: to-regex-range: 5.0.1 - /find-up@4.1.0: - resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} - engines: {node: '>=8'} + find-up@4.1.0: dependencies: locate-path: 5.0.0 path-exists: 4.0.0 - dev: true - /find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} + find-up@5.0.0: dependencies: locate-path: 6.0.0 path-exists: 4.0.0 - dev: true - /find-yarn-workspace-root2@1.2.16: - resolution: {integrity: sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA==} + find-yarn-workspace-root2@1.2.16: dependencies: micromatch: 4.0.5 pkg-dir: 4.2.0 - dev: true - /flat-cache@3.2.0: - resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} - engines: {node: ^10.12.0 || >=12.0.0} + flat-cache@3.2.0: dependencies: flatted: 3.3.1 keyv: 4.5.4 rimraf: 3.0.2 - dev: true - /flatted@3.3.1: - resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} - dev: true + flatted@3.3.1: {} - /flattie@1.1.1: - resolution: {integrity: sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ==} - engines: {node: '>=8'} - dev: true + flattie@1.1.1: {} - /for-each@0.3.3: - resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + for-each@0.3.3: dependencies: is-callable: 1.2.7 - dev: true - /formdata-polyfill@4.0.10: - resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} - engines: {node: '>=12.20.0'} + formdata-polyfill@4.0.10: dependencies: fetch-blob: 3.2.0 - dev: true - /fs-constants@1.0.0: - resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} - requiresBuild: true - dev: true + fs-constants@1.0.0: optional: true - /fs-then-native@2.0.0: - resolution: {integrity: sha512-X712jAOaWXkemQCAmWeg5rOT2i+KOpWz1Z/txk/cW0qlOu2oQ9H61vc5w3X/iyuUEfq/OyaFJ78/cZAQD1/bgA==} - engines: {node: '>=4.0.0'} - dev: false + fs-then-native@2.0.0: {} - /fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + fs.realpath@1.0.0: {} - /fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - requiresBuild: true + fsevents@2.3.3: optional: true - /function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - dev: true + function-bind@1.1.2: {} - /function.prototype.name@1.1.6: - resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} - engines: {node: '>= 0.4'} + function.prototype.name@1.1.6: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.22.5 functions-have-names: 1.2.3 - dev: true - /functions-have-names@1.2.3: - resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - dev: true + functions-have-names@1.2.3: {} - /gensync@1.0.0-beta.2: - resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} - engines: {node: '>=6.9.0'} - dev: true + gensync@1.0.0-beta.2: {} - /get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - dev: false + get-caller-file@2.0.5: {} - /get-east-asian-width@1.2.0: - resolution: {integrity: sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==} - engines: {node: '>=18'} - dev: true + get-east-asian-width@1.2.0: {} - /get-func-name@2.0.2: - resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - dev: true + get-func-name@2.0.2: {} - /get-intrinsic@1.2.4: - resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} - engines: {node: '>= 0.4'} + get-intrinsic@1.2.4: dependencies: es-errors: 1.3.0 function-bind: 1.1.2 has-proto: 1.0.3 has-symbols: 1.0.3 hasown: 2.0.2 - dev: true - /get-stream@8.0.1: - resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} - engines: {node: '>=16'} - dev: true + get-stream@8.0.1: {} - /get-symbol-description@1.0.2: - resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} - engines: {node: '>= 0.4'} + get-symbol-description@1.0.2: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 get-intrinsic: 1.2.4 - dev: true - /github-from-package@0.0.0: - resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} - requiresBuild: true - dev: true + github-from-package@0.0.0: optional: true - /github-slugger@2.0.0: - resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} + github-slugger@2.0.0: {} - /glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} + glob-parent@5.1.2: dependencies: is-glob: 4.0.3 - /glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} + glob-parent@6.0.2: dependencies: is-glob: 4.0.3 - dev: true - /glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + glob@7.2.3: dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 @@ -4329,28 +6845,17 @@ packages: once: 1.4.0 path-is-absolute: 1.0.1 - /globals@11.12.0: - resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} - engines: {node: '>=4'} - dev: true + globals@11.12.0: {} - /globals@13.24.0: - resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} - engines: {node: '>=8'} + globals@13.24.0: dependencies: type-fest: 0.20.2 - dev: true - /globalthis@1.0.3: - resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} - engines: {node: '>= 0.4'} + globalthis@1.0.3: dependencies: define-properties: 1.2.1 - dev: true - /globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} + globby@11.1.0: dependencies: array-union: 2.1.0 dir-glob: 3.0.1 @@ -4358,77 +6863,45 @@ packages: ignore: 5.3.1 merge2: 1.4.1 slash: 3.0.0 - dev: true - /gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + gopd@1.0.1: dependencies: get-intrinsic: 1.2.4 - dev: true - /graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + graceful-fs@4.2.11: {} - /graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - dev: true + graphemer@1.4.0: {} - /gray-matter@4.0.3: - resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==} - engines: {node: '>=6.0'} + gray-matter@4.0.3: dependencies: js-yaml: 3.14.1 kind-of: 6.0.3 section-matter: 1.0.0 strip-bom-string: 1.0.0 - dev: true - /has-bigints@1.0.2: - resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} - dev: true + has-bigints@1.0.2: {} - /has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} - dev: true + has-flag@3.0.0: {} - /has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - dev: true + has-flag@4.0.0: {} - /has-property-descriptors@1.0.2: - resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + has-property-descriptors@1.0.2: dependencies: es-define-property: 1.0.0 - dev: true - /has-proto@1.0.3: - resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} - engines: {node: '>= 0.4'} - dev: true + has-proto@1.0.3: {} - /has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} - engines: {node: '>= 0.4'} - dev: true + has-symbols@1.0.3: {} - /has-tostringtag@1.0.2: - resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} - engines: {node: '>= 0.4'} + has-tostringtag@1.0.2: dependencies: has-symbols: 1.0.3 - dev: true - /hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} - engines: {node: '>= 0.4'} + hasown@2.0.2: dependencies: function-bind: 1.1.2 - dev: true - /hast-util-from-html@2.0.1: - resolution: {integrity: sha512-RXQBLMl9kjKVNkJTIO6bZyb2n+cUH8LFaSSzo82jiLT6Tfc+Pt7VQCS+/h3YwG4jaNE2TA2sdJisGWR+aJrp0g==} + hast-util-from-html@2.0.1: dependencies: '@types/hast': 3.0.4 devlop: 1.1.0 @@ -4436,10 +6909,8 @@ packages: parse5: 7.1.2 vfile: 6.0.1 vfile-message: 4.0.2 - dev: true - /hast-util-from-parse5@7.1.2: - resolution: {integrity: sha512-Nz7FfPBuljzsN3tCQ4kCBKqdNhQE2l0Tn+X1ubgKBPRoiDIu1mL08Cfw4k7q71+Duyaw7DXDN+VTAp4Vh3oCOw==} + hast-util-from-parse5@7.1.2: dependencies: '@types/hast': 2.3.10 '@types/unist': 2.0.10 @@ -4448,10 +6919,8 @@ packages: vfile: 5.3.7 vfile-location: 4.1.0 web-namespaces: 2.0.1 - dev: true - /hast-util-from-parse5@8.0.1: - resolution: {integrity: sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==} + hast-util-from-parse5@8.0.1: dependencies: '@types/hast': 3.0.4 '@types/unist': 3.0.2 @@ -4461,33 +6930,24 @@ packages: vfile: 6.0.1 vfile-location: 5.0.2 web-namespaces: 2.0.1 - dev: true - /hast-util-heading-rank@3.0.0: - resolution: {integrity: sha512-EJKb8oMUXVHcWZTDepnr+WNbfnXKFNf9duMesmr4S8SXTJBJ9M4Yok08pu9vxdJwdlGRhVumk9mEhkEvKGifwA==} + hast-util-heading-rank@3.0.0: dependencies: '@types/hast': 3.0.4 - dev: false - /hast-util-is-element@3.0.0: - resolution: {integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==} + hast-util-is-element@3.0.0: dependencies: '@types/hast': 3.0.4 - /hast-util-parse-selector@3.1.1: - resolution: {integrity: sha512-jdlwBjEexy1oGz0aJ2f4GKMaVKkA9jwjr4MjAAI22E5fM/TXVZHuS5OpONtdeIkRKqAaryQ2E9xNQxijoThSZA==} + hast-util-parse-selector@3.1.1: dependencies: '@types/hast': 2.3.10 - dev: true - /hast-util-parse-selector@4.0.0: - resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} + hast-util-parse-selector@4.0.0: dependencies: '@types/hast': 3.0.4 - dev: true - /hast-util-raw@7.2.3: - resolution: {integrity: sha512-RujVQfVsOrxzPOPSzZFiwofMArbQke6DJjnFfceiEbFh7S05CbPt0cYN+A5YeD3pso0JQk6O1aHBnx9+Pm2uqg==} + hast-util-raw@7.2.3: dependencies: '@types/hast': 2.3.10 '@types/parse5': 6.0.3 @@ -4500,10 +6960,8 @@ packages: vfile: 5.3.7 web-namespaces: 2.0.1 zwitch: 2.0.4 - dev: true - /hast-util-raw@9.0.2: - resolution: {integrity: sha512-PldBy71wO9Uq1kyaMch9AHIghtQvIwxBUkv823pKmkTM3oV1JxtsTNYdevMxvUHqcnOAuO65JKU2+0NOxc2ksA==} + hast-util-raw@9.0.2: dependencies: '@types/hast': 3.0.4 '@types/unist': 3.0.2 @@ -4518,10 +6976,8 @@ packages: vfile: 6.0.1 web-namespaces: 2.0.1 zwitch: 2.0.4 - dev: true - /hast-util-to-estree@3.1.0: - resolution: {integrity: sha512-lfX5g6hqVh9kjS/B9E2gSkvHH4SZNiQFiqWS0x9fENzEl+8W12RqdRxX6d/Cwxi30tPQs3bIO+aolQJNp1bIyw==} + hast-util-to-estree@3.1.0: dependencies: '@types/estree': 1.0.5 '@types/estree-jsx': 1.0.5 @@ -4541,10 +6997,8 @@ packages: zwitch: 2.0.4 transitivePeerDependencies: - supports-color - dev: true - /hast-util-to-html@8.0.4: - resolution: {integrity: sha512-4tpQTUOr9BMjtYyNlt0P50mH7xj0Ks2xpo8M943Vykljf99HW6EzulIoJP1N3eKOSScEHzyzi9dm7/cn0RfGwA==} + hast-util-to-html@8.0.4: dependencies: '@types/hast': 2.3.10 '@types/unist': 2.0.10 @@ -4557,10 +7011,8 @@ packages: space-separated-tokens: 2.0.2 stringify-entities: 4.0.3 zwitch: 2.0.4 - dev: true - /hast-util-to-html@9.0.0: - resolution: {integrity: sha512-IVGhNgg7vANuUA2XKrT6sOIIPgaYZnmLx3l/CCOAK0PtgfoHrZwX7jCSYyFxHTrGmC6S9q8aQQekjp4JPZF+cw==} + hast-util-to-html@9.0.0: dependencies: '@types/hast': 3.0.4 '@types/unist': 3.0.2 @@ -4574,10 +7026,8 @@ packages: space-separated-tokens: 2.0.2 stringify-entities: 4.0.3 zwitch: 2.0.4 - dev: true - /hast-util-to-jsx-runtime@2.3.0: - resolution: {integrity: sha512-H/y0+IWPdsLLS738P8tDnrQ8Z+dj12zQQ6WC11TIM21C8WFVoIxcqWXf2H3hiTVZjF1AWqoimGwrTWecWrnmRQ==} + hast-util-to-jsx-runtime@2.3.0: dependencies: '@types/estree': 1.0.5 '@types/hast': 3.0.4 @@ -4596,10 +7046,8 @@ packages: vfile-message: 4.0.2 transitivePeerDependencies: - supports-color - dev: true - /hast-util-to-parse5@7.1.0: - resolution: {integrity: sha512-YNRgAJkH2Jky5ySkIqFXTQiaqcAtJyVE+D5lkN6CdtOqrnkLfGYYrEcKuHOJZlp+MwjSwuD3fZuawI+sic/RBw==} + hast-util-to-parse5@7.1.0: dependencies: '@types/hast': 2.3.10 comma-separated-tokens: 2.0.3 @@ -4607,10 +7055,8 @@ packages: space-separated-tokens: 2.0.2 web-namespaces: 2.0.1 zwitch: 2.0.4 - dev: true - /hast-util-to-parse5@8.0.0: - resolution: {integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==} + hast-util-to-parse5@8.0.0: dependencies: '@types/hast': 3.0.4 comma-separated-tokens: 2.0.3 @@ -4619,485 +7065,280 @@ packages: space-separated-tokens: 2.0.2 web-namespaces: 2.0.1 zwitch: 2.0.4 - dev: true - /hast-util-to-string@3.0.0: - resolution: {integrity: sha512-OGkAxX1Ua3cbcW6EJ5pT/tslVb90uViVkcJ4ZZIMW/R33DX/AkcJcRrPebPwJkHYwlDHXz4aIwvAAaAdtrACFA==} + hast-util-to-string@3.0.0: dependencies: '@types/hast': 3.0.4 - /hast-util-to-text@4.0.0: - resolution: {integrity: sha512-EWiE1FSArNBPUo1cKWtzqgnuRQwEeQbQtnFJRYV1hb1BWDgrAlBU0ExptvZMM/KSA82cDpm2sFGf3Dmc5Mza3w==} + hast-util-to-text@4.0.0: dependencies: '@types/hast': 3.0.4 '@types/unist': 3.0.2 hast-util-is-element: 3.0.0 unist-util-find-after: 5.0.0 - dev: true - /hast-util-whitespace@2.0.1: - resolution: {integrity: sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng==} - dev: true + hast-util-whitespace@2.0.1: {} - /hast-util-whitespace@3.0.0: - resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + hast-util-whitespace@3.0.0: dependencies: '@types/hast': 3.0.4 - dev: true - /hastscript@7.2.0: - resolution: {integrity: sha512-TtYPq24IldU8iKoJQqvZOuhi5CyCQRAbvDOX0x1eW6rsHSxa/1i2CCiptNTotGHJ3VoHRGmqiv6/D3q113ikkw==} + hastscript@7.2.0: dependencies: '@types/hast': 2.3.10 comma-separated-tokens: 2.0.3 hast-util-parse-selector: 3.1.1 property-information: 6.4.1 space-separated-tokens: 2.0.2 - dev: true - /hastscript@8.0.0: - resolution: {integrity: sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==} + hastscript@8.0.0: dependencies: '@types/hast': 3.0.4 comma-separated-tokens: 2.0.3 hast-util-parse-selector: 4.0.0 property-information: 6.4.1 space-separated-tokens: 2.0.2 - dev: true - /hastscript@9.0.0: - resolution: {integrity: sha512-jzaLBGavEDKHrc5EfFImKN7nZKKBdSLIdGvCwDZ9TfzbF2ffXiov8CKE445L2Z1Ek2t/m4SKQ2j6Ipv7NyUolw==} + hastscript@9.0.0: dependencies: '@types/hast': 3.0.4 comma-separated-tokens: 2.0.3 hast-util-parse-selector: 4.0.0 property-information: 6.4.1 space-separated-tokens: 2.0.2 - dev: true - /he@1.2.0: - resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} - hasBin: true - dev: true + he@1.2.0: {} - /html-escaper@3.0.3: - resolution: {integrity: sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==} - dev: true + html-escaper@3.0.3: {} - /html-void-elements@2.0.1: - resolution: {integrity: sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==} - dev: true + html-void-elements@2.0.1: {} - /html-void-elements@3.0.0: - resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} - dev: true + html-void-elements@3.0.0: {} - /htmlparser2@9.1.0: - resolution: {integrity: sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ==} + htmlparser2@9.1.0: dependencies: domelementtype: 2.3.0 domhandler: 5.0.3 domutils: 3.1.0 entities: 4.5.0 - dev: true - /http-cache-semantics@4.1.1: - resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} - dev: true + http-cache-semantics@4.1.1: {} - /human-signals@5.0.0: - resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} - engines: {node: '>=16.17.0'} - dev: true + human-signals@5.0.0: {} - /husky@9.0.11: - resolution: {integrity: sha512-AB6lFlbwwyIqMdHYhwPe+kjOC3Oc5P3nThEoW/AaO2BX3vJDjWPFxYLxokUZOo6RNX20He3AaT8sESs9NJcmEw==} - engines: {node: '>=18'} - hasBin: true - dev: true + husky@9.0.11: {} - /ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - dev: true + ieee754@1.2.1: {} - /ignore@5.3.1: - resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} - engines: {node: '>= 4'} - dev: true + ignore@5.3.1: {} - /immutable@4.3.5: - resolution: {integrity: sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw==} + immutable@4.3.5: {} - /import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} - engines: {node: '>=6'} + import-fresh@3.3.0: dependencies: parent-module: 1.0.1 resolve-from: 4.0.0 - dev: true - /import-meta-resolve@4.0.0: - resolution: {integrity: sha512-okYUR7ZQPH+efeuMJGlq4f8ubUgO50kByRPyt/Cy1Io4PSRsPjxME+YlVaCOx+NIToW7hCsZNFJyTPFFKepRSA==} - dev: true + import-meta-resolve@4.0.0: {} - /imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} - dev: true + imurmurhash@0.1.4: {} - /inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + inflight@1.0.6: dependencies: once: 1.4.0 wrappy: 1.0.2 - /inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + inherits@2.0.4: {} - /ini@1.3.8: - resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} - requiresBuild: true - dev: true + ini@1.3.8: optional: true - /inline-style-parser@0.1.1: - resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==} - dev: true + inline-style-parser@0.1.1: {} - /inline-style-parser@0.2.3: - resolution: {integrity: sha512-qlD8YNDqyTKTyuITrDOffsl6Tdhv+UC4hcdAVuQsK4IMQ99nSgd1MIA/Q+jQYoh9r3hVUXhYh7urSRmXPkW04g==} - dev: true + inline-style-parser@0.2.3: {} - /internal-slot@1.0.7: - resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} - engines: {node: '>= 0.4'} + internal-slot@1.0.7: dependencies: es-errors: 1.3.0 hasown: 2.0.2 side-channel: 1.0.6 - dev: true - /is-alphabetical@2.0.1: - resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} - dev: true + is-alphabetical@2.0.1: {} - /is-alphanumerical@2.0.1: - resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} + is-alphanumerical@2.0.1: dependencies: is-alphabetical: 2.0.1 is-decimal: 2.0.1 - dev: true - /is-array-buffer@3.0.4: - resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} - engines: {node: '>= 0.4'} + is-array-buffer@3.0.4: dependencies: call-bind: 1.0.7 get-intrinsic: 1.2.4 - dev: true - /is-arrayish@0.3.2: - resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} - requiresBuild: true - dev: true + is-arrayish@0.3.2: optional: true - /is-async-function@2.0.0: - resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==} - engines: {node: '>= 0.4'} + is-async-function@2.0.0: dependencies: has-tostringtag: 1.0.2 - dev: true - /is-bigint@1.0.4: - resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + is-bigint@1.0.4: dependencies: has-bigints: 1.0.2 - dev: true - /is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} + is-binary-path@2.1.0: dependencies: binary-extensions: 2.3.0 - /is-boolean-object@1.1.2: - resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} - engines: {node: '>= 0.4'} + is-boolean-object@1.1.2: dependencies: call-bind: 1.0.7 has-tostringtag: 1.0.2 - dev: true - /is-buffer@2.0.5: - resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} - engines: {node: '>=4'} - dev: true + is-buffer@2.0.5: {} - /is-callable@1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} - dev: true + is-callable@1.2.7: {} - /is-core-module@2.13.1: - resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + is-core-module@2.13.1: dependencies: hasown: 2.0.2 - dev: true - /is-data-view@1.0.1: - resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} - engines: {node: '>= 0.4'} + is-data-view@1.0.1: dependencies: is-typed-array: 1.1.13 - dev: true - /is-date-object@1.0.5: - resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} - engines: {node: '>= 0.4'} + is-date-object@1.0.5: dependencies: has-tostringtag: 1.0.2 - dev: true - /is-decimal@2.0.1: - resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} - dev: true + is-decimal@2.0.1: {} - /is-docker@3.0.0: - resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - hasBin: true - dev: true + is-docker@3.0.0: {} - /is-extendable@0.1.1: - resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} - engines: {node: '>=0.10.0'} - dev: true + is-extendable@0.1.1: {} - /is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} + is-extglob@2.1.1: {} - /is-finalizationregistry@1.0.2: - resolution: {integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==} + is-finalizationregistry@1.0.2: dependencies: call-bind: 1.0.7 - dev: true - /is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} + is-fullwidth-code-point@3.0.0: {} - /is-fullwidth-code-point@4.0.0: - resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} - engines: {node: '>=12'} - dev: true + is-fullwidth-code-point@4.0.0: {} - /is-fullwidth-code-point@5.0.0: - resolution: {integrity: sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==} - engines: {node: '>=18'} + is-fullwidth-code-point@5.0.0: dependencies: get-east-asian-width: 1.2.0 - dev: true - /is-generator-function@1.0.10: - resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} - engines: {node: '>= 0.4'} + is-generator-function@1.0.10: dependencies: has-tostringtag: 1.0.2 - dev: true - /is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} + is-glob@4.0.3: dependencies: is-extglob: 2.1.1 - /is-hexadecimal@2.0.1: - resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} - dev: true + is-hexadecimal@2.0.1: {} - /is-inside-container@1.0.0: - resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} - engines: {node: '>=14.16'} - hasBin: true + is-inside-container@1.0.0: dependencies: is-docker: 3.0.0 - dev: true - /is-interactive@2.0.0: - resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==} - engines: {node: '>=12'} - dev: true + is-interactive@2.0.0: {} - /is-map@2.0.3: - resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} - engines: {node: '>= 0.4'} - dev: true + is-map@2.0.3: {} - /is-negative-zero@2.0.3: - resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} - engines: {node: '>= 0.4'} - dev: true + is-negative-zero@2.0.3: {} - /is-network-error@1.1.0: - resolution: {integrity: sha512-tUdRRAnhT+OtCZR/LxZelH/C7QtjtFrTu5tXCA8pl55eTUElUHT+GPYV8MBMBvea/j+NxQqVt3LbWMRir7Gx9g==} - engines: {node: '>=16'} - dev: true + is-network-error@1.1.0: {} - /is-number-object@1.0.7: - resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} - engines: {node: '>= 0.4'} + is-number-object@1.0.7: dependencies: has-tostringtag: 1.0.2 - dev: true - /is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} + is-number@7.0.0: {} - /is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} - dev: true + is-path-inside@3.0.3: {} - /is-plain-obj@4.1.0: - resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} - engines: {node: '>=12'} + is-plain-obj@4.1.0: {} - /is-reference@3.0.2: - resolution: {integrity: sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==} + is-reference@3.0.2: dependencies: '@types/estree': 1.0.5 - dev: true - /is-regex@1.1.4: - resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} - engines: {node: '>= 0.4'} + is-regex@1.1.4: dependencies: call-bind: 1.0.7 has-tostringtag: 1.0.2 - dev: true - /is-set@2.0.3: - resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} - engines: {node: '>= 0.4'} - dev: true + is-set@2.0.3: {} - /is-shared-array-buffer@1.0.3: - resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} - engines: {node: '>= 0.4'} + is-shared-array-buffer@1.0.3: dependencies: call-bind: 1.0.7 - dev: true - /is-stream@3.0.0: - resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true + is-stream@3.0.0: {} - /is-string@1.0.7: - resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} - engines: {node: '>= 0.4'} + is-string@1.0.7: dependencies: has-tostringtag: 1.0.2 - dev: true - /is-symbol@1.0.4: - resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} - engines: {node: '>= 0.4'} + is-symbol@1.0.4: dependencies: has-symbols: 1.0.3 - dev: true - /is-typed-array@1.1.13: - resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} - engines: {node: '>= 0.4'} + is-typed-array@1.1.13: dependencies: which-typed-array: 1.1.15 - dev: true - /is-unicode-supported@1.3.0: - resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} - engines: {node: '>=12'} - dev: true + is-unicode-supported@1.3.0: {} - /is-weakmap@2.0.2: - resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} - engines: {node: '>= 0.4'} - dev: true + is-weakmap@2.0.2: {} - /is-weakref@1.0.2: - resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + is-weakref@1.0.2: dependencies: call-bind: 1.0.7 - dev: true - /is-weakset@2.0.3: - resolution: {integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==} - engines: {node: '>= 0.4'} + is-weakset@2.0.3: dependencies: call-bind: 1.0.7 get-intrinsic: 1.2.4 - dev: true - /is-wsl@3.1.0: - resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} - engines: {node: '>=16'} + is-wsl@3.1.0: dependencies: is-inside-container: 1.0.0 - dev: true - /isarray@2.0.5: - resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} - dev: true + isarray@2.0.5: {} - /isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - dev: true + isexe@2.0.0: {} - /iterator.prototype@1.1.2: - resolution: {integrity: sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==} + iterator.prototype@1.1.2: dependencies: define-properties: 1.2.1 get-intrinsic: 1.2.4 has-symbols: 1.0.3 reflect.getprototypeof: 1.0.6 set-function-name: 2.0.2 - dev: true - /js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - dev: true + js-tokens@4.0.0: {} - /js-tokens@8.0.3: - resolution: {integrity: sha512-UfJMcSJc+SEXEl9lH/VLHSZbThQyLpw1vLO1Lb+j4RWDvG3N2f7yj3PVQA3cmkTBNldJ9eFnM+xEXxHIXrYiJw==} - dev: true + js-tokens@8.0.3: {} - /js-yaml@3.14.1: - resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} - hasBin: true + js-yaml@3.14.1: dependencies: argparse: 1.0.10 esprima: 4.0.1 - dev: true - /js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true + js-yaml@4.1.0: dependencies: argparse: 2.0.1 - dev: true - /js2xmlparser@4.0.2: - resolution: {integrity: sha512-6n4D8gLlLf1n5mNLQPRfViYzu9RATblzPEtm1SthMX1Pjao0r9YI9nw7ZIfRxQMERS87mcswrg+r/OYrPRX6jA==} + js2xmlparser@4.0.2: dependencies: xmlcreate: 2.0.4 - dev: false - /jsdoc-api@8.0.0: - resolution: {integrity: sha512-Rnhor0suB1Ds1abjmFkFfKeD+kSMRN9oHMTMZoJVUrmtCGDwXty+sWMA9sa4xbe4UyxuPjhC7tavZ40mDKK6QQ==} - engines: {node: '>=12.17'} + jsdoc-api@8.0.0: dependencies: array-back: 6.2.2 cache-point: 2.0.0 @@ -5108,12 +7349,8 @@ packages: object-to-spawn-args: 2.0.1 temp-path: 1.0.0 walk-back: 5.1.0 - dev: false - /jsdoc@4.0.2: - resolution: {integrity: sha512-e8cIg2z62InH7azBBi3EsSEqrKx+nUtAS5bBcYTSpZFA+vhNPyhv8PTFZ0WsjOPDj04/dOLlm08EDcQJDqaGQg==} - engines: {node: '>=12.0.0'} - hasBin: true + jsdoc@4.0.2: dependencies: '@babel/parser': 7.24.1 '@jsdoc/salty': 0.2.7 @@ -5129,104 +7366,57 @@ packages: mkdirp: 1.0.4 requizzle: 0.2.4 strip-json-comments: 3.1.1 - underscore: 1.13.6 - dev: false - - /jsesc@2.5.2: - resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} - engines: {node: '>=4'} - hasBin: true - dev: true + underscore: 1.13.6 - /json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - dev: true + jsesc@2.5.2: {} - /json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - dev: true + json-buffer@3.0.1: {} - /json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - dev: true + json-schema-traverse@0.4.1: {} - /json5@2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} - engines: {node: '>=6'} - hasBin: true - dev: true + json-stable-stringify-without-jsonify@1.0.1: {} - /jsonc-parser@2.3.1: - resolution: {integrity: sha512-H8jvkz1O50L3dMZCsLqiuB2tA7muqbSg1AtGEkN0leAqGjsUzDJir3Zwr02BhqdcITPg3ei3mZ+HjMocAknhhg==} - dev: false + json5@2.2.3: {} - /jsonc-parser@3.2.1: - resolution: {integrity: sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==} - dev: true + jsonc-parser@2.3.1: {} - /jsx-ast-utils@3.3.5: - resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} - engines: {node: '>=4.0'} + jsonc-parser@3.2.1: {} + + jsx-ast-utils@3.3.5: dependencies: array-includes: 3.1.7 array.prototype.flat: 1.3.2 object.assign: 4.1.5 object.values: 1.2.0 - dev: true - /keyv@4.5.4: - resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + keyv@4.5.4: dependencies: json-buffer: 3.0.1 - dev: true - /kind-of@6.0.3: - resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} - engines: {node: '>=0.10.0'} - dev: true + kind-of@6.0.3: {} - /klaw@3.0.0: - resolution: {integrity: sha512-0Fo5oir+O9jnXu5EefYbVK+mHMBeEVEy2cmctR1O1NECcCkPRreJKrS6Qt/j3KC2C148Dfo9i3pCmCMsdqGr0g==} + klaw@3.0.0: dependencies: graceful-fs: 4.2.11 - dev: false - /kleur@3.0.3: - resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} - engines: {node: '>=6'} - dev: true + kleur@3.0.3: {} - /kleur@4.1.5: - resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} - engines: {node: '>=6'} + kleur@4.1.5: {} - /kolorist@1.8.0: - resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} - dev: true + kolorist@1.8.0: {} - /levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} + levn@0.4.1: dependencies: prelude-ls: 1.2.1 type-check: 0.4.0 - dev: true - /lilconfig@3.0.0: - resolution: {integrity: sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==} - engines: {node: '>=14'} - dev: true + lilconfig@3.0.0: {} - /linkify-it@3.0.3: - resolution: {integrity: sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==} + linkify-it@3.0.3: dependencies: uc.micro: 1.0.6 - dev: false - /lint-staged@15.2.2: - resolution: {integrity: sha512-TiTt93OPh1OZOsb5B7k96A/ATl2AjIZo+vnzFZ6oHK5FuTk63ByDtxGQpHm+kFETjEWqgkF95M8FRXKR/LEBcw==} - engines: {node: '>=18.12.0'} - hasBin: true + lint-staged@15.2.2: dependencies: chalk: 5.3.0 commander: 11.1.0 @@ -5240,11 +7430,8 @@ packages: yaml: 2.3.4 transitivePeerDependencies: - supports-color - dev: true - /listr2@8.0.1: - resolution: {integrity: sha512-ovJXBXkKGfq+CwmKTjluEqFi3p4h8xvkxGQQAQan22YCgef4KZ1mKGjzfGh6PL6AW5Csw0QiQPNuQyH+6Xk3hA==} - engines: {node: '>=18.0.0'} + listr2@8.0.1: dependencies: cli-truncate: 4.0.0 colorette: 2.0.20 @@ -5252,161 +7439,101 @@ packages: log-update: 6.0.0 rfdc: 1.3.1 wrap-ansi: 9.0.0 - dev: true - /load-yaml-file@0.2.0: - resolution: {integrity: sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==} - engines: {node: '>=6'} + load-yaml-file@0.2.0: dependencies: graceful-fs: 4.2.11 js-yaml: 3.14.1 pify: 4.0.1 strip-bom: 3.0.0 - dev: true - /local-pkg@0.5.0: - resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==} - engines: {node: '>=14'} + local-pkg@0.5.0: dependencies: mlly: 1.6.1 pkg-types: 1.0.3 - dev: true - /locate-path@5.0.0: - resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} - engines: {node: '>=8'} + locate-path@5.0.0: dependencies: p-locate: 4.1.0 - dev: true - /locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} + locate-path@6.0.0: dependencies: p-locate: 5.0.0 - dev: true - /lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - dev: true + lodash.merge@4.6.2: {} - /lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - dev: false + lodash@4.17.21: {} - /log-symbols@5.1.0: - resolution: {integrity: sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==} - engines: {node: '>=12'} + log-symbols@5.1.0: dependencies: chalk: 5.3.0 is-unicode-supported: 1.3.0 - dev: true - /log-update@6.0.0: - resolution: {integrity: sha512-niTvB4gqvtof056rRIrTZvjNYE4rCUzO6X/X+kYjd7WFxXeJ0NwEFnRxX6ehkvv3jTwrXnNdtAak5XYZuIyPFw==} - engines: {node: '>=18'} + log-update@6.0.0: dependencies: ansi-escapes: 6.2.0 cli-cursor: 4.0.0 slice-ansi: 7.1.0 strip-ansi: 7.1.0 wrap-ansi: 9.0.0 - dev: true - /longest-streak@3.1.0: - resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + longest-streak@3.1.0: {} - /loose-envify@1.4.0: - resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} - hasBin: true + loose-envify@1.4.0: dependencies: js-tokens: 4.0.0 - dev: true - /loupe@2.3.7: - resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} + loupe@2.3.7: dependencies: get-func-name: 2.0.2 - dev: true - /lru-cache@4.1.5: - resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} + lru-cache@4.1.5: dependencies: pseudomap: 1.0.2 yallist: 2.1.2 - dev: true - /lru-cache@5.1.1: - resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + lru-cache@5.1.1: dependencies: yallist: 3.1.1 - dev: true - /lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} + lru-cache@6.0.0: dependencies: yallist: 4.0.0 - /magic-string@0.30.5: - resolution: {integrity: sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==} - engines: {node: '>=12'} + magic-string@0.30.5: dependencies: '@jridgewell/sourcemap-codec': 1.4.15 - dev: true - /magic-string@0.30.8: - resolution: {integrity: sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==} - engines: {node: '>=12'} + magic-string@0.30.8: dependencies: '@jridgewell/sourcemap-codec': 1.4.15 - dev: true - /markdown-extensions@2.0.0: - resolution: {integrity: sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==} - engines: {node: '>=16'} - dev: true + markdown-extensions@2.0.0: {} - /markdown-it-anchor@8.6.7(@types/markdown-it@12.2.3)(markdown-it@12.3.2): - resolution: {integrity: sha512-FlCHFwNnutLgVTflOYHPW2pPcl2AACqVzExlkGQNsi4CJgqOHN7YTgDd4LuhgN1BFO3TS0vLAruV1Td6dwWPJA==} - peerDependencies: - '@types/markdown-it': '*' - markdown-it: '*' + markdown-it-anchor@8.6.7(@types/markdown-it@12.2.3)(markdown-it@12.3.2): dependencies: '@types/markdown-it': 12.2.3 markdown-it: 12.3.2 - dev: false - /markdown-it@12.3.2: - resolution: {integrity: sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==} - hasBin: true + markdown-it@12.3.2: dependencies: argparse: 2.0.1 entities: 2.1.0 linkify-it: 3.0.3 mdurl: 1.0.1 uc.micro: 1.0.6 - dev: false - /markdown-table@3.0.3: - resolution: {integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==} + markdown-table@3.0.3: {} - /marked@4.3.0: - resolution: {integrity: sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==} - engines: {node: '>= 12'} - hasBin: true - dev: false + marked@4.3.0: {} - /mdast-util-definitions@6.0.0: - resolution: {integrity: sha512-scTllyX6pnYNZH/AIp/0ePz6s4cZtARxImwoPJ7kS42n+MnVsI4XbnG6d4ibehRIldYMWM2LD7ImQblVhUejVQ==} + mdast-util-definitions@6.0.0: dependencies: '@types/mdast': 4.0.3 '@types/unist': 3.0.2 unist-util-visit: 5.0.0 - dev: true - /mdast-util-directive@3.0.0: - resolution: {integrity: sha512-JUpYOqKI4mM3sZcNxmF/ox04XYFFkNwr0CFlrQIkCwbvH0xzMCqkMqAde9wRd80VAhaUrwFwKm2nxretdT1h7Q==} + mdast-util-directive@3.0.0: dependencies: '@types/mdast': 4.0.3 '@types/unist': 3.0.2 @@ -5418,18 +7545,15 @@ packages: unist-util-visit-parents: 6.0.1 transitivePeerDependencies: - supports-color - dev: true - /mdast-util-find-and-replace@3.0.1: - resolution: {integrity: sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==} + mdast-util-find-and-replace@3.0.1: dependencies: '@types/mdast': 4.0.3 escape-string-regexp: 5.0.0 unist-util-is: 6.0.0 unist-util-visit-parents: 6.0.1 - /mdast-util-from-markdown@2.0.0: - resolution: {integrity: sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==} + mdast-util-from-markdown@2.0.0: dependencies: '@types/mdast': 4.0.3 '@types/unist': 3.0.2 @@ -5446,8 +7570,7 @@ packages: transitivePeerDependencies: - supports-color - /mdast-util-gfm-autolink-literal@2.0.0: - resolution: {integrity: sha512-FyzMsduZZHSc3i0Px3PQcBT4WJY/X/RCtEJKuybiC6sjPqLv7h1yqAkmILZtuxMSsUyaLUWNp71+vQH2zqp5cg==} + mdast-util-gfm-autolink-literal@2.0.0: dependencies: '@types/mdast': 4.0.3 ccount: 2.0.1 @@ -5455,8 +7578,7 @@ packages: mdast-util-find-and-replace: 3.0.1 micromark-util-character: 2.1.0 - /mdast-util-gfm-footnote@2.0.0: - resolution: {integrity: sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ==} + mdast-util-gfm-footnote@2.0.0: dependencies: '@types/mdast': 4.0.3 devlop: 1.1.0 @@ -5466,8 +7588,7 @@ packages: transitivePeerDependencies: - supports-color - /mdast-util-gfm-strikethrough@2.0.0: - resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==} + mdast-util-gfm-strikethrough@2.0.0: dependencies: '@types/mdast': 4.0.3 mdast-util-from-markdown: 2.0.0 @@ -5475,8 +7596,7 @@ packages: transitivePeerDependencies: - supports-color - /mdast-util-gfm-table@2.0.0: - resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==} + mdast-util-gfm-table@2.0.0: dependencies: '@types/mdast': 4.0.3 devlop: 1.1.0 @@ -5486,8 +7606,7 @@ packages: transitivePeerDependencies: - supports-color - /mdast-util-gfm-task-list-item@2.0.0: - resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==} + mdast-util-gfm-task-list-item@2.0.0: dependencies: '@types/mdast': 4.0.3 devlop: 1.1.0 @@ -5496,8 +7615,7 @@ packages: transitivePeerDependencies: - supports-color - /mdast-util-gfm@3.0.0: - resolution: {integrity: sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw==} + mdast-util-gfm@3.0.0: dependencies: mdast-util-from-markdown: 2.0.0 mdast-util-gfm-autolink-literal: 2.0.0 @@ -5509,8 +7627,7 @@ packages: transitivePeerDependencies: - supports-color - /mdast-util-mdx-expression@2.0.0: - resolution: {integrity: sha512-fGCu8eWdKUKNu5mohVGkhBXCXGnOTLuFqOvGMvdikr+J1w7lDJgxThOKpwRWzzbyXAU2hhSwsmssOY4yTokluw==} + mdast-util-mdx-expression@2.0.0: dependencies: '@types/estree-jsx': 1.0.5 '@types/hast': 3.0.4 @@ -5520,10 +7637,8 @@ packages: mdast-util-to-markdown: 2.1.0 transitivePeerDependencies: - supports-color - dev: true - /mdast-util-mdx-jsx@3.1.2: - resolution: {integrity: sha512-eKMQDeywY2wlHc97k5eD8VC+9ASMjN8ItEZQNGwJ6E0XWKiW/Z0V5/H8pvoXUf+y+Mj0VIgeRRbujBmFn4FTyA==} + mdast-util-mdx-jsx@3.1.2: dependencies: '@types/estree-jsx': 1.0.5 '@types/hast': 3.0.4 @@ -5540,10 +7655,8 @@ packages: vfile-message: 4.0.2 transitivePeerDependencies: - supports-color - dev: true - /mdast-util-mdx@3.0.0: - resolution: {integrity: sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==} + mdast-util-mdx@3.0.0: dependencies: mdast-util-from-markdown: 2.0.0 mdast-util-mdx-expression: 2.0.0 @@ -5552,10 +7665,8 @@ packages: mdast-util-to-markdown: 2.1.0 transitivePeerDependencies: - supports-color - dev: true - /mdast-util-mdxjs-esm@2.0.1: - resolution: {integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==} + mdast-util-mdxjs-esm@2.0.1: dependencies: '@types/estree-jsx': 1.0.5 '@types/hast': 3.0.4 @@ -5565,16 +7676,13 @@ packages: mdast-util-to-markdown: 2.1.0 transitivePeerDependencies: - supports-color - dev: true - /mdast-util-phrasing@4.1.0: - resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} + mdast-util-phrasing@4.1.0: dependencies: '@types/mdast': 4.0.3 unist-util-is: 6.0.0 - /mdast-util-to-hast@13.1.0: - resolution: {integrity: sha512-/e2l/6+OdGp/FB+ctrJ9Avz71AN/GRH3oi/3KAx/kMnoUsD6q0woXlDT8lLEeViVKE7oZxE7RXzvO3T8kF2/sA==} + mdast-util-to-hast@13.1.0: dependencies: '@types/hast': 3.0.4 '@types/mdast': 4.0.3 @@ -5585,10 +7693,8 @@ packages: unist-util-position: 5.0.0 unist-util-visit: 5.0.0 vfile: 6.0.1 - dev: true - /mdast-util-to-markdown@2.1.0: - resolution: {integrity: sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==} + mdast-util-to-markdown@2.1.0: dependencies: '@types/mdast': 4.0.3 '@types/unist': 3.0.2 @@ -5599,25 +7705,17 @@ packages: unist-util-visit: 5.0.0 zwitch: 2.0.4 - /mdast-util-to-string@4.0.0: - resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + mdast-util-to-string@4.0.0: dependencies: '@types/mdast': 4.0.3 - /mdurl@1.0.1: - resolution: {integrity: sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==} - dev: false + mdurl@1.0.1: {} - /merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} - dev: true + merge-stream@2.0.0: {} - /merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} + merge2@1.4.1: {} - /micromark-core-commonmark@2.0.0: - resolution: {integrity: sha512-jThOz/pVmAYUtkroV3D5c1osFXAMv9e0ypGDOIZuCeAe91/sD6BoE2Sjzt30yuXtwOYUmySOhMas/PVyh02itA==} + micromark-core-commonmark@2.0.0: dependencies: decode-named-character-reference: 1.0.2 devlop: 1.1.0 @@ -5636,8 +7734,7 @@ packages: micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 - /micromark-extension-directive@3.0.0: - resolution: {integrity: sha512-61OI07qpQrERc+0wEysLHMvoiO3s2R56x5u7glHq2Yqq6EHbH4dW25G9GfDdGCDYqA21KE6DWgNSzxSwHc2hSg==} + micromark-extension-directive@3.0.0: dependencies: devlop: 1.1.0 micromark-factory-space: 2.0.0 @@ -5646,18 +7743,15 @@ packages: micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 parse-entities: 4.0.1 - dev: true - /micromark-extension-gfm-autolink-literal@2.0.0: - resolution: {integrity: sha512-rTHfnpt/Q7dEAK1Y5ii0W8bhfJlVJFnJMHIPisfPK3gpVNuOP0VnRl96+YJ3RYWV/P4gFeQoGKNlT3RhuvpqAg==} + micromark-extension-gfm-autolink-literal@2.0.0: dependencies: micromark-util-character: 2.1.0 micromark-util-sanitize-uri: 2.0.0 micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 - /micromark-extension-gfm-footnote@2.0.0: - resolution: {integrity: sha512-6Rzu0CYRKDv3BfLAUnZsSlzx3ak6HAoI85KTiijuKIz5UxZxbUI+pD6oHgw+6UtQuiRwnGRhzMmPRv4smcz0fg==} + micromark-extension-gfm-footnote@2.0.0: dependencies: devlop: 1.1.0 micromark-core-commonmark: 2.0.0 @@ -5668,8 +7762,7 @@ packages: micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 - /micromark-extension-gfm-strikethrough@2.0.0: - resolution: {integrity: sha512-c3BR1ClMp5fxxmwP6AoOY2fXO9U8uFMKs4ADD66ahLTNcwzSCyRVU4k7LPV5Nxo/VJiR4TdzxRQY2v3qIUceCw==} + micromark-extension-gfm-strikethrough@2.0.0: dependencies: devlop: 1.1.0 micromark-util-chunked: 2.0.0 @@ -5678,8 +7771,7 @@ packages: micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 - /micromark-extension-gfm-table@2.0.0: - resolution: {integrity: sha512-PoHlhypg1ItIucOaHmKE8fbin3vTLpDOUg8KAr8gRCF1MOZI9Nquq2i/44wFvviM4WuxJzc3demT8Y3dkfvYrw==} + micromark-extension-gfm-table@2.0.0: dependencies: devlop: 1.1.0 micromark-factory-space: 2.0.0 @@ -5687,13 +7779,11 @@ packages: micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 - /micromark-extension-gfm-tagfilter@2.0.0: - resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==} + micromark-extension-gfm-tagfilter@2.0.0: dependencies: micromark-util-types: 2.0.0 - /micromark-extension-gfm-task-list-item@2.0.1: - resolution: {integrity: sha512-cY5PzGcnULaN5O7T+cOzfMoHjBW7j+T9D2sucA5d/KbsBTPcYdebm9zUd9zzdgJGCwahV+/W78Z3nbulBYVbTw==} + micromark-extension-gfm-task-list-item@2.0.1: dependencies: devlop: 1.1.0 micromark-factory-space: 2.0.0 @@ -5701,8 +7791,7 @@ packages: micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 - /micromark-extension-gfm@3.0.0: - resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} + micromark-extension-gfm@3.0.0: dependencies: micromark-extension-gfm-autolink-literal: 2.0.0 micromark-extension-gfm-footnote: 2.0.0 @@ -5713,8 +7802,7 @@ packages: micromark-util-combine-extensions: 2.0.0 micromark-util-types: 2.0.0 - /micromark-extension-mdx-expression@3.0.0: - resolution: {integrity: sha512-sI0nwhUDz97xyzqJAbHQhp5TfaxEvZZZ2JDqUo+7NvyIYG6BZ5CPPqj2ogUoPJlmXHBnyZUzISg9+oUmU6tUjQ==} + micromark-extension-mdx-expression@3.0.0: dependencies: '@types/estree': 1.0.5 devlop: 1.1.0 @@ -5724,10 +7812,8 @@ packages: micromark-util-events-to-acorn: 2.0.2 micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 - dev: true - /micromark-extension-mdx-jsx@3.0.0: - resolution: {integrity: sha512-uvhhss8OGuzR4/N17L1JwvmJIpPhAd8oByMawEKx6NVdBCbesjH4t+vjEp3ZXft9DwvlKSD07fCeI44/N0Vf2w==} + micromark-extension-mdx-jsx@3.0.0: dependencies: '@types/acorn': 4.0.6 '@types/estree': 1.0.5 @@ -5739,16 +7825,12 @@ packages: micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 vfile-message: 4.0.2 - dev: true - /micromark-extension-mdx-md@2.0.0: - resolution: {integrity: sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==} + micromark-extension-mdx-md@2.0.0: dependencies: micromark-util-types: 2.0.0 - dev: true - /micromark-extension-mdxjs-esm@3.0.0: - resolution: {integrity: sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==} + micromark-extension-mdxjs-esm@3.0.0: dependencies: '@types/estree': 1.0.5 devlop: 1.1.0 @@ -5759,10 +7841,8 @@ packages: micromark-util-types: 2.0.0 unist-util-position-from-estree: 2.0.0 vfile-message: 4.0.2 - dev: true - /micromark-extension-mdxjs@3.0.0: - resolution: {integrity: sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==} + micromark-extension-mdxjs@3.0.0: dependencies: acorn: 8.11.3 acorn-jsx: 5.3.2(acorn@8.11.3) @@ -5772,25 +7852,21 @@ packages: micromark-extension-mdxjs-esm: 3.0.0 micromark-util-combine-extensions: 2.0.0 micromark-util-types: 2.0.0 - dev: true - /micromark-factory-destination@2.0.0: - resolution: {integrity: sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==} + micromark-factory-destination@2.0.0: dependencies: micromark-util-character: 2.1.0 micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 - /micromark-factory-label@2.0.0: - resolution: {integrity: sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==} + micromark-factory-label@2.0.0: dependencies: devlop: 1.1.0 micromark-util-character: 2.1.0 micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 - /micromark-factory-mdx-expression@2.0.1: - resolution: {integrity: sha512-F0ccWIUHRLRrYp5TC9ZYXmZo+p2AM13ggbsW4T0b5CRKP8KHVRB8t4pwtBgTxtjRmwrK0Irwm7vs2JOZabHZfg==} + micromark-factory-mdx-expression@2.0.1: dependencies: '@types/estree': 1.0.5 devlop: 1.1.0 @@ -5800,72 +7876,60 @@ packages: micromark-util-types: 2.0.0 unist-util-position-from-estree: 2.0.0 vfile-message: 4.0.2 - dev: true - /micromark-factory-space@2.0.0: - resolution: {integrity: sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==} + micromark-factory-space@2.0.0: dependencies: micromark-util-character: 2.1.0 micromark-util-types: 2.0.0 - /micromark-factory-title@2.0.0: - resolution: {integrity: sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==} + micromark-factory-title@2.0.0: dependencies: micromark-factory-space: 2.0.0 micromark-util-character: 2.1.0 micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 - /micromark-factory-whitespace@2.0.0: - resolution: {integrity: sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==} + micromark-factory-whitespace@2.0.0: dependencies: micromark-factory-space: 2.0.0 micromark-util-character: 2.1.0 micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 - /micromark-util-character@2.1.0: - resolution: {integrity: sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==} + micromark-util-character@2.1.0: dependencies: micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 - /micromark-util-chunked@2.0.0: - resolution: {integrity: sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==} + micromark-util-chunked@2.0.0: dependencies: micromark-util-symbol: 2.0.0 - /micromark-util-classify-character@2.0.0: - resolution: {integrity: sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==} + micromark-util-classify-character@2.0.0: dependencies: micromark-util-character: 2.1.0 micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 - /micromark-util-combine-extensions@2.0.0: - resolution: {integrity: sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==} + micromark-util-combine-extensions@2.0.0: dependencies: micromark-util-chunked: 2.0.0 micromark-util-types: 2.0.0 - /micromark-util-decode-numeric-character-reference@2.0.1: - resolution: {integrity: sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==} + micromark-util-decode-numeric-character-reference@2.0.1: dependencies: micromark-util-symbol: 2.0.0 - /micromark-util-decode-string@2.0.0: - resolution: {integrity: sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==} + micromark-util-decode-string@2.0.0: dependencies: decode-named-character-reference: 1.0.2 micromark-util-character: 2.1.0 micromark-util-decode-numeric-character-reference: 2.0.1 micromark-util-symbol: 2.0.0 - /micromark-util-encode@2.0.0: - resolution: {integrity: sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==} + micromark-util-encode@2.0.0: {} - /micromark-util-events-to-acorn@2.0.2: - resolution: {integrity: sha512-Fk+xmBrOv9QZnEDguL9OI9/NQQp6Hz4FuQ4YmCb/5V7+9eAh1s6AYSvL20kHkD67YIg7EpE54TiSlcsf3vyZgA==} + micromark-util-events-to-acorn@2.0.2: dependencies: '@types/acorn': 4.0.6 '@types/estree': 1.0.5 @@ -5875,44 +7939,35 @@ packages: micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 vfile-message: 4.0.2 - dev: true - /micromark-util-html-tag-name@2.0.0: - resolution: {integrity: sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==} + micromark-util-html-tag-name@2.0.0: {} - /micromark-util-normalize-identifier@2.0.0: - resolution: {integrity: sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==} + micromark-util-normalize-identifier@2.0.0: dependencies: micromark-util-symbol: 2.0.0 - /micromark-util-resolve-all@2.0.0: - resolution: {integrity: sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==} + micromark-util-resolve-all@2.0.0: dependencies: micromark-util-types: 2.0.0 - /micromark-util-sanitize-uri@2.0.0: - resolution: {integrity: sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==} + micromark-util-sanitize-uri@2.0.0: dependencies: micromark-util-character: 2.1.0 micromark-util-encode: 2.0.0 micromark-util-symbol: 2.0.0 - /micromark-util-subtokenize@2.0.0: - resolution: {integrity: sha512-vc93L1t+gpR3p8jxeVdaYlbV2jTYteDje19rNSS/H5dlhxUYll5Fy6vJ2cDwP8RnsXi818yGty1ayP55y3W6fg==} + micromark-util-subtokenize@2.0.0: dependencies: devlop: 1.1.0 micromark-util-chunked: 2.0.0 micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 - /micromark-util-symbol@2.0.0: - resolution: {integrity: sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==} + micromark-util-symbol@2.0.0: {} - /micromark-util-types@2.0.0: - resolution: {integrity: sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==} + micromark-util-types@2.0.0: {} - /micromark@4.0.0: - resolution: {integrity: sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==} + micromark@4.0.0: dependencies: '@types/debug': 4.1.12 debug: 4.3.4 @@ -5934,279 +7989,159 @@ packages: transitivePeerDependencies: - supports-color - /micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} - engines: {node: '>=8.6'} + micromatch@4.0.5: dependencies: braces: 3.0.2 picomatch: 2.3.1 - /mime@3.0.0: - resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} - engines: {node: '>=10.0.0'} - hasBin: true - dev: true + mime@3.0.0: {} - /mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} - dev: true + mimic-fn@2.1.0: {} - /mimic-fn@4.0.0: - resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} - engines: {node: '>=12'} - dev: true + mimic-fn@4.0.0: {} - /mimic-response@3.1.0: - resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} - engines: {node: '>=10'} - requiresBuild: true - dev: true + mimic-response@3.1.0: optional: true - /minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + minimatch@3.1.2: dependencies: brace-expansion: 1.1.11 - /minimatch@5.1.6: - resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} - engines: {node: '>=10'} + minimatch@5.1.6: dependencies: brace-expansion: 2.0.1 - dev: true - /minimatch@9.0.3: - resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} - engines: {node: '>=16 || 14 >=14.17'} + minimatch@9.0.3: dependencies: brace-expansion: 2.0.1 - /minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - requiresBuild: true - dev: true + minimist@1.2.8: optional: true - /mkdirp-classic@0.5.3: - resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} - requiresBuild: true - dev: true + mkdirp-classic@0.5.3: optional: true - /mkdirp2@1.0.5: - resolution: {integrity: sha512-xOE9xbICroUDmG1ye2h4bZ8WBie9EGmACaco8K8cx6RlkJJrxGIqjGqztAI+NMhexXBcdGbSEzI6N3EJPevxZw==} - dev: false + mkdirp2@1.0.5: {} - /mkdirp@1.0.4: - resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} - engines: {node: '>=10'} - hasBin: true + mkdirp@1.0.4: {} - /mlly@1.6.1: - resolution: {integrity: sha512-vLgaHvaeunuOXHSmEbZ9izxPx3USsk8KCQ8iC+aTlp5sKRSoZvwhHh5L9VbKSaVC6sJDqbyohIS76E2VmHIPAA==} + mlly@1.6.1: dependencies: acorn: 8.11.3 pathe: 1.1.2 pkg-types: 1.0.3 ufo: 1.5.2 - dev: true - /ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + ms@2.1.2: {} - /muggle-string@0.4.1: - resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==} - dev: false + muggle-string@0.4.1: {} - /nanoid@3.3.7: - resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - dev: true + nanoid@3.3.7: {} - /nanostores@0.10.0: - resolution: {integrity: sha512-Poy5+9wFXOD0jAstn4kv9n686U2BFw48z/W8lms8cS8lcbRz7BU20JxZ3e/kkKQVfRrkm4yLWCUA6GQINdvJCQ==} - engines: {node: ^18.0.0 || >=20.0.0} - dev: false + nanostores@0.10.0: {} - /napi-build-utils@1.0.2: - resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} - requiresBuild: true - dev: true + napi-build-utils@1.0.2: optional: true - /natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - dev: true + natural-compare@1.4.0: {} - /nlcst-to-string@3.1.1: - resolution: {integrity: sha512-63mVyqaqt0cmn2VcI2aH6kxe1rLAmSROqHMA0i4qqg1tidkfExgpb0FGMikMCn86mw5dFtBtEANfmSSK7TjNHw==} + nlcst-to-string@3.1.1: dependencies: '@types/nlcst': 1.0.4 - dev: true - /nlcst-to-string@4.0.0: - resolution: {integrity: sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA==} + nlcst-to-string@4.0.0: dependencies: '@types/nlcst': 2.0.3 - dev: false - /node-abi@3.56.0: - resolution: {integrity: sha512-fZjdhDOeRcaS+rcpve7XuwHBmktS1nS1gzgghwKUQQ8nTy2FdSDr6ZT8k6YhvlJeHmmQMYiT/IH9hfco5zeW2Q==} - engines: {node: '>=10'} - requiresBuild: true + node-abi@3.56.0: dependencies: semver: 7.6.0 - dev: true optional: true - /node-addon-api@6.1.0: - resolution: {integrity: sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==} - requiresBuild: true - dev: true + node-addon-api@6.1.0: optional: true - /node-domexception@1.0.0: - resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} - engines: {node: '>=10.5.0'} - dev: true + node-domexception@1.0.0: {} - /node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true + node-fetch@2.7.0: dependencies: whatwg-url: 5.0.0 - dev: true - /node-fetch@3.3.2: - resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + node-fetch@3.3.2: dependencies: data-uri-to-buffer: 4.0.1 fetch-blob: 3.2.0 formdata-polyfill: 4.0.10 - dev: true - /node-html-parser@6.1.12: - resolution: {integrity: sha512-/bT/Ncmv+fbMGX96XG9g05vFt43m/+SYKIs9oAemQVYyVcZmDAI2Xq/SbNcpOA35eF0Zk2av3Ksf+Xk8Vt8abA==} + node-html-parser@6.1.12: dependencies: css-select: 5.1.0 he: 1.2.0 - dev: true - /node-releases@2.0.14: - resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} - dev: true + node-releases@2.0.14: {} - /normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} + normalize-path@3.0.0: {} - /npm-run-path@5.3.0: - resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + npm-run-path@5.3.0: dependencies: path-key: 4.0.0 - dev: true - /nth-check@2.1.1: - resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + nth-check@2.1.1: dependencies: boolbase: 1.0.0 - dev: true - /object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} - dev: true + object-assign@4.1.1: {} - /object-inspect@1.13.1: - resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} - dev: true + object-inspect@1.13.1: {} - /object-keys@1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} - dev: true + object-keys@1.1.1: {} - /object-to-spawn-args@2.0.1: - resolution: {integrity: sha512-6FuKFQ39cOID+BMZ3QaphcC8Y4cw6LXBLyIgPU+OhIYwviJamPAn+4mITapnSBQrejB+NNp+FMskhD8Cq+Ys3w==} - engines: {node: '>=8.0.0'} - dev: false + object-to-spawn-args@2.0.1: {} - /object.assign@4.1.5: - resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} - engines: {node: '>= 0.4'} + object.assign@4.1.5: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 has-symbols: 1.0.3 object-keys: 1.1.1 - dev: true - /object.entries@1.1.8: - resolution: {integrity: sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==} - engines: {node: '>= 0.4'} + object.entries@1.1.8: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-object-atoms: 1.0.0 - dev: true - /object.fromentries@2.0.8: - resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} - engines: {node: '>= 0.4'} + object.fromentries@2.0.8: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.23.2 es-object-atoms: 1.0.0 - dev: true - /object.hasown@1.1.3: - resolution: {integrity: sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==} + object.hasown@1.1.3: dependencies: define-properties: 1.2.1 es-abstract: 1.22.5 - dev: true - /object.values@1.2.0: - resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==} - engines: {node: '>= 0.4'} + object.values@1.2.0: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-object-atoms: 1.0.0 - dev: true - /once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + once@1.4.0: dependencies: wrappy: 1.0.2 - /onetime@5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} + onetime@5.1.2: dependencies: mimic-fn: 2.1.0 - dev: true - /onetime@6.0.0: - resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} - engines: {node: '>=12'} + onetime@6.0.0: dependencies: mimic-fn: 4.0.0 - dev: true - /optionator@0.9.3: - resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} - engines: {node: '>= 0.8.0'} + optionator@0.9.3: dependencies: '@aashutoshrathi/word-wrap': 1.2.6 deep-is: 0.1.4 @@ -6214,11 +8149,8 @@ packages: levn: 0.4.1 prelude-ls: 1.2.1 type-check: 0.4.0 - dev: true - /ora@7.0.1: - resolution: {integrity: sha512-0TUxTiFJWv+JnjWm4o9yvuskpEJLXTcng8MJuKd+SzAzp2o+OP3HWqNhB4OdJRt1Vsd9/mR0oyaEYlOnL7XIRw==} - engines: {node: '>=16'} + ora@7.0.1: dependencies: chalk: 5.3.0 cli-cursor: 4.0.0 @@ -6229,109 +8161,65 @@ packages: stdin-discarder: 0.1.0 string-width: 6.1.0 strip-ansi: 7.1.0 - dev: true - /organize-imports-cli@0.10.0: - resolution: {integrity: sha512-cVyNEeiDxX/zA6gdK1QS2rr3TK1VymIkT0LagnAk4f6eE0IC0bo3BeUkMzm3q3GnCJzYC+6lfuMpBE0Cequ7Vg==} - hasBin: true + organize-imports-cli@0.10.0: dependencies: chalk: 4.1.2 editorconfig: 0.15.3 ts-morph: 15.1.0 tsconfig: 7.0.0 - dev: true - /p-finally@1.0.0: - resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} - engines: {node: '>=4'} - dev: true + p-finally@1.0.0: {} - /p-limit@2.3.0: - resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} - engines: {node: '>=6'} + p-limit@2.3.0: dependencies: p-try: 2.2.0 - dev: true - /p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} + p-limit@3.1.0: dependencies: yocto-queue: 0.1.0 - dev: true - /p-limit@5.0.0: - resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==} - engines: {node: '>=18'} + p-limit@5.0.0: dependencies: yocto-queue: 1.0.0 - dev: true - /p-locate@4.1.0: - resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} - engines: {node: '>=8'} + p-locate@4.1.0: dependencies: p-limit: 2.3.0 - dev: true - /p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} + p-locate@5.0.0: dependencies: p-limit: 3.1.0 - dev: true - /p-queue@6.6.2: - resolution: {integrity: sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==} - engines: {node: '>=8'} + p-queue@6.6.2: dependencies: eventemitter3: 4.0.7 p-timeout: 3.2.0 - dev: true - /p-queue@8.0.1: - resolution: {integrity: sha512-NXzu9aQJTAzbBqOt2hwsR63ea7yvxJc0PwN/zobNAudYfb1B7R08SzB4TsLeSbUCuG467NhnoT0oO6w1qRO+BA==} - engines: {node: '>=18'} + p-queue@8.0.1: dependencies: eventemitter3: 5.0.1 p-timeout: 6.1.2 - dev: true - /p-retry@6.2.0: - resolution: {integrity: sha512-JA6nkq6hKyWLLasXQXUrO4z8BUZGUt/LjlJxx8Gb2+2ntodU/SS63YZ8b0LUTbQ8ZB9iwOfhEPhg4ykKnn2KsA==} - engines: {node: '>=16.17'} + p-retry@6.2.0: dependencies: '@types/retry': 0.12.2 is-network-error: 1.1.0 retry: 0.13.1 - dev: true - /p-timeout@3.2.0: - resolution: {integrity: sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==} - engines: {node: '>=8'} + p-timeout@3.2.0: dependencies: p-finally: 1.0.0 - dev: true - /p-timeout@6.1.2: - resolution: {integrity: sha512-UbD77BuZ9Bc9aABo74gfXhNvzC9Tx7SxtHSh1fxvx3jTLLYvmVhiQZZrJzqqU0jKbN32kb5VOKiLEQI/3bIjgQ==} - engines: {node: '>=14.16'} - dev: true + p-timeout@6.1.2: {} - /p-try@2.2.0: - resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} - engines: {node: '>=6'} - dev: true + p-try@2.2.0: {} - /parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} + parent-module@1.0.1: dependencies: callsites: 3.1.0 - dev: true - /parse-entities@4.0.1: - resolution: {integrity: sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==} + parse-entities@4.0.1: dependencies: '@types/unist': 2.0.10 character-entities: 2.0.2 @@ -6341,18 +8229,14 @@ packages: is-alphanumerical: 2.0.1 is-decimal: 2.0.1 is-hexadecimal: 2.0.1 - dev: true - /parse-latin@5.0.1: - resolution: {integrity: sha512-b/K8ExXaWC9t34kKeDV8kGXBkXZ1HCSAZRYE7HR14eA1GlXX5L8iWhs8USJNhQU9q5ci413jCKF0gOyovvyRBg==} + parse-latin@5.0.1: dependencies: nlcst-to-string: 3.1.1 unist-util-modify-children: 3.1.1 unist-util-visit-children: 2.0.2 - dev: true - /parse-latin@7.0.0: - resolution: {integrity: sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ==} + parse-latin@7.0.0: dependencies: '@types/nlcst': 2.0.3 '@types/unist': 3.0.2 @@ -6360,177 +8244,97 @@ packages: unist-util-modify-children: 4.0.0 unist-util-visit-children: 3.0.0 vfile: 6.0.1 - dev: false - /parse-numeric-range@1.3.0: - resolution: {integrity: sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==} - dev: true + parse-numeric-range@1.3.0: {} - /parse5@6.0.1: - resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} - dev: true + parse5@6.0.1: {} - /parse5@7.1.2: - resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} + parse5@7.1.2: dependencies: entities: 4.5.0 - dev: true - /path-browserify@1.0.1: - resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + path-browserify@1.0.1: {} - /path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - dev: true + path-exists@4.0.0: {} - /path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} + path-is-absolute@1.0.1: {} - /path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} - dev: true + path-key@3.1.1: {} - /path-key@4.0.0: - resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} - engines: {node: '>=12'} - dev: true + path-key@4.0.0: {} - /path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - dev: true + path-parse@1.0.7: {} - /path-to-regexp@6.2.1: - resolution: {integrity: sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==} - dev: true + path-to-regexp@6.2.1: {} - /path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} - dev: true + path-type@4.0.0: {} - /pathe@1.1.2: - resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} - dev: true + pathe@1.1.2: {} - /pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} - dev: true + pathval@1.1.1: {} - /periscopic@3.1.0: - resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==} + periscopic@3.1.0: dependencies: '@types/estree': 1.0.5 estree-walker: 3.0.3 is-reference: 3.0.2 - dev: true - /picocolors@1.0.0: - resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} - dev: true + picocolors@1.0.0: {} - /picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} + picomatch@2.3.1: {} - /pidtree@0.6.0: - resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} - engines: {node: '>=0.10'} - hasBin: true - dev: true + pidtree@0.6.0: {} - /pify@4.0.1: - resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} - engines: {node: '>=6'} - dev: true + pify@4.0.1: {} - /pkg-dir@4.2.0: - resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} - engines: {node: '>=8'} + pkg-dir@4.2.0: dependencies: find-up: 4.1.0 - dev: true - /pkg-types@1.0.3: - resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==} + pkg-types@1.0.3: dependencies: jsonc-parser: 3.2.1 mlly: 1.6.1 pathe: 1.1.2 - dev: true - /plantuml-encoder@1.4.0: - resolution: {integrity: sha512-sxMwpDw/ySY1WB2CE3+IdMuEcWibJ72DDOsXLkSmEaSzwEUaYBT6DWgOfBiHGCux4q433X6+OEFWjlVqp7gL6g==} - dev: false + plantuml-encoder@1.4.0: {} - /possible-typed-array-names@1.0.0: - resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} - engines: {node: '>= 0.4'} - dev: true + possible-typed-array-names@1.0.0: {} - /postcss-nested@6.0.1(postcss@8.4.37): - resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==} - engines: {node: '>=12.0'} - peerDependencies: - postcss: ^8.2.14 + postcss-nested@6.0.1(postcss@8.4.37): dependencies: postcss: 8.4.37 postcss-selector-parser: 6.0.16 - dev: true - /postcss-selector-parser@6.0.16: - resolution: {integrity: sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==} - engines: {node: '>=4'} + postcss-selector-parser@6.0.16: dependencies: cssesc: 3.0.0 util-deprecate: 1.0.2 - dev: true - /postcss@8.4.37: - resolution: {integrity: sha512-7iB/v/r7Woof0glKLH8b1SPHrsX7uhdO+Geb41QpF/+mWZHU3uxxSlN+UXGVit1PawOYDToO+AbZzhBzWRDwbQ==} - engines: {node: ^10 || ^12 || >=14} + postcss@8.4.37: dependencies: nanoid: 3.3.7 picocolors: 1.0.0 source-map-js: 1.2.0 - dev: true - /postcss@8.4.38: - resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} - engines: {node: ^10 || ^12 || >=14} + postcss@8.4.38: dependencies: nanoid: 3.3.7 picocolors: 1.0.0 source-map-js: 1.2.0 - dev: true - /preact-render-to-string@6.3.1(preact@10.19.7): - resolution: {integrity: sha512-NQ28WrjLtWY6lKDlTxnFpKHZdpjfF+oE6V4tZ0rTrunHrtZp6Dm0oFrcJalt/5PNeqJz4j1DuZDS0Y6rCBoqDA==} - peerDependencies: - preact: '>=10' + preact-render-to-string@6.3.1(preact@10.19.7): dependencies: preact: 10.19.7 pretty-format: 3.8.0 - dev: true - /preact-ssr-prepass@1.2.1(preact@10.19.7): - resolution: {integrity: sha512-bLgbUfy8nL+PZghAPpyk9MF+cmXjdwEnxYPaJBmwbzFQqzIz8dQVBqjwB60RqZ9So/vIf6BRfHCiwFGuMCyfbQ==} - peerDependencies: - preact: '>=10 || ^10.0.0-beta.0 || ^10.0.0-alpha.0' + preact-ssr-prepass@1.2.1(preact@10.19.7): dependencies: preact: 10.19.7 - dev: true - /preact@10.19.7: - resolution: {integrity: sha512-IJOW6cQN1fwfC17HfNOqUtAGyB8wAYshuC+jG1JiL/1+sC4yVyuA3IcF0N9vdodMJjW/lbuEF5qFsJqGNcbHbw==} + preact@10.19.7: {} - /prebuild-install@7.1.2: - resolution: {integrity: sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==} - engines: {node: '>=10'} - hasBin: true - requiresBuild: true + prebuild-install@7.1.2: dependencies: detect-libc: 2.0.3 expand-template: 2.0.3 @@ -6544,140 +8348,86 @@ packages: simple-get: 4.0.1 tar-fs: 2.1.1 tunnel-agent: 0.6.0 - dev: true optional: true - /preferred-pm@3.1.3: - resolution: {integrity: sha512-MkXsENfftWSRpzCzImcp4FRsCc3y1opwB73CfCNWyzMqArju2CrlMHlqB7VexKiPEOjGMbttv1r9fSCn5S610w==} - engines: {node: '>=10'} + preferred-pm@3.1.3: dependencies: find-up: 5.0.0 find-yarn-workspace-root2: 1.2.16 path-exists: 4.0.0 which-pm: 2.0.0 - dev: true - /prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} - dev: true + prelude-ls@1.2.1: {} - /prettier-plugin-astro@0.13.0: - resolution: {integrity: sha512-5HrJNnPmZqTUNoA97zn4gNQv9BgVhv+et03314WpQ9H9N8m2L9OSV798olwmG2YLXPl1iSstlJCR1zB3x5xG4g==} - engines: {node: ^14.15.0 || >=16.0.0} + prettier-plugin-astro@0.13.0: dependencies: '@astrojs/compiler': 1.8.2 prettier: 3.2.5 sass-formatter: 0.7.9 - /prettier@3.2.5: - resolution: {integrity: sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==} - engines: {node: '>=14'} - hasBin: true + prettier@3.2.5: {} - /pretty-format@29.7.0: - resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + pretty-format@29.7.0: dependencies: '@jest/schemas': 29.6.3 ansi-styles: 5.2.0 react-is: 18.2.0 - dev: true - /pretty-format@3.8.0: - resolution: {integrity: sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew==} - dev: true + pretty-format@3.8.0: {} - /prismjs@1.29.0: - resolution: {integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==} - engines: {node: '>=6'} - dev: true + prismjs@1.29.0: {} - /prompts@2.4.2: - resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} - engines: {node: '>= 6'} + prompts@2.4.2: dependencies: kleur: 3.0.3 sisteransi: 1.0.5 - dev: true - /prop-types@15.8.1: - resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + prop-types@15.8.1: dependencies: loose-envify: 1.4.0 object-assign: 4.1.1 react-is: 16.13.1 - dev: true - /property-information@6.4.1: - resolution: {integrity: sha512-OHYtXfu5aI2sS2LWFSN5rgJjrQ4pCy8i1jubJLe2QvMF8JJ++HXTUIVWFLfXJoaOfvYYjk2SN8J2wFUWIGXT4w==} - dev: true + property-information@6.4.1: {} - /pseudomap@1.0.2: - resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} - dev: true + pseudomap@1.0.2: {} - /pump@3.0.0: - resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} - requiresBuild: true + pump@3.0.0: dependencies: end-of-stream: 1.4.4 once: 1.4.0 - dev: true optional: true - /punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} - engines: {node: '>=6'} - dev: true + punycode@2.3.1: {} - /queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + queue-microtask@1.2.3: {} - /queue-tick@1.0.1: - resolution: {integrity: sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==} - requiresBuild: true - dev: true + queue-tick@1.0.1: optional: true - /rc@1.2.8: - resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} - hasBin: true - requiresBuild: true + rc@1.2.8: dependencies: deep-extend: 0.6.0 ini: 1.3.8 minimist: 1.2.8 strip-json-comments: 2.0.1 - dev: true optional: true - /react-is@16.13.1: - resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} - dev: true + react-is@16.13.1: {} - /react-is@18.2.0: - resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} - dev: true + react-is@18.2.0: {} - /readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} + readable-stream@3.6.2: dependencies: inherits: 2.0.4 string_decoder: 1.3.0 util-deprecate: 1.0.2 - dev: true - /readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} + readdirp@3.6.0: dependencies: picomatch: 2.3.1 - /reflect.getprototypeof@1.0.6: - resolution: {integrity: sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==} - engines: {node: '>= 0.4'} + reflect.getprototypeof@1.0.6: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 @@ -6686,20 +8436,15 @@ packages: get-intrinsic: 1.2.4 globalthis: 1.0.3 which-builtin-type: 1.1.3 - dev: true - /regexp.prototype.flags@1.5.2: - resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} - engines: {node: '>= 0.4'} + regexp.prototype.flags@1.5.2: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-errors: 1.3.0 set-function-name: 2.0.2 - dev: true - /rehype-autolink-headings@7.1.0: - resolution: {integrity: sha512-rItO/pSdvnvsP4QRB1pmPiNHUskikqtPojZKJPPPAVx9Hj8i8TwMBhofrrAYRhYOOBZH9tgmG5lPqDLuIWPWmw==} + rehype-autolink-headings@7.1.0: dependencies: '@types/hast': 3.0.4 '@ungap/structured-clone': 1.2.0 @@ -6707,53 +8452,41 @@ packages: hast-util-is-element: 3.0.0 unified: 11.0.4 unist-util-visit: 5.0.0 - dev: false - /rehype-parse@9.0.0: - resolution: {integrity: sha512-WG7nfvmWWkCR++KEkZevZb/uw41E8TsH4DsY9UxsTbIXCVGbAs4S+r8FrQ+OtH5EEQAs+5UxKC42VinkmpA1Yw==} + rehype-parse@9.0.0: dependencies: '@types/hast': 3.0.4 hast-util-from-html: 2.0.1 unified: 11.0.4 - dev: true - /rehype-raw@7.0.0: - resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==} + rehype-raw@7.0.0: dependencies: '@types/hast': 3.0.4 hast-util-raw: 9.0.2 vfile: 6.0.1 - dev: true - /rehype-slug@6.0.0: - resolution: {integrity: sha512-lWyvf/jwu+oS5+hL5eClVd3hNdmwM1kAC0BUvEGD19pajQMIzcNUd/k9GsfQ+FfECvX+JE+e9/btsKH0EjJT6A==} + rehype-slug@6.0.0: dependencies: '@types/hast': 3.0.4 github-slugger: 2.0.0 hast-util-heading-rank: 3.0.0 hast-util-to-string: 3.0.0 unist-util-visit: 5.0.0 - dev: false - /rehype-stringify@10.0.0: - resolution: {integrity: sha512-1TX1i048LooI9QoecrXy7nGFFbFSufxVRAfc6Y9YMRAi56l+oB0zP51mLSV312uRuvVLPV1opSlJmslozR1XHQ==} + rehype-stringify@10.0.0: dependencies: '@types/hast': 3.0.4 hast-util-to-html: 9.0.0 unified: 11.0.4 - dev: true - /rehype@13.0.1: - resolution: {integrity: sha512-AcSLS2mItY+0fYu9xKxOu1LhUZeBZZBx8//5HKzF+0XP+eP8+6a5MXn2+DW2kfXR6Dtp1FEXMVrjyKAcvcU8vg==} + rehype@13.0.1: dependencies: '@types/hast': 3.0.4 rehype-parse: 9.0.0 rehype-stringify: 10.0.0 unified: 11.0.4 - dev: true - /remark-directive@3.0.0: - resolution: {integrity: sha512-l1UyWJ6Eg1VPU7Hm/9tt0zKtReJQNOA4+iDMAxTyZNWnJnFlbS/7zhiel/rogTLQ2vMYwDzSJa4BiVNqGlqIMA==} + remark-directive@3.0.0: dependencies: '@types/mdast': 4.0.3 mdast-util-directive: 3.0.0 @@ -6761,18 +8494,14 @@ packages: unified: 11.0.4 transitivePeerDependencies: - supports-color - dev: true - /remark-expressive-code@0.33.5: - resolution: {integrity: sha512-E4CZq3AuUXLu6or0AaDKkgsHYqmnm4ZL8/+1/8YgwtKcogHwTMRJfQtxkZpth90QQoNUpsapvm5x5n3Np2OC9w==} + remark-expressive-code@0.33.5: dependencies: expressive-code: 0.33.5 hast-util-to-html: 8.0.4 unist-util-visit: 4.1.2 - dev: true - /remark-gfm@4.0.0: - resolution: {integrity: sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA==} + remark-gfm@4.0.0: dependencies: '@types/mdast': 4.0.3 mdast-util-gfm: 3.0.0 @@ -6783,17 +8512,14 @@ packages: transitivePeerDependencies: - supports-color - /remark-mdx@3.0.1: - resolution: {integrity: sha512-3Pz3yPQ5Rht2pM5R+0J2MrGoBSrzf+tJG94N+t/ilfdh8YLyyKYtidAYwTveB20BoHAcwIopOUqhcmh2F7hGYA==} + remark-mdx@3.0.1: dependencies: mdast-util-mdx: 3.0.0 micromark-extension-mdxjs: 3.0.0 transitivePeerDependencies: - supports-color - dev: true - /remark-parse@11.0.0: - resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} + remark-parse@11.0.0: dependencies: '@types/mdast': 4.0.3 mdast-util-from-markdown: 2.0.0 @@ -6802,44 +8528,34 @@ packages: transitivePeerDependencies: - supports-color - /remark-rehype@11.1.0: - resolution: {integrity: sha512-z3tJrAs2kIs1AqIIy6pzHmAHlF1hWQ+OdY4/hv+Wxe35EhyLKcajL33iUEn3ScxtFox9nUvRufR/Zre8Q08H/g==} + remark-rehype@11.1.0: dependencies: '@types/hast': 3.0.4 '@types/mdast': 4.0.3 mdast-util-to-hast: 13.1.0 unified: 11.0.4 vfile: 6.0.1 - dev: true - /remark-smartypants@2.1.0: - resolution: {integrity: sha512-qoF6Vz3BjU2tP6OfZqHOvCU0ACmu/6jhGaINSQRI9mM7wCxNQTKB3JUAN4SVoN2ybElEDTxBIABRep7e569iJw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + remark-smartypants@2.1.0: dependencies: retext: 8.1.0 retext-smartypants: 5.2.0 unist-util-visit: 5.0.0 - dev: true - /remark-smartypants@3.0.1: - resolution: {integrity: sha512-qyshfCl2eLO0i0558e79ZJsfojC5wjnYLByjt0FmjJQN6aYwcRxpoj784LZJSoWCdnA2ubh5rLNGb8Uur/wDng==} - engines: {node: '>=16.0.0'} + remark-smartypants@3.0.1: dependencies: retext: 9.0.0 retext-smartypants: 6.1.0 unified: 11.0.4 unist-util-visit: 5.0.0 - dev: false - /remark-stringify@11.0.0: - resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} + remark-stringify@11.0.0: dependencies: '@types/mdast': 4.0.3 mdast-util-to-markdown: 2.1.0 unified: 11.0.4 - /remark@15.0.1: - resolution: {integrity: sha512-Eht5w30ruCXgFmxVUSlNWQ9iiimq07URKeFS3hNc8cUWy1llX4KDWfyEDZRycMc+znsN9Ux5/tJ/BFdgdOwA3A==} + remark@15.0.1: dependencies: '@types/mdast': 4.0.3 remark-parse: 11.0.0 @@ -6847,150 +8563,99 @@ packages: unified: 11.0.4 transitivePeerDependencies: - supports-color - dev: true - /remove-markdown@0.5.0: - resolution: {integrity: sha512-x917M80K97K5IN1L8lUvFehsfhR8cYjGQ/yAMRI9E7JIKivtl5Emo5iD13DhMr+VojzMCiYk8V2byNPwT/oapg==} - dev: true + remove-markdown@0.5.0: {} - /request-light@0.7.0: - resolution: {integrity: sha512-lMbBMrDoxgsyO+yB3sDcrDuX85yYt7sS8BfQd11jtbW/z5ZWgLZRcEGLsLoYw7I0WSUGQBs8CC8ScIxkTX1+6Q==} - dev: false + request-light@0.7.0: {} - /require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - dev: false + require-directory@2.1.1: {} - /requizzle@0.2.4: - resolution: {integrity: sha512-JRrFk1D4OQ4SqovXOgdav+K8EAhSB/LJZqCz8tbX0KObcdeM15Ss59ozWMBWmmINMagCwmqn4ZNryUGpBsl6Jw==} + requizzle@0.2.4: dependencies: lodash: 4.17.21 - dev: false - /resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} - dev: true + resolve-from@4.0.0: {} - /resolve@1.22.8: - resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} - hasBin: true + resolve@1.22.8: dependencies: is-core-module: 2.13.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - dev: true - /resolve@2.0.0-next.5: - resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} - hasBin: true + resolve@2.0.0-next.5: dependencies: is-core-module: 2.13.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - dev: true - /restore-cursor@4.0.0: - resolution: {integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + restore-cursor@4.0.0: dependencies: onetime: 5.1.2 signal-exit: 3.0.7 - dev: true - /retext-latin@3.1.0: - resolution: {integrity: sha512-5MrD1tuebzO8ppsja5eEu+ZbBeUNCjoEarn70tkXOS7Bdsdf6tNahsv2bY0Z8VooFF6cw7/6S+d3yI/TMlMVVQ==} + retext-latin@3.1.0: dependencies: '@types/nlcst': 1.0.4 parse-latin: 5.0.1 unherit: 3.0.1 unified: 10.1.2 - dev: true - /retext-latin@4.0.0: - resolution: {integrity: sha512-hv9woG7Fy0M9IlRQloq/N6atV82NxLGveq+3H2WOi79dtIYWN8OaxogDm77f8YnVXJL2VD3bbqowu5E3EMhBYA==} + retext-latin@4.0.0: dependencies: '@types/nlcst': 2.0.3 parse-latin: 7.0.0 unified: 11.0.4 - dev: false - /retext-smartypants@5.2.0: - resolution: {integrity: sha512-Do8oM+SsjrbzT2UNIKgheP0hgUQTDDQYyZaIY3kfq0pdFzoPk+ZClYJ+OERNXveog4xf1pZL4PfRxNoVL7a/jw==} + retext-smartypants@5.2.0: dependencies: '@types/nlcst': 1.0.4 nlcst-to-string: 3.1.1 unified: 10.1.2 unist-util-visit: 4.1.2 - dev: true - /retext-smartypants@6.1.0: - resolution: {integrity: sha512-LDPXg95346bqFZnDMHo0S7Rq5p64+B+N8Vz733+wPMDtwb9rCOs9LIdIEhrUOU+TAywX9St+ocQWJt8wrzivcQ==} + retext-smartypants@6.1.0: dependencies: '@types/nlcst': 2.0.3 nlcst-to-string: 4.0.0 unist-util-visit: 5.0.0 - dev: false - /retext-stringify@3.1.0: - resolution: {integrity: sha512-767TLOaoXFXyOnjx/EggXlb37ZD2u4P1n0GJqVdpipqACsQP+20W+BNpMYrlJkq7hxffnFk+jc6mAK9qrbuB8w==} + retext-stringify@3.1.0: dependencies: '@types/nlcst': 1.0.4 nlcst-to-string: 3.1.1 unified: 10.1.2 - dev: true - /retext-stringify@4.0.0: - resolution: {integrity: sha512-rtfN/0o8kL1e+78+uxPTqu1Klt0yPzKuQ2BfWwwfgIUSayyzxpM1PJzkKt4V8803uB9qSy32MvI7Xep9khTpiA==} + retext-stringify@4.0.0: dependencies: '@types/nlcst': 2.0.3 nlcst-to-string: 4.0.0 unified: 11.0.4 - dev: false - /retext@8.1.0: - resolution: {integrity: sha512-N9/Kq7YTn6ZpzfiGW45WfEGJqFf1IM1q8OsRa1CGzIebCJBNCANDRmOrholiDRGKo/We7ofKR4SEvcGAWEMD3Q==} + retext@8.1.0: dependencies: '@types/nlcst': 1.0.4 retext-latin: 3.1.0 retext-stringify: 3.1.0 unified: 10.1.2 - dev: true - /retext@9.0.0: - resolution: {integrity: sha512-sbMDcpHCNjvlheSgMfEcVrZko3cDzdbe1x/e7G66dFp0Ff7Mldvi2uv6JkJQzdRcvLYE8CA8Oe8siQx8ZOgTcA==} + retext@9.0.0: dependencies: '@types/nlcst': 2.0.3 retext-latin: 4.0.0 retext-stringify: 4.0.0 unified: 11.0.4 - dev: false - /retry@0.13.1: - resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} - engines: {node: '>= 4'} - dev: true + retry@0.13.1: {} - /reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + reusify@1.0.4: {} - /rfdc@1.3.1: - resolution: {integrity: sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==} - dev: true + rfdc@1.3.1: {} - /rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - hasBin: true + rimraf@3.0.2: dependencies: glob: 7.2.3 - dev: true - /rollup@4.13.0: - resolution: {integrity: sha512-3YegKemjoQnYKmsBlOHfMLVPPA5xLkQ8MHLLSw/fBrFaVkEayL51DilPpNNLq1exr98F2B1TzrV0FUlN3gWRPg==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} - hasBin: true + rollup@4.13.0: dependencies: '@types/estree': 1.0.5 optionalDependencies: @@ -7008,90 +8673,56 @@ packages: '@rollup/rollup-win32-ia32-msvc': 4.13.0 '@rollup/rollup-win32-x64-msvc': 4.13.0 fsevents: 2.3.3 - dev: true - /run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 - /s.color@0.0.15: - resolution: {integrity: sha512-AUNrbEUHeKY8XsYr/DYpl+qk5+aM+DChopnWOPEzn8YKzOhv4l2zH6LzZms3tOZP3wwdOyc0RmTciyi46HLIuA==} + s.color@0.0.15: {} - /safe-array-concat@1.1.2: - resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} - engines: {node: '>=0.4'} + safe-array-concat@1.1.2: dependencies: call-bind: 1.0.7 get-intrinsic: 1.2.4 has-symbols: 1.0.3 isarray: 2.0.5 - dev: true - /safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - requiresBuild: true - dev: true + safe-buffer@5.2.1: {} - /safe-regex-test@1.0.3: - resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} - engines: {node: '>= 0.4'} + safe-regex-test@1.0.3: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 is-regex: 1.1.4 - dev: true - /sass-formatter@0.7.9: - resolution: {integrity: sha512-CWZ8XiSim+fJVG0cFLStwDvft1VI7uvXdCNJYXhDvowiv+DsbD1nXLiQ4zrE5UBvj5DWZJ93cwN0NX5PMsr1Pw==} + sass-formatter@0.7.9: dependencies: suf-log: 2.5.3 - /sass@1.72.0: - resolution: {integrity: sha512-Gpczt3WA56Ly0Mn8Sl21Vj94s1axi9hDIzDFn9Ph9x3C3p4nNyvsqJoQyVXKou6cBlfFWEgRW4rT8Tb4i3XnVA==} - engines: {node: '>=14.0.0'} - hasBin: true + sass@1.72.0: dependencies: chokidar: 3.6.0 immutable: 4.3.5 source-map-js: 1.1.0 - /sax@1.3.0: - resolution: {integrity: sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==} - dev: true + sax@1.3.0: {} - /search-insights@2.13.0: - resolution: {integrity: sha512-Orrsjf9trHHxFRuo9/rzm0KIWmgzE8RMlZMzuhZOJ01Rnz3D0YBAe+V6473t6/H6c7irs6Lt48brULAiRWb3Vw==} - dev: true + search-insights@2.13.0: {} - /section-matter@1.0.0: - resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==} - engines: {node: '>=4'} + section-matter@1.0.0: dependencies: extend-shallow: 2.0.1 kind-of: 6.0.3 - dev: true - /semver@5.7.2: - resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} - hasBin: true - dev: true + semver@5.7.2: {} - /semver@6.3.1: - resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} - hasBin: true - dev: true + semver@6.3.1: {} - /semver@7.6.0: - resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} - engines: {node: '>=10'} - hasBin: true + semver@7.6.0: dependencies: lru-cache: 6.0.0 - /set-function-length@1.2.2: - resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} - engines: {node: '>= 0.4'} + set-function-length@1.2.2: dependencies: define-data-property: 1.1.4 es-errors: 1.3.0 @@ -7099,22 +8730,15 @@ packages: get-intrinsic: 1.2.4 gopd: 1.0.1 has-property-descriptors: 1.0.2 - dev: true - /set-function-name@2.0.2: - resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} - engines: {node: '>= 0.4'} + set-function-name@2.0.2: dependencies: define-data-property: 1.1.4 es-errors: 1.3.0 functions-have-names: 1.2.3 has-property-descriptors: 1.0.2 - dev: true - /sharp@0.32.6: - resolution: {integrity: sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w==} - engines: {node: '>=14.15.0'} - requiresBuild: true + sharp@0.32.6: dependencies: color: 4.2.3 detect-libc: 2.0.3 @@ -7124,237 +8748,142 @@ packages: simple-get: 4.0.1 tar-fs: 3.0.5 tunnel-agent: 0.6.0 - dev: true optional: true - /shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 - dev: true - /shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} - dev: true + shebang-regex@3.0.0: {} - /shiki@1.2.0: - resolution: {integrity: sha512-xLhiTMOIUXCv5DqJ4I70GgQCtdlzsTqFLZWcMHHG3TAieBUbvEGthdrlPDlX4mL/Wszx9C6rEcxU6kMlg4YlxA==} + shiki@1.2.0: dependencies: '@shikijs/core': 1.2.0 - dev: true - /shiki@1.2.1: - resolution: {integrity: sha512-u+XW6o0vCkUNlneZb914dLO+AayEIwK5tI62WeS//R5HIXBFiYaj/Hc5xcq27Yh83Grr4JbNtUBV8W6zyK4hWg==} + shiki@1.2.1: dependencies: '@shikijs/core': 1.2.1 - dev: true - /side-channel@1.0.6: - resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} - engines: {node: '>= 0.4'} + side-channel@1.0.6: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 get-intrinsic: 1.2.4 object-inspect: 1.13.1 - dev: true - /siginfo@2.0.0: - resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} - dev: true + siginfo@2.0.0: {} - /sigmund@1.0.1: - resolution: {integrity: sha512-fCvEXfh6NWpm+YSuY2bpXb/VIihqWA6hLsgboC+0nl71Q7N7o2eaCW8mJa/NLvQhs6jpd3VZV4UiUQlV6+lc8g==} - dev: true + sigmund@1.0.1: {} - /signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - dev: true + signal-exit@3.0.7: {} - /signal-exit@4.1.0: - resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} - engines: {node: '>=14'} - dev: true + signal-exit@4.1.0: {} - /simple-concat@1.0.1: - resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} - requiresBuild: true - dev: true + simple-concat@1.0.1: optional: true - /simple-get@4.0.1: - resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} - requiresBuild: true + simple-get@4.0.1: dependencies: decompress-response: 6.0.0 once: 1.4.0 simple-concat: 1.0.1 - dev: true optional: true - /simple-git@3.23.0: - resolution: {integrity: sha512-P9ggTW8vb/21CAL/AmnACAhqBDfnqSSZVpV7WuFtsFR9HLunf5IqQvk+OXAQTfkcZep8pKnt3DV3o7w3TegEkQ==} + simple-git@3.23.0: dependencies: '@kwsites/file-exists': 1.1.1 '@kwsites/promise-deferred': 1.1.1 debug: 4.3.4 transitivePeerDependencies: - supports-color - dev: true - /simple-swizzle@0.2.2: - resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} - requiresBuild: true + simple-swizzle@0.2.2: dependencies: is-arrayish: 0.3.2 - dev: true optional: true - /sisteransi@1.0.5: - resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} - dev: true + sisteransi@1.0.5: {} - /sitemap@7.1.1: - resolution: {integrity: sha512-mK3aFtjz4VdJN0igpIJrinf3EO8U8mxOPsTBzSsy06UtjZQJ3YY3o3Xa7zSc5nMqcMrRwlChHZ18Kxg0caiPBg==} - engines: {node: '>=12.0.0', npm: '>=5.6.0'} - hasBin: true + sitemap@7.1.1: dependencies: '@types/node': 17.0.45 '@types/sax': 1.2.7 arg: 5.0.2 sax: 1.3.0 - dev: true - /slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} - dev: true + slash@3.0.0: {} - /slice-ansi@5.0.0: - resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} - engines: {node: '>=12'} + slice-ansi@5.0.0: dependencies: ansi-styles: 6.2.1 is-fullwidth-code-point: 4.0.0 - dev: true - /slice-ansi@7.1.0: - resolution: {integrity: sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==} - engines: {node: '>=18'} + slice-ansi@7.1.0: dependencies: ansi-styles: 6.2.1 is-fullwidth-code-point: 5.0.0 - dev: true - /source-map-js@1.1.0: - resolution: {integrity: sha512-9vC2SfsJzlej6MAaMPLu8HiBSHGdRAJ9hVFYN1ibZoNkeanmDmLUcIrj6G9DGL7XMJ54AKg/G75akXl1/izTOw==} - engines: {node: '>=0.10.0'} + source-map-js@1.1.0: {} - /source-map-js@1.2.0: - resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} - engines: {node: '>=0.10.0'} - dev: true + source-map-js@1.2.0: {} - /source-map@0.7.4: - resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} - engines: {node: '>= 8'} - dev: true + source-map@0.7.4: {} - /space-separated-tokens@2.0.2: - resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} - dev: true + space-separated-tokens@2.0.2: {} - /sprintf-js@1.0.3: - resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - dev: true + sprintf-js@1.0.3: {} - /stack-trace@1.0.0-pre2: - resolution: {integrity: sha512-2ztBJRek8IVofG9DBJqdy2N5kulaacX30Nz7xmkYF6ale9WBVmIy6mFBchvGX7Vx/MyjBhx+Rcxqrj+dbOnQ6A==} - engines: {node: '>=16'} - dev: true + stack-trace@1.0.0-pre2: {} - /stackback@0.0.2: - resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} - dev: true + stackback@0.0.2: {} - /std-env@3.7.0: - resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} - dev: true + std-env@3.7.0: {} - /stdin-discarder@0.1.0: - resolution: {integrity: sha512-xhV7w8S+bUwlPTb4bAOUQhv8/cSS5offJuX8GQGq32ONF0ZtDWKfkdomM3HMRA+LhX6um/FZ0COqlwsjD53LeQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + stdin-discarder@0.1.0: dependencies: bl: 5.1.0 - dev: true - /stream-connect@1.0.2: - resolution: {integrity: sha512-68Kl+79cE0RGKemKkhxTSg8+6AGrqBt+cbZAXevg2iJ6Y3zX4JhA/sZeGzLpxW9cXhmqAcE7KnJCisUmIUfnFQ==} - engines: {node: '>=0.10.0'} + stream-connect@1.0.2: dependencies: array-back: 1.0.4 - dev: false - /stream-via@1.0.4: - resolution: {integrity: sha512-DBp0lSvX5G9KGRDTkR/R+a29H+Wk2xItOF+MpZLLNDWbEV9tGPnqLPxHEYjmiz8xGtJHRIqmI+hCjmNzqoA4nQ==} - engines: {node: '>=0.10.0'} - dev: false + stream-via@1.0.4: {} - /streamx@2.16.1: - resolution: {integrity: sha512-m9QYj6WygWyWa3H1YY69amr4nVgy61xfjys7xO7kviL5rfIEc2naf+ewFiOA+aEJD7y0JO3h2GoiUv4TDwEGzQ==} - requiresBuild: true + streamx@2.16.1: dependencies: fast-fifo: 1.3.2 queue-tick: 1.0.1 optionalDependencies: bare-events: 2.2.2 - dev: true optional: true - /string-argv@0.3.2: - resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} - engines: {node: '>=0.6.19'} - dev: true + string-argv@0.3.2: {} - /string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} + string-width@4.2.3: dependencies: emoji-regex: 8.0.0 is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 - /string-width@5.1.2: - resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} - engines: {node: '>=12'} + string-width@5.1.2: dependencies: eastasianwidth: 0.2.0 emoji-regex: 9.2.2 strip-ansi: 7.1.0 - dev: true - /string-width@6.1.0: - resolution: {integrity: sha512-k01swCJAgQmuADB0YIc+7TuatfNvTBVOoaUWJjTB9R4VJzR5vNWzf5t42ESVZFPS8xTySF7CAdV4t/aaIm3UnQ==} - engines: {node: '>=16'} + string-width@6.1.0: dependencies: eastasianwidth: 0.2.0 emoji-regex: 10.3.0 strip-ansi: 7.1.0 - dev: true - /string-width@7.1.0: - resolution: {integrity: sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==} - engines: {node: '>=18'} + string-width@7.1.0: dependencies: emoji-regex: 10.3.0 get-east-asian-width: 1.2.0 strip-ansi: 7.1.0 - dev: true - /string.prototype.matchall@4.0.10: - resolution: {integrity: sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==} + string.prototype.matchall@4.0.10: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 @@ -7365,337 +8894,199 @@ packages: regexp.prototype.flags: 1.5.2 set-function-name: 2.0.2 side-channel: 1.0.6 - dev: true - /string.prototype.trim@1.2.9: - resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} - engines: {node: '>= 0.4'} + string.prototype.trim@1.2.9: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.23.2 es-object-atoms: 1.0.0 - dev: true - /string.prototype.trimend@1.0.8: - resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} + string.prototype.trimend@1.0.8: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-object-atoms: 1.0.0 - dev: true - /string.prototype.trimstart@1.0.7: - resolution: {integrity: sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==} + string.prototype.trimstart@1.0.7: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.22.5 - dev: true - /string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} - requiresBuild: true + string_decoder@1.3.0: dependencies: safe-buffer: 5.2.1 - dev: true - /stringify-entities@4.0.3: - resolution: {integrity: sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g==} + stringify-entities@4.0.3: dependencies: character-entities-html4: 2.1.0 character-entities-legacy: 3.0.0 - dev: true - /strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} + strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 - /strip-ansi@7.1.0: - resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} - engines: {node: '>=12'} + strip-ansi@7.1.0: dependencies: ansi-regex: 6.0.1 - dev: true - /strip-bom-string@1.0.0: - resolution: {integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==} - engines: {node: '>=0.10.0'} - dev: true + strip-bom-string@1.0.0: {} - /strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - dev: true + strip-bom@3.0.0: {} - /strip-final-newline@3.0.0: - resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} - engines: {node: '>=12'} - dev: true + strip-final-newline@3.0.0: {} - /strip-json-comments@2.0.1: - resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} - engines: {node: '>=0.10.0'} - dev: true + strip-json-comments@2.0.1: {} - /strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} + strip-json-comments@3.1.1: {} - /strip-literal@2.0.0: - resolution: {integrity: sha512-f9vHgsCWBq2ugHAkGMiiYY+AYG0D/cbloKKg0nhaaaSNsujdGIpVXCNsrJpCKr5M0f4aI31mr13UjY6GAuXCKA==} + strip-literal@2.0.0: dependencies: js-tokens: 8.0.3 - dev: true - /style-to-object@0.4.4: - resolution: {integrity: sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==} + style-to-object@0.4.4: dependencies: inline-style-parser: 0.1.1 - dev: true - /style-to-object@1.0.6: - resolution: {integrity: sha512-khxq+Qm3xEyZfKd/y9L3oIWQimxuc4STrQKtQn8aSDRHb8mFgpukgX1hdzfrMEW6JCjyJ8p89x+IUMVnCBI1PA==} + style-to-object@1.0.6: dependencies: inline-style-parser: 0.2.3 - dev: true - /suf-log@2.5.3: - resolution: {integrity: sha512-KvC8OPjzdNOe+xQ4XWJV2whQA0aM1kGVczMQ8+dStAO6KfEB140JEVQ9dE76ONZ0/Ylf67ni4tILPJB41U0eow==} + suf-log@2.5.3: dependencies: s.color: 0.0.15 - /supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} + supports-color@5.5.0: dependencies: has-flag: 3.0.0 - dev: true - /supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} + supports-color@7.2.0: dependencies: has-flag: 4.0.0 - dev: true - /supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} - dev: true + supports-preserve-symlinks-flag@1.0.0: {} - /synckit@0.9.0: - resolution: {integrity: sha512-7RnqIMq572L8PeEzKeBINYEJDDxpcH8JEgLwUqBd3TkofhFRbkq4QLR0u+36avGAhCRbk2nnmjcW9SE531hPDg==} - engines: {node: ^14.18.0 || >=16.0.0} + synckit@0.9.0: dependencies: '@pkgr/core': 0.1.1 tslib: 2.6.2 - dev: true - /tar-fs@2.1.1: - resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} - requiresBuild: true + tar-fs@2.1.1: dependencies: chownr: 1.1.4 mkdirp-classic: 0.5.3 pump: 3.0.0 tar-stream: 2.2.0 - dev: true optional: true - /tar-fs@3.0.5: - resolution: {integrity: sha512-JOgGAmZyMgbqpLwct7ZV8VzkEB6pxXFBVErLtb+XCOqzc6w1xiWKI9GVd6bwk68EX7eJ4DWmfXVmq8K2ziZTGg==} - requiresBuild: true + tar-fs@3.0.5: dependencies: pump: 3.0.0 tar-stream: 3.1.7 optionalDependencies: bare-fs: 2.3.0 bare-path: 2.1.2 - dev: true optional: true - /tar-stream@2.2.0: - resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} - engines: {node: '>=6'} - requiresBuild: true + tar-stream@2.2.0: dependencies: bl: 4.1.0 end-of-stream: 1.4.4 fs-constants: 1.0.0 inherits: 2.0.4 readable-stream: 3.6.2 - dev: true optional: true - /tar-stream@3.1.7: - resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} - requiresBuild: true + tar-stream@3.1.7: dependencies: b4a: 1.6.6 fast-fifo: 1.3.2 streamx: 2.16.1 - dev: true optional: true - /temp-path@1.0.0: - resolution: {integrity: sha512-TvmyH7kC6ZVTYkqCODjJIbgvu0FKiwQpZ4D1aknE7xpcDf/qEOB8KZEK5ef2pfbVoiBhNWs3yx4y+ESMtNYmlg==} - dev: false + temp-path@1.0.0: {} - /text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - dev: true + text-table@0.2.0: {} - /tinybench@2.6.0: - resolution: {integrity: sha512-N8hW3PG/3aOoZAN5V/NSAEDz0ZixDSSt5b/a05iqtpgfLWMSVuCo7w0k2vVvEjdrIoeGqZzweX2WlyioNIHchA==} - dev: true + tinybench@2.6.0: {} - /tinypool@0.8.2: - resolution: {integrity: sha512-SUszKYe5wgsxnNOVlBYO6IC+8VGWdVGZWAqUxp3UErNBtptZvWbwyUOyzNL59zigz2rCA92QiL3wvG+JDSdJdQ==} - engines: {node: '>=14.0.0'} - dev: true + tinypool@0.8.2: {} - /tinyspy@2.2.1: - resolution: {integrity: sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==} - engines: {node: '>=14.0.0'} - dev: true + tinyspy@2.2.1: {} - /to-fast-properties@2.0.0: - resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} - engines: {node: '>=4'} + to-fast-properties@2.0.0: {} - /to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} + to-regex-range@5.0.1: dependencies: is-number: 7.0.0 - /tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - dev: true + tr46@0.0.3: {} - /trim-lines@3.0.1: - resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} - dev: true + trim-lines@3.0.1: {} - /trough@2.2.0: - resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} + trough@2.2.0: {} - /ts-api-utils@1.3.0(typescript@5.4.5): - resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} - engines: {node: '>=16'} - peerDependencies: - typescript: '>=4.2.0' + ts-api-utils@1.3.0(typescript@5.4.5): dependencies: typescript: 5.4.5 - dev: true - /ts-morph@15.1.0: - resolution: {integrity: sha512-RBsGE2sDzUXFTnv8Ba22QfeuKbgvAGJFuTN7HfmIRUkgT/NaVLfDM/8OFm2NlFkGlWEXdpW5OaFIp1jvqdDuOg==} + ts-morph@15.1.0: dependencies: '@ts-morph/common': 0.16.0 code-block-writer: 11.0.3 - dev: true - /tsconfck@3.0.3(typescript@5.4.5): - resolution: {integrity: sha512-4t0noZX9t6GcPTfBAbIbbIU4pfpCwh0ueq3S4O/5qXI1VwK1outmxhe9dOiEWqMz3MW2LKgDTpqWV+37IWuVbA==} - engines: {node: ^18 || >=20} - hasBin: true - peerDependencies: - typescript: ^5.0.0 - peerDependenciesMeta: - typescript: - optional: true + tsconfck@3.0.3(typescript@5.4.5): dependencies: typescript: 5.4.5 - dev: true - /tsconfig@7.0.0: - resolution: {integrity: sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw==} + tsconfig@7.0.0: dependencies: '@types/strip-bom': 3.0.0 '@types/strip-json-comments': 0.0.30 strip-bom: 3.0.0 strip-json-comments: 2.0.1 - dev: true - /tslib@2.6.2: - resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} - dev: true + tslib@2.6.2: {} - /tsm@2.3.0: - resolution: {integrity: sha512-++0HFnmmR+gMpDtKTnW3XJ4yv9kVGi20n+NfyQWB9qwJvTaIWY9kBmzek2YUQK5APTQ/1DTrXmm4QtFPmW9Rzw==} - engines: {node: '>=12'} - hasBin: true + tsm@2.3.0: dependencies: esbuild: 0.15.18 - dev: true - /tunnel-agent@0.6.0: - resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} - requiresBuild: true + tunnel-agent@0.6.0: dependencies: safe-buffer: 5.2.1 - dev: true optional: true - /tunnel@0.0.6: - resolution: {integrity: sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==} - engines: {node: '>=0.6.11 <=0.7.0 || >=0.7.3'} - dev: true + tunnel@0.0.6: {} - /type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} + type-check@0.4.0: dependencies: prelude-ls: 1.2.1 - dev: true - /type-detect@4.0.8: - resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} - engines: {node: '>=4'} - dev: true + type-detect@4.0.8: {} - /type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} - dev: true + type-fest@0.20.2: {} - /type-fest@2.19.0: - resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} - engines: {node: '>=12.20'} - dev: true + type-fest@2.19.0: {} - /type-fest@3.13.1: - resolution: {integrity: sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==} - engines: {node: '>=14.16'} - dev: true + type-fest@3.13.1: {} - /typed-array-buffer@1.0.2: - resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} - engines: {node: '>= 0.4'} + typed-array-buffer@1.0.2: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 is-typed-array: 1.1.13 - dev: true - /typed-array-byte-length@1.0.1: - resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} - engines: {node: '>= 0.4'} + typed-array-byte-length@1.0.1: dependencies: call-bind: 1.0.7 for-each: 0.3.3 gopd: 1.0.1 has-proto: 1.0.3 is-typed-array: 1.1.13 - dev: true - /typed-array-byte-offset@1.0.2: - resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} - engines: {node: '>= 0.4'} + typed-array-byte-offset@1.0.2: dependencies: available-typed-arrays: 1.0.7 call-bind: 1.0.7 @@ -7703,11 +9094,8 @@ packages: gopd: 1.0.1 has-proto: 1.0.3 is-typed-array: 1.1.13 - dev: true - /typed-array-length@1.0.5: - resolution: {integrity: sha512-yMi0PlwuznKHxKmcpoOdeLwxBoVPkqZxd7q2FgMkmD3bNwvF5VW0+UlUQ1k1vmktTu4Yu13Q0RIxEP8+B+wloA==} - engines: {node: '>= 0.4'} + typed-array-length@1.0.5: dependencies: call-bind: 1.0.7 for-each: 0.3.3 @@ -7715,65 +9103,39 @@ packages: has-proto: 1.0.3 is-typed-array: 1.1.13 possible-typed-array-names: 1.0.0 - dev: true - /typesafe-path@0.2.2: - resolution: {integrity: sha512-OJabfkAg1WLZSqJAJ0Z6Sdt3utnbzr/jh+NAHoyWHJe8CMSy79Gm085094M9nvTPy22KzTVn5Zq5mbapCI/hPA==} - dev: false + typesafe-path@0.2.2: {} - /typescript-auto-import-cache@0.3.2: - resolution: {integrity: sha512-+laqe5SFL1vN62FPOOJSUDTZxtgsoOXjneYOXIpx5rQ4UMiN89NAtJLpqLqyebv9fgQ/IMeeTX+mQyRnwvJzvg==} + typescript-auto-import-cache@0.3.2: dependencies: semver: 7.6.0 - dev: false - /typescript@5.4.5: - resolution: {integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==} - engines: {node: '>=14.17'} - hasBin: true + typescript@5.4.5: {} - /typical@2.6.1: - resolution: {integrity: sha512-ofhi8kjIje6npGozTip9Fr8iecmYfEbS06i0JnIg+rh51KakryWF4+jX8lLKZVhy6N+ID45WYSFCxPOdTWCzNg==} - dev: false + typical@2.6.1: {} - /uc.micro@1.0.6: - resolution: {integrity: sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==} - dev: false + uc.micro@1.0.6: {} - /ufo@1.5.2: - resolution: {integrity: sha512-eiutMaL0J2MKdhcOM1tUy13pIrYnyR87fEd8STJQFrrAwImwvlXkxlZEjaKah8r2viPohld08lt73QfLG1NxMg==} - dev: true + ufo@1.5.2: {} - /unbox-primitive@1.0.2: - resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + unbox-primitive@1.0.2: dependencies: call-bind: 1.0.7 has-bigints: 1.0.2 has-symbols: 1.0.3 which-boxed-primitive: 1.0.2 - dev: true - /underscore@1.13.6: - resolution: {integrity: sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==} - dev: false + underscore@1.13.6: {} - /undici-types@5.26.5: - resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} - dev: true + undici-types@5.26.5: {} - /undici@5.28.4: - resolution: {integrity: sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==} - engines: {node: '>=14.0'} + undici@5.28.4: dependencies: '@fastify/busboy': 2.1.1 - dev: true - /unherit@3.0.1: - resolution: {integrity: sha512-akOOQ/Yln8a2sgcLj4U0Jmx0R5jpIg2IUyRrWOzmEbjBtGzBdHtSeFKgoEcoH4KYIG/Pb8GQ/BwtYm0GCq1Sqg==} - dev: true + unherit@3.0.1: {} - /unified@10.1.2: - resolution: {integrity: sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==} + unified@10.1.2: dependencies: '@types/unist': 2.0.10 bail: 2.0.2 @@ -7782,10 +9144,8 @@ packages: is-plain-obj: 4.1.0 trough: 2.2.0 vfile: 5.3.7 - dev: true - /unified@11.0.4: - resolution: {integrity: sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ==} + unified@11.0.4: dependencies: '@types/unist': 3.0.2 bail: 2.0.2 @@ -7795,221 +9155,156 @@ packages: trough: 2.2.0 vfile: 6.0.1 - /unist-util-find-after@5.0.0: - resolution: {integrity: sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==} + unist-util-find-after@5.0.0: dependencies: '@types/unist': 3.0.2 unist-util-is: 6.0.0 - dev: true - /unist-util-is@4.1.0: - resolution: {integrity: sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==} - dev: false + unist-util-is@4.1.0: {} - /unist-util-is@5.2.1: - resolution: {integrity: sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==} + unist-util-is@5.2.1: dependencies: '@types/unist': 2.0.10 - dev: true - /unist-util-is@6.0.0: - resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} + unist-util-is@6.0.0: dependencies: '@types/unist': 3.0.2 - /unist-util-modify-children@3.1.1: - resolution: {integrity: sha512-yXi4Lm+TG5VG+qvokP6tpnk+r1EPwyYL04JWDxLvgvPV40jANh7nm3udk65OOWquvbMDe+PL9+LmkxDpTv/7BA==} + unist-util-modify-children@3.1.1: dependencies: '@types/unist': 2.0.10 array-iterate: 2.0.1 - dev: true - /unist-util-modify-children@4.0.0: - resolution: {integrity: sha512-+tdN5fGNddvsQdIzUF3Xx82CU9sMM+fA0dLgR9vOmT0oPT2jH+P1nd5lSqfCfXAw+93NhcXNY2qqvTUtE4cQkw==} + unist-util-modify-children@4.0.0: dependencies: '@types/unist': 3.0.2 array-iterate: 2.0.1 - dev: false - /unist-util-position-from-estree@2.0.0: - resolution: {integrity: sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==} + unist-util-position-from-estree@2.0.0: dependencies: '@types/unist': 3.0.2 - dev: true - /unist-util-position@4.0.4: - resolution: {integrity: sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==} + unist-util-position@4.0.4: dependencies: '@types/unist': 2.0.10 - dev: true - /unist-util-position@5.0.0: - resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + unist-util-position@5.0.0: dependencies: '@types/unist': 3.0.2 - dev: true - /unist-util-remove-position@5.0.0: - resolution: {integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==} + unist-util-remove-position@5.0.0: dependencies: '@types/unist': 3.0.2 unist-util-visit: 5.0.0 - dev: true - /unist-util-remove@4.0.0: - resolution: {integrity: sha512-b4gokeGId57UVRX/eVKej5gXqGlc9+trkORhFJpu9raqZkZhU0zm8Doi05+HaiBsMEIJowL+2WtQ5ItjsngPXg==} + unist-util-remove@4.0.0: dependencies: '@types/unist': 3.0.2 unist-util-is: 6.0.0 unist-util-visit-parents: 6.0.1 - dev: true - /unist-util-stringify-position@3.0.3: - resolution: {integrity: sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==} + unist-util-stringify-position@3.0.3: dependencies: '@types/unist': 2.0.10 - dev: true - /unist-util-stringify-position@4.0.0: - resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + unist-util-stringify-position@4.0.0: dependencies: '@types/unist': 3.0.2 - /unist-util-visit-children@2.0.2: - resolution: {integrity: sha512-+LWpMFqyUwLGpsQxpumsQ9o9DG2VGLFrpz+rpVXYIEdPy57GSy5HioC0g3bg/8WP9oCLlapQtklOzQ8uLS496Q==} + unist-util-visit-children@2.0.2: dependencies: '@types/unist': 2.0.10 - dev: true - /unist-util-visit-children@3.0.0: - resolution: {integrity: sha512-RgmdTfSBOg04sdPcpTSD1jzoNBjt9a80/ZCzp5cI9n1qPzLZWF9YdvWGN2zmTumP1HWhXKdUWexjy/Wy/lJ7tA==} + unist-util-visit-children@3.0.0: dependencies: '@types/unist': 3.0.2 - dev: false - /unist-util-visit-parents@3.1.1: - resolution: {integrity: sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==} + unist-util-visit-parents@3.1.1: dependencies: '@types/unist': 2.0.10 unist-util-is: 4.1.0 - dev: false - /unist-util-visit-parents@5.1.3: - resolution: {integrity: sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==} + unist-util-visit-parents@5.1.3: dependencies: '@types/unist': 2.0.10 unist-util-is: 5.2.1 - dev: true - /unist-util-visit-parents@6.0.1: - resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} + unist-util-visit-parents@6.0.1: dependencies: '@types/unist': 3.0.2 unist-util-is: 6.0.0 - /unist-util-visit@2.0.3: - resolution: {integrity: sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==} + unist-util-visit@2.0.3: dependencies: '@types/unist': 2.0.10 unist-util-is: 4.1.0 unist-util-visit-parents: 3.1.1 - dev: false - /unist-util-visit@4.1.2: - resolution: {integrity: sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==} + unist-util-visit@4.1.2: dependencies: '@types/unist': 2.0.10 unist-util-is: 5.2.1 unist-util-visit-parents: 5.1.3 - dev: true - /unist-util-visit@5.0.0: - resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + unist-util-visit@5.0.0: dependencies: '@types/unist': 3.0.2 unist-util-is: 6.0.0 unist-util-visit-parents: 6.0.1 - /unist-util-walker@1.0.0: - resolution: {integrity: sha512-XxadVB7qdSH6LBwhyHozj1VltpnK9m3/Zt/E/WFLaEt9eRQ0RkbsUb0lP9e1anQCEOXxf4X3NYtZQSpzqzTptw==} + unist-util-walker@1.0.0: dependencies: '@types/unist': 2.0.10 unified: 10.1.2 - dev: true - /update-browserslist-db@1.0.13(browserslist@4.23.0): - resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' + update-browserslist-db@1.0.13(browserslist@4.23.0): dependencies: browserslist: 4.23.0 escalade: 3.1.2 picocolors: 1.0.0 - dev: true - /uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + uri-js@4.4.1: dependencies: punycode: 2.3.1 - dev: true - /util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - dev: true + util-deprecate@1.0.2: {} - /uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - hasBin: true - dev: true + uuid@8.3.2: {} - /vfile-location@4.1.0: - resolution: {integrity: sha512-YF23YMyASIIJXpktBa4vIGLJ5Gs88UB/XePgqPmTa7cDA+JeO3yclbpheQYCHjVHBn/yePzrXuygIL+xbvRYHw==} + vfile-location@4.1.0: dependencies: '@types/unist': 2.0.10 vfile: 5.3.7 - dev: true - /vfile-location@5.0.2: - resolution: {integrity: sha512-NXPYyxyBSH7zB5U6+3uDdd6Nybz6o6/od9rk8bp9H8GR3L+cm/fC0uUTbqBmUTnMCUDslAGBOIKNfvvb+gGlDg==} + vfile-location@5.0.2: dependencies: '@types/unist': 3.0.2 vfile: 6.0.1 - dev: true - /vfile-message@3.1.4: - resolution: {integrity: sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==} + vfile-message@3.1.4: dependencies: '@types/unist': 2.0.10 unist-util-stringify-position: 3.0.3 - dev: true - /vfile-message@4.0.2: - resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} + vfile-message@4.0.2: dependencies: '@types/unist': 3.0.2 unist-util-stringify-position: 4.0.0 - /vfile@5.3.7: - resolution: {integrity: sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==} + vfile@5.3.7: dependencies: '@types/unist': 2.0.10 is-buffer: 2.0.5 unist-util-stringify-position: 3.0.3 vfile-message: 3.1.4 - dev: true - /vfile@6.0.1: - resolution: {integrity: sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==} + vfile@6.0.1: dependencies: '@types/unist': 3.0.2 unist-util-stringify-position: 4.0.0 vfile-message: 4.0.2 - /vite-node@1.4.0(@types/node@20.12.7)(sass@1.72.0): - resolution: {integrity: sha512-VZDAseqjrHgNd4Kh8icYHWzTKSCZMhia7GyHfhtzLW33fZlG9SwsB6CEhgyVOWkJfJ2pFLrp/Gj1FSfAiqH9Lw==} - engines: {node: ^18.0.0 || >=20.0.0} - hasBin: true + vite-node@1.4.0(@types/node@20.12.7)(sass@1.72.0): dependencies: cac: 6.7.14 debug: 4.3.4 @@ -8025,35 +9320,8 @@ packages: - sugarss - supports-color - terser - dev: true - /vite@5.2.8(@types/node@20.12.7)(sass@1.72.0): - resolution: {integrity: sha512-OyZR+c1CE8yeHw5V5t59aXsUPPVTHMDjEZz8MgguLL/Q7NblxhZUlTu9xSPqlsUO/y+X7dlU05jdhvyycD55DA==} - engines: {node: ^18.0.0 || >=20.0.0} - hasBin: true - peerDependencies: - '@types/node': ^18.0.0 || >=20.0.0 - less: '*' - lightningcss: ^1.21.0 - sass: '*' - stylus: '*' - sugarss: '*' - terser: ^5.4.0 - peerDependenciesMeta: - '@types/node': - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true + vite@5.2.8(@types/node@20.12.7)(sass@1.72.0): dependencies: '@types/node': 20.12.7 esbuild: 0.20.2 @@ -8062,43 +9330,12 @@ packages: sass: 1.72.0 optionalDependencies: fsevents: 2.3.3 - dev: true - /vitefu@0.2.5(vite@5.2.8): - resolution: {integrity: sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q==} - peerDependencies: - vite: ^3.0.0 || ^4.0.0 || ^5.0.0 - peerDependenciesMeta: - vite: - optional: true + vitefu@0.2.5(vite@5.2.8): dependencies: vite: 5.2.8(@types/node@20.12.7)(sass@1.72.0) - dev: true - /vitest@1.4.0(@types/node@20.12.7)(sass@1.72.0): - resolution: {integrity: sha512-gujzn0g7fmwf83/WzrDTnncZt2UiXP41mHuFYFrdwaLRVQ6JYQEiME2IfEjU3vcFL3VKa75XhI3lFgn+hfVsQw==} - engines: {node: ^18.0.0 || >=20.0.0} - hasBin: true - peerDependencies: - '@edge-runtime/vm': '*' - '@types/node': ^18.0.0 || >=20.0.0 - '@vitest/browser': 1.4.0 - '@vitest/ui': 1.4.0 - happy-dom: '*' - jsdom: '*' - peerDependenciesMeta: - '@edge-runtime/vm': - optional: true - '@types/node': - optional: true - '@vitest/browser': - optional: true - '@vitest/ui': - optional: true - happy-dom: - optional: true - jsdom: - optional: true + vitest@1.4.0(@types/node@20.12.7)(sass@1.72.0): dependencies: '@types/node': 20.12.7 '@vitest/expect': 1.4.0 @@ -8129,83 +9366,38 @@ packages: - sugarss - supports-color - terser - dev: true - /volar-service-css@0.0.34(@volar/language-service@2.1.6): - resolution: {integrity: sha512-C7ua0j80ZD7bsgALAz/cA1bykPehoIa5n+3+Ccr+YLpj0fypqw9iLUmGLX11CqzqNCO2XFGe/1eXB/c+SWrF/g==} - peerDependencies: - '@volar/language-service': ~2.1.0 - peerDependenciesMeta: - '@volar/language-service': - optional: true + volar-service-css@0.0.34(@volar/language-service@2.1.6): dependencies: '@volar/language-service': 2.1.6 vscode-css-languageservice: 6.2.14 vscode-languageserver-textdocument: 1.0.11 vscode-uri: 3.0.8 - dev: false - /volar-service-emmet@0.0.34(@volar/language-service@2.1.6): - resolution: {integrity: sha512-ubQvMCmHPp8Ic82LMPkgrp9ot+u2p/RDd0RyT0EykRkZpWsagHUF5HWkVheLfiMyx2rFuWx/+7qZPOgypx6h6g==} - peerDependencies: - '@volar/language-service': ~2.1.0 - peerDependenciesMeta: - '@volar/language-service': - optional: true + volar-service-emmet@0.0.34(@volar/language-service@2.1.6): dependencies: '@volar/language-service': 2.1.6 '@vscode/emmet-helper': 2.9.3 vscode-html-languageservice: 5.2.0 - dev: false - /volar-service-html@0.0.34(@volar/language-service@2.1.6): - resolution: {integrity: sha512-kMEneea1tQbiRcyKavqdrSVt8zV06t+0/3pGkjO3gV6sikXTNShIDkdtB4Tq9vE2cQdM50TuS7utVV7iysUxHw==} - peerDependencies: - '@volar/language-service': ~2.1.0 - peerDependenciesMeta: - '@volar/language-service': - optional: true + volar-service-html@0.0.34(@volar/language-service@2.1.6): dependencies: '@volar/language-service': 2.1.6 vscode-html-languageservice: 5.2.0 vscode-languageserver-textdocument: 1.0.11 vscode-uri: 3.0.8 - dev: false - /volar-service-prettier@0.0.34(@volar/language-service@2.1.6)(prettier@3.2.5): - resolution: {integrity: sha512-BNfJ8FwfPi1Wm/JkuzNjraOLdtKieGksNT/bDyquygVawv1QUzO2HB1hiMKfZGdcSFG5ZL9R0j7bBfRTfXA2gg==} - peerDependencies: - '@volar/language-service': ~2.1.0 - prettier: ^2.2 || ^3.0 - peerDependenciesMeta: - '@volar/language-service': - optional: true - prettier: - optional: true + volar-service-prettier@0.0.34(@volar/language-service@2.1.6)(prettier@3.2.5): dependencies: '@volar/language-service': 2.1.6 prettier: 3.2.5 vscode-uri: 3.0.8 - dev: false - /volar-service-typescript-twoslash-queries@0.0.34(@volar/language-service@2.1.6): - resolution: {integrity: sha512-XAY2YtWKUp6ht89gxt3L5Dr46LU45d/VlBkj1KXUwNlinpoWiGN4Nm3B6DRF3VoBThAnQgm4c7WD0S+5yTzh+w==} - peerDependencies: - '@volar/language-service': ~2.1.0 - peerDependenciesMeta: - '@volar/language-service': - optional: true + volar-service-typescript-twoslash-queries@0.0.34(@volar/language-service@2.1.6): dependencies: '@volar/language-service': 2.1.6 - dev: false - /volar-service-typescript@0.0.34(@volar/language-service@2.1.6): - resolution: {integrity: sha512-NbAry0w8ZXFgGsflvMwmPDCzgJGx3C+eYxFEbldaumkpTAJiywECWiUbPIOfmEHgpOllUKSnhwtLlWFK4YnfQg==} - peerDependencies: - '@volar/language-service': ~2.1.0 - peerDependenciesMeta: - '@volar/language-service': - optional: true + volar-service-typescript@0.0.34(@volar/language-service@2.1.6): dependencies: '@volar/language-service': 2.1.6 path-browserify: 1.0.1 @@ -8213,103 +9405,64 @@ packages: typescript-auto-import-cache: 0.3.2 vscode-languageserver-textdocument: 1.0.11 vscode-nls: 5.2.0 - dev: false - /vscode-css-languageservice@6.2.14: - resolution: {integrity: sha512-5UPQ9Y1sUTnuMyaMBpO7LrBkqjhEJb5eAwdUlDp+Uez8lry+Tspnk3+3p2qWS4LlNsr4p3v9WkZxUf1ltgFpgw==} + vscode-css-languageservice@6.2.14: dependencies: '@vscode/l10n': 0.0.18 vscode-languageserver-textdocument: 1.0.11 vscode-languageserver-types: 3.17.5 vscode-uri: 3.0.8 - dev: false - /vscode-html-languageservice@5.2.0: - resolution: {integrity: sha512-cdNMhyw57/SQzgUUGSIMQ66jikqEN6nBNyhx5YuOyj9310+eY9zw8Q0cXpiKzDX8aHYFewQEXRnigl06j/TVwQ==} + vscode-html-languageservice@5.2.0: dependencies: '@vscode/l10n': 0.0.18 vscode-languageserver-textdocument: 1.0.11 vscode-languageserver-types: 3.17.5 vscode-uri: 3.0.8 - dev: false - /vscode-jsonrpc@8.2.0: - resolution: {integrity: sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==} - engines: {node: '>=14.0.0'} - dev: false + vscode-jsonrpc@8.2.0: {} - /vscode-languageserver-protocol@3.17.5: - resolution: {integrity: sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==} + vscode-languageserver-protocol@3.17.5: dependencies: vscode-jsonrpc: 8.2.0 vscode-languageserver-types: 3.17.5 - dev: false - /vscode-languageserver-textdocument@1.0.11: - resolution: {integrity: sha512-X+8T3GoiwTVlJbicx/sIAF+yuJAqz8VvwJyoMVhwEMoEKE/fkDmrqUgDMyBECcM2A2frVZIUj5HI/ErRXCfOeA==} - dev: false + vscode-languageserver-textdocument@1.0.11: {} - /vscode-languageserver-types@3.17.5: - resolution: {integrity: sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==} - dev: false + vscode-languageserver-types@3.17.5: {} - /vscode-languageserver@9.0.1: - resolution: {integrity: sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==} - hasBin: true + vscode-languageserver@9.0.1: dependencies: vscode-languageserver-protocol: 3.17.5 - dev: false - /vscode-nls@5.2.0: - resolution: {integrity: sha512-RAaHx7B14ZU04EU31pT+rKz2/zSl7xMsfIZuo8pd+KZO6PXtQmpevpq3vxvWNcrGbdmhM/rr5Uw5Mz+NBfhVng==} - dev: false + vscode-nls@5.2.0: {} - /vscode-uri@2.1.2: - resolution: {integrity: sha512-8TEXQxlldWAuIODdukIb+TR5s+9Ds40eSJrw+1iDDA9IFORPjMELarNQE3myz5XIkWWpdprmJjm1/SxMlWOC8A==} - dev: false + vscode-uri@2.1.2: {} - /vscode-uri@3.0.8: - resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==} - dev: false + vscode-uri@3.0.8: {} - /walk-back@5.1.0: - resolution: {integrity: sha512-Uhxps5yZcVNbLEAnb+xaEEMdgTXl9qAQDzKYejG2AZ7qPwRQ81lozY9ECDbjLPNWm7YsO1IK5rsP1KoQzXAcGA==} - engines: {node: '>=12.17'} - dev: false + walk-back@5.1.0: {} - /web-namespaces@2.0.1: - resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} - dev: true + web-namespaces@2.0.1: {} - /web-streams-polyfill@3.3.3: - resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} - engines: {node: '>= 8'} - dev: true + web-streams-polyfill@3.3.3: {} - /webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - dev: true + webidl-conversions@3.0.1: {} - /whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + whatwg-url@5.0.0: dependencies: tr46: 0.0.3 webidl-conversions: 3.0.1 - dev: true - /which-boxed-primitive@1.0.2: - resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + which-boxed-primitive@1.0.2: dependencies: is-bigint: 1.0.4 is-boolean-object: 1.1.2 is-number-object: 1.0.7 is-string: 1.0.7 is-symbol: 1.0.4 - dev: true - /which-builtin-type@1.1.3: - resolution: {integrity: sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==} - engines: {node: '>= 0.4'} + which-builtin-type@1.1.3: dependencies: function.prototype.name: 1.1.6 has-tostringtag: 1.0.2 @@ -8323,136 +9476,82 @@ packages: which-boxed-primitive: 1.0.2 which-collection: 1.0.2 which-typed-array: 1.1.15 - dev: true - /which-collection@1.0.2: - resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} - engines: {node: '>= 0.4'} + which-collection@1.0.2: dependencies: is-map: 2.0.3 is-set: 2.0.3 is-weakmap: 2.0.2 is-weakset: 2.0.3 - dev: true - /which-pm-runs@1.1.0: - resolution: {integrity: sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA==} - engines: {node: '>=4'} - dev: true + which-pm-runs@1.1.0: {} - /which-pm@2.0.0: - resolution: {integrity: sha512-Lhs9Pmyph0p5n5Z3mVnN0yWcbQYUAD7rbQUiMsQxOJ3T57k7RFe35SUwWMf7dsbDZks1uOmw4AecB/JMDj3v/w==} - engines: {node: '>=8.15'} + which-pm@2.0.0: dependencies: load-yaml-file: 0.2.0 path-exists: 4.0.0 - dev: true - /which-pm@2.1.1: - resolution: {integrity: sha512-xzzxNw2wMaoCWXiGE8IJ9wuPMU+EYhFksjHxrRT8kMT5SnocBPRg69YAMtyV4D12fP582RA+k3P8H9J5EMdIxQ==} - engines: {node: '>=8.15'} + which-pm@2.1.1: dependencies: load-yaml-file: 0.2.0 path-exists: 4.0.0 - dev: true - /which-typed-array@1.1.15: - resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} - engines: {node: '>= 0.4'} + which-typed-array@1.1.15: dependencies: available-typed-arrays: 1.0.7 call-bind: 1.0.7 for-each: 0.3.3 gopd: 1.0.1 has-tostringtag: 1.0.2 - dev: true - /which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true + which@2.0.2: dependencies: isexe: 2.0.0 - dev: true - /why-is-node-running@2.2.2: - resolution: {integrity: sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==} - engines: {node: '>=8'} - hasBin: true + why-is-node-running@2.2.2: dependencies: siginfo: 2.0.0 stackback: 0.0.2 - dev: true - /widest-line@4.0.1: - resolution: {integrity: sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==} - engines: {node: '>=12'} + widest-line@4.0.1: dependencies: string-width: 5.1.2 - dev: true - /wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} + wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 string-width: 4.2.3 strip-ansi: 6.0.1 - dev: false - /wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} + wrap-ansi@8.1.0: dependencies: ansi-styles: 6.2.1 string-width: 5.1.2 strip-ansi: 7.1.0 - dev: true - /wrap-ansi@9.0.0: - resolution: {integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==} - engines: {node: '>=18'} + wrap-ansi@9.0.0: dependencies: ansi-styles: 6.2.1 string-width: 7.1.0 strip-ansi: 7.1.0 - dev: true - /wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + wrappy@1.0.2: {} - /xmlcreate@2.0.4: - resolution: {integrity: sha512-nquOebG4sngPmGPICTS5EnxqhKbCmz5Ox5hsszI2T6U5qdrJizBc+0ilYSEjTSzU0yZcmvppztXe/5Al5fUwdg==} - dev: false + xmlcreate@2.0.4: {} - /y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - dev: false + y18n@5.0.8: {} - /yallist@2.1.2: - resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} - dev: true + yallist@2.1.2: {} - /yallist@3.1.1: - resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - dev: true + yallist@3.1.1: {} - /yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + yallist@4.0.0: {} - /yaml@2.3.4: - resolution: {integrity: sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==} - engines: {node: '>= 14'} - dev: true + yaml@2.3.4: {} - /yargs-parser@21.1.1: - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} - engines: {node: '>=12'} + yargs-parser@21.1.1: {} - /yargs@17.7.2: - resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} - engines: {node: '>=12'} + yargs@17.7.2: dependencies: cliui: 8.0.1 escalade: 3.1.2 @@ -8461,29 +9560,15 @@ packages: string-width: 4.2.3 y18n: 5.0.8 yargs-parser: 21.1.1 - dev: false - /yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - dev: true + yocto-queue@0.1.0: {} - /yocto-queue@1.0.0: - resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} - engines: {node: '>=12.20'} - dev: true + yocto-queue@1.0.0: {} - /zod-to-json-schema@3.22.4(zod@3.22.4): - resolution: {integrity: sha512-2Ed5dJ+n/O3cU383xSY28cuVi0BCQhF8nYqWU5paEpl7fVdqdAmiLdqLyfblbNdfOFwFfi/mqU4O1pwc60iBhQ==} - peerDependencies: - zod: ^3.22.4 + zod-to-json-schema@3.22.4(zod@3.22.4): dependencies: zod: 3.22.4 - dev: true - /zod@3.22.4: - resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} - dev: true + zod@3.22.4: {} - /zwitch@2.0.4: - resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + zwitch@2.0.4: {} From 87705ba0613c72d4d010488b0abb87db77ea645b Mon Sep 17 00:00:00 2001 From: Steveay <907221539@qq.com> Date: Fri, 26 Apr 2024 11:36:51 +0800 Subject: [PATCH 44/81] ADM-927:[frontend]feat: add metrics board and pipeline failed status handle logic (#1410) * ADM-927:[frontend]feat: add retry button * ADM-927:[frontend]feat: http client handle 5xx error with special route * ADM-927:[frontend]feat: add failed status for retry * ADM-927:[frontend]feat: add notification pop up when partial failed * ADM-927:[frontend]feat: implemented all no cards and all 4xx error cases * ADM-927:[frontend]feat: map correct api result to board * ADM-927:[frontend]refactor: restore the http client handle 500 logic * ADM-927:[frontend]fix: refactor from cr comments * ADM-927:[frontend]refactor: adapt code style * ADM-927:[frontend]refactor: remove retry for board info * ADM-927:[frontend]feat: add board info failed status ability * ADM-927:[frontend]refactor: adapt all no cards * ADM-927:[frontend]refactor: move board info response filter and map to hook * ADM-927:[frontend]test: fix test * ADM-927:[frontend]refactor: rename status and remove unnecessary variable * ADM-927:[frontend]feat: fixed test coverage * ADM-927:[frontend]fix: fix coverage to 100 by delete useless code * ADM-927:[frontend]feat: add partial error popup for metrics step * ADM-927:[frontend]fix: combined two tests using mockImplementation * ADM-927:[frontend]fix: use and logic for error code mapping * ADM-927:[frontend]fix: fix code space * ADM-927:[frontend]refactor: refactor pipeline info request error title * ADM-927:[frontend]test: add pipeline failed status test * ADM-927:[frontend]test: rename test * ADM-927:[frontend]test: rename test --------- Co-authored-by: PengxiWPix Co-authored-by: guzhongren --- .../client/PipelineToolClient.test.ts | 8 +- ...icSelectionPopupTestPartialFailed.test.tsx | 85 ++++++++++++ .../MetricsStep/MetricsStep.test.tsx | 31 ++++- ...MetricsStepPopupTestPartialFailed.test.tsx | 60 ++++++++ .../__tests__/hooks/useGetBoardInfo.test.tsx | 128 ++++++++++++++++-- .../hooks/useGetMetricsStepsEffect.test.tsx | 39 ++++++ .../clients/pipeline/PipelineToolClient.ts | 10 +- frontend/src/constants/commons.ts | 10 ++ frontend/src/constants/resources.ts | 15 +- .../PipelineMetricSelection/index.tsx | 30 +++- frontend/src/containers/MetricsStep/index.tsx | 55 ++++++-- frontend/src/hooks/useGetBoardInfo.ts | 102 +++++++++----- .../src/hooks/useGetMetricsStepsEffect.ts | 18 ++- 13 files changed, 525 insertions(+), 66 deletions(-) create mode 100644 frontend/__tests__/containers/MetricsStep/DeploymentFrequencySettings/PipelineMetricSelectionPopupTestPartialFailed.test.tsx create mode 100644 frontend/__tests__/containers/MetricsStep/MetricsStepPopupTestPartialFailed.test.tsx diff --git a/frontend/__tests__/client/PipelineToolClient.test.ts b/frontend/__tests__/client/PipelineToolClient.test.ts index ed50cd7c95..acf485b6ec 100644 --- a/frontend/__tests__/client/PipelineToolClient.test.ts +++ b/frontend/__tests__/client/PipelineToolClient.test.ts @@ -79,22 +79,22 @@ describe('PipelineToolClient', () => { }, { code: HttpStatusCode.BadRequest, - errorTitle: 'Invalid input!', + errorTitle: 'Failed to get Pipeline configuration!', errorMessage, }, { code: HttpStatusCode.Unauthorized, - errorTitle: 'Unauthorized request!', + errorTitle: 'Failed to get Pipeline configuration!', errorMessage, }, { code: HttpStatusCode.Forbidden, - errorTitle: 'Forbidden request!', + errorTitle: 'Failed to get Pipeline configuration!', errorMessage, }, { code: HttpStatusCode.NotFound, - errorTitle: 'Not found!', + errorTitle: 'Failed to get Pipeline configuration!', errorMessage, }, ]; diff --git a/frontend/__tests__/containers/MetricsStep/DeploymentFrequencySettings/PipelineMetricSelectionPopupTestPartialFailed.test.tsx b/frontend/__tests__/containers/MetricsStep/DeploymentFrequencySettings/PipelineMetricSelectionPopupTestPartialFailed.test.tsx new file mode 100644 index 0000000000..ce9032322d --- /dev/null +++ b/frontend/__tests__/containers/MetricsStep/DeploymentFrequencySettings/PipelineMetricSelectionPopupTestPartialFailed.test.tsx @@ -0,0 +1,85 @@ +import { render, waitFor } from '@testing-library/react'; +import { setupStore } from '@test/utils/setupStoreUtil'; +import { Provider } from 'react-redux'; + +import { PipelineMetricSelection } from '@src/containers/MetricsStep/DeploymentFrequencySettings/PipelineMetricSelection'; +import { IPipelineConfig, updateShouldGetPipelineConfig } from '@src/context/Metrics/metricsSlice'; +import { addNotification } from '@src/context/notification/NotificationSlice'; +import { METRICS_DATA_FAIL_STATUS } from '@src/constants/commons'; +import { PIPELINE_SETTING_TYPES } from '@test/fixtures'; + +const store = setupStore(); +let stepFailStatus = METRICS_DATA_FAIL_STATUS.NOT_FAILED; + +jest.mock('@src/context/notification/NotificationSlice', () => ({ + ...jest.requireActual('@src/context/notification/NotificationSlice'), + addNotification: jest.fn().mockReturnValue({ type: 'ADD_NEW_NOTIFICATION' }), +})); + +jest.mock('@src/hooks/useGetMetricsStepsEffect', () => ({ + ...jest.requireActual('@src/hooks/useGetMetricsStepsEffect'), + + useGetMetricsStepsEffect: jest.fn().mockImplementation(() => { + return { + stepFailedStatus: stepFailStatus, + }; + }), +})); + +describe('PipelineMetricSelection', () => { + const deploymentFrequencySetting = { + id: 0, + organization: '', + pipelineName: '', + step: '', + branches: [], + }; + const mockHandleClickRemoveButton = jest.fn(); + const mockUpdatePipeline = jest.fn(); + const mockSetLoadingCompletedNumber = jest.fn(); + + const setup = async ( + deploymentFrequencySetting: IPipelineConfig, + isShowRemoveButton: boolean, + isDuplicated: boolean, + ) => { + store.dispatch(updateShouldGetPipelineConfig(true)); + return render( + + + , + ); + }; + + beforeEach(() => { + jest.clearAllMocks(); + }); + + it('should show 4xx popup when call pipeline step to get partial 4xx error', async () => { + stepFailStatus = METRICS_DATA_FAIL_STATUS.PARTIAL_FAILED_4XX; + await setup(deploymentFrequencySetting, true, false); + + await waitFor(() => { + expect(addNotification).toHaveBeenCalled(); + }); + }); + + it('should show timeout popup when call pipeline step to get partial timeout error', async () => { + stepFailStatus = METRICS_DATA_FAIL_STATUS.PARTIAL_FAILED_TIMEOUT; + await setup(deploymentFrequencySetting, true, false); + + await waitFor(() => { + expect(addNotification).toHaveBeenCalled(); + }); + }); +}); diff --git a/frontend/__tests__/containers/MetricsStep/MetricsStep.test.tsx b/frontend/__tests__/containers/MetricsStep/MetricsStep.test.tsx index 73383b92fa..c1af8a8fc1 100644 --- a/frontend/__tests__/containers/MetricsStep/MetricsStep.test.tsx +++ b/frontend/__tests__/containers/MetricsStep/MetricsStep.test.tsx @@ -195,7 +195,6 @@ describe('MetricsStep', () => { { key: 'done', value: { name: 'Done', statuses: ['PRE-DONE,', 'DONE', 'CANCEL'] } }, ]; - store.dispatch(updateShouldGetBoardConfig(true)); store.dispatch(updateMetrics(REQUIRED_DATA_LIST)); store.dispatch(updateCycleTimeSettings(cycleTimeSettingsWithTwoDoneValue)); store.dispatch(saveDoneColumn(doneColumn)); @@ -286,6 +285,7 @@ describe('MetricsStep', () => { }); it('should be render no card container when get board card when no data', async () => { + store.dispatch(updateShouldGetBoardConfig(true)); server.use( rest.post(MOCK_BOARD_INFO_URL, (_, res, ctx) => { return res(ctx.status(HttpStatusCode.Ok)); @@ -304,7 +304,35 @@ describe('MetricsStep', () => { ).toBeInTheDocument(); }); + it('should be render failed message container when get 4xx error', async () => { + store.dispatch(updateShouldGetBoardConfig(true)); + server.use( + rest.post(MOCK_BOARD_INFO_URL, (_, res, ctx) => { + return res(ctx.status(HttpStatusCode.BadRequest)); + }), + ); + + setup(); + + await waitFor(() => { + expect(screen.getByText('Failed to get Board configuration!')).toBeInTheDocument(); + }); + expect(screen.getByText('Please go back to the previous page and check your board info!')).toBeInTheDocument(); + }); + + it('should be render popup when get partial 4xx error', async () => { + store.dispatch(updateShouldGetBoardConfig(true)); + + setup(); + + await waitFor(() => { + expect(screen.getByText('Failed to get Board configuration!')).toBeInTheDocument(); + }); + expect(screen.getByText('Please go back to the previous page and check your board info!')).toBeInTheDocument(); + }); + it('should be render form container when got board card success', async () => { + store.dispatch(updateShouldGetBoardConfig(true)); server.use( rest.post(MOCK_BOARD_INFO_URL, (_, res, ctx) => { return res( @@ -374,6 +402,7 @@ describe('MetricsStep', () => { }); it('should show retry button when call get info timeout', async () => { + store.dispatch(updateShouldGetBoardConfig(true)); server.use( rest.post(MOCK_BOARD_INFO_URL, (_, res) => { return res.networkError('NETWORK_TIMEOUT'); diff --git a/frontend/__tests__/containers/MetricsStep/MetricsStepPopupTestPartialFailed.test.tsx b/frontend/__tests__/containers/MetricsStep/MetricsStepPopupTestPartialFailed.test.tsx new file mode 100644 index 0000000000..4fd87aebd2 --- /dev/null +++ b/frontend/__tests__/containers/MetricsStep/MetricsStepPopupTestPartialFailed.test.tsx @@ -0,0 +1,60 @@ +import { render, waitFor } from '@testing-library/react'; +import { setupStore } from '../../utils/setupStoreUtil'; +import MetricsStep from '@src/containers/MetricsStep'; +import { Provider } from 'react-redux'; + +import { addNotification } from '@src/context/notification/NotificationSlice'; +import { METRICS_DATA_FAIL_STATUS } from '@src/constants/commons'; + +let store = setupStore(); +const setup = () => + render( + + + , + ); + +jest.mock('@src/context/notification/NotificationSlice', () => ({ + ...jest.requireActual('@src/context/notification/NotificationSlice'), + addNotification: jest.fn().mockReturnValue({ type: 'ADD_NEW_NOTIFICATION' }), +})); + +let boardInfoFailStatus = METRICS_DATA_FAIL_STATUS.NOT_FAILED; + +jest.mock('@src/hooks/useGetBoardInfo', () => ({ + ...jest.requireActual('@src/hooks/useGetBoardInfo'), + + useGetBoardInfoEffect: jest.fn().mockImplementation(() => { + return { + boardInfoFailedStatus: boardInfoFailStatus, + }; + }), +})); + +describe('MetricsStep', () => { + beforeEach(() => { + store = setupStore(); + }); + + afterEach(() => { + jest.clearAllMocks(); + }); + + it('should show 4xx popup when call get partial 4xx error', async () => { + boardInfoFailStatus = METRICS_DATA_FAIL_STATUS.PARTIAL_FAILED_4XX; + setup(); + + await waitFor(() => { + expect(addNotification).toHaveBeenCalled(); + }); + }); + + it('should show no cards popup when call get partial no cards error', async () => { + boardInfoFailStatus = METRICS_DATA_FAIL_STATUS.PARTIAL_FAILED_NO_CARDS; + setup(); + + await waitFor(() => { + expect(addNotification).toHaveBeenCalled(); + }); + }); +}); diff --git a/frontend/__tests__/hooks/useGetBoardInfo.test.tsx b/frontend/__tests__/hooks/useGetBoardInfo.test.tsx index 0430c7a6fe..750b0ea271 100644 --- a/frontend/__tests__/hooks/useGetBoardInfo.test.tsx +++ b/frontend/__tests__/hooks/useGetBoardInfo.test.tsx @@ -1,4 +1,5 @@ import { MOCK_BOARD_INFO_URL, FAKE_TOKEN, FAKE_DATE_EARLIER, FAKE_DATE_LATER } from '@test/fixtures'; +import { AXIOS_REQUEST_ERROR_CODE } from '@src/constants/resources'; import { useGetBoardInfoEffect } from '@src/hooks/useGetBoardInfo'; import { renderHook, act, waitFor } from '@testing-library/react'; import { setupServer } from 'msw/node'; @@ -46,23 +47,23 @@ describe('use get board info', () => { ], [ HttpStatusCode.BadRequest, - 'Failed to get the board configuration!', - 'Please go back to the previous page to check your board info, or change your time range!', + 'Failed to get Board configuration!', + 'Please go back to the previous page and check your board info!', ], [ HttpStatusCode.Unauthorized, - 'Failed to get the board configuration!', - 'Please go back to the previous page to check your board info, or change your time range!', + 'Failed to get Board configuration!', + 'Please go back to the previous page and check your board info!', ], [ HttpStatusCode.Forbidden, - 'Failed to get the board configuration!', - 'Please go back to the previous page to check your board info, or change your time range!', + 'Failed to get Board configuration!', + 'Please go back to the previous page and check your board info!', ], [ HttpStatusCode.NotFound, - 'Failed to get the board configuration!', - 'Please go back to the previous page to check your board info, or change your time range!', + 'Failed to get Board configuration!', + 'Please go back to the previous page and check your board info!', ], ])('should got error message when got code is %s', async (code, title, message) => { server.use( @@ -81,4 +82,115 @@ describe('use get board info', () => { }); expect(result.current.errorMessage.message).toEqual(message); }); + + it('should get data when mock 4xx error', async () => { + server.use( + rest.post(MOCK_BOARD_INFO_URL, (_, res, ctx) => { + return res( + ctx.status(HttpStatusCode.BadRequest), + ctx.json({ + ignoredTargetFields: [ + { + key: 'description', + name: 'Description', + flag: false, + }, + ], + jiraColumns: [ + { + key: 'To Do', + value: { + name: 'TODO', + statuses: ['TODO'], + }, + }, + ], + targetFields: [ + { + key: 'issuetype', + name: 'Issue Type', + flag: false, + }, + ], + users: ['heartbeat user'], + }), + ); + }), + ); + const { result } = renderHook(() => useGetBoardInfoEffect()); + await act(() => { + result.current.getBoardInfo(mockBoardConfig); + }); + + await waitFor(() => { + expect(result.current.errorMessage.title).toEqual('Failed to get Board configuration!'); + }); + expect(result.current.errorMessage.message).toEqual( + 'Please go back to the previous page and check your board info!', + ); + }); + + it('should get data when mock 3xx error', async () => { + server.use( + rest.post(MOCK_BOARD_INFO_URL, (_, res, ctx) => { + return res( + ctx.status(HttpStatusCode.Unused), + ctx.json({ + code: AXIOS_REQUEST_ERROR_CODE.TIMEOUT, + }), + ); + }), + ); + const { result } = renderHook(() => useGetBoardInfoEffect()); + await act(() => { + result.current.getBoardInfo(mockBoardConfig); + }); + + await waitFor(() => { + expect(result.current.errorMessage.title).toEqual('Failed to get Board configuration!'); + }); + expect(result.current.errorMessage.message).toEqual( + 'Please go back to the previous page and check your board info!', + ); + }); + + it('should get data when status is OK', async () => { + server.use( + rest.post(MOCK_BOARD_INFO_URL, (_, res, ctx) => { + return res.once( + ctx.status(HttpStatusCode.Ok), + ctx.json({ + ignoredTargetFields: [ + { + key: 'description', + name: 'Description', + flag: false, + }, + ], + jiraColumns: [ + { + key: 'To Do', + value: { + name: 'TODO', + statuses: ['TODO'], + }, + }, + ], + targetFields: [ + { + key: 'issuetype', + name: 'Issue Type', + flag: false, + }, + ], + users: ['heartbeat user'], + }), + ); + }), + ); + const { result } = renderHook(() => useGetBoardInfoEffect()); + await act(() => { + result.current.getBoardInfo(mockBoardConfig); + }); + }); }); diff --git a/frontend/__tests__/hooks/useGetMetricsStepsEffect.test.tsx b/frontend/__tests__/hooks/useGetMetricsStepsEffect.test.tsx index 8f2ceb4c23..f979b73669 100644 --- a/frontend/__tests__/hooks/useGetMetricsStepsEffect.test.tsx +++ b/frontend/__tests__/hooks/useGetMetricsStepsEffect.test.tsx @@ -1,6 +1,7 @@ import { useGetMetricsStepsEffect } from '@src/hooks/useGetMetricsStepsEffect'; import { AXIOS_REQUEST_ERROR_CODE } from '@src/constants/resources'; import { act, renderHook, waitFor } from '@testing-library/react'; +import { METRICS_DATA_FAIL_STATUS } from '@src/constants/commons'; import { metricsClient } from '@src/clients/MetricsClient'; import { setupStore } from '@test/utils/setupStoreUtil'; import { TimeoutError } from '@src/errors/TimeoutError'; @@ -67,6 +68,44 @@ describe('use get steps effect', () => { }); }); + it('should get the steps failed status when partial 4xx response from steps res', async () => { + metricsClient.getSteps = jest + .fn() + .mockReturnValueOnce({ + response: ['a', 'b', 'c'], + haveStep: true, + branches: ['branchA', 'branchB'], + pipelineCrews: ['crewA', 'crewB'], + }) + .mockRejectedValue({ + code: 400, + }); + const { result } = renderHook(() => useGetMetricsStepsEffect()); + await act(async () => { + await result.current.getSteps(params, buildId, organizationId, pipelineType, token); + }); + expect(result.current.stepFailedStatus).toEqual(METRICS_DATA_FAIL_STATUS.PARTIAL_FAILED_4XX); + }); + + it('should get the steps failed status when partial timeout response from steps res', async () => { + metricsClient.getSteps = jest + .fn() + .mockReturnValueOnce({ + response: ['a', 'b', 'c'], + haveStep: true, + branches: ['branchA', 'branchB'], + pipelineCrews: ['crewA', 'crewB'], + }) + .mockRejectedValue({ + code: 'NETWORK_TIMEOUT', + }); + const { result } = renderHook(() => useGetMetricsStepsEffect()); + await act(async () => { + await result.current.getSteps(params, buildId, organizationId, pipelineType, token); + }); + expect(result.current.stepFailedStatus).toEqual(METRICS_DATA_FAIL_STATUS.PARTIAL_FAILED_TIMEOUT); + }); + it('should set error message when get steps throw error', async () => { jest.useFakeTimers(); metricsClient.getSteps = jest.fn().mockImplementation(() => { diff --git a/frontend/src/clients/pipeline/PipelineToolClient.ts b/frontend/src/clients/pipeline/PipelineToolClient.ts index ee74a0affc..a272da0470 100644 --- a/frontend/src/clients/pipeline/PipelineToolClient.ts +++ b/frontend/src/clients/pipeline/PipelineToolClient.ts @@ -3,6 +3,7 @@ import { PIPELINE_TOOL_GET_INFO_ERROR_CASE_TEXT_MAPPING, PIPELINE_TOOL_GET_INFO_ERROR_MESSAGE, UNKNOWN_ERROR_TITLE, + PIPELINE_CONFIG_TITLE, } from '@src/constants/resources'; import { IPipelineVerifyRequestDTO, PipelineInfoRequestDTO } from '@src/clients/pipeline/dto/request'; import { IPipelineInfoResponseDTO } from '@src/clients/pipeline/dto/response'; @@ -64,7 +65,14 @@ export class PipelineToolClient extends HttpClient { if (isAppError(e)) { const exception = e as IAppError; result.code = exception.code; - result.errorTitle = PIPELINE_TOOL_GET_INFO_ERROR_CASE_TEXT_MAPPING[`${exception.code}`] || UNKNOWN_ERROR_TITLE; + if ( + (exception.code as number) >= HttpStatusCode.BadRequest && + (exception.code as number) < HttpStatusCode.InternalServerError + ) { + result.errorTitle = PIPELINE_CONFIG_TITLE; + } else { + result.errorTitle = UNKNOWN_ERROR_TITLE; + } } result.errorMessage = PIPELINE_TOOL_GET_INFO_ERROR_MESSAGE; diff --git a/frontend/src/constants/commons.ts b/frontend/src/constants/commons.ts index a6ac392633..544b38c54c 100644 --- a/frontend/src/constants/commons.ts +++ b/frontend/src/constants/commons.ts @@ -87,3 +87,13 @@ export const GRID_CONFIG = { HALF: { XS: 6, MAX_INDEX: 2, FLEX: 1 }, FULL: { XS: 12, MAX_INDEX: 4, FLEX: 0.25 }, }; + +export enum METRICS_DATA_FAIL_STATUS { + NOT_FAILED, + PARTIAL_FAILED_4XX, + PARTIAL_FAILED_TIMEOUT, + PARTIAL_FAILED_NO_CARDS, + ALL_FAILED_4XX, + ALL_FAILED_TIMEOUT, + ALL_FAILED_NO_CARDS, +} diff --git a/frontend/src/constants/resources.ts b/frontend/src/constants/resources.ts index af2c76bf3a..5a06599746 100644 --- a/frontend/src/constants/resources.ts +++ b/frontend/src/constants/resources.ts @@ -282,6 +282,14 @@ export const MESSAGE = { 'Failed to get Classification data, please go back to previous page and try again!', FAILED_TO_EXPORT_CSV: 'Failed to export csv.', FAILED_TO_REQUEST: 'Failed to request!', + BOARD_INFO_REQUEST_PARTIAL_FAILED_4XX: + 'Failed to get partial Board configuration, please go back to the previous page and check your board info, or click "Next" button to go to Report page.', + BOARD_INFO_REQUEST_PARTIAL_FAILED_OTHERS: + 'Failed to get partial Board configuration, you can click "Next" button to go to Report page.', + PIPELINE_STEP_REQUEST_PARTIAL_FAILED_4XX: + 'Failed to get partial Pipeline configuration, please go back to the previous page and change your pipeline token with correct access permission, or click "Next" button to go to Report page.', + PIPELINE_STEP_REQUEST_PARTIAL_FAILED_OTHERS: + 'Failed to get partial Pipeline configuration, you can click "Next" button to go to Report page.', }; export const METRICS_CYCLE_SETTING_TABLE_HEADER_BY_COLUMN = [ @@ -334,6 +342,7 @@ export const NO_PIPELINE_STEP_ERROR = 'No steps for this pipeline!'; export enum AXIOS_REQUEST_ERROR_CODE { TIMEOUT = 'NETWORK_TIMEOUT', + NO_CARDS = 'NO_CARDS', } export const BOARD_CONFIG_INFO_TITLE = { @@ -342,15 +351,17 @@ export const BOARD_CONFIG_INFO_TITLE = { UNAUTHORIZED_REQUEST: 'Unauthorized request!', NOT_FOUND: 'Not found!', NO_CONTENT: 'No card within selected date range!', - GENERAL_ERROR: 'Failed to get the board configuration!', + GENERAL_ERROR: 'Failed to get Board configuration!', EMPTY: '', }; +export const PIPELINE_CONFIG_TITLE = 'Failed to get Pipeline configuration!'; + export const BOARD_CONFIG_INFO_ERROR = { FORBIDDEN: 'Please go back to the previous page and change your board token with correct access permission.', NOT_FOUND: 'Please go back to the previous page and check your board info!', NOT_CONTENT: 'Please go back to the previous page and change your collection date, or check your board info!', - GENERAL_ERROR: 'Please go back to the previous page to check your board info, or change your time range!', + GENERAL_ERROR: 'Please go back to the previous page and check your board info!', RETRY: 'Data loading failed, please', }; diff --git a/frontend/src/containers/MetricsStep/DeploymentFrequencySettings/PipelineMetricSelection/index.tsx b/frontend/src/containers/MetricsStep/DeploymentFrequencySettings/PipelineMetricSelection/index.tsx index 00611b70e7..c2da87bd2e 100644 --- a/frontend/src/containers/MetricsStep/DeploymentFrequencySettings/PipelineMetricSelection/index.tsx +++ b/frontend/src/containers/MetricsStep/DeploymentFrequencySettings/PipelineMetricSelection/index.tsx @@ -22,10 +22,12 @@ import { BranchSelection } from '@src/containers/MetricsStep/DeploymentFrequency import { ButtonWrapper, PipelineMetricSelectionWrapper, RemoveButton, WarningMessage } from './style'; import { WarningNotification } from '@src/components/Common/WarningNotification'; import { useGetMetricsStepsEffect } from '@src/hooks/useGetMetricsStepsEffect'; +import { addNotification } from '@src/context/notification/NotificationSlice'; import { uniqPipelineListCrews, updateResponseCrews } from '@src/utils/util'; import { MESSAGE, NO_PIPELINE_STEP_ERROR } from '@src/constants/resources'; import { ErrorNotification } from '@src/components/ErrorNotification'; import { shouldMetricsLoad } from '@src/context/stepper/StepperSlice'; +import { METRICS_DATA_FAIL_STATUS } from '@src/constants/commons'; import { useAppDispatch, useAppSelector } from '@src/hooks'; import { useEffect, useRef, useState } from 'react'; import { Loading } from '@src/components/Loading'; @@ -62,7 +64,7 @@ export const PipelineMetricSelection = ({ }: pipelineMetricSelectionProps) => { const { id, organization, pipelineName, step } = pipelineSetting; const dispatch = useAppDispatch(); - const { isLoading, errorMessage, getSteps } = useGetMetricsStepsEffect(); + const { isLoading, errorMessage, getSteps, stepFailedStatus } = useGetMetricsStepsEffect(); const storeContext = store.getState(); const organizationNameOptions = selectPipelineOrganizations(storeContext); const pipelineNameOptions = selectPipelineNames(storeContext, organization); @@ -130,6 +132,32 @@ export const PipelineMetricSelection = ({ }); }; + useEffect(() => { + const popup = () => { + if (stepFailedStatus === METRICS_DATA_FAIL_STATUS.PARTIAL_FAILED_4XX) { + dispatch( + addNotification({ + type: 'warning', + message: MESSAGE.PIPELINE_STEP_REQUEST_PARTIAL_FAILED_4XX, + }), + ); + } else if ( + stepFailedStatus === METRICS_DATA_FAIL_STATUS.PARTIAL_FAILED_NO_CARDS || + stepFailedStatus === METRICS_DATA_FAIL_STATUS.PARTIAL_FAILED_TIMEOUT + ) { + dispatch( + addNotification({ + type: 'warning', + message: MESSAGE.PIPELINE_STEP_REQUEST_PARTIAL_FAILED_OTHERS, + }), + ); + } + }; + if (!isLoading) { + popup(); + } + }, [stepFailedStatus, dispatch, isLoading]); + return ( {organizationWarningMessage && } diff --git a/frontend/src/containers/MetricsStep/index.tsx b/frontend/src/containers/MetricsStep/index.tsx index dbddd57045..62c14dd589 100644 --- a/frontend/src/containers/MetricsStep/index.tsx +++ b/frontend/src/containers/MetricsStep/index.tsx @@ -22,20 +22,27 @@ import { StyledErrorMessage, StyledRetryButton, } from '@src/containers/MetricsStep/style'; -import { AXIOS_REQUEST_ERROR_CODE, CYCLE_TIME_SETTINGS_TYPES, DONE, REQUIRED_DATA } from '@src/constants/resources'; +import { + AXIOS_REQUEST_ERROR_CODE, + CYCLE_TIME_SETTINGS_TYPES, + DONE, + MESSAGE, + REQUIRED_DATA, +} from '@src/constants/resources'; import { DeploymentFrequencySettings } from '@src/containers/MetricsStep/DeploymentFrequencySettings'; -import { closeAllNotifications } from '@src/context/notification/NotificationSlice'; +import { addNotification, closeAllNotifications } from '@src/context/notification/NotificationSlice'; import { Classification } from '@src/containers/MetricsStep/Classification'; import { shouldMetricsLoad } from '@src/context/stepper/StepperSlice'; import DateRangeViewer from '@src/components/Common/DateRangeViewer'; import { useGetBoardInfoEffect } from '@src/hooks/useGetBoardInfo'; import { combineBoardInfo, sortDateRanges } from '@src/utils/util'; import { CycleTime } from '@src/containers/MetricsStep/CycleTime'; +import { METRICS_DATA_FAIL_STATUS } from '@src/constants/commons'; import { RealDone } from '@src/containers/MetricsStep/RealDone'; +import { useCallback, useEffect, useLayoutEffect } from 'react'; import EmptyContent from '@src/components/Common/EmptyContent'; import { useAppDispatch, useAppSelector } from '@src/hooks'; import { Crews } from '@src/containers/MetricsStep/Crews'; -import { useCallback, useLayoutEffect } from 'react'; import { Loading } from '@src/components/Loading'; import ReworkSettings from './ReworkSettings'; import { Advance } from './Advance/Advance'; @@ -63,7 +70,7 @@ const MetricsStep = () => { const isShowRealDone = cycleTimeSettingsType === CYCLE_TIME_SETTINGS_TYPES.BY_COLUMN && cycleTimeSettings.filter((e) => e.value === DONE).length > 1; - const { getBoardInfo, isLoading, errorMessage } = useGetBoardInfoEffect(); + const { getBoardInfo, isLoading, errorMessage, boardInfoFailedStatus } = useGetBoardInfoEffect(); const shouldLoad = useAppSelector(shouldMetricsLoad); const shouldGetBoardConfig = useAppSelector(selectShouldGetBoardConfig); @@ -73,9 +80,8 @@ const MetricsStep = () => { ...boardConfig, dateRanges, }).then((res) => { - if (res && res[0].data) { - const boardInfo = res?.map((r) => r.data); - const commonPayload = combineBoardInfo(boardInfo!); + if (res && res.length) { + const commonPayload = combineBoardInfo(res); dispatch(updateBoardVerifyState(true)); dispatch(updateJiraVerifyResponse(commonPayload)); dispatch(updateMetricsState(merge(commonPayload, { isProjectCreated: isProjectCreated }))); @@ -88,6 +94,32 @@ const MetricsStep = () => { [], ); + useEffect(() => { + const popup = () => { + if (boardInfoFailedStatus === METRICS_DATA_FAIL_STATUS.PARTIAL_FAILED_4XX) { + dispatch( + addNotification({ + type: 'warning', + message: MESSAGE.BOARD_INFO_REQUEST_PARTIAL_FAILED_4XX, + }), + ); + } else if ( + boardInfoFailedStatus === METRICS_DATA_FAIL_STATUS.PARTIAL_FAILED_NO_CARDS || + boardInfoFailedStatus === METRICS_DATA_FAIL_STATUS.PARTIAL_FAILED_TIMEOUT + ) { + dispatch( + addNotification({ + type: 'warning', + message: MESSAGE.BOARD_INFO_REQUEST_PARTIAL_FAILED_OTHERS, + }), + ); + } + }; + if (!isLoading) { + popup(); + } + }, [boardInfoFailedStatus, dispatch, isLoading]); + useLayoutEffect(() => { if (!shouldLoad) return; dispatch(closeAllNotifications()); @@ -106,12 +138,15 @@ const MetricsStep = () => { /> )} - {isShowCrewsAndRealDone && ( {isLoading && } - Board configuration - {isEmpty(errorMessage) ? ( + Board configuration + + {isEmpty(errorMessage) || + (boardInfoFailedStatus != METRICS_DATA_FAIL_STATUS.ALL_FAILED_4XX && + boardInfoFailedStatus != METRICS_DATA_FAIL_STATUS.ALL_FAILED_TIMEOUT && + boardInfoFailedStatus != METRICS_DATA_FAIL_STATUS.ALL_FAILED_NO_CARDS) ? ( <> diff --git a/frontend/src/hooks/useGetBoardInfo.ts b/frontend/src/hooks/useGetBoardInfo.ts index bf31629aa2..169e44c1dc 100644 --- a/frontend/src/hooks/useGetBoardInfo.ts +++ b/frontend/src/hooks/useGetBoardInfo.ts @@ -1,9 +1,9 @@ -import { BOARD_CONFIG_INFO_ERROR, BOARD_CONFIG_INFO_TITLE } from '@src/constants/resources'; +import { AXIOS_REQUEST_ERROR_CODE, BOARD_CONFIG_INFO_ERROR, BOARD_CONFIG_INFO_TITLE } from '@src/constants/resources'; import { boardInfoClient } from '@src/clients/board/BoardInfoClient'; import { BoardInfoConfigDTO } from '@src/clients/board/dto/request'; -import { AXIOS_REQUEST_ERROR_CODE } from '@src/constants/resources'; -import { AxiosResponse, HttpStatusCode } from 'axios'; +import { METRICS_DATA_FAIL_STATUS } from '@src/constants/commons'; import { ReactNode, useState } from 'react'; +import { HttpStatusCode } from 'axios'; import get from 'lodash/get'; import dayjs from 'dayjs'; @@ -17,49 +17,62 @@ export interface BoardInfoResponse { users: Users; } export interface useGetBoardInfoInterface { - getBoardInfo: (data: BoardInfoConfigDTO) => Promise[]> | undefined>; + getBoardInfo: (data: BoardInfoConfigDTO) => Promise | undefined>; isLoading: boolean; errorMessage: Record; + boardInfoFailedStatus: METRICS_DATA_FAIL_STATUS; } +const boardInfoPartialFailedStatusMapping = (code: string | number) => { + if (code == AXIOS_REQUEST_ERROR_CODE.TIMEOUT) { + return METRICS_DATA_FAIL_STATUS.PARTIAL_FAILED_TIMEOUT; + } + const numericCode = code as number; + if (numericCode >= HttpStatusCode.BadRequest && numericCode < HttpStatusCode.InternalServerError) { + return METRICS_DATA_FAIL_STATUS.PARTIAL_FAILED_4XX; + } + return METRICS_DATA_FAIL_STATUS.PARTIAL_FAILED_4XX; +}; -const codeMapping = (code: string | number) => { - const codes = { - [HttpStatusCode.BadRequest]: { - title: BOARD_CONFIG_INFO_TITLE.GENERAL_ERROR, - message: BOARD_CONFIG_INFO_ERROR.GENERAL_ERROR, - code: HttpStatusCode.BadRequest, - }, - [HttpStatusCode.Unauthorized]: { - title: BOARD_CONFIG_INFO_TITLE.GENERAL_ERROR, - message: BOARD_CONFIG_INFO_ERROR.GENERAL_ERROR, - code: HttpStatusCode.Unauthorized, - }, - [HttpStatusCode.Forbidden]: { - title: BOARD_CONFIG_INFO_TITLE.GENERAL_ERROR, - message: BOARD_CONFIG_INFO_ERROR.GENERAL_ERROR, - code: HttpStatusCode.Forbidden, +const errorStatusMap = (status: METRICS_DATA_FAIL_STATUS) => { + const errorStatusMap = { + [METRICS_DATA_FAIL_STATUS.PARTIAL_FAILED_4XX]: { + errorMessage: { + title: BOARD_CONFIG_INFO_TITLE.GENERAL_ERROR, + message: BOARD_CONFIG_INFO_ERROR.GENERAL_ERROR, + code: HttpStatusCode.BadRequest, + }, + elevateStatus: METRICS_DATA_FAIL_STATUS.ALL_FAILED_4XX, }, - [HttpStatusCode.NotFound]: { - title: BOARD_CONFIG_INFO_TITLE.GENERAL_ERROR, - message: BOARD_CONFIG_INFO_ERROR.GENERAL_ERROR, - code: HttpStatusCode.NotFound, + [METRICS_DATA_FAIL_STATUS.PARTIAL_FAILED_TIMEOUT]: { + errorMessage: { + title: BOARD_CONFIG_INFO_TITLE.EMPTY, + message: BOARD_CONFIG_INFO_ERROR.RETRY, + code: AXIOS_REQUEST_ERROR_CODE.TIMEOUT, + }, + elevateStatus: METRICS_DATA_FAIL_STATUS.ALL_FAILED_TIMEOUT, }, - [AXIOS_REQUEST_ERROR_CODE.TIMEOUT]: { - title: BOARD_CONFIG_INFO_TITLE.EMPTY, - message: BOARD_CONFIG_INFO_ERROR.RETRY, - code: AXIOS_REQUEST_ERROR_CODE.TIMEOUT, + [METRICS_DATA_FAIL_STATUS.PARTIAL_FAILED_NO_CARDS]: { + errorMessage: { + title: BOARD_CONFIG_INFO_TITLE.NO_CONTENT, + message: BOARD_CONFIG_INFO_ERROR.NOT_CONTENT, + code: AXIOS_REQUEST_ERROR_CODE.NO_CARDS, + }, + elevateStatus: METRICS_DATA_FAIL_STATUS.ALL_FAILED_NO_CARDS, }, }; - return get(codes, code); + return get(errorStatusMap, status); }; export const useGetBoardInfoEffect = (): useGetBoardInfoInterface => { const [isLoading, setIsLoading] = useState(false); const [errorMessage, setErrorMessage] = useState({}); + const [boardInfoFailedStatus, setBoardInfoFailedStatus] = useState(METRICS_DATA_FAIL_STATUS.NOT_FAILED); const getBoardInfo = async (data: BoardInfoConfigDTO) => { setIsLoading(true); setErrorMessage({}); + let errorCount = 0; + let localBoardInfoFailedStatus: METRICS_DATA_FAIL_STATUS; if (data.dateRanges) { const dateRangeCopy = Array.from(data.dateRanges); @@ -83,31 +96,46 @@ export const useGetBoardInfoEffect = (): useGetBoardInfoInterface => { .getBoardInfo(boardInfoRequest) .then((res) => { if (!res.data) { - setErrorMessage({ - title: BOARD_CONFIG_INFO_TITLE.NO_CONTENT, - message: BOARD_CONFIG_INFO_ERROR.NOT_CONTENT, - code: HttpStatusCode.NoContent, - }); + errorCount++; + localBoardInfoFailedStatus = METRICS_DATA_FAIL_STATUS.PARTIAL_FAILED_NO_CARDS; + setBoardInfoFailedStatus(METRICS_DATA_FAIL_STATUS.PARTIAL_FAILED_NO_CARDS); } return res; }) .catch((err) => { const { code } = err; - setErrorMessage(codeMapping(code)); + errorCount++; + localBoardInfoFailedStatus = boardInfoPartialFailedStatusMapping(code); + setBoardInfoFailedStatus(localBoardInfoFailedStatus); return err; }); }); return Promise.all(allBoardData) .then((res) => { - return res; + const config = errorStatusMap(localBoardInfoFailedStatus); + if (errorCount == res.length) { + if (config) { + setErrorMessage(config.errorMessage); + setBoardInfoFailedStatus(config.elevateStatus); + } + } else if (errorCount != 0) { + if (config) { + setErrorMessage(config.errorMessage); + } + } + const data = res.filter((r) => r.data); + return data?.map((r) => r.data); }) - .finally(() => setIsLoading(false)); + .finally(() => { + setIsLoading(false); + }); } }; return { getBoardInfo, errorMessage, isLoading, + boardInfoFailedStatus, }; }; diff --git a/frontend/src/hooks/useGetMetricsStepsEffect.ts b/frontend/src/hooks/useGetMetricsStepsEffect.ts index ed2e679931..0c54841eac 100644 --- a/frontend/src/hooks/useGetMetricsStepsEffect.ts +++ b/frontend/src/hooks/useGetMetricsStepsEffect.ts @@ -1,9 +1,9 @@ import { updateShouldRetryPipelineConfig } from '@src/context/Metrics/metricsSlice'; import { IStepsParams, IStepsRes, metricsClient } from '@src/clients/MetricsClient'; +import { METRICS_DATA_FAIL_STATUS, DURATION } from '@src/constants/commons'; import { useAppDispatch } from '@src/hooks/useAppDispatch'; import { TimeoutError } from '@src/errors/TimeoutError'; import { MESSAGE } from '@src/constants/resources'; -import { DURATION } from '@src/constants/commons'; import { useState } from 'react'; export interface useGetMetricsStepsEffectInterface { @@ -16,6 +16,7 @@ export interface useGetMetricsStepsEffectInterface { ) => Promise; isLoading: boolean; errorMessage: string; + stepFailedStatus: METRICS_DATA_FAIL_STATUS; } const TIMEOUT = 'timeout'; @@ -30,6 +31,7 @@ export const useGetMetricsStepsEffect = (): useGetMetricsStepsEffectInterface => const dispatch = useAppDispatch(); const [isLoading, setIsLoading] = useState(false); const [errorMessage, setErrorMessage] = useState(''); + const [stepFailedStatus, setStepFailedStatus] = useState(METRICS_DATA_FAIL_STATUS.NOT_FAILED); const getSteps = async ( params: IStepsParams[], @@ -44,6 +46,18 @@ export const useGetMetricsStepsEffect = (): useGetMetricsStepsEffectInterface => return metricsClient.getSteps(param, organizationId, buildId, pipelineType, token); }), ); + const hasRejected = allStepsRes.some((stepInfo) => stepInfo.status === 'rejected'); + const hasFulfilled = allStepsRes.some((stepInfo) => stepInfo.status === 'fulfilled'); + if (!hasRejected) { + setStepFailedStatus(METRICS_DATA_FAIL_STATUS.NOT_FAILED); + } else if (hasRejected && hasFulfilled) { + const rejectedStep = allStepsRes.find((stepInfo) => stepInfo.status === 'rejected'); + if ((rejectedStep as PromiseRejectedResult).reason.code == 400) { + setStepFailedStatus(METRICS_DATA_FAIL_STATUS.PARTIAL_FAILED_4XX); + } else { + setStepFailedStatus(METRICS_DATA_FAIL_STATUS.PARTIAL_FAILED_TIMEOUT); + } + } setIsLoading(false); if (allStepsRes.every((stepInfo) => stepInfo.status === 'rejected')) { if (isAllTimeoutError(allStepsRes)) { @@ -83,5 +97,5 @@ export const useGetMetricsStepsEffect = (): useGetMetricsStepsEffectInterface => }, DURATION.ERROR_MESSAGE_TIME); }; - return { isLoading, getSteps, errorMessage }; + return { isLoading, getSteps, errorMessage, stepFailedStatus }; }; From dca98d2c50fef44ee486d604aceace9a81490e00 Mon Sep 17 00:00:00 2001 From: Chao <89126516+mrcuriosity-tw@users.noreply.github.com> Date: Fri, 26 Apr 2024 13:53:26 +0800 Subject: [PATCH 45/81] Feat/form management config (#1409) * [ADM-887][frontend]: chore: roughly build up the form context. * [ADM-887][frontend]: feat: reconstruct the config step forms. * [ADM-887][frontend]: feat: make controlled. * [ADM-887][frontend]: feat: useDefaultValues to make projectName accept imports. * [ADM-887][frontend]: chore: refine code. * [ADM-887][frontend]: feat: integrate & . * [ADM-887][frontend]: feat: integrate form with pre-submit validations. * [ADM-887][frontend]: feat: apply `verify` disabled state with form centralized `isValid`. * [ADM-887][frontend]: feat: refactor the useVerifyBaordEffect * [ADM-887][frontend]: chore: refine code. * [ADM-887][frontend]: feat: integrate with RHF. * [ADM-887][frontend]: feat: integrate with RHF. * [ADM-887][frontend]: feat: reset form's validation state when submittion succeeds. * [ADM-887][frontend]: feat: roughly integrate the `next` button state with RHF. * [ADM-887][frontend]: feat: make form re-submit anytime when user change fields. * [ADM-887][frontend]: feat: correct Labels && fix some test. * [ADM-887][frontend]: feat: add to facilitate testing. * [ADM-887][frontend]: test: fix test because of aria-label change. * i[ADM-887][frontend]: chore: refine code. * [ADM-887][frontend]: chore: refine code. * [ADM-887][frontend]: feat: refine naming. * [ADM-887][frontend]: test: fix broken test. * [ADM-887][frontend]: test: fix the test of useVerifyBoardEffect. * [ADM-887][frontend]: test: fix the test of useVerifyPipelineToolEffect. * [ADM-887][frontend]: test: refine test. * [ADM-887][frontend]: test: add FormProvider for * [ADM-887][frontend]: feat: remove sourceControl.isVerified since no longer use it to compute the `next` state. * [ADM-887][frontend]: feat: remove board.isVerified since no longer use it to compute the `next` state. * [ADM-887][frontend]: feat: remove `isVerified`, use `isValid` & `isSubmitSuccessful` instead. * [ADM-887][frontend]: feat: complete the schemas of basicInfo except for `dateRange` * [ADM-887][frontend]: feat: manually control the error state when date-range error detected. * [ADM-887][frontend]: feat: integrate the date range with RHF. * [ADM-887][frontend]: feat: persist token in redux when onchange. * [ADM-887][frontend]: feat: persist sourceControl token in redux when onchange. * [ADM-887][frontend]: feat: persist board config in redux when onchange. * [ADM-887][frontend]: feat: customize validation rule for date ranges to synchronise form & UI. * [ADM-887][frontend]: test: fix test. * [ADM-887][frontend]: chore: restore fixture consts. * [ADM-887][frontend]: test: improve testing coverage. * [ADM-887][frontend]: test: improve coverage. * [ADM-887][frontend]: test: cover every scenario to match 100% coverage for date range. * [ADM-887][frontend]: feat: fix lint errors. * [ADM-887][frontend]: feat: no need to give default sort type in useState. * [ADM-887][frontend]: chore: refine code. * [ADM-887][frontend]: feat: move form initialization to MetricsStepper to persist the form submition state while jumping pages. * [ADM-887][frontend]: feat: trigger form validation while adding & removing range. * [ADM-887][frontend]: test: fix ConfigStep test and reduce duplicates of test runner. * [ADM-887][frontend]: chore: abstract CONST for reused labels. --- .../constants/fileConfig/fileConfig.test.ts | 2 +- ...peCheckbox.test.tsx => BasicInfo.test.tsx} | 29 +- .../containers/ConfigStep/Board.test.tsx | 42 +- .../containers/ConfigStep/ConfigStep.test.tsx | 83 +++- .../ConfigStep/DateRangePicker.test.tsx | 53 ++- .../ConfigStep/PipelineTool.test.tsx | 74 +++- .../ConfigStep/SortingDateRange.test.tsx | 2 +- .../ConfigStep/SourceControl.test.tsx | 116 +++-- .../ConfigStep/TimeoutAlet.test.tsx | 36 +- .../MetricsStepper/MetricsStepper.test.tsx | 159 ++++--- frontend/__tests__/context/boardSlice.test.ts | 18 +- .../__tests__/context/configSlice.test.ts | 2 +- .../context/pipelineToolSlice.test.ts | 15 - .../context/sourceControlSlice.test.ts | 13 - frontend/__tests__/fixtures.ts | 7 +- .../hooks/useVerifyBoardEffect.test.tsx | 197 +++++---- .../useVerifyPipelineToolEffect.test.tsx | 177 +++++--- ...useVerifySourceControlTokenEffect.test.tsx | 159 ++++--- frontend/__tests__/initialConfigState.ts | 5 +- frontend/__tests__/updatedConfigState.ts | 3 - frontend/__tests__/utils/FormProvider.tsx | 20 + frontend/package.json | 5 +- frontend/pnpm-lock.yaml | 402 +++++++++--------- frontend/src/constants/fileConfig.ts | 2 +- frontend/src/constants/resources.ts | 6 - .../BasicInfo/RequiredMetrics/index.tsx | 85 ++-- .../containers/ConfigStep/BasicInfo/index.tsx | 78 ++-- .../ConfigStep/Board/FormTextField.tsx | 66 +++ .../src/containers/ConfigStep/Board/index.tsx | 100 ++--- .../DateRangePicker/DateRangePicker.tsx | 68 ++- .../DateRangePicker/DateRangePickerGroup.tsx | 80 ++-- .../DateRangePicker/SortingDateRange.tsx | 2 +- .../ConfigStep/DateRangePicker/index.tsx | 8 +- .../ConfigStep/DateRangePicker/types.ts | 29 +- .../containers/ConfigStep/Form/FormSelect.tsx | 43 ++ .../src/containers/ConfigStep/Form/literal.ts | 81 ++++ .../src/containers/ConfigStep/Form/schema.ts | 101 +++++ .../src/containers/ConfigStep/Form/type.ts | 69 +++ .../ConfigStep/Form/useDefaultValues.ts | 86 ++++ .../ConfigStep/MetricsTypeCheckbox/index.tsx | 20 - .../ConfigStep/PipelineTool/index.tsx | 219 ++++------ .../ConfigStep/SourceControl/index.tsx | 209 ++++----- .../ConfigStep/TimeoutAlert/index.tsx | 13 +- frontend/src/containers/ConfigStep/index.tsx | 61 ++- .../MetricsStep/Advance/Advance.tsx | 10 +- frontend/src/containers/MetricsStep/index.tsx | 20 +- .../src/containers/MetricsStepper/index.tsx | 116 ++++- .../src/context/config/board/boardSlice.ts | 2 - frontend/src/context/config/configSlice.ts | 27 +- .../config/pipelineTool/pipelineToolSlice.ts | 2 - .../sourceControl/sourceControlSlice.ts | 2 - .../src/hooks/useGetPipelineToolInfoEffect.ts | 6 +- frontend/src/hooks/useVerifyBoardEffect.ts | 211 +++------ .../src/hooks/useVerifyPipelineToolEffect.ts | 68 ++- .../useVerifySourceControlTokenEffect.ts | 67 ++- 55 files changed, 2141 insertions(+), 1435 deletions(-) rename frontend/__tests__/containers/ConfigStep/{MetricsTypeCheckbox.test.tsx => BasicInfo.test.tsx} (84%) create mode 100644 frontend/__tests__/utils/FormProvider.tsx create mode 100644 frontend/src/containers/ConfigStep/Board/FormTextField.tsx create mode 100644 frontend/src/containers/ConfigStep/Form/FormSelect.tsx create mode 100644 frontend/src/containers/ConfigStep/Form/literal.ts create mode 100644 frontend/src/containers/ConfigStep/Form/schema.ts create mode 100644 frontend/src/containers/ConfigStep/Form/type.ts create mode 100644 frontend/src/containers/ConfigStep/Form/useDefaultValues.ts delete mode 100644 frontend/src/containers/ConfigStep/MetricsTypeCheckbox/index.tsx diff --git a/frontend/__tests__/constants/fileConfig/fileConfig.test.ts b/frontend/__tests__/constants/fileConfig/fileConfig.test.ts index 722ac3d961..e0ee8726fa 100644 --- a/frontend/__tests__/constants/fileConfig/fileConfig.test.ts +++ b/frontend/__tests__/constants/fileConfig/fileConfig.test.ts @@ -5,7 +5,7 @@ import { CHINA_CALENDAR, DEFAULT_REWORK_SETTINGS, } from '../../fixtures'; -import { SortType } from '@src/containers/ConfigStep/DateRangePicker/DateRangePickerGroup'; +import { SortType } from '@src/containers/ConfigStep/DateRangePicker/types'; import { convertToNewFileConfig } from '@src/constants/fileConfig'; describe('#fileConfig', () => { diff --git a/frontend/__tests__/containers/ConfigStep/MetricsTypeCheckbox.test.tsx b/frontend/__tests__/containers/ConfigStep/BasicInfo.test.tsx similarity index 84% rename from frontend/__tests__/containers/ConfigStep/MetricsTypeCheckbox.test.tsx rename to frontend/__tests__/containers/ConfigStep/BasicInfo.test.tsx index 2a46a935b4..f505be840b 100644 --- a/frontend/__tests__/containers/ConfigStep/MetricsTypeCheckbox.test.tsx +++ b/frontend/__tests__/containers/ConfigStep/BasicInfo.test.tsx @@ -2,7 +2,6 @@ import { ALL, DEV_CHANGE_FAILURE_RATE, CLASSIFICATION, - CONFIG_TITLE, CYCLE_TIME, DEPLOYMENT_FREQUENCY, LEAD_TIME_FOR_CHANGES, @@ -12,11 +11,13 @@ import { REWORK_TIMES, VELOCITY, } from '../../fixtures'; -import { MetricsTypeCheckbox } from '@src/containers/ConfigStep/MetricsTypeCheckbox'; +import { basicInfoDefaultValues } from '@src/containers/ConfigStep/Form/useDefaultValues'; +import { basicInfoSchema } from '@src/containers/ConfigStep/Form/schema'; import { render, waitFor, within, screen } from '@testing-library/react'; import { SELECTED_VALUE_SEPARATOR } from '@src/constants/commons'; import BasicInfo from '@src/containers/ConfigStep/BasicInfo'; import { setupStore } from '../../utils/setupStoreUtil'; +import { FormProvider } from '@test/utils/FormProvider'; import userEvent from '@testing-library/user-event'; import { Provider } from 'react-redux'; @@ -27,8 +28,9 @@ describe('MetricsTypeCheckbox', () => { store = setupStore(); return render( - - + + + , ); }; @@ -146,23 +148,4 @@ describe('MetricsTypeCheckbox', () => { expect(getByText(/Metrics is required/i)).toBeInTheDocument(); }); - - it('should show board component when click MetricsTypeCheckbox selection velocity ', async () => { - setup(); - await userEvent.click(screen.getByRole('combobox', { name: REQUIRED_DATA })); - const listBox = within(screen.getByRole('listbox')); - await userEvent.click(listBox.getByRole('option', { name: VELOCITY })); - expect(screen.getAllByText(CONFIG_TITLE.BOARD)[0]).toBeInTheDocument(); - }); - - it('should hidden board component when MetricsTypeCheckbox select is null given MetricsTypeCheckbox select is velocity ', async () => { - setup(); - - await userEvent.click(screen.getByRole('combobox', { name: REQUIRED_DATA })); - const requireDateSelection = within(screen.getByRole('listbox')); - await userEvent.click(requireDateSelection.getByRole('option', { name: VELOCITY })); - await userEvent.click(requireDateSelection.getByRole('option', { name: VELOCITY })); - - expect(screen.queryByText(CONFIG_TITLE.BOARD)).not.toBeInTheDocument(); - }); }); diff --git a/frontend/__tests__/containers/ConfigStep/Board.test.tsx b/frontend/__tests__/containers/ConfigStep/Board.test.tsx index 85f092ed0d..5dd859cbed 100644 --- a/frontend/__tests__/containers/ConfigStep/Board.test.tsx +++ b/frontend/__tests__/containers/ConfigStep/Board.test.tsx @@ -10,11 +10,14 @@ import { FAKE_TOKEN, REVERIFY, } from '../../fixtures'; +import { boardConfigDefaultValues } from '@src/containers/ConfigStep/Form/useDefaultValues'; +import { boardConfigSchema } from '@src/containers/ConfigStep/Form/schema'; import { render, screen, waitFor, within } from '@testing-library/react'; import { AXIOS_REQUEST_ERROR_CODE } from '@src/constants/resources'; import { boardClient } from '@src/clients/board/BoardClient'; import { Board } from '@src/containers/ConfigStep/Board'; import { setupStore } from '../../utils/setupStoreUtil'; +import { FormProvider } from '@test/utils/FormProvider'; import { TimeoutError } from '@src/errors/TimeoutError'; import userEvent from '@testing-library/user-event'; import { Provider } from 'react-redux'; @@ -59,7 +62,9 @@ describe('Board', () => { store = setupStore(); return render( - + + + , ); }; @@ -252,4 +257,39 @@ describe('Board', () => { ).toBeInTheDocument(); }); }); + + it('should close alert modal when user manually close the alert', async () => { + setup(); + await fillBoardFieldsInformation(); + const timeoutError = new TimeoutError('', AXIOS_REQUEST_ERROR_CODE.TIMEOUT); + boardClient.getVerifyBoard = jest.fn().mockImplementation(() => Promise.reject(timeoutError)); + + await userEvent.click(screen.getByText(VERIFY)); + + expect(screen.getByTestId('timeoutAlert')).toBeInTheDocument(); + + await userEvent.click(screen.getByLabelText('Close')); + + expect(screen.queryByLabelText('timeoutAlert')).not.toBeInTheDocument(); + }); + + it('should allow user to re-submit when user interact again with form given form is already submit successfully', async () => { + setup(); + mockVerifySuccess(); + await fillBoardFieldsInformation(); + + expect(screen.getByRole('button', { name: /verify/i })).toBeEnabled(); + + await userEvent.click(screen.getByText(/verify/i)); + + expect(await screen.findByRole('button', { name: /reset/i })).toBeInTheDocument(); + expect(await screen.findByRole('button', { name: /verified/i })).toBeDisabled(); + + const emailInput = (await screen.findByRole('textbox', { name: 'Email' })) as HTMLInputElement; + await userEvent.clear(emailInput); + await userEvent.type(emailInput, 'other@qq.com'); + const verifyButton = await screen.findByRole('button', { name: /verify/i }); + + expect(verifyButton).toBeEnabled(); + }); }); diff --git a/frontend/__tests__/containers/ConfigStep/ConfigStep.test.tsx b/frontend/__tests__/containers/ConfigStep/ConfigStep.test.tsx index 012b813ac9..83d64fb636 100644 --- a/frontend/__tests__/containers/ConfigStep/ConfigStep.test.tsx +++ b/frontend/__tests__/containers/ConfigStep/ConfigStep.test.tsx @@ -15,13 +15,33 @@ import { VELOCITY, VERIFIED, VERIFY, + ALL, + FAKE_TOKEN, + PIPELINE_TOOL_TOKEN_INPUT_LABEL, } from '../../fixtures'; -import { fillBoardFieldsInformation } from '@test/containers/ConfigStep/Board.test'; +import { + basicInfoSchema, + boardConfigSchema, + pipelineToolSchema, + sourceControlSchema, + IBasicInfoData, + IBoardConfigData, + IPipelineToolData, + ISourceControlData, +} from '@src/containers/ConfigStep/Form/schema'; +import { + basicInfoDefaultValues, + boardConfigDefaultValues, + pipelineToolDefaultValues, + sourceControlDefaultValues, +} from '@src/containers/ConfigStep/Form/useDefaultValues'; import { act, render, screen, waitFor, within } from '@testing-library/react'; import { setupStore } from '../../utils/setupStoreUtil'; +import { yupResolver } from '@hookform/resolvers/yup'; import userEvent from '@testing-library/user-event'; import ConfigStep from '@src/containers/ConfigStep'; import { closeMuiModal } from '@test/testUtils'; +import { useForm } from 'react-hook-form'; import { Provider } from 'react-redux'; import { setupServer } from 'msw/node'; import { rest } from 'msw'; @@ -39,18 +59,59 @@ const server = setupServer( ), ); +export const fillBoardFieldsInformation = async () => { + await userEvent.type(screen.getByLabelText(/board id/i), '1'); + await userEvent.type(screen.getByLabelText(/email/i), 'fake@qq.com'); + await userEvent.type(screen.getByLabelText(/site/i), 'fake'); + await userEvent.type(screen.getByLabelText(/token/i), FAKE_TOKEN); +}; + let store = null; jest.mock('@src/context/config/configSlice', () => ({ ...jest.requireActual('@src/context/config/configSlice'), selectWarningMessage: jest.fn().mockReturnValue('Test warning Message'), })); +const ConfigStepWithFormInstances = () => { + const basicInfoMethods = useForm({ + defaultValues: basicInfoDefaultValues, + resolver: yupResolver(basicInfoSchema), + mode: 'onChange', + }); + + const boardConfigMethods = useForm({ + defaultValues: boardConfigDefaultValues, + resolver: yupResolver(boardConfigSchema), + mode: 'onChange', + }); + + const pipelineToolMethods = useForm({ + defaultValues: pipelineToolDefaultValues, + resolver: yupResolver(pipelineToolSchema), + mode: 'onChange', + }); + + const sourceControlMethods = useForm({ + defaultValues: sourceControlDefaultValues, + resolver: yupResolver(sourceControlSchema), + mode: 'onChange', + }); + return ( + + ); +}; + describe('ConfigStep', () => { const setup = () => { store = setupStore(); return render( - + , ); }; @@ -235,7 +296,9 @@ describe('ConfigStep', () => { const requireDateSelection = within(screen.getByRole('listbox')); await userEvent.click(requireDateSelection.getByRole('option', { name: DEPLOYMENT_FREQUENCY })); await closeMuiModal(userEvent); - const tokenNode = within(screen.getByTestId('pipelineToolTextField')).getByLabelText('input Token'); + const tokenNode = within(screen.getByTestId('pipelineToolTextField')).getByLabelText( + PIPELINE_TOOL_TOKEN_INPUT_LABEL, + ); await userEvent.type(tokenNode, FAKE_PIPELINE_TOKEN); const submitButton = screen.getByText(VERIFY); await userEvent.click(submitButton); @@ -248,4 +311,18 @@ describe('ConfigStep', () => { expect(screen.queryByText(VERIFIED)).toBeVisible(); expect(screen.queryByText(RESET)).toBeVisible(); }); + + it('should show all forms given all metrics selected', async () => { + setup(); + + const requiredMetricsField = screen.getByRole('combobox', { name: REQUIRED_DATA }); + await userEvent.click(requiredMetricsField); + const requireDateSelection = within(screen.getByRole('listbox')); + await userEvent.click(requireDateSelection.getByRole('option', { name: ALL })); + await closeMuiModal(userEvent); + + expect(screen.getByLabelText('Board Config')).toBeInTheDocument(); + expect(screen.getByLabelText('Pipeline Tool Config')).toBeInTheDocument(); + expect(screen.getByLabelText('Source Control Config')).toBeInTheDocument(); + }); }); diff --git a/frontend/__tests__/containers/ConfigStep/DateRangePicker.test.tsx b/frontend/__tests__/containers/ConfigStep/DateRangePicker.test.tsx index 8d44fde57c..b209ed96e3 100644 --- a/frontend/__tests__/containers/ConfigStep/DateRangePicker.test.tsx +++ b/frontend/__tests__/containers/ConfigStep/DateRangePicker.test.tsx @@ -1,15 +1,18 @@ import { updateShouldGetBoardConfig, updateShouldGetPipelineConfig } from '@src/context/Metrics/metricsSlice'; +import { basicInfoDefaultValues } from '@src/containers/ConfigStep/Form/useDefaultValues'; import { DateRangePickerSection } from '@src/containers/ConfigStep/DateRangePicker'; +import { basicInfoSchema } from '@src/containers/ConfigStep/Form/schema'; import { ERROR_DATE, TIME_RANGE_ERROR_MESSAGE } from '../../fixtures'; import { render, screen, within } from '@testing-library/react'; import { setupStore } from '../../utils/setupStoreUtil'; +import { FormProvider } from '@test/utils/FormProvider'; import userEvent from '@testing-library/user-event'; import { Provider } from 'react-redux'; import React from 'react'; import dayjs from 'dayjs'; -const START_DATE_LABEL = 'From *'; -const END_DATE_LABEL = 'To *'; +const START_DATE_LABEL = 'From'; +const END_DATE_LABEL = 'To'; const TODAY = dayjs('2024-03-20'); const INPUT_DATE_VALUE = TODAY.format('MM/DD/YYYY'); let store = setupStore(); @@ -26,7 +29,9 @@ const setup = () => { store = setupStore(); return render( - + + + , ); }; @@ -300,4 +305,46 @@ describe('DateRangePickerSection', () => { await userEvent.click(sortButton); expect(screen.getByRole('button', { name: 'Ascending' })).toBeInTheDocument(); }); + + it('should provide unified error message when given all invalid time input', async () => { + const correctRange = ['03/15/2024', '03/25/2024']; + const rangeOfTooEarly = ['03/15/1600', '03/25/1600']; + const rangeOfInvalidFormat = ['XXxYY/2024', 'ZZ/11/2024']; + const startDateRequiredErrorMessage = 'Start date is required'; + const endDateRequiredErrorMessage = 'End date is required'; + const unifiedStartDateErrorMessage = 'Start date is invalid'; + const unifiedEndDateErrorMessage = 'End date is invalid'; + + const ranges = screen.getAllByLabelText('Range picker row'); + const startDateInput = within(ranges[0]).getByRole('textbox', { name: START_DATE_LABEL }) as HTMLInputElement; + const endDateInput = within(ranges[0]).getByRole('textbox', { name: END_DATE_LABEL }) as HTMLInputElement; + await userEvent.type(startDateInput, rangeOfTooEarly[0]); + await userEvent.type(endDateInput, rangeOfTooEarly[1]); + + expect(await screen.findByText(unifiedStartDateErrorMessage)).toBeVisible(); + expect(await screen.findByText(unifiedEndDateErrorMessage)).toBeVisible(); + + await userEvent.clear(startDateInput); + await userEvent.clear(endDateInput); + await userEvent.keyboard('{Tab}'); + + expect(await screen.findByText(startDateRequiredErrorMessage)).toBeVisible(); + expect(await screen.findByText(endDateRequiredErrorMessage)).toBeVisible(); + + await userEvent.type(startDateInput, correctRange[0]); + await userEvent.type(endDateInput, correctRange[1]); + + expect(screen.queryByText(startDateRequiredErrorMessage)).toBeNull(); + expect(screen.queryByText(endDateRequiredErrorMessage)).toBeNull(); + expect(screen.queryByText(unifiedStartDateErrorMessage)).toBeNull(); + expect(screen.queryByText(unifiedEndDateErrorMessage)).toBeNull(); + + await userEvent.type(startDateInput, rangeOfInvalidFormat[0]); + await userEvent.type(endDateInput, rangeOfInvalidFormat[1]); + + expect(screen.queryByText(startDateRequiredErrorMessage)).toBeNull(); + expect(screen.queryByText(endDateRequiredErrorMessage)).toBeNull(); + expect(screen.queryByText(unifiedStartDateErrorMessage)).toBeVisible(); + expect(screen.queryByText(unifiedEndDateErrorMessage)).toBeVisible(); + }); }); diff --git a/frontend/__tests__/containers/ConfigStep/PipelineTool.test.tsx b/frontend/__tests__/containers/ConfigStep/PipelineTool.test.tsx index af1c886bf4..e83a5eac44 100644 --- a/frontend/__tests__/containers/ConfigStep/PipelineTool.test.tsx +++ b/frontend/__tests__/containers/ConfigStep/PipelineTool.test.tsx @@ -10,12 +10,18 @@ import { MOCK_PIPELINE_VERIFY_URL, FAKE_PIPELINE_TOKEN, REVERIFY, + PIPELINE_TOOL_TOKEN_INPUT_LABEL, + TIMEOUT_ALERT_TEST_ID, } from '../../fixtures'; +import { pipelineToolDefaultValues } from '@src/containers/ConfigStep/Form/useDefaultValues'; import { pipelineToolClient } from '@src/clients/pipeline/PipelineToolClient'; +import { pipelineToolSchema } from '@src/containers/ConfigStep/Form/schema'; import { render, screen, waitFor, within } from '@testing-library/react'; import { PipelineTool } from '@src/containers/ConfigStep/PipelineTool'; import { AXIOS_REQUEST_ERROR_CODE } from '@src/constants/resources'; import { setupStore } from '../../utils/setupStoreUtil'; +import { FormProvider } from '@test/utils/FormProvider'; +import { TimeoutError } from '@src/errors/TimeoutError'; import userEvent from '@testing-library/user-event'; import { Provider } from 'react-redux'; import { setupServer } from 'msw/node'; @@ -24,7 +30,7 @@ import { rest } from 'msw'; export const fillPipelineToolFieldsInformation = async () => { const tokenInput = within(screen.getByTestId('pipelineToolTextField')).getByLabelText( - 'input Token', + PIPELINE_TOOL_TOKEN_INPUT_LABEL, ) as HTMLInputElement; await userEvent.type(tokenInput, FAKE_PIPELINE_TOKEN); @@ -40,19 +46,22 @@ const originalVerify = pipelineToolClient.verify; describe('PipelineTool', () => { beforeAll(() => server.listen()); afterAll(() => server.close()); + afterEach(() => { + store = null; + pipelineToolClient.verify = originalVerify; + }); + store = setupStore(); const setup = () => { store = setupStore(); return render( - + + + , ); }; - afterEach(() => { - store = null; - pipelineToolClient.verify = originalVerify; - }); it('should show pipelineTool title and fields when render pipelineTool component ', () => { setup(); @@ -74,7 +83,7 @@ describe('PipelineTool', () => { it('should clear all fields information when click reset button', async () => { setup(); const tokenInput = within(screen.getByTestId('pipelineToolTextField')).getByLabelText( - 'input Token', + PIPELINE_TOOL_TOKEN_INPUT_LABEL, ) as HTMLInputElement; await fillPipelineToolFieldsInformation(); @@ -95,11 +104,11 @@ describe('PipelineTool', () => { await userEvent.click(screen.getByText(VERIFY)); - expect(screen.getByTestId('timeoutAlert')).toBeInTheDocument(); + expect(screen.getByTestId(TIMEOUT_ALERT_TEST_ID)).toBeInTheDocument(); await userEvent.click(screen.getByRole('button', { name: RESET })); - expect(screen.queryByTestId('timeoutAlert')).not.toBeInTheDocument(); + expect(screen.queryByTestId(TIMEOUT_ALERT_TEST_ID)).not.toBeInTheDocument(); }); it('should hidden timeout alert when the error type of api call becomes other', async () => { @@ -109,13 +118,13 @@ describe('PipelineTool', () => { await userEvent.click(screen.getByText(VERIFY)); - expect(screen.getByTestId('timeoutAlert')).toBeInTheDocument(); + expect(screen.getByTestId(TIMEOUT_ALERT_TEST_ID)).toBeInTheDocument(); pipelineToolClient.verify = jest.fn().mockResolvedValue({ code: HttpStatusCode.Unauthorized }); await userEvent.click(screen.getByText(REVERIFY)); - expect(screen.queryByTestId('timeoutAlert')).not.toBeInTheDocument(); + expect(screen.queryByTestId(TIMEOUT_ALERT_TEST_ID)).not.toBeInTheDocument(); }); it('should show detail options when click pipelineTool fields', async () => { @@ -144,7 +153,7 @@ describe('PipelineTool', () => { await fillPipelineToolFieldsInformation(); const mockInfo = 'mockToken'; const tokenInput = within(screen.getByTestId('pipelineToolTextField')).getByLabelText( - 'input Token', + PIPELINE_TOOL_TOKEN_INPUT_LABEL, ) as HTMLInputElement; await userEvent.type(tokenInput, mockInfo); await userEvent.clear(tokenInput); @@ -162,7 +171,7 @@ describe('PipelineTool', () => { it('should show error message when focus on field given an empty value', async () => { setup(); - await userEvent.click(screen.getByLabelText('input Token')); + await userEvent.click(screen.getByLabelText(PIPELINE_TOOL_TOKEN_INPUT_LABEL)); expect(screen.getByText(TOKEN_ERROR_MESSAGE[1])).toBeInTheDocument(); expect(screen.getByText(TOKEN_ERROR_MESSAGE[1])).toHaveStyle(ERROR_MESSAGE_COLOR); @@ -172,7 +181,7 @@ describe('PipelineTool', () => { setup(); const mockInfo = 'mockToken'; const tokenInput = within(screen.getByTestId('pipelineToolTextField')).getByLabelText( - 'input Token', + PIPELINE_TOOL_TOKEN_INPUT_LABEL, ) as HTMLInputElement; await userEvent.type(tokenInput, mockInfo); @@ -224,4 +233,41 @@ describe('PipelineTool', () => { expect(getByText('Token is incorrect!')).toBeInTheDocument(); }); }); + + it('should close alert modal when user manually close the alert', async () => { + setup(); + await fillPipelineToolFieldsInformation(); + const timeoutError = new TimeoutError('', AXIOS_REQUEST_ERROR_CODE.TIMEOUT); + pipelineToolClient.verify = jest.fn().mockImplementation(() => Promise.resolve(timeoutError)); + + await userEvent.click(screen.getByText(VERIFY)); + + expect(await screen.getByTestId(TIMEOUT_ALERT_TEST_ID)).toBeInTheDocument(); + + await userEvent.click(screen.getByLabelText('Close')); + + expect(screen.queryByTestId(TIMEOUT_ALERT_TEST_ID)).not.toBeInTheDocument(); + }); + + it('should allow user to re-submit when user interact again with form given form is already submit successfully', async () => { + server.use( + rest.post(MOCK_PIPELINE_VERIFY_URL, (_, res, ctx) => res(ctx.delay(100), ctx.status(HttpStatusCode.NoContent))), + ); + setup(); + await fillPipelineToolFieldsInformation(); + + expect(screen.getByRole('button', { name: /verify/i })).toBeEnabled(); + + await userEvent.click(screen.getByText(/verify/i)); + + expect(await screen.findByRole('button', { name: /reset/i })).toBeInTheDocument(); + expect(await screen.findByRole('button', { name: /verified/i })).toBeDisabled(); + + const tokenInput = (await screen.findByLabelText('Token *')) as HTMLInputElement; + await userEvent.clear(tokenInput); + await userEvent.type(tokenInput, FAKE_PIPELINE_TOKEN); + const verifyButton = await screen.findByRole('button', { name: /verify/i }); + + expect(verifyButton).toBeEnabled(); + }); }); diff --git a/frontend/__tests__/containers/ConfigStep/SortingDateRange.test.tsx b/frontend/__tests__/containers/ConfigStep/SortingDateRange.test.tsx index 694e67a53d..e7e22fe33c 100644 --- a/frontend/__tests__/containers/ConfigStep/SortingDateRange.test.tsx +++ b/frontend/__tests__/containers/ConfigStep/SortingDateRange.test.tsx @@ -1,5 +1,5 @@ import { SortingDateRange } from '@src/containers/ConfigStep/DateRangePicker/SortingDateRange'; -import { SortType } from '@src/containers/ConfigStep/DateRangePicker/DateRangePickerGroup'; +import { SortType } from '@src/containers/ConfigStep/DateRangePicker/types'; import { updateDateRangeSortType } from '@src/context/config/configSlice'; import { setupStore } from '@test/utils/setupStoreUtil'; import { render, screen } from '@testing-library/react'; diff --git a/frontend/__tests__/containers/ConfigStep/SourceControl.test.tsx b/frontend/__tests__/containers/ConfigStep/SourceControl.test.tsx index 521508bd15..351ea399e0 100644 --- a/frontend/__tests__/containers/ConfigStep/SourceControl.test.tsx +++ b/frontend/__tests__/containers/ConfigStep/SourceControl.test.tsx @@ -10,12 +10,15 @@ import { VERIFIED, VERIFY, } from '../../fixtures'; +import { sourceControlDefaultValues } from '@src/containers/ConfigStep/Form/useDefaultValues'; import { AXIOS_REQUEST_ERROR_CODE, SOURCE_CONTROL_TYPES } from '@src/constants/resources'; import { sourceControlClient } from '@src/clients/sourceControl/SourceControlClient'; import { updateShouldGetPipelineConfig } from '@src/context/Metrics/metricsSlice'; -import { fireEvent, render, screen, waitFor } from '@testing-library/react'; +import { sourceControlSchema } from '@src/containers/ConfigStep/Form/schema'; import { SourceControl } from '@src/containers/ConfigStep/SourceControl'; +import { render, screen, act, waitFor } from '@testing-library/react'; import { setupStore } from '../../utils/setupStoreUtil'; +import { FormProvider } from '@test/utils/FormProvider'; import userEvent from '@testing-library/user-event'; import { Provider } from 'react-redux'; import { setupServer } from 'msw/node'; @@ -23,15 +26,16 @@ import { HttpStatusCode } from 'axios'; import { rest } from 'msw'; import React from 'react'; -export const fillSourceControlFieldsInformation = () => { - const mockInfo = 'AAAAA_XXXXXX' - .replace('AAAAA', 'ghpghoghughsghr') - .replace('XXXXXX', '1A2b1A2b1A2b1A2b1A2b1A2b1A2b1A2b1A2b'); +const mockValidFormtToken = 'AAAAA_XXXXXX' + .replace('AAAAA', 'ghpghoghughsghr') + .replace('XXXXXX', '1A2b1A2b1A2b1A2b1A2b1A2b1A2b1A2b1A2b'); + +export const fillSourceControlFieldsInformation = async () => { const tokenInput = screen.getByTestId('sourceControlTextField').querySelector('input') as HTMLInputElement; - fireEvent.change(tokenInput, { target: { value: mockInfo } }); + await userEvent.type(tokenInput, mockValidFormtToken); - expect(tokenInput.value).toEqual(mockInfo); + expect(tokenInput.value).toEqual(mockValidFormtToken); }; let store = null; @@ -49,19 +53,22 @@ jest.mock('@src/context/Metrics/metricsSlice', () => ({ describe('SourceControl', () => { beforeAll(() => server.listen()); afterAll(() => server.close()); + afterEach(() => { + store = null; + sourceControlClient.verifyToken = originalVerifyToken; + }); + store = setupStore(); const setup = () => { store = setupStore(); return render( - + + + , ); }; - afterEach(() => { - store = null; - sourceControlClient.verifyToken = originalVerifyToken; - }); it('should show sourceControl title and fields when render sourceControl component', () => { setup(); @@ -83,9 +90,9 @@ describe('SourceControl', () => { setup(); const tokenInput = screen.getByTestId('sourceControlTextField').querySelector('input') as HTMLInputElement; - fillSourceControlFieldsInformation(); + await fillSourceControlFieldsInformation(); - await userEvent.click(screen.getByText(VERIFY)); + await userEvent.click(screen.getByRole('button', { name: VERIFY })); await waitFor(async () => { expect(screen.getByRole('button', { name: RESET })).toBeTruthy(); @@ -133,22 +140,24 @@ describe('SourceControl', () => { expect(queryByTestId('timeoutAlert')).not.toBeInTheDocument(); }); - it('should enable verify button when all fields checked correctly given disable verify button', () => { + it('should enable verify button when all fields checked correctly given disable verify button', async () => { setup(); const verifyButton = screen.getByRole('button', { name: VERIFY }); expect(verifyButton).toBeDisabled(); - fillSourceControlFieldsInformation(); + await fillSourceControlFieldsInformation(); - expect(verifyButton).toBeEnabled(); + await waitFor(() => { + expect(screen.getByRole('button', { name: VERIFY })).toBeEnabled(); + }); }); it('should show reset button and verified button when verify successfully', async () => { setup(); - fillSourceControlFieldsInformation(); + await fillSourceControlFieldsInformation(); - fireEvent.click(screen.getByText(VERIFY)); + await userEvent.click(screen.getByText(VERIFY)); await waitFor(() => { expect(screen.getByText(RESET)).toBeTruthy(); @@ -161,25 +170,24 @@ describe('SourceControl', () => { it('should reload pipeline config when reset fields', async () => { setup(); - fillSourceControlFieldsInformation(); + await fillSourceControlFieldsInformation(); await userEvent.click(screen.getByText(VERIFY)); await userEvent.click(screen.getByRole('button', { name: RESET })); - fillSourceControlFieldsInformation(); + await fillSourceControlFieldsInformation(); expect(updateShouldGetPipelineConfig).toHaveBeenCalledWith(true); }); - it('should show error message and error style when token is empty', () => { + it('should show error message and error style when token is empty', async () => { setup(); - fillSourceControlFieldsInformation(); - const tokenInput = screen.getByTestId('sourceControlTextField').querySelector('input') as HTMLInputElement; - - fireEvent.change(tokenInput, { target: { value: '' } }); + act(() => { + tokenInput.focus(); + }); expect(screen.getByText(TOKEN_ERROR_MESSAGE[1])).toBeInTheDocument(); expect(screen.getByText(TOKEN_ERROR_MESSAGE[1])).toHaveStyle(ERROR_MESSAGE_COLOR); @@ -191,21 +199,24 @@ describe('SourceControl', () => { expect(screen.queryByText(TOKEN_ERROR_MESSAGE[1])).not.toBeInTheDocument(); }); - it('should show error message when focus on field given an empty value', () => { + it('should show error message when focus on field given an empty value', async () => { setup(); - fireEvent.focus(screen.getByLabelText('input Token')); + const tokenInput = screen.getByTestId('sourceControlTextField').querySelector('input') as HTMLInputElement; + act(() => { + tokenInput.focus(); + }); expect(screen.getByText(TOKEN_ERROR_MESSAGE[1])).toBeInTheDocument(); expect(screen.getByText(TOKEN_ERROR_MESSAGE[1])).toHaveStyle(ERROR_MESSAGE_COLOR); }); - it('should show error message and error style when token is invalid', () => { + it('should show error message and error style when token is invalid', async () => { setup(); const mockInfo = 'mockToken'; const tokenInput = screen.getByTestId('sourceControlTextField').querySelector('input') as HTMLInputElement; - fireEvent.change(tokenInput, { target: { value: mockInfo } }); + await userEvent.type(tokenInput, mockInfo); expect(tokenInput.value).toEqual(mockInfo); expect(screen.getByText(TOKEN_ERROR_MESSAGE[0])).toBeInTheDocument(); @@ -218,12 +229,49 @@ describe('SourceControl', () => { ); setup(); - fillSourceControlFieldsInformation(); + await fillSourceControlFieldsInformation(); + await userEvent.click(screen.getByRole('button', { name: VERIFY })); - fireEvent.click(screen.getByRole('button', { name: VERIFY })); + expect(screen.getByText(MOCK_SOURCE_CONTROL_VERIFY_ERROR_CASE_TEXT)).toBeInTheDocument(); + }); - await waitFor(() => { - expect(screen.getByText(MOCK_SOURCE_CONTROL_VERIFY_ERROR_CASE_TEXT)).toBeInTheDocument(); + it('should close alert modal when user manually close the alert', async () => { + setup(); + await fillSourceControlFieldsInformation(); + sourceControlClient.verifyToken = jest.fn().mockResolvedValue({ + code: AXIOS_REQUEST_ERROR_CODE.TIMEOUT, }); + + await userEvent.click(screen.getByText(VERIFY)); + + expect(await screen.getByTestId('timeoutAlert')).toBeInTheDocument(); + + await userEvent.click(screen.getByLabelText('Close')); + + expect(screen.queryByLabelText('timeoutAlert')).not.toBeInTheDocument(); + }); + + it('should allow user to re-submit when user interact again with form given form is already submit successfully', async () => { + server.use( + rest.post(MOCK_SOURCE_CONTROL_VERIFY_TOKEN_URL, (req, res, ctx) => + res(ctx.delay(100), ctx.status(HttpStatusCode.NoContent)), + ), + ); + setup(); + await fillSourceControlFieldsInformation(); + + expect(screen.getByRole('button', { name: /verify/i })).toBeEnabled(); + + await userEvent.click(screen.getByText(/verify/i)); + + expect(await screen.findByRole('button', { name: /reset/i })).toBeInTheDocument(); + expect(await screen.findByRole('button', { name: /verified/i })).toBeDisabled(); + + const tokenInput = (await screen.findByLabelText('Token *')) as HTMLInputElement; + await userEvent.clear(tokenInput); + await userEvent.type(tokenInput, mockValidFormtToken); + const verifyButton = await screen.findByRole('button', { name: /verify/i }); + + expect(verifyButton).toBeEnabled(); }); }); diff --git a/frontend/__tests__/containers/ConfigStep/TimeoutAlet.test.tsx b/frontend/__tests__/containers/ConfigStep/TimeoutAlet.test.tsx index 986fdd3461..bb112b6730 100644 --- a/frontend/__tests__/containers/ConfigStep/TimeoutAlet.test.tsx +++ b/frontend/__tests__/containers/ConfigStep/TimeoutAlet.test.tsx @@ -4,41 +4,20 @@ import userEvent from '@testing-library/user-event'; import React from 'react'; describe('TimeoutAlert', () => { - const setIsShowAlert = jest.fn(); - const setup = ( - setIsShowAlert: (value: boolean) => void, - isShowAlert: boolean, - isVerifyTimeOut: boolean, - moduleType: string, - ) => { - return render( - , - ); + const onCloseSpy = jest.fn(); + const setup = (onClose: () => void, showAlert: boolean, moduleType: string) => { + return render(); }; it('should render board message given moduleType is board', () => { - setup(setIsShowAlert, true, true, 'Board'); + setup(onCloseSpy, true, 'Board'); const message = screen.getByText('Board'); expect(message).toBeInTheDocument(); }); - it('should not render the alert given isVerifyTimeOut or isShowAlert is false', () => { - setup(setIsShowAlert, false, true, 'Board'); - expect(screen.queryByText('Board')).not.toBeInTheDocument(); - - setup(setIsShowAlert, true, false, 'Board'); - - expect(screen.queryByText('Board')).not.toBeInTheDocument(); - }); - - it('should call setIsShowAlert with false when click the close icon given init value', async () => { - setup(setIsShowAlert, true, true, 'any'); + it('should call onCloseSpy when click the close icon given init value', async () => { + setup(onCloseSpy, true, 'any'); const closeIcon = screen.getByTestId('CloseIcon'); act(() => { @@ -46,8 +25,7 @@ describe('TimeoutAlert', () => { }); await waitFor(() => { - expect(setIsShowAlert).toHaveBeenCalledTimes(1); - expect(setIsShowAlert).toHaveBeenCalledWith(false); + expect(onCloseSpy).toHaveBeenCalledTimes(1); }); }); }); diff --git a/frontend/__tests__/containers/MetricsStepper/MetricsStepper.test.tsx b/frontend/__tests__/containers/MetricsStepper/MetricsStepper.test.tsx index 502300bdf0..1588c7214f 100644 --- a/frontend/__tests__/containers/MetricsStepper/MetricsStepper.test.tsx +++ b/frontend/__tests__/containers/MetricsStepper/MetricsStepper.test.tsx @@ -8,9 +8,13 @@ import { PROJECT_NAME_LABEL, SAVE, STEPPER, + VERIFY, TEST_PROJECT_NAME, VELOCITY, COMMON_TIME_FORMAT, + REQUIRED_DATA, + MOCK_PIPELINE_VERIFY_URL, + MOCK_BOARD_URL_FOR_JIRA, } from '../../fixtures'; import { updateCycleTimeSettings, @@ -20,14 +24,9 @@ import { updateDeploymentFrequencySettings, updateTreatFlagCardAsBlock, } from '@src/context/Metrics/metricsSlice'; -import { - updateBoardVerifyState, - updateMetrics, - updatePipelineToolVerifyState, - updateSourceControlVerifyState, -} from '@src/context/config/configSlice'; -import { act, render, screen, waitFor } from '@testing-library/react'; +import { act, render, screen, waitFor, within } from '@testing-library/react'; import { ASSIGNEE_FILTER_TYPES } from '@src/constants/resources'; +import { updateMetrics } from '@src/context/config/configSlice'; import MetricsStepper from '@src/containers/MetricsStepper'; import { setupStore } from '../../utils/setupStoreUtil'; import userEvent from '@testing-library/user-event'; @@ -40,7 +39,7 @@ import { rest } from 'msw'; import dayjs from 'dayjs'; import React from 'react'; -const START_DATE_LABEL = 'From *'; +const START_DATE_LABEL = 'From'; const TODAY = dayjs(); const INPUT_DATE_VALUE = TODAY.format('MM/DD/YYYY'); const YES = 'Yes'; @@ -98,23 +97,41 @@ jest.mock('@src/hooks/useGenerateReportEffect', () => ({ }), })); -const server = setupServer(rest.post(MOCK_REPORT_URL, (_, res, ctx) => res(ctx.status(HttpStatusCode.Ok)))); +const server = setupServer( + rest.post(MOCK_REPORT_URL, (_, res, ctx) => res(ctx.status(HttpStatusCode.Ok))), + rest.post(MOCK_BOARD_URL_FOR_JIRA, (_, res, ctx) => res(ctx.status(HttpStatusCode.NoContent))), +); -const mockLocation = { reload: jest.fn() }; +const mockLocation = { ...window.location, reload: jest.fn() }; Object.defineProperty(window, 'location', { value: mockLocation }); let store = setupStore(); -const fillConfigPageData = async () => { +const fillAndVerifyConfigPageData = async () => { const projectNameInput = await screen.findByRole('textbox', { name: PROJECT_NAME_LABEL }); await userEvent.type(projectNameInput, TEST_PROJECT_NAME); const startDateInput = (await screen.findByRole('textbox', { name: START_DATE_LABEL })) as HTMLInputElement; await userEvent.type(startDateInput, INPUT_DATE_VALUE); - - act(() => { - store.dispatch(updateMetrics([VELOCITY])); - store.dispatch(updateBoardVerifyState(true)); - store.dispatch(updatePipelineToolVerifyState(true)); - store.dispatch(updateSourceControlVerifyState(true)); + await userEvent.click(screen.getByRole('combobox', { name: REQUIRED_DATA })); + const requireMetricsSelection = within(screen.getByRole('listbox')); + await userEvent.click(requireMetricsSelection.getByRole('option', { name: VELOCITY })); + await userEvent.keyboard('{Escape}'); + const boardConfigModule = screen.getByLabelText('Board Config'); + + expect(boardConfigModule).toBeInTheDocument(); + + const boardIdInput = within(boardConfigModule).getByRole('textbox', { name: 'Board Id' }); + await userEvent.type(boardIdInput, '2'); + const emailInput = within(boardConfigModule).getByRole('textbox', { name: 'Email' }); + await userEvent.type(emailInput, 'user@test.com'); + const siteInput = within(boardConfigModule).getByRole('textbox', { name: 'Site' }); + await userEvent.type(siteInput, 'dorametrics'); + const tokenInput = within(boardConfigModule).getByLabelText('Token *'); + await userEvent.type(tokenInput, 'mockJiraToken'); + const verifyBoardButton = within(boardConfigModule).getByText(VERIFY); + await userEvent.click(verifyBoardButton); + + await waitFor(() => { + expect(screen.getByText(NEXT)).toBeEnabled(); }); }; @@ -125,20 +142,20 @@ const fillMetricsData = () => { }; const fillMetricsPageDate = async () => { - act(() => { + await act(async () => { store.dispatch(saveTargetFields([{ name: 'mockClassification', key: 'mockClassification', flag: true }])); store.dispatch(saveUsers(['mockUsers'])); - store.dispatch(saveDoneColumn(['Done', 'Canceled'])), - store.dispatch( - updateCycleTimeSettings([ - { column: 'Testing', status: 'testing', value: 'Done' }, - { column: 'Testing', status: 'test', value: 'Done' }, - ]), - ); - store.dispatch(updateTreatFlagCardAsBlock(false)), - store.dispatch( - updateDeploymentFrequencySettings({ updateId: 0, label: 'organization', value: 'mock new organization' }), - ); + store.dispatch(saveDoneColumn(['Done', 'Canceled'])); + store.dispatch( + updateCycleTimeSettings([ + { column: 'Testing', status: 'testing', value: 'Done' }, + { column: 'Testing', status: 'test', value: 'Done' }, + ]), + ); + store.dispatch(updateTreatFlagCardAsBlock(false)); + store.dispatch( + updateDeploymentFrequencySettings({ updateId: 0, label: 'organization', value: 'mock new organization' }), + ); store.dispatch( updateDeploymentFrequencySettings({ updateId: 0, label: 'pipelineName', value: 'mock new pipelineName' }), ); @@ -146,16 +163,17 @@ const fillMetricsPageDate = async () => { }); }; -describe('MetricsStepper', () => { - beforeAll(() => server.listen()); - afterAll(() => server.close()); - beforeEach(() => { - store = setupStore(); - }); - afterEach(() => { - navigateMock.mockClear(); - }); +beforeAll(() => server.listen({ onUnhandledRequest: 'error' })); +afterAll(() => server.close()); +beforeEach(() => { + store = setupStore(); +}); +afterEach(() => { + server.resetHandlers(); + navigateMock.mockClear(); +}); +describe('MetricsStepper', () => { const setup = () => render( @@ -221,34 +239,38 @@ describe('MetricsStepper', () => { }); it('should enable next when every selected component is show and verified', async () => { - setup(); - await fillConfigPageData(); - - expect(screen.getByText(NEXT)).toBeEnabled(); + server.use(rest.post(MOCK_PIPELINE_VERIFY_URL, (_, res, ctx) => res(ctx.status(HttpStatusCode.NoContent)))); + await act(async () => { + setup(); + }); + await fillAndVerifyConfigPageData(); }); it('should disable next when board component is exist but not verified successfully', async () => { setup(); act(() => { store.dispatch(updateMetrics([VELOCITY])); - store.dispatch(updateBoardVerifyState(false)); }); expect(screen.getByText(NEXT)).toBeDisabled(); }); it('should go metrics page when click next button given next button enabled', async () => { - setup(); + await act(async () => { + setup(); + }); - await fillConfigPageData(); + await fillAndVerifyConfigPageData(); await userEvent.click(screen.getByText(NEXT)); - expect(screen.getByText(METRICS)).toHaveStyle(`color:${stepperColor}`); + expect(screen.getByText(METRICS)).toHaveClass('Mui-active'); }); it('should show metrics export step when click next button given export step', async () => { - setup(); - await fillConfigPageData(); + await act(async () => { + setup(); + }); + await fillAndVerifyConfigPageData(); await userEvent.click(screen.getByText(NEXT)); await fillMetricsPageDate(); waitFor(() => { @@ -274,6 +296,7 @@ describe('MetricsStepper', () => { startDate: null, }, ], + sortType: 'DEFAULT', metrics: [], pipelineTool: undefined, projectName: '', @@ -297,6 +320,7 @@ describe('MetricsStepper', () => { startDate: null, }, ], + sortType: 'DEFAULT', metrics: ['Velocity'], pipelineTool: undefined, projectName: '', @@ -316,7 +340,6 @@ describe('MetricsStepper', () => { const expectedJson = { advancedSettings: null, assigneeFilter: ASSIGNEE_FILTER_TYPES.LAST_ASSIGNEE, - board: { boardId: '', email: '', site: '', token: '', type: 'Jira' }, calendarType: 'Regular Calendar(Weekend Considered)', dateRange: [ { @@ -325,8 +348,16 @@ describe('MetricsStepper', () => { }, ], metrics: ['Velocity'], - pipelineCrews: undefined, + board: { + type: 'Jira', + boardId: '', + email: '', + site: '', + token: '', + }, pipelineTool: undefined, + sortType: 'DEFAULT', + pipelineCrews: undefined, projectName: 'test project Name', sourceControl: undefined, classification: undefined, @@ -337,13 +368,23 @@ describe('MetricsStepper', () => { leadTime: undefined, reworkTimesSettings: DEFAULT_REWORK_SETTINGS, }; - setup(); + await act(() => { + setup(); + }); - await fillConfigPageData(); + await fillAndVerifyConfigPageData(); await userEvent.click(screen.getByText(NEXT)); + const saveButton = screen.getByText(SAVE); + expect(screen.getByText(METRICS)).toHaveClass('Mui-active'); + + waitFor(() => { + expect(saveButton).toBeInTheDocument(); + }); await userEvent.click(screen.getByText(SAVE)); - expect(exportToJsonFile).toHaveBeenCalledWith(expectedFileName, expectedJson); + await waitFor(() => { + expect(exportToJsonFile).toHaveBeenCalledWith(expectedFileName, expectedJson); + }); }, 50000); it('should export json file when click save button in report page given all content is empty', async () => { @@ -366,6 +407,7 @@ describe('MetricsStepper', () => { sourceControl: undefined, classification: ['mockClassification'], crews: ['mockUsers'], + sortType: 'DEFAULT', cycleTime: { jiraColumns: [ { @@ -384,13 +426,20 @@ describe('MetricsStepper', () => { }, }; - setup(); - await fillConfigPageData(); + await act(() => { + setup(); + }); + await fillAndVerifyConfigPageData(); await userEvent.click(screen.getByText(NEXT)); + + expect(screen.getByText(METRICS)).toHaveClass('Mui-active'); + await fillMetricsPageDate(); + waitFor(() => { expect(screen.getByText(NEXT)).toBeInTheDocument(); }); + await userEvent.click(screen.getByText(NEXT)); await waitFor(() => { diff --git a/frontend/__tests__/context/boardSlice.test.ts b/frontend/__tests__/context/boardSlice.test.ts index 636268bd06..916ccb5cfe 100644 --- a/frontend/__tests__/context/boardSlice.test.ts +++ b/frontend/__tests__/context/boardSlice.test.ts @@ -1,24 +1,8 @@ -import boardReducer, { - updateBoard, - updateBoardVerifyState, - updateJiraVerifyResponse, -} from '@src/context/config/configSlice'; +import boardReducer, { updateBoard, updateJiraVerifyResponse } from '@src/context/config/configSlice'; import { MOCK_JIRA_VERIFY_RESPONSE } from '../fixtures'; import initialConfigState from '../initialConfigState'; describe('board reducer', () => { - it('should return false when handle initial state', () => { - const result = boardReducer(undefined, { type: 'unknown' }); - - expect(result.board.isVerified).toEqual(false); - }); - - it('should return true when handle changeBoardVerifyState given isBoardVerified is true', () => { - const result = boardReducer(initialConfigState, updateBoardVerifyState(true)); - - expect(result.board.isVerified).toEqual(true); - }); - it('should update board fields when change board fields input', () => { const board = boardReducer(initialConfigState, updateBoard({ boardId: '1' })); diff --git a/frontend/__tests__/context/configSlice.test.ts b/frontend/__tests__/context/configSlice.test.ts index 9481daff1c..bc6d4f85ac 100644 --- a/frontend/__tests__/context/configSlice.test.ts +++ b/frontend/__tests__/context/configSlice.test.ts @@ -9,7 +9,7 @@ import configReducer, { updateProjectName, } from '@src/context/config/configSlice'; import { CHINA_CALENDAR, CONFIG_PAGE_VERIFY_IMPORT_ERROR_MESSAGE, REGULAR_CALENDAR, VELOCITY } from '../fixtures'; -import { SortType } from '@src/containers/ConfigStep/DateRangePicker/DateRangePickerGroup'; +import { SortType } from '@src/containers/ConfigStep/DateRangePicker/types'; import { setupStore } from '@test/utils/setupStoreUtil'; import initialConfigState from '../initialConfigState'; diff --git a/frontend/__tests__/context/pipelineToolSlice.test.ts b/frontend/__tests__/context/pipelineToolSlice.test.ts index 33a164732c..0044d28786 100644 --- a/frontend/__tests__/context/pipelineToolSlice.test.ts +++ b/frontend/__tests__/context/pipelineToolSlice.test.ts @@ -7,7 +7,6 @@ import { updatePipelineTool, updatePipelineToolVerifyResponse, updatePipelineToolVerifyResponseSteps, - updatePipelineToolVerifyState, } from '@src/context/config/configSlice'; import { MOCK_BUILD_KITE_VERIFY_RESPONSE, PIPELINE_TOOL_TYPES } from '../fixtures'; import configReducer from '@src/context/config/configSlice'; @@ -60,18 +59,6 @@ describe('pipelineTool reducer', () => { }, ]; - it('should set isPipelineToolVerified false when handle initial state', () => { - const result = configReducer(undefined, { type: 'unknown' }); - - expect(result.pipelineTool.isVerified).toEqual(false); - }); - - it('should set isPipelineToolVerified true when handle updatePipelineToolVerifyState given isPipelineToolVerified is true', () => { - const result = configReducer(initialConfigState, updatePipelineToolVerifyState(true)); - - expect(result.pipelineTool.isVerified).toEqual(true); - }); - it('should update pipelineTool fields when change pipelineTool fields input', () => { const config = configReducer(initialConfigState, updatePipelineTool({ token: 'abcd' })); @@ -86,7 +73,6 @@ describe('pipelineTool reducer', () => { type: PIPELINE_TOOL_TYPES.BUILD_KITE, token: '', }, - isVerified: false, isShow: false, verifiedResponse: { pipelineList: [ @@ -134,7 +120,6 @@ describe('pipelineTool reducer', () => { type: PIPELINE_TOOL_TYPES.BUILD_KITE, token: '', }, - isVerified: false, isShow: false, verifiedResponse: { pipelineList: [ diff --git a/frontend/__tests__/context/sourceControlSlice.test.ts b/frontend/__tests__/context/sourceControlSlice.test.ts index 6c46a1289a..f8f0c1f645 100644 --- a/frontend/__tests__/context/sourceControlSlice.test.ts +++ b/frontend/__tests__/context/sourceControlSlice.test.ts @@ -1,24 +1,11 @@ import sourceControlReducer, { updateSourceControl, updateSourceControlVerifiedResponse, - updateSourceControlVerifyState, } from '@src/context/config/configSlice'; import { MOCK_GITHUB_VERIFY_RESPONSE } from '../fixtures'; import initialConfigState from '../initialConfigState'; describe('sourceControl reducer', () => { - it('should set isSourceControlVerified false when handle initial state', () => { - const sourceControl = sourceControlReducer(undefined, { type: 'unknown' }); - - expect(sourceControl.sourceControl.isVerified).toEqual(false); - }); - - it('should return true when handle changeSourceControlVerifyState given isSourceControlVerified is true', () => { - const sourceControl = sourceControlReducer(initialConfigState, updateSourceControlVerifyState(true)); - - expect(sourceControl.sourceControl.isVerified).toEqual(true); - }); - it('should update sourceControl fields when change sourceControl fields input', () => { const sourceControl = sourceControlReducer(initialConfigState, updateSourceControl({ token: 'token' })); diff --git a/frontend/__tests__/fixtures.ts b/frontend/__tests__/fixtures.ts index 2e09481238..47d570ae23 100644 --- a/frontend/__tests__/fixtures.ts +++ b/frontend/__tests__/fixtures.ts @@ -1,5 +1,5 @@ -import { SortType } from '@src/containers/ConfigStep/DateRangePicker/DateRangePickerGroup'; import { CSVReportRequestDTO, ReportRequestDTO } from '@src/clients/report/dto/request'; +import { SortType } from '@src/containers/ConfigStep/DateRangePicker/types'; import { ReportResponseDTO } from '@src/clients/report/dto/response'; import { SOURCE_CONTROL_TYPES } from '@src/constants/resources'; import { IStepsParams } from '@src/clients/MetricsClient'; @@ -651,6 +651,7 @@ export const MOCK_SOURCE_CONTROL_VERIFY_ERROR_CASE_TEXT = 'Token is incorrect!'; export const MOCK_PIPELINE_VERIFY_UNAUTHORIZED_TEXT = 'Token is incorrect!'; export const MOCK_PIPELINE_VERIFY_FORBIDDEN_ERROR_TEXT = 'Forbidden request, please change your token with correct access permission.'; +export const UNKNOWN_ERROR_TEXT = 'Unknown error'; export const FAKE_TOKEN = 'fake-token'; @@ -694,3 +695,7 @@ export const TIME_RANGE_ERROR_MESSAGE = { }; export const COMMON_TIME_FORMAT = 'YYYY-MM-DDTHH:mm:ss.SSSZ'; + +export const PIPELINE_TOOL_TOKEN_INPUT_LABEL = 'input token'; + +export const TIMEOUT_ALERT_TEST_ID = 'timeoutAlert'; diff --git a/frontend/__tests__/hooks/useVerifyBoardEffect.test.tsx b/frontend/__tests__/hooks/useVerifyBoardEffect.test.tsx index 9a781cd93f..e45e580c72 100644 --- a/frontend/__tests__/hooks/useVerifyBoardEffect.test.tsx +++ b/frontend/__tests__/hooks/useVerifyBoardEffect.test.tsx @@ -1,161 +1,154 @@ -import { useVerifyBoardEffect, useVerifyBoardStateInterface } from '@src/hooks/useVerifyBoardEffect'; -import { act, renderHook, waitFor } from '@testing-library/react'; -import { FAKE_TOKEN } from '@test/fixtures'; -import { HttpStatusCode } from 'axios'; - +import { boardConfigDefaultValues } from '@src/containers/ConfigStep/Form/useDefaultValues'; +import { boardConfigSchema } from '@src/containers/ConfigStep/Form/schema'; +import { useVerifyBoardEffect } from '@src/hooks/useVerifyBoardEffect'; import { InternalServerError } from '@src/errors/InternalServerError'; import { AXIOS_REQUEST_ERROR_CODE } from '@src/constants/resources'; import { UnauthorizedError } from '@src/errors/UnauthorizedError'; import { boardClient } from '@src/clients/board/BoardClient'; import { NotFoundError } from '@src/errors/NotFoundError'; import { TimeoutError } from '@src/errors/TimeoutError'; -import { BOARD_TYPES } from '@test/fixtures'; - -const mockDispatch = jest.fn(); -jest.mock('react-redux', () => ({ - ...jest.requireActual('react-redux'), - useDispatch: () => mockDispatch, -})); - -jest.mock('@src/hooks/useAppDispatch', () => ({ - useAppSelector: () => ({ type: BOARD_TYPES.JIRA }), - useAppDispatch: jest.fn(() => jest.fn()), -})); - -const updateFields = (result: { current: useVerifyBoardStateInterface }) => { - result.current.updateField('Board Id', '1'); - result.current.updateField('Email', 'fake@qq.com'); - result.current.updateField('Site', 'fake'); - result.current.updateField('Token', FAKE_TOKEN); +import { FormProvider } from '@test/utils/FormProvider'; +import { setupStore } from '../utils/setupStoreUtil'; +import { renderHook } from '@testing-library/react'; +import { Provider } from 'react-redux'; +import { HttpStatusCode } from 'axios'; +import { ReactNode } from 'react'; + +const setErrorSpy = jest.fn(); +const resetSpy = jest.fn(); + +jest.mock('react-hook-form', () => { + return { + ...jest.requireActual('react-hook-form'), + useFormContext: () => { + const { useFormContext } = jest.requireActual('react-hook-form'); + const originals = useFormContext(); + return { + ...originals, + setError: (...args: [string, { message: string }]) => setErrorSpy(...args), + reset: (...args: [string, { message: string }]) => resetSpy(...args), + }; + }, + }; +}); + +const HookWrapper = ({ children }: { children: ReactNode }) => { + const store = setupStore(); + return ( + + + {children} + + + ); +}; + +const setup = () => { + const { result } = renderHook(useVerifyBoardEffect, { wrapper: HookWrapper }); + + return { result }; }; describe('use verify board state', () => { + beforeEach(() => { + setErrorSpy.mockClear(); + resetSpy.mockClear(); + }); afterAll(() => { jest.clearAllMocks(); }); it('should got initial data state when hook render given none input', async () => { - const { result } = renderHook(() => useVerifyBoardEffect()); + const { result } = setup(); expect(result.current.isLoading).toBe(false); expect(result.current.fields.length).toBe(5); }); - it('should got email and token fields error message when call verify function given a invalid token', async () => { - const mockedError = new UnauthorizedError('', HttpStatusCode.Unauthorized, ''); - boardClient.getVerifyBoard = jest.fn().mockImplementation(() => Promise.reject(mockedError)); - - const { result } = renderHook(() => useVerifyBoardEffect()); - await act(async () => { - await updateFields(result); - await result.current.verifyJira(); - }); - - const emailFiled = result.current.fields.find((field) => field.key === 'Email'); - const tokenField = result.current.fields.find((field) => field.key === 'Token'); - expect(emailFiled?.verifiedError).toBe('Email is incorrect!'); - expect(tokenField?.verifiedError).toBe( - 'Token is invalid, please change your token with correct access permission!', + it('should keep verified values when call verify function given a valid token', async () => { + const mockedOkResponse = { + response: 'ok', + }; + boardClient.getVerifyBoard = jest.fn().mockImplementation(() => Promise.resolve(mockedOkResponse)); + + const { result } = setup(); + await result.current.verifyJira(); + + expect(resetSpy).toHaveBeenCalledWith( + { + type: 'Jira', + boardId: '', + email: '', + site: '', + token: '', + }, + { keepValues: true }, ); }); - it('should clear email validatedError when updateField by Email given fetch error ', async () => { + it('should got email and token fields error message when call verify function given a invalid token', async () => { const mockedError = new UnauthorizedError('', HttpStatusCode.Unauthorized, ''); boardClient.getVerifyBoard = jest.fn().mockImplementation(() => Promise.reject(mockedError)); - const { result } = renderHook(() => useVerifyBoardEffect()); - await act(async () => { - await updateFields(result); - await result.current.verifyJira(); - }); + const { result } = setup(); + await result.current.verifyJira(); - const emailFiled = result.current.fields.find((field) => field.key === 'Email'); - expect(emailFiled?.verifiedError).toBe('Email is incorrect!'); - - await act(async () => { - await result.current.updateField('Email', 'fake@qq.com'); + expect(setErrorSpy).toHaveBeenCalledWith('email', { message: 'Email is incorrect!' }); + expect(setErrorSpy).toHaveBeenCalledWith('token', { + message: 'Token is invalid, please change your token with correct access permission!', }); - const emailText = result.current.fields.find((field) => field.key === 'Email'); - expect(emailText?.verifiedError).toBe(''); }); it('should got site field error message when call verify function given a invalid site', async () => { const mockedError = new NotFoundError('site is incorrect', HttpStatusCode.NotFound, 'site is incorrect'); boardClient.getVerifyBoard = jest.fn().mockImplementation(() => Promise.reject(mockedError)); - const { result } = renderHook(() => useVerifyBoardEffect()); - await act(async () => { - await updateFields(result); - await result.current.verifyJira(); - }); - - await waitFor(() => { - const site = result.current.fields.find((field) => field.key === 'Site'); + const { result } = setup(); + await result.current.verifyJira(); - expect(site?.verifiedError).toBe('Site is incorrect!'); - }); + expect(setErrorSpy).toHaveBeenCalledWith('site', { message: 'Site is incorrect!' }); }); it('should got board id field error message when call verify function given a invalid board id', async () => { const mockedError = new NotFoundError('boardId is incorrect', HttpStatusCode.NotFound, 'boardId is incorrect'); boardClient.getVerifyBoard = jest.fn().mockImplementation(() => Promise.reject(mockedError)); - const { result } = renderHook(() => useVerifyBoardEffect()); - await act(() => { - updateFields(result); - result.current.verifyJira(); - }); + const { result } = setup(); + await result.current.verifyJira(); - await waitFor(() => { - const boardId = result.current.fields.find((field) => field.key === 'Board Id'); - expect(boardId?.verifiedError).toBe('Board Id is incorrect!'); - }); + expect(setErrorSpy).toHaveBeenCalledWith('boardId', { message: 'Board Id is incorrect!' }); }); it('should got token fields error message when call verify function given a unknown error', async () => { const mockedError = new InternalServerError('', HttpStatusCode.ServiceUnavailable, ''); boardClient.getVerifyBoard = jest.fn().mockImplementation(() => Promise.reject(mockedError)); - const { result } = renderHook(() => useVerifyBoardEffect()); - await act(async () => { - await updateFields(result); - await result.current.verifyJira(); - }); + const { result } = setup(); + await result.current.verifyJira(); - const tokenField = result.current.fields.find((field) => field.key === 'Token'); - expect(tokenField?.verifiedError).toBe('Unknown error'); + expect(setErrorSpy).toHaveBeenCalledWith('token', { message: 'Unknown error' }); }); - it('should clear all verified error messages when update a verified error field', async () => { - const mockedError = new UnauthorizedError('', HttpStatusCode.Unauthorized, ''); + it('should set timeout is true given getVerifyBoard api is timeout', async () => { + const mockedError = new TimeoutError('', AXIOS_REQUEST_ERROR_CODE.TIMEOUT); boardClient.getVerifyBoard = jest.fn().mockImplementation(() => Promise.reject(mockedError)); - const { result } = renderHook(() => useVerifyBoardEffect()); - await act(() => { - updateFields(result); - result.current.verifyJira(); - }); - await waitFor(() => { - result.current.updateField('Token', 'fake-token-new'); - }); + const { result } = setup(); + await result.current.verifyJira(); - const emailFiled = result.current.fields.find((field) => field.key === 'Email'); - const tokenField = result.current.fields.find((field) => field.key === 'Token'); - expect(emailFiled?.verifiedError).toBe(''); - expect(tokenField?.verifiedError).toBe(''); + expect(setErrorSpy).toHaveBeenCalledWith('token', { message: 'Timeout!' }); }); - it('should set timeout is true given getVerifyBoard api is timeout', async () => { - const mockedError = new TimeoutError('', AXIOS_REQUEST_ERROR_CODE.TIMEOUT); - boardClient.getVerifyBoard = jest.fn().mockImplementation(() => Promise.reject(mockedError)); + it('should clear all verified error messages when call resetFeilds', async () => { + const { result } = setup(); - const { result } = renderHook(() => useVerifyBoardEffect()); - await act(() => { - result.current.verifyJira(); - }); + result.current.resetFields(); - await waitFor(() => { - const isVerifyTimeOut = result.current.isVerifyTimeOut; - expect(isVerifyTimeOut).toBe(true); + expect(resetSpy).toHaveBeenCalledWith({ + type: 'Jira', + boardId: '', + email: '', + site: '', + token: '', }); }); }); diff --git a/frontend/__tests__/hooks/useVerifyPipelineToolEffect.test.tsx b/frontend/__tests__/hooks/useVerifyPipelineToolEffect.test.tsx index f8e8bd4da1..d379a3a39b 100644 --- a/frontend/__tests__/hooks/useVerifyPipelineToolEffect.test.tsx +++ b/frontend/__tests__/hooks/useVerifyPipelineToolEffect.test.tsx @@ -1,87 +1,136 @@ import { MOCK_PIPELINE_VERIFY_FORBIDDEN_ERROR_TEXT, - MOCK_PIPELINE_VERIFY_REQUEST_PARAMS, MOCK_PIPELINE_VERIFY_UNAUTHORIZED_TEXT, + UNKNOWN_ERROR_TEXT, } from '../fixtures'; +import { pipelineToolDefaultValues } from '@src/containers/ConfigStep/Form/useDefaultValues'; import { useVerifyPipelineToolEffect } from '@src/hooks/useVerifyPipelineToolEffect'; import { pipelineToolClient } from '@src/clients/pipeline/PipelineToolClient'; +import { pipelineToolSchema } from '@src/containers/ConfigStep/Form/schema'; import { AXIOS_REQUEST_ERROR_CODE } from '@src/constants/resources'; -import { act, renderHook, waitFor } from '@testing-library/react'; +import { FormProvider } from '@test/utils/FormProvider'; +import { setupStore } from '../utils/setupStoreUtil'; +import { renderHook } from '@testing-library/react'; +import { Provider } from 'react-redux'; import { HttpStatusCode } from 'axios'; +import { ReactNode } from 'react'; + +const setErrorSpy = jest.fn(); +const resetSpy = jest.fn(); + +jest.mock('react-hook-form', () => { + return { + ...jest.requireActual('react-hook-form'), + useFormContext: () => { + const { useFormContext } = jest.requireActual('react-hook-form'); + const originals = useFormContext(); + return { + ...originals, + setError: (...args: [string, { message: string }]) => { + setErrorSpy(...args); + }, + reset: (...args: [string, { message: string }]) => resetSpy(...args), + }; + }, + }; +}); -const mockDispatch = jest.fn(); -jest.mock('react-redux', () => ({ - ...jest.requireActual('react-redux'), - useDispatch: () => mockDispatch, -})); +const HookWrapper = ({ children }: { children: ReactNode }) => { + const store = setupStore(); -describe('use verify pipelineTool state', () => { - it('should return empty error message when call verify feature given client returns 204', async () => { - pipelineToolClient.verify = jest.fn().mockResolvedValue({ - code: HttpStatusCode.NoContent, - }); + return ( + + + {children} + + + ); +}; - const { result } = renderHook(() => useVerifyPipelineToolEffect()); +const setup = () => { + const { result } = renderHook(useVerifyPipelineToolEffect, { wrapper: HookWrapper }); - act(() => { - result.current.verifyPipelineTool(MOCK_PIPELINE_VERIFY_REQUEST_PARAMS); - }); + return { result }; +}; - await waitFor(() => { - expect(result.current.verifiedError).toEqual(''); - expect(result.current.isLoading).toEqual(false); - }); +describe('use verify pipelineTool state', () => { + beforeEach(() => { + setErrorSpy.mockClear(); + resetSpy.mockClear(); }); - - it('should set error message when verifying pipeline given response status 401', async () => { - pipelineToolClient.verify = jest.fn().mockResolvedValue({ - code: HttpStatusCode.Unauthorized, - errorTitle: MOCK_PIPELINE_VERIFY_UNAUTHORIZED_TEXT, - }); - - const { result } = renderHook(() => useVerifyPipelineToolEffect()); - - act(() => { - result.current.verifyPipelineTool(MOCK_PIPELINE_VERIFY_REQUEST_PARAMS); - }); - - await waitFor(() => { - expect(result.current.verifiedError).toEqual(MOCK_PIPELINE_VERIFY_UNAUTHORIZED_TEXT); - }); + afterAll(() => { + jest.clearAllMocks(); }); - - it('should clear error message when explicitly call clear function given error message exists', async () => { - pipelineToolClient.verify = jest - .fn() - .mockResolvedValue({ code: HttpStatusCode.Forbidden, errorTitle: MOCK_PIPELINE_VERIFY_FORBIDDEN_ERROR_TEXT }); - const { result } = renderHook(() => useVerifyPipelineToolEffect()); - - act(() => { - result.current.verifyPipelineTool(MOCK_PIPELINE_VERIFY_REQUEST_PARAMS); - }); - - await waitFor(() => { - expect(result.current.verifiedError).toEqual(MOCK_PIPELINE_VERIFY_FORBIDDEN_ERROR_TEXT); + it('should keep verified values when call verify feature given client returns 204', async () => { + pipelineToolClient.verify = jest.fn().mockResolvedValue({ + code: HttpStatusCode.NoContent, }); - result.current.clearVerifiedError(); + const { result } = setup(); + await result.current.verifyPipelineTool(); - await waitFor(() => { - expect(result.current.verifiedError).toEqual(''); - }); + expect(resetSpy).toHaveBeenCalledWith({ type: 'BuildKite', token: '' }, { keepValues: true }); }); - it('should set timeout is true when verify api is timeout', async () => { - pipelineToolClient.verify = jest.fn().mockResolvedValue({ code: AXIOS_REQUEST_ERROR_CODE.TIMEOUT }); - - const { result } = renderHook(() => useVerifyPipelineToolEffect()); - await act(() => { - result.current.verifyPipelineTool(MOCK_PIPELINE_VERIFY_REQUEST_PARAMS); - }); - - await waitFor(() => { - const isVerifyTimeOut = result.current.isVerifyTimeOut; - expect(isVerifyTimeOut).toBe(true); + const errorScenarios = [ + { + mock: { + code: HttpStatusCode.Unauthorized, + errorTitle: MOCK_PIPELINE_VERIFY_UNAUTHORIZED_TEXT, + }, + field: 'token', + status: '401', + message: 'Token is incorrect!', + }, + { + mock: { + code: HttpStatusCode.Forbidden, + errorTitle: MOCK_PIPELINE_VERIFY_FORBIDDEN_ERROR_TEXT, + }, + field: 'token', + status: '403', + message: 'Forbidden request, please change your token with correct access permission.', + }, + { + mock: { + code: HttpStatusCode.ServiceUnavailable, + errorTitle: UNKNOWN_ERROR_TEXT, + }, + field: 'token', + status: 'Unknown', + message: 'Unknown error', + }, + { + mock: { + code: AXIOS_REQUEST_ERROR_CODE.TIMEOUT, + errorTitle: '', + }, + field: 'token', + status: 'Timeout', + message: 'Timeout!', + }, + ]; + + it.each(errorScenarios)( + 'should set $field error message when verifying pipeline given response status', + async ({ mock, field, message }) => { + pipelineToolClient.verify = jest.fn().mockResolvedValue(mock); + + const { result } = setup(); + await result.current.verifyPipelineTool(); + + expect(setErrorSpy).toHaveBeenCalledWith(field, { message }); + }, + ); + + it('should clear all verified error messages when call resetFeilds', async () => { + const { result } = setup(); + + result.current.resetFields(); + + expect(resetSpy).toHaveBeenCalledWith({ + type: 'BuildKite', + token: '', }); }); }); diff --git a/frontend/__tests__/hooks/useVerifySourceControlTokenEffect.test.tsx b/frontend/__tests__/hooks/useVerifySourceControlTokenEffect.test.tsx index 21951c67e7..4602088f6c 100644 --- a/frontend/__tests__/hooks/useVerifySourceControlTokenEffect.test.tsx +++ b/frontend/__tests__/hooks/useVerifySourceControlTokenEffect.test.tsx @@ -1,94 +1,119 @@ -import { MOCK_SOURCE_CONTROL_VERIFY_ERROR_CASE_TEXT, MOCK_SOURCE_CONTROL_VERIFY_REQUEST_PARAMS } from '../fixtures'; import { useVerifySourceControlTokenEffect } from '@src/hooks/useVerifySourceControlTokenEffect'; +import { sourceControlDefaultValues } from '@src/containers/ConfigStep/Form/useDefaultValues'; +import { MOCK_PIPELINE_VERIFY_UNAUTHORIZED_TEXT, UNKNOWN_ERROR_TEXT } from '../fixtures'; import { sourceControlClient } from '@src/clients/sourceControl/SourceControlClient'; -import { ContextProvider } from '@src/hooks/useMetricsStepValidationCheckContext'; +import { sourceControlSchema } from '@src/containers/ConfigStep/Form/schema'; import { AXIOS_REQUEST_ERROR_CODE } from '@src/constants/resources'; -import { act, renderHook, waitFor } from '@testing-library/react'; +import { FormProvider } from '@test/utils/FormProvider'; import { setupStore } from '../utils/setupStoreUtil'; +import { renderHook } from '@testing-library/react'; import { Provider } from 'react-redux'; import { HttpStatusCode } from 'axios'; -import React from 'react'; +import { ReactNode } from 'react'; + +const setErrorSpy = jest.fn(); +const resetSpy = jest.fn(); + +jest.mock('react-hook-form', () => { + return { + ...jest.requireActual('react-hook-form'), + useFormContext: () => { + const { useFormContext } = jest.requireActual('react-hook-form'); + const originals = useFormContext(); + return { + ...originals, + setError: (...args: [string, { message: string }]) => setErrorSpy(...args), + reset: (...args: [string, { message: string }]) => resetSpy(...args), + }; + }, + }; +}); + +const HookWrapper = ({ children }: { children: ReactNode }) => { + const store = setupStore(); + return ( + + + {children} + + + ); +}; describe('use verify sourceControl token', () => { const setup = () => { - const store = setupStore(); - const wrapper = ({ children }: { children: React.ReactNode }) => ( - - {children} - - ); - const { result } = renderHook(() => useVerifySourceControlTokenEffect(), { wrapper }); + const { result } = renderHook(useVerifySourceControlTokenEffect, { wrapper: HookWrapper }); return { result }; }; - it('should initial data state when render hook', async () => { + it('should keep verified values when call verify function given a valid token', async () => { const { result } = setup(); - - expect(result.current.isLoading).toEqual(false); - }); - - it('should set error message when get verify sourceControl throw error', async () => { sourceControlClient.verifyToken = jest.fn().mockResolvedValue({ code: HttpStatusCode.NoContent, }); - const { result } = setup(); - - act(() => { - result.current.verifyToken(MOCK_SOURCE_CONTROL_VERIFY_REQUEST_PARAMS); - }); - - await waitFor(() => { - expect(result.current.isLoading).toEqual(false); - }); - await waitFor(() => expect(result.current.verifiedError).toBeUndefined()); - }); - it('should set error message when get verify sourceControl response status 401', async () => { - sourceControlClient.verifyToken = jest.fn().mockResolvedValue({ - code: HttpStatusCode.Unauthorized, - errorTitle: MOCK_SOURCE_CONTROL_VERIFY_ERROR_CASE_TEXT, - }); - const { result } = setup(); + await result.current.verifyToken(); - act(() => { - result.current.verifyToken(MOCK_SOURCE_CONTROL_VERIFY_REQUEST_PARAMS); - }); - - await waitFor(() => { - expect(result.current.isLoading).toEqual(false); - }); - await waitFor(() => { - expect(result.current.verifiedError).toEqual(MOCK_SOURCE_CONTROL_VERIFY_ERROR_CASE_TEXT); - }); - }); - - it('should clear error message when call clearErrorMessage', async () => { - sourceControlClient.verifyToken = jest.fn().mockResolvedValue({ - code: HttpStatusCode.Unauthorized, - errorTitle: MOCK_SOURCE_CONTROL_VERIFY_ERROR_CASE_TEXT, - }); - const { result } = setup(); - - await act(() => result.current.verifyToken(MOCK_SOURCE_CONTROL_VERIFY_REQUEST_PARAMS)); - await act(() => result.current.clearVerifiedError()); - - await waitFor(() => { - expect(result.current.verifiedError).toEqual(''); - }); + expect(resetSpy).toHaveBeenCalledWith( + { + type: 'GitHub', + token: '', + }, + { keepValues: true }, + ); }); - it('should isVerifyTimeOut and isShowAlert is true when api timeout', async () => { - sourceControlClient.verifyToken = jest.fn().mockResolvedValue({ - code: AXIOS_REQUEST_ERROR_CODE.TIMEOUT, - }); + const errorScenarios = [ + { + mock: { + code: HttpStatusCode.Unauthorized, + errorTitle: MOCK_PIPELINE_VERIFY_UNAUTHORIZED_TEXT, + }, + field: 'token', + status: '401', + message: 'Token is incorrect!', + }, + { + mock: { + code: HttpStatusCode.ServiceUnavailable, + errorTitle: UNKNOWN_ERROR_TEXT, + }, + field: 'token', + status: 'Unknown', + message: 'Unknown error', + }, + { + mock: { + code: AXIOS_REQUEST_ERROR_CODE.TIMEOUT, + errorTitle: '', + }, + field: 'token', + status: 'Timeout', + message: 'Timeout!', + }, + ]; + + it.each(errorScenarios)( + 'should set $field error message when verifying pipeline given response status', + async ({ mock, field, message }) => { + sourceControlClient.verifyToken = jest.fn().mockResolvedValue(mock); + + const { result } = setup(); + await result.current.verifyToken(); + + expect(setErrorSpy).toHaveBeenCalledWith(field, { message }); + }, + ); + + it('should clear all verified error messages when call resetFeilds', async () => { const { result } = setup(); - await act(() => result.current.verifyToken(MOCK_SOURCE_CONTROL_VERIFY_REQUEST_PARAMS)); + result.current.resetFields(); - await waitFor(() => { - expect(result.current.isVerifyTimeOut).toBeTruthy(); - expect(result.current.isShowAlert).toBeTruthy(); + expect(resetSpy).toHaveBeenCalledWith({ + type: 'GitHub', + token: '', }); }); }); diff --git a/frontend/__tests__/initialConfigState.ts b/frontend/__tests__/initialConfigState.ts index b0500db339..d71e47f4a3 100644 --- a/frontend/__tests__/initialConfigState.ts +++ b/frontend/__tests__/initialConfigState.ts @@ -1,5 +1,5 @@ -import { SortType } from '@src/containers/ConfigStep/DateRangePicker/DateRangePickerGroup'; import { BOARD_TYPES, PIPELINE_TOOL_TYPES, REGULAR_CALENDAR } from './fixtures'; +import { SortType } from '@src/containers/ConfigStep/DateRangePicker/types'; import { BasicConfigState } from '@src/context/config/configSlice'; import { SOURCE_CONTROL_TYPES } from '@src/constants/resources'; @@ -26,7 +26,6 @@ const initialConfigState: BasicConfigState = { site: '', token: '', }, - isVerified: false, isShow: false, verifiedResponse: { jiraColumns: [], @@ -39,7 +38,6 @@ const initialConfigState: BasicConfigState = { type: PIPELINE_TOOL_TYPES.BUILD_KITE, token: '', }, - isVerified: false, isShow: false, verifiedResponse: { pipelineList: [], @@ -50,7 +48,6 @@ const initialConfigState: BasicConfigState = { type: SOURCE_CONTROL_TYPES.GITHUB, token: '', }, - isVerified: false, isShow: false, verifiedResponse: { repoList: [], diff --git a/frontend/__tests__/updatedConfigState.ts b/frontend/__tests__/updatedConfigState.ts index c76d6819ea..e359353db6 100644 --- a/frontend/__tests__/updatedConfigState.ts +++ b/frontend/__tests__/updatedConfigState.ts @@ -21,7 +21,6 @@ const updatedConfigState = { site: '', token: '', }, - isVerified: false, isShow: false, verifiedResponse: { jiraColumns: [], @@ -34,7 +33,6 @@ const updatedConfigState = { type: PIPELINE_TOOL_TYPES.BUILD_KITE, token: '', }, - isVerified: false, isShow: false, verifiedResponse: { pipelineList: [], @@ -45,7 +43,6 @@ const updatedConfigState = { type: SOURCE_CONTROL_TYPES.GITHUB, token: '', }, - isVerified: false, isShow: false, verifiedResponse: { repoList: [], diff --git a/frontend/__tests__/utils/FormProvider.tsx b/frontend/__tests__/utils/FormProvider.tsx new file mode 100644 index 0000000000..e4afe55d4f --- /dev/null +++ b/frontend/__tests__/utils/FormProvider.tsx @@ -0,0 +1,20 @@ +import { useForm, FormProvider as RHFProvider } from 'react-hook-form'; +import { InferType, AnySchema, ObjectSchema } from 'yup'; +import { yupResolver } from '@hookform/resolvers/yup'; +import { ReactNode } from 'react'; + +interface IFormProviderProps { + children: ReactNode; + defaultValues: InferType; + schema: T; +} + +export const FormProvider = ({ defaultValues, children, schema }: IFormProviderProps>) => { + const formMethods = useForm>({ + defaultValues, + resolver: yupResolver(schema), + mode: 'onChange', + }); + + return {children}; +}; diff --git a/frontend/package.json b/frontend/package.json index 6fc8453091..893667ac41 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -47,6 +47,7 @@ "@emotion/react": "^11.11.4", "@emotion/styled": "^11.11.0", "@fontsource/roboto": "^5.0.12", + "@hookform/resolvers": "^3.3.4", "@mui/icons-material": "^5.15.14", "@mui/material": "^5.15.14", "@mui/x-date-pickers": "^7.0.0", @@ -58,11 +59,13 @@ "react": "^18.2.0", "react-dom": "^18.2.0", "react-error-boundary": "^4.0.13", + "react-hook-form": "^7.51.3", "react-redux": "^9.0.0", "react-router-dom": "^6.22.3", "typescript": "^5.4.2", "vite": "^5.2.2", - "vite-plugin-pwa": "^0.19.5" + "vite-plugin-pwa": "^0.19.5", + "yup": "^1.4.0" }, "devDependencies": { "@dotenvx/dotenvx": "^0.27.0", diff --git a/frontend/pnpm-lock.yaml b/frontend/pnpm-lock.yaml index 1546ad761f..9e275e1680 100644 --- a/frontend/pnpm-lock.yaml +++ b/frontend/pnpm-lock.yaml @@ -10,22 +10,25 @@ dependencies: version: 11.11.4(@types/react@18.2.67)(react@18.2.0) '@emotion/styled': specifier: ^11.11.0 - version: 11.11.5(@emotion/react@11.11.4)(@types/react@18.2.67)(react@18.2.0) + version: 11.11.0(@emotion/react@11.11.4)(@types/react@18.2.67)(react@18.2.0) '@fontsource/roboto': specifier: ^5.0.12 version: 5.0.12 + '@hookform/resolvers': + specifier: ^3.3.4 + version: 3.3.4(react-hook-form@7.51.3) '@mui/icons-material': specifier: ^5.15.14 - version: 5.15.15(@mui/material@5.15.15)(@types/react@18.2.67)(react@18.2.0) + version: 5.15.14(@mui/material@5.15.14)(@types/react@18.2.67)(react@18.2.0) '@mui/material': specifier: ^5.15.14 - version: 5.15.15(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.2.67)(react-dom@18.2.0)(react@18.2.0) + version: 5.15.14(@emotion/react@11.11.4)(@emotion/styled@11.11.0)(@types/react@18.2.67)(react-dom@18.2.0)(react@18.2.0) '@mui/x-date-pickers': specifier: ^7.0.0 - version: 7.2.0(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@mui/material@5.15.15)(@types/react@18.2.67)(dayjs@1.11.10)(react-dom@18.2.0)(react@18.2.0) + version: 7.0.0(@emotion/react@11.11.4)(@emotion/styled@11.11.0)(@mui/material@5.15.14)(@types/react@18.2.67)(dayjs@1.11.10)(react-dom@18.2.0)(react@18.2.0) '@reduxjs/toolkit': specifier: ^2.2.2 - version: 2.2.3(react-redux@9.1.0)(react@18.2.0) + version: 2.2.2(react-redux@9.1.0)(react@18.2.0) axios: specifier: ^1.6.8 version: 1.6.8 @@ -47,6 +50,9 @@ dependencies: react-error-boundary: specifier: ^4.0.13 version: 4.0.13(react@18.2.0) + react-hook-form: + specifier: ^7.51.3 + version: 7.51.3(react@18.2.0) react-redux: specifier: ^9.0.0 version: 9.1.0(@types/react@18.2.67)(react@18.2.0)(redux@5.0.1) @@ -55,13 +61,16 @@ dependencies: version: 6.22.3(react-dom@18.2.0)(react@18.2.0) typescript: specifier: ^5.4.2 - version: 5.4.5 + version: 5.4.2 vite: specifier: ^5.2.2 - version: 5.2.8(@types/node@20.11.30) + version: 5.2.6(@types/node@20.11.30) vite-plugin-pwa: specifier: ^0.19.5 - version: 0.19.5(vite@5.2.8)(workbox-build@7.0.0)(workbox-window@7.0.0) + version: 0.19.5(vite@5.2.6)(workbox-build@7.0.0)(workbox-window@7.0.0) + yup: + specifier: ^1.4.0 + version: 1.4.0 devDependencies: '@dotenvx/dotenvx': @@ -78,7 +87,7 @@ devDependencies: version: 14.2.2(react-dom@18.2.0)(react@18.2.0) '@testing-library/user-event': specifier: ^14.5.2 - version: 14.5.2(@testing-library/dom@10.0.0) + version: 14.5.2(@testing-library/dom@9.3.4) '@types/jest': specifier: ^29.5.12 version: 29.5.12 @@ -105,13 +114,13 @@ devDependencies: version: 7.1.33 '@typescript-eslint/eslint-plugin': specifier: ^7.3.1 - version: 7.4.0(@typescript-eslint/parser@7.4.0)(eslint@8.57.0)(typescript@5.4.5) + version: 7.4.0(@typescript-eslint/parser@7.4.0)(eslint@8.57.0)(typescript@5.4.2) '@typescript-eslint/parser': specifier: ^7.3.1 - version: 7.4.0(eslint@8.57.0)(typescript@5.4.5) + version: 7.4.0(eslint@8.57.0)(typescript@5.4.2) '@vitejs/plugin-react-swc': specifier: ^3.6.0 - version: 3.6.0(vite@5.2.8) + version: 3.6.0(vite@5.2.6) audit-ci: specifier: ^6.6.1 version: 6.6.1 @@ -162,13 +171,13 @@ devDependencies: version: 29.7.0 license-compliance: specifier: ^3.0.0 - version: 3.0.0(typescript@5.4.5) + version: 3.0.0(typescript@5.4.2) lint-staged: specifier: ^15.2.2 version: 15.2.2 msw: specifier: ^1.3.3 - version: 1.3.3(typescript@5.4.5) + version: 1.3.3(typescript@5.4.2) node-fetch: specifier: ^3.3.2 version: 3.3.2 @@ -177,16 +186,16 @@ devDependencies: version: 3.2.5 prettier-plugin-sort-imports: specifier: ^1.8.4 - version: 1.8.5(typescript@5.4.5) + version: 1.8.4(typescript@5.4.2) ts-jest: specifier: ^29.1.2 - version: 29.1.2(@babel/core@7.24.3)(jest@29.7.0)(typescript@5.4.5) + version: 29.1.2(@babel/core@7.24.3)(jest@29.7.0)(typescript@5.4.2) ts-node: specifier: ^10.9.2 - version: 10.9.2(@types/node@20.11.30)(typescript@5.4.5) + version: 10.9.2(@types/node@20.11.30)(typescript@5.4.2) tsc-files: specifier: ^1.1.4 - version: 1.1.4(typescript@5.4.5) + version: 1.1.4(typescript@5.4.2) packages: @@ -1547,6 +1556,7 @@ packages: engines: {node: '>=6.9.0'} dependencies: regenerator-runtime: 0.14.1 + dev: false /@babel/template@7.24.0: resolution: {integrity: sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==} @@ -1714,22 +1724,12 @@ packages: csstype: 3.1.3 dev: false - /@emotion/serialize@1.1.4: - resolution: {integrity: sha512-RIN04MBT8g+FnDwgvIUi8czvr1LU1alUMI05LekWB5DGyTm8cCBMCRpq3GqaiyEDRptEXOyXnvZ58GZYu4kBxQ==} - dependencies: - '@emotion/hash': 0.9.1 - '@emotion/memoize': 0.8.1 - '@emotion/unitless': 0.8.1 - '@emotion/utils': 1.2.1 - csstype: 3.1.3 - dev: false - /@emotion/sheet@1.2.2: resolution: {integrity: sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==} dev: false - /@emotion/styled@11.11.5(@emotion/react@11.11.4)(@types/react@18.2.67)(react@18.2.0): - resolution: {integrity: sha512-/ZjjnaNKvuMPxcIiUkf/9SHoG4Q196DRl1w82hQ3WCsjo1IUR8uaGWrC6a87CrYAW0Kb/pK7hk8BnLgLRi9KoQ==} + /@emotion/styled@11.11.0(@emotion/react@11.11.4)(@types/react@18.2.67)(react@18.2.0): + resolution: {integrity: sha512-hM5Nnvu9P3midq5aaXj4I+lnSfNi7Pmd4EWk1fOZ3pxookaQTNew6bp4JaCBYM4HVFZF9g7UjJmsUmC2JlxOng==} peerDependencies: '@emotion/react': ^11.0.0-rc.0 '@types/react': '*' @@ -1738,11 +1738,11 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.24.4 + '@babel/runtime': 7.24.1 '@emotion/babel-plugin': 11.11.0 '@emotion/is-prop-valid': 1.2.2 '@emotion/react': 11.11.4(@types/react@18.2.67)(react@18.2.0) - '@emotion/serialize': 1.1.4 + '@emotion/serialize': 1.1.3 '@emotion/use-insertion-effect-with-fallbacks': 1.0.1(react@18.2.0) '@emotion/utils': 1.2.1 '@types/react': 18.2.67 @@ -2037,6 +2037,14 @@ packages: '@hapi/hoek': 9.3.0 dev: true + /@hookform/resolvers@3.3.4(react-hook-form@7.51.3): + resolution: {integrity: sha512-o5cgpGOuJYrd+iMKvkttOclgwRW86EsWJZZRC23prf0uU2i48Htq4PuT73AVb9ionFyZrwYEITuOFGF+BydEtQ==} + peerDependencies: + react-hook-form: ^7.0.0 + dependencies: + react-hook-form: 7.51.3(react@18.2.0) + dev: false + /@humanwhocodes/config-array@0.11.14: resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} engines: {node: '>=10.10.0'} @@ -2492,7 +2500,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.24.4 + '@babel/runtime': 7.24.1 '@floating-ui/react-dom': 2.0.8(react-dom@18.2.0)(react@18.2.0) '@mui/types': 7.2.14(@types/react@18.2.67) '@mui/utils': 5.15.14(@types/react@18.2.67)(react@18.2.0) @@ -2504,12 +2512,12 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: false - /@mui/core-downloads-tracker@5.15.15: - resolution: {integrity: sha512-aXnw29OWQ6I5A47iuWEI6qSSUfH6G/aCsW9KmW3LiFqr7uXZBK4Ks+z8G+qeIub8k0T5CMqlT2q0L+ZJTMrqpg==} + /@mui/core-downloads-tracker@5.15.14: + resolution: {integrity: sha512-on75VMd0XqZfaQW+9pGjSNiqW+ghc5E2ZSLRBXwcXl/C4YzjfyjrLPhrEpKnR9Uym9KXBvxrhoHfPcczYHweyA==} dev: false - /@mui/icons-material@5.15.15(@mui/material@5.15.15)(@types/react@18.2.67)(react@18.2.0): - resolution: {integrity: sha512-kkeU/pe+hABcYDH6Uqy8RmIsr2S/y5bP2rp+Gat4CcRjCcVne6KudS1NrZQhUCRysrTDCAhcbcf9gt+/+pGO2g==} + /@mui/icons-material@5.15.14(@mui/material@5.15.14)(@types/react@18.2.67)(react@18.2.0): + resolution: {integrity: sha512-vj/51k7MdFmt+XVw94sl30SCvGx6+wJLsNYjZRgxhS6y3UtnWnypMOsm3Kmg8TN+P0dqwsjy4/fX7B1HufJIhw==} engines: {node: '>=12.0.0'} peerDependencies: '@mui/material': ^5.0.0 @@ -2519,14 +2527,14 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.24.4 - '@mui/material': 5.15.15(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.2.67)(react-dom@18.2.0)(react@18.2.0) + '@babel/runtime': 7.24.1 + '@mui/material': 5.15.14(@emotion/react@11.11.4)(@emotion/styled@11.11.0)(@types/react@18.2.67)(react-dom@18.2.0)(react@18.2.0) '@types/react': 18.2.67 react: 18.2.0 dev: false - /@mui/material@5.15.15(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.2.67)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-3zvWayJ+E1kzoIsvwyEvkTUKVKt1AjchFFns+JtluHCuvxgKcLSRJTADw37k0doaRtVAsyh8bz9Afqzv+KYrIA==} + /@mui/material@5.15.14(@emotion/react@11.11.4)(@emotion/styled@11.11.0)(@types/react@18.2.67)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-kEbRw6fASdQ1SQ7LVdWR5OlWV3y7Y54ZxkLzd6LV5tmz+NpO3MJKZXSfgR0LHMP7meKsPiMm4AuzV0pXDpk/BQ==} engines: {node: '>=12.0.0'} peerDependencies: '@emotion/react': ^11.5.0 @@ -2542,12 +2550,12 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.24.4 + '@babel/runtime': 7.24.1 '@emotion/react': 11.11.4(@types/react@18.2.67)(react@18.2.0) - '@emotion/styled': 11.11.5(@emotion/react@11.11.4)(@types/react@18.2.67)(react@18.2.0) + '@emotion/styled': 11.11.0(@emotion/react@11.11.4)(@types/react@18.2.67)(react@18.2.0) '@mui/base': 5.0.0-beta.40(@types/react@18.2.67)(react-dom@18.2.0)(react@18.2.0) - '@mui/core-downloads-tracker': 5.15.15 - '@mui/system': 5.15.15(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.2.67)(react@18.2.0) + '@mui/core-downloads-tracker': 5.15.14 + '@mui/system': 5.15.14(@emotion/react@11.11.4)(@emotion/styled@11.11.0)(@types/react@18.2.67)(react@18.2.0) '@mui/types': 7.2.14(@types/react@18.2.67) '@mui/utils': 5.15.14(@types/react@18.2.67)(react@18.2.0) '@types/react': 18.2.67 @@ -2571,14 +2579,14 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.24.4 + '@babel/runtime': 7.24.1 '@mui/utils': 5.15.14(@types/react@18.2.67)(react@18.2.0) '@types/react': 18.2.67 prop-types: 15.8.1 react: 18.2.0 dev: false - /@mui/styled-engine@5.15.14(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(react@18.2.0): + /@mui/styled-engine@5.15.14(@emotion/react@11.11.4)(@emotion/styled@11.11.0)(react@18.2.0): resolution: {integrity: sha512-RILkuVD8gY6PvjZjqnWhz8fu68dVkqhM5+jYWfB5yhlSQKg+2rHkmEwm75XIeAqI3qwOndK6zELK5H6Zxn4NHw==} engines: {node: '>=12.0.0'} peerDependencies: @@ -2591,17 +2599,17 @@ packages: '@emotion/styled': optional: true dependencies: - '@babel/runtime': 7.24.4 + '@babel/runtime': 7.24.1 '@emotion/cache': 11.11.0 '@emotion/react': 11.11.4(@types/react@18.2.67)(react@18.2.0) - '@emotion/styled': 11.11.5(@emotion/react@11.11.4)(@types/react@18.2.67)(react@18.2.0) + '@emotion/styled': 11.11.0(@emotion/react@11.11.4)(@types/react@18.2.67)(react@18.2.0) csstype: 3.1.3 prop-types: 15.8.1 react: 18.2.0 dev: false - /@mui/system@5.15.15(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.2.67)(react@18.2.0): - resolution: {integrity: sha512-aulox6N1dnu5PABsfxVGOZffDVmlxPOVgj56HrUnJE8MCSh8lOvvkd47cebIVQQYAjpwieXQXiDPj5pwM40jTQ==} + /@mui/system@5.15.14(@emotion/react@11.11.4)(@emotion/styled@11.11.0)(@types/react@18.2.67)(react@18.2.0): + resolution: {integrity: sha512-auXLXzUaCSSOLqJXmsAaq7P96VPRXg2Rrz6OHNV7lr+kB8lobUF+/N84Vd9C4G/wvCXYPs5TYuuGBRhcGbiBGg==} engines: {node: '>=12.0.0'} peerDependencies: '@emotion/react': ^11.5.0 @@ -2616,11 +2624,11 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.24.4 + '@babel/runtime': 7.24.1 '@emotion/react': 11.11.4(@types/react@18.2.67)(react@18.2.0) - '@emotion/styled': 11.11.5(@emotion/react@11.11.4)(@types/react@18.2.67)(react@18.2.0) + '@emotion/styled': 11.11.0(@emotion/react@11.11.4)(@types/react@18.2.67)(react@18.2.0) '@mui/private-theming': 5.15.14(@types/react@18.2.67)(react@18.2.0) - '@mui/styled-engine': 5.15.14(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(react@18.2.0) + '@mui/styled-engine': 5.15.14(@emotion/react@11.11.4)(@emotion/styled@11.11.0)(react@18.2.0) '@mui/types': 7.2.14(@types/react@18.2.67) '@mui/utils': 5.15.14(@types/react@18.2.67)(react@18.2.0) '@types/react': 18.2.67 @@ -2651,16 +2659,16 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.24.4 - '@types/prop-types': 15.7.12 + '@babel/runtime': 7.24.1 + '@types/prop-types': 15.7.11 '@types/react': 18.2.67 prop-types: 15.8.1 react: 18.2.0 react-is: 18.2.0 dev: false - /@mui/x-date-pickers@7.2.0(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@mui/material@5.15.15)(@types/react@18.2.67)(dayjs@1.11.10)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-hsXugZ+n1ZnHRYzf7+PFrjZ44T+FyGZmTreBmH0M2RUaAblgK+A1V3KNLT+r4Y9gJLH+92LwePxQ9xyfR+E51A==} + /@mui/x-date-pickers@7.0.0(@emotion/react@11.11.4)(@emotion/styled@11.11.0)(@mui/material@5.15.14)(@types/react@18.2.67)(dayjs@1.11.10)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-/9mp4O2WMixHOso63DBoZVfJVYGrzOHF5voheV2tYQ4XqDdTKp2AdWS3oh8PGwrsvCzqkvb3quzTqhKoEsJUwA==} engines: {node: '>=14.0.0'} peerDependencies: '@emotion/react': ^11.9.0 @@ -2695,12 +2703,12 @@ packages: moment-jalaali: optional: true dependencies: - '@babel/runtime': 7.24.4 + '@babel/runtime': 7.24.1 '@emotion/react': 11.11.4(@types/react@18.2.67)(react@18.2.0) - '@emotion/styled': 11.11.5(@emotion/react@11.11.4)(@types/react@18.2.67)(react@18.2.0) + '@emotion/styled': 11.11.0(@emotion/react@11.11.4)(@types/react@18.2.67)(react@18.2.0) '@mui/base': 5.0.0-beta.40(@types/react@18.2.67)(react-dom@18.2.0)(react@18.2.0) - '@mui/material': 5.15.15(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.2.67)(react-dom@18.2.0)(react@18.2.0) - '@mui/system': 5.15.15(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.2.67)(react@18.2.0) + '@mui/material': 5.15.14(@emotion/react@11.11.4)(@emotion/styled@11.11.0)(@types/react@18.2.67)(react-dom@18.2.0)(react@18.2.0) + '@mui/system': 5.15.14(@emotion/react@11.11.4)(@emotion/styled@11.11.0)(@types/react@18.2.67)(react@18.2.0) '@mui/utils': 5.15.14(@types/react@18.2.67)(react@18.2.0) '@types/react-transition-group': 4.4.10 clsx: 2.1.0 @@ -2759,8 +2767,8 @@ packages: resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} dev: false - /@reduxjs/toolkit@2.2.3(react-redux@9.1.0)(react@18.2.0): - resolution: {integrity: sha512-76dll9EnJXg4EVcI5YNxZA/9hSAmZsFqzMmNRHvIlzw2WS/twfcVX3ysYrWGJMClwEmChQFC4yRq74tn6fdzRA==} + /@reduxjs/toolkit@2.2.2(react-redux@9.1.0)(react@18.2.0): + resolution: {integrity: sha512-454GZrEx3G6QSYwIx9ROaso1HR6sTH8qyZBe3KEsdWVGU3ayV8jYCwdaEJV3vl9V6+pi3GRl+7Xl7AeDna6qwQ==} peerDependencies: react: ^16.9.0 || ^17.0.0 || ^18 react-redux: ^7.2.1 || ^8.1.3 || ^9.0.0 @@ -2837,106 +2845,106 @@ packages: rollup: 2.79.1 dev: false - /@rollup/rollup-android-arm-eabi@4.14.2: - resolution: {integrity: sha512-ahxSgCkAEk+P/AVO0vYr7DxOD3CwAQrT0Go9BJyGQ9Ef0QxVOfjDZMiF4Y2s3mLyPrjonchIMH/tbWHucJMykQ==} + /@rollup/rollup-android-arm-eabi@4.14.0: + resolution: {integrity: sha512-jwXtxYbRt1V+CdQSy6Z+uZti7JF5irRKF8hlKfEnF/xJpcNGuuiZMBvuoYM+x9sr9iWGnzrlM0+9hvQ1kgkf1w==} cpu: [arm] os: [android] requiresBuild: true optional: true - /@rollup/rollup-android-arm64@4.14.2: - resolution: {integrity: sha512-lAarIdxZWbFSHFSDao9+I/F5jDaKyCqAPMq5HqnfpBw8dKDiCaaqM0lq5h1pQTLeIqueeay4PieGR5jGZMWprw==} + /@rollup/rollup-android-arm64@4.14.0: + resolution: {integrity: sha512-fI9nduZhCccjzlsA/OuAwtFGWocxA4gqXGTLvOyiF8d+8o0fZUeSztixkYjcGq1fGZY3Tkq4yRvHPFxU+jdZ9Q==} cpu: [arm64] os: [android] requiresBuild: true optional: true - /@rollup/rollup-darwin-arm64@4.14.2: - resolution: {integrity: sha512-SWsr8zEUk82KSqquIMgZEg2GE5mCSfr9sE/thDROkX6pb3QQWPp8Vw8zOq2GyxZ2t0XoSIUlvHDkrf5Gmf7x3Q==} + /@rollup/rollup-darwin-arm64@4.14.0: + resolution: {integrity: sha512-BcnSPRM76/cD2gQC+rQNGBN6GStBs2pl/FpweW8JYuz5J/IEa0Fr4AtrPv766DB/6b2MZ/AfSIOSGw3nEIP8SA==} cpu: [arm64] os: [darwin] requiresBuild: true optional: true - /@rollup/rollup-darwin-x64@4.14.2: - resolution: {integrity: sha512-o/HAIrQq0jIxJAhgtIvV5FWviYK4WB0WwV91SLUnsliw1lSAoLsmgEEgRWzDguAFeUEUUoIWXiJrPqU7vGiVkA==} + /@rollup/rollup-darwin-x64@4.14.0: + resolution: {integrity: sha512-LDyFB9GRolGN7XI6955aFeI3wCdCUszFWumWU0deHA8VpR3nWRrjG6GtGjBrQxQKFevnUTHKCfPR4IvrW3kCgQ==} cpu: [x64] os: [darwin] requiresBuild: true optional: true - /@rollup/rollup-linux-arm-gnueabihf@4.14.2: - resolution: {integrity: sha512-nwlJ65UY9eGq91cBi6VyDfArUJSKOYt5dJQBq8xyLhvS23qO+4Nr/RreibFHjP6t+5ap2ohZrUJcHv5zk5ju/g==} + /@rollup/rollup-linux-arm-gnueabihf@4.14.0: + resolution: {integrity: sha512-ygrGVhQP47mRh0AAD0zl6QqCbNsf0eTo+vgwkY6LunBcg0f2Jv365GXlDUECIyoXp1kKwL5WW6rsO429DBY/bA==} cpu: [arm] os: [linux] requiresBuild: true optional: true - /@rollup/rollup-linux-arm64-gnu@4.14.2: - resolution: {integrity: sha512-Pg5TxxO2IVlMj79+c/9G0LREC9SY3HM+pfAwX7zj5/cAuwrbfj2Wv9JbMHIdPCfQpYsI4g9mE+2Bw/3aeSs2rQ==} + /@rollup/rollup-linux-arm64-gnu@4.14.0: + resolution: {integrity: sha512-x+uJ6MAYRlHGe9wi4HQjxpaKHPM3d3JjqqCkeC5gpnnI6OWovLdXTpfa8trjxPLnWKyBsSi5kne+146GAxFt4A==} cpu: [arm64] os: [linux] requiresBuild: true optional: true - /@rollup/rollup-linux-arm64-musl@4.14.2: - resolution: {integrity: sha512-cAOTjGNm84gc6tS02D1EXtG7tDRsVSDTBVXOLbj31DkwfZwgTPYZ6aafSU7rD/4R2a34JOwlF9fQayuTSkoclA==} + /@rollup/rollup-linux-arm64-musl@4.14.0: + resolution: {integrity: sha512-nrRw8ZTQKg6+Lttwqo6a2VxR9tOroa2m91XbdQ2sUUzHoedXlsyvY1fN4xWdqz8PKmf4orDwejxXHjh7YBGUCA==} cpu: [arm64] os: [linux] requiresBuild: true optional: true - /@rollup/rollup-linux-powerpc64le-gnu@4.14.2: - resolution: {integrity: sha512-4RyT6v1kXb7C0fn6zV33rvaX05P0zHoNzaXI/5oFHklfKm602j+N4mn2YvoezQViRLPnxP8M1NaY4s/5kXO5cw==} - cpu: [ppc64] + /@rollup/rollup-linux-powerpc64le-gnu@4.14.0: + resolution: {integrity: sha512-xV0d5jDb4aFu84XKr+lcUJ9y3qpIWhttO3Qev97z8DKLXR62LC3cXT/bMZXrjLF9X+P5oSmJTzAhqwUbY96PnA==} + cpu: [ppc64le] os: [linux] requiresBuild: true optional: true - /@rollup/rollup-linux-riscv64-gnu@4.14.2: - resolution: {integrity: sha512-KNUH6jC/vRGAKSorySTyc/yRYlCwN/5pnMjXylfBniwtJx5O7X17KG/0efj8XM3TZU7raYRXJFFReOzNmL1n1w==} + /@rollup/rollup-linux-riscv64-gnu@4.14.0: + resolution: {integrity: sha512-SDDhBQwZX6LPRoPYjAZWyL27LbcBo7WdBFWJi5PI9RPCzU8ijzkQn7tt8NXiXRiFMJCVpkuMkBf4OxSxVMizAw==} cpu: [riscv64] os: [linux] requiresBuild: true optional: true - /@rollup/rollup-linux-s390x-gnu@4.14.2: - resolution: {integrity: sha512-xPV4y73IBEXToNPa3h5lbgXOi/v0NcvKxU0xejiFw6DtIYQqOTMhZ2DN18/HrrP0PmiL3rGtRG9gz1QE8vFKXQ==} + /@rollup/rollup-linux-s390x-gnu@4.14.0: + resolution: {integrity: sha512-RxB/qez8zIDshNJDufYlTT0ZTVut5eCpAZ3bdXDU9yTxBzui3KhbGjROK2OYTTor7alM7XBhssgoO3CZ0XD3qA==} cpu: [s390x] os: [linux] requiresBuild: true optional: true - /@rollup/rollup-linux-x64-gnu@4.14.2: - resolution: {integrity: sha512-QBhtr07iFGmF9egrPOWyO5wciwgtzKkYPNLVCFZTmr4TWmY0oY2Dm/bmhHjKRwZoGiaKdNcKhFtUMBKvlchH+Q==} + /@rollup/rollup-linux-x64-gnu@4.14.0: + resolution: {integrity: sha512-C6y6z2eCNCfhZxT9u+jAM2Fup89ZjiG5pIzZIDycs1IwESviLxwkQcFRGLjnDrP+PT+v5i4YFvlcfAs+LnreXg==} cpu: [x64] os: [linux] requiresBuild: true optional: true - /@rollup/rollup-linux-x64-musl@4.14.2: - resolution: {integrity: sha512-8zfsQRQGH23O6qazZSFY5jP5gt4cFvRuKTpuBsC1ZnSWxV8ZKQpPqOZIUtdfMOugCcBvFGRa1pDC/tkf19EgBw==} + /@rollup/rollup-linux-x64-musl@4.14.0: + resolution: {integrity: sha512-i0QwbHYfnOMYsBEyjxcwGu5SMIi9sImDVjDg087hpzXqhBSosxkE7gyIYFHgfFl4mr7RrXksIBZ4DoLoP4FhJg==} cpu: [x64] os: [linux] requiresBuild: true optional: true - /@rollup/rollup-win32-arm64-msvc@4.14.2: - resolution: {integrity: sha512-H4s8UjgkPnlChl6JF5empNvFHp77Jx+Wfy2EtmYPe9G22XV+PMuCinZVHurNe8ggtwoaohxARJZbaH/3xjB/FA==} + /@rollup/rollup-win32-arm64-msvc@4.14.0: + resolution: {integrity: sha512-Fq52EYb0riNHLBTAcL0cun+rRwyZ10S9vKzhGKKgeD+XbwunszSY0rVMco5KbOsTlwovP2rTOkiII/fQ4ih/zQ==} cpu: [arm64] os: [win32] requiresBuild: true optional: true - /@rollup/rollup-win32-ia32-msvc@4.14.2: - resolution: {integrity: sha512-djqpAjm/i8erWYF0K6UY4kRO3X5+T4TypIqw60Q8MTqSBaQNpNXDhxdjpZ3ikgb+wn99svA7jxcXpiyg9MUsdw==} + /@rollup/rollup-win32-ia32-msvc@4.14.0: + resolution: {integrity: sha512-e/PBHxPdJ00O9p5Ui43+vixSgVf4NlLsmV6QneGERJ3lnjIua/kim6PRFe3iDueT1rQcgSkYP8ZBBXa/h4iPvw==} cpu: [ia32] os: [win32] requiresBuild: true optional: true - /@rollup/rollup-win32-x64-msvc@4.14.2: - resolution: {integrity: sha512-teAqzLT0yTYZa8ZP7zhFKEx4cotS8Tkk5XiqNMJhD4CpaWB1BHARE4Qy+RzwnXvSAYv+Q3jAqCVBS+PS+Yee8Q==} + /@rollup/rollup-win32-x64-msvc@4.14.0: + resolution: {integrity: sha512-aGg7iToJjdklmxlUlJh/PaPNa4PmqHfyRMLunbL3eaMO0gp656+q1zOKkpJ/CVe9CryJv6tAN1HDoR8cNGzkag==} cpu: [x64] os: [win32] requiresBuild: true @@ -2980,7 +2988,7 @@ packages: /@surma/rollup-plugin-off-main-thread@2.2.3: resolution: {integrity: sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==} dependencies: - ejs: 3.1.10 + ejs: 3.1.9 json5: 2.2.3 magic-string: 0.25.9 string.prototype.matchall: 4.0.11 @@ -3118,20 +3126,6 @@ packages: defer-to-connect: 2.0.1 dev: true - /@testing-library/dom@10.0.0: - resolution: {integrity: sha512-PmJPnogldqoVFf+EwbHvbBJ98MmqASV8kLrBYgsDNxQcFMeIS7JFL48sfyXvuMtgmWO/wMhh25odr+8VhDmn4g==} - engines: {node: '>=18'} - dependencies: - '@babel/code-frame': 7.24.2 - '@babel/runtime': 7.24.4 - '@types/aria-query': 5.0.4 - aria-query: 5.3.0 - chalk: 4.1.2 - dom-accessibility-api: 0.5.16 - lz-string: 1.5.0 - pretty-format: 27.5.1 - dev: true - /@testing-library/dom@9.3.4: resolution: {integrity: sha512-FlS4ZWlp97iiNWig0Muq8p+3rVDjRiYE+YKGbAqXOu9nwJFFOdL00kFpz42M+4huzYi86vAK1sOOfyOG45muIQ==} engines: {node: '>=14'} @@ -3193,13 +3187,13 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: true - /@testing-library/user-event@14.5.2(@testing-library/dom@10.0.0): + /@testing-library/user-event@14.5.2(@testing-library/dom@9.3.4): resolution: {integrity: sha512-YAh82Wh4TIrxYLmfGcixwD18oIjyC1pFQC2Y01F2lzV2HTMiYrI0nze0FD0ocB//CKS/7jIUgae+adPqxK5yCQ==} engines: {node: '>=12', npm: '>=6'} peerDependencies: '@testing-library/dom': '>=7.21.4' dependencies: - '@testing-library/dom': 10.0.0 + '@testing-library/dom': 9.3.4 dev: true /@tootallnate/once@2.0.0: @@ -3380,8 +3374,8 @@ packages: dependencies: undici-types: 5.26.5 - /@types/node@20.12.7: - resolution: {integrity: sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==} + /@types/node@20.12.3: + resolution: {integrity: sha512-sD+ia2ubTeWrOu+YMF+MTAB7E+O7qsMqAbMfW7DG3K1URwhZ5hN1pLlRVGbf4wDFzSfikL05M17EyorS86jShw==} dependencies: undici-types: 5.26.5 dev: false @@ -3393,10 +3387,6 @@ packages: /@types/prop-types@15.7.11: resolution: {integrity: sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==} - /@types/prop-types@15.7.12: - resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} - dev: false - /@types/react-dom@18.2.22: resolution: {integrity: sha512-fHkBXPeNtfvri6gdsMYyW+dW7RXFo6Ad09nLFK0VQWR7yGLai/Cyvyj696gbwYvBnhGtevUG9cET0pmUbMtoPQ==} dependencies: @@ -3428,7 +3418,7 @@ packages: /@types/resolve@1.17.1: resolution: {integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==} dependencies: - '@types/node': 20.12.7 + '@types/node': 20.12.3 dev: false /@types/responselike@1.0.3: @@ -3484,7 +3474,7 @@ packages: '@types/yargs-parser': 21.0.3 dev: true - /@typescript-eslint/eslint-plugin@7.4.0(@typescript-eslint/parser@7.4.0)(eslint@8.57.0)(typescript@5.4.5): + /@typescript-eslint/eslint-plugin@7.4.0(@typescript-eslint/parser@7.4.0)(eslint@8.57.0)(typescript@5.4.2): resolution: {integrity: sha512-yHMQ/oFaM7HZdVrVm/M2WHaNPgyuJH4WelkSVEWSSsir34kxW2kDJCxlXRhhGWEsMN0WAW/vLpKfKVcm8k+MPw==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: @@ -3496,10 +3486,10 @@ packages: optional: true dependencies: '@eslint-community/regexpp': 4.10.0 - '@typescript-eslint/parser': 7.4.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/parser': 7.4.0(eslint@8.57.0)(typescript@5.4.2) '@typescript-eslint/scope-manager': 7.4.0 - '@typescript-eslint/type-utils': 7.4.0(eslint@8.57.0)(typescript@5.4.5) - '@typescript-eslint/utils': 7.4.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/type-utils': 7.4.0(eslint@8.57.0)(typescript@5.4.2) + '@typescript-eslint/utils': 7.4.0(eslint@8.57.0)(typescript@5.4.2) '@typescript-eslint/visitor-keys': 7.4.0 debug: 4.3.4 eslint: 8.57.0 @@ -3507,13 +3497,13 @@ packages: ignore: 5.3.1 natural-compare: 1.4.0 semver: 7.6.0 - ts-api-utils: 1.3.0(typescript@5.4.5) - typescript: 5.4.5 + ts-api-utils: 1.3.0(typescript@5.4.2) + typescript: 5.4.2 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/parser@7.4.0(eslint@8.57.0)(typescript@5.4.5): + /@typescript-eslint/parser@7.4.0(eslint@8.57.0)(typescript@5.4.2): resolution: {integrity: sha512-ZvKHxHLusweEUVwrGRXXUVzFgnWhigo4JurEj0dGF1tbcGh6buL+ejDdjxOQxv6ytcY1uhun1p2sm8iWStlgLQ==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: @@ -3525,11 +3515,11 @@ packages: dependencies: '@typescript-eslint/scope-manager': 7.4.0 '@typescript-eslint/types': 7.4.0 - '@typescript-eslint/typescript-estree': 7.4.0(typescript@5.4.5) + '@typescript-eslint/typescript-estree': 7.4.0(typescript@5.4.2) '@typescript-eslint/visitor-keys': 7.4.0 debug: 4.3.4 eslint: 8.57.0 - typescript: 5.4.5 + typescript: 5.4.2 transitivePeerDependencies: - supports-color dev: true @@ -3542,7 +3532,7 @@ packages: '@typescript-eslint/visitor-keys': 7.4.0 dev: true - /@typescript-eslint/type-utils@7.4.0(eslint@8.57.0)(typescript@5.4.5): + /@typescript-eslint/type-utils@7.4.0(eslint@8.57.0)(typescript@5.4.2): resolution: {integrity: sha512-247ETeHgr9WTRMqHbbQdzwzhuyaJ8dPTuyuUEMANqzMRB1rj/9qFIuIXK7l0FX9i9FXbHeBQl/4uz6mYuCE7Aw==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: @@ -3552,12 +3542,12 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': 7.4.0(typescript@5.4.5) - '@typescript-eslint/utils': 7.4.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/typescript-estree': 7.4.0(typescript@5.4.2) + '@typescript-eslint/utils': 7.4.0(eslint@8.57.0)(typescript@5.4.2) debug: 4.3.4 eslint: 8.57.0 - ts-api-utils: 1.3.0(typescript@5.4.5) - typescript: 5.4.5 + ts-api-utils: 1.3.0(typescript@5.4.2) + typescript: 5.4.2 transitivePeerDependencies: - supports-color dev: true @@ -3567,7 +3557,7 @@ packages: engines: {node: ^18.18.0 || >=20.0.0} dev: true - /@typescript-eslint/typescript-estree@7.4.0(typescript@5.4.5): + /@typescript-eslint/typescript-estree@7.4.0(typescript@5.4.2): resolution: {integrity: sha512-A99j5AYoME/UBQ1ucEbbMEmGkN7SE0BvZFreSnTd1luq7yulcHdyGamZKizU7canpGDWGJ+Q6ZA9SyQobipePg==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: @@ -3583,13 +3573,13 @@ packages: is-glob: 4.0.3 minimatch: 9.0.3 semver: 7.6.0 - ts-api-utils: 1.3.0(typescript@5.4.5) - typescript: 5.4.5 + ts-api-utils: 1.3.0(typescript@5.4.2) + typescript: 5.4.2 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/utils@7.4.0(eslint@8.57.0)(typescript@5.4.5): + /@typescript-eslint/utils@7.4.0(eslint@8.57.0)(typescript@5.4.2): resolution: {integrity: sha512-NQt9QLM4Tt8qrlBVY9lkMYzfYtNz8/6qwZg8pI3cMGlPnj6mOpRxxAm7BMJN9K0AiY+1BwJ5lVC650YJqYOuNg==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: @@ -3600,7 +3590,7 @@ packages: '@types/semver': 7.5.8 '@typescript-eslint/scope-manager': 7.4.0 '@typescript-eslint/types': 7.4.0 - '@typescript-eslint/typescript-estree': 7.4.0(typescript@5.4.5) + '@typescript-eslint/typescript-estree': 7.4.0(typescript@5.4.2) eslint: 8.57.0 semver: 7.6.0 transitivePeerDependencies: @@ -3620,13 +3610,13 @@ packages: resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} dev: true - /@vitejs/plugin-react-swc@3.6.0(vite@5.2.8): + /@vitejs/plugin-react-swc@3.6.0(vite@5.2.6): resolution: {integrity: sha512-XFRbsGgpGxGzEV5i5+vRiro1bwcIaZDIdBRP16qwm+jP68ue/S8FJTBEgOeojtVDYrbSua3XFp71kC8VJE6v+g==} peerDependencies: vite: ^4 || ^5 dependencies: '@swc/core': 1.4.8 - vite: 5.2.8(@types/node@20.11.30) + vite: 5.2.6(@types/node@20.11.30) transitivePeerDependencies: - '@swc/helpers' dev: true @@ -4498,7 +4488,7 @@ packages: yaml: 1.10.2 dev: false - /cosmiconfig@9.0.0(typescript@5.4.5): + /cosmiconfig@9.0.0(typescript@5.4.2): resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} engines: {node: '>=14'} peerDependencies: @@ -4511,7 +4501,7 @@ packages: import-fresh: 3.3.0 js-yaml: 4.1.0 parse-json: 5.2.0 - typescript: 5.4.5 + typescript: 5.4.2 dev: true /create-jest@29.7.0(@types/node@20.11.30)(ts-node@10.9.2): @@ -4796,7 +4786,7 @@ packages: /dom-helpers@5.2.1: resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==} dependencies: - '@babel/runtime': 7.24.4 + '@babel/runtime': 7.24.1 csstype: 3.1.3 dev: false @@ -4842,8 +4832,8 @@ packages: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} dev: true - /ejs@3.1.10: - resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} + /ejs@3.1.9: + resolution: {integrity: sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==} engines: {node: '>=0.10.0'} hasBin: true dependencies: @@ -5177,7 +5167,7 @@ packages: eslint-import-resolver-webpack: optional: true dependencies: - '@typescript-eslint/parser': 7.4.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/parser': 7.4.0(eslint@8.57.0)(typescript@5.4.2) debug: 3.2.7 eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 @@ -5207,7 +5197,7 @@ packages: '@typescript-eslint/parser': optional: true dependencies: - '@typescript-eslint/parser': 7.4.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/parser': 7.4.0(eslint@8.57.0)(typescript@5.4.2) array-includes: 3.1.7 array.prototype.findlastindex: 1.2.5 array.prototype.flat: 1.3.2 @@ -6589,7 +6579,7 @@ packages: pretty-format: 29.7.0 slash: 3.0.0 strip-json-comments: 3.1.1 - ts-node: 10.9.2(@types/node@20.11.30)(typescript@5.4.5) + ts-node: 10.9.2(@types/node@20.11.30)(typescript@5.4.2) transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -6895,7 +6885,7 @@ packages: resolution: {integrity: sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==} engines: {node: '>= 10.13.0'} dependencies: - '@types/node': 20.12.7 + '@types/node': 20.12.3 merge-stream: 2.0.0 supports-color: 7.2.0 dev: false @@ -7112,14 +7102,14 @@ packages: type-check: 0.4.0 dev: true - /license-compliance@3.0.0(typescript@5.4.5): + /license-compliance@3.0.0(typescript@5.4.2): resolution: {integrity: sha512-0kXEr7JSdP+jPSTSEnAiyGvpOoFnkiVXqmTFhXx22+tCay7shTN1mVM7Z+p2F3YNeIhx0tmADglrp5ddWGyHnQ==} engines: {node: '>=18.20.1'} hasBin: true dependencies: chalk: 4.1.2 commander: 12.0.0 - cosmiconfig: 9.0.0(typescript@5.4.5) + cosmiconfig: 9.0.0(typescript@5.4.2) debug: 4.3.4 joi: 17.12.3 spdx-expression-parse: 4.0.0 @@ -7402,7 +7392,7 @@ packages: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} dev: true - /msw@1.3.3(typescript@5.4.5): + /msw@1.3.3(typescript@5.4.2): resolution: {integrity: sha512-CiPyRFiYJCXYyH/vwxT7m+sa4VZHuUH6cGwRBj0kaTjBGpsk4EnL47YzhoA859htVCF2vzqZuOsomIUlFqg9GQ==} engines: {node: '>=14'} hasBin: true @@ -7431,7 +7421,7 @@ packages: path-to-regexp: 6.2.1 strict-event-emitter: 0.4.6 type-fest: 2.19.0 - typescript: 5.4.5 + typescript: 5.4.2 yargs: 17.7.2 transitivePeerDependencies: - encoding @@ -7870,13 +7860,13 @@ packages: fast-diff: 1.3.0 dev: true - /prettier-plugin-sort-imports@1.8.5(typescript@5.4.5): - resolution: {integrity: sha512-PkizzuO2S8h3kJeWHytnMZXqvv/fD6g+en/dhv4y5QjoiMm1wq3FWzFiFT7c/BilX95l0ZIqJTlMsXYs8z/WQQ==} + /prettier-plugin-sort-imports@1.8.4(typescript@5.4.2): + resolution: {integrity: sha512-3Y5TK68TXdP+ViIzRNp4bvjjjPZ0MULL96ImBVTwWtKiIOIcuBIzFmtfPEzOVHaX0tJa3MGChrzmJAsyObvPbA==} peerDependencies: typescript: '>4.0.0' dependencies: prettier: 3.2.5 - typescript: 5.4.5 + typescript: 5.4.2 dev: true /prettier@3.2.5: @@ -7928,6 +7918,10 @@ packages: object-assign: 4.1.1 react-is: 16.13.1 + /property-expr@2.0.6: + resolution: {integrity: sha512-SVtmxhRE/CGkn3eZY1T6pC8Nln6Fr/lu1mKSgRud0eC73whjGfoAogbn78LkD8aFL0zz3bAFerKSnOl7NlErBA==} + dev: false + /proxy-from-env@1.1.0: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} dev: false @@ -8004,6 +7998,15 @@ packages: react: 18.2.0 dev: false + /react-hook-form@7.51.3(react@18.2.0): + resolution: {integrity: sha512-cvJ/wbHdhYx8aviSWh28w9ImjmVsb5Y05n1+FW786vEZQJV5STNM0pW6ujS+oiBecb0ARBxJFyAnXj9+GHXACQ==} + engines: {node: '>=12.22.0'} + peerDependencies: + react: ^16.8.0 || ^17 || ^18 + dependencies: + react: 18.2.0 + dev: false + /react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} @@ -8065,7 +8068,7 @@ packages: react: '>=16.6.0' react-dom: '>=16.6.0' dependencies: - '@babel/runtime': 7.24.4 + '@babel/runtime': 7.24.1 dom-helpers: 5.2.1 loose-envify: 1.4.0 prop-types: 15.8.1 @@ -8119,7 +8122,7 @@ packages: /redux@4.2.1: resolution: {integrity: sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==} dependencies: - '@babel/runtime': 7.24.4 + '@babel/runtime': 7.24.1 dev: true /redux@5.0.1: @@ -8322,28 +8325,28 @@ packages: fsevents: 2.3.3 dev: false - /rollup@4.14.2: - resolution: {integrity: sha512-WkeoTWvuBoFjFAhsEOHKRoZ3r9GfTyhh7Vff1zwebEFLEFjT1lG3784xEgKiTa7E+e70vsC81roVL2MP4tgEEQ==} + /rollup@4.14.0: + resolution: {integrity: sha512-Qe7w62TyawbDzB4yt32R0+AbIo6m1/sqO7UPzFS8Z/ksL5mrfhA0v4CavfdmFav3D+ub4QeAgsGEe84DoWe/nQ==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true dependencies: '@types/estree': 1.0.5 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.14.2 - '@rollup/rollup-android-arm64': 4.14.2 - '@rollup/rollup-darwin-arm64': 4.14.2 - '@rollup/rollup-darwin-x64': 4.14.2 - '@rollup/rollup-linux-arm-gnueabihf': 4.14.2 - '@rollup/rollup-linux-arm64-gnu': 4.14.2 - '@rollup/rollup-linux-arm64-musl': 4.14.2 - '@rollup/rollup-linux-powerpc64le-gnu': 4.14.2 - '@rollup/rollup-linux-riscv64-gnu': 4.14.2 - '@rollup/rollup-linux-s390x-gnu': 4.14.2 - '@rollup/rollup-linux-x64-gnu': 4.14.2 - '@rollup/rollup-linux-x64-musl': 4.14.2 - '@rollup/rollup-win32-arm64-msvc': 4.14.2 - '@rollup/rollup-win32-ia32-msvc': 4.14.2 - '@rollup/rollup-win32-x64-msvc': 4.14.2 + '@rollup/rollup-android-arm-eabi': 4.14.0 + '@rollup/rollup-android-arm64': 4.14.0 + '@rollup/rollup-darwin-arm64': 4.14.0 + '@rollup/rollup-darwin-x64': 4.14.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.14.0 + '@rollup/rollup-linux-arm64-gnu': 4.14.0 + '@rollup/rollup-linux-arm64-musl': 4.14.0 + '@rollup/rollup-linux-powerpc64le-gnu': 4.14.0 + '@rollup/rollup-linux-riscv64-gnu': 4.14.0 + '@rollup/rollup-linux-s390x-gnu': 4.14.0 + '@rollup/rollup-linux-x64-gnu': 4.14.0 + '@rollup/rollup-linux-x64-musl': 4.14.0 + '@rollup/rollup-win32-arm64-msvc': 4.14.0 + '@rollup/rollup-win32-ia32-msvc': 4.14.0 + '@rollup/rollup-win32-x64-msvc': 4.14.0 fsevents: 2.3.3 /run-async@2.4.1: @@ -8881,6 +8884,10 @@ packages: resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} dev: true + /tiny-case@1.0.3: + resolution: {integrity: sha512-Eet/eeMhkO6TX8mnUteS9zgPbUMQa4I6Kkp5ORiBD5476/m+PIRiumP5tmh5ioJpH7k51Kehawy2UDfsnxxY8Q==} + dev: false + /tmp@0.0.33: resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} engines: {node: '>=0.6.0'} @@ -8902,6 +8909,10 @@ packages: dependencies: is-number: 7.0.0 + /toposort@2.0.2: + resolution: {integrity: sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg==} + dev: false + /tough-cookie@4.1.3: resolution: {integrity: sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==} engines: {node: '>=6'} @@ -8934,16 +8945,16 @@ packages: engines: {node: '>= 14.0.0'} dev: true - /ts-api-utils@1.3.0(typescript@5.4.5): + /ts-api-utils@1.3.0(typescript@5.4.2): resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} engines: {node: '>=16'} peerDependencies: typescript: '>=4.2.0' dependencies: - typescript: 5.4.5 + typescript: 5.4.2 dev: true - /ts-jest@29.1.2(@babel/core@7.24.3)(jest@29.7.0)(typescript@5.4.5): + /ts-jest@29.1.2(@babel/core@7.24.3)(jest@29.7.0)(typescript@5.4.2): resolution: {integrity: sha512-br6GJoH/WUX4pu7FbZXuWGKGNDuU7b8Uj77g/Sp7puZV6EXzuByl6JrECvm0MzVzSTkSHWTihsXt+5XYER5b+g==} engines: {node: ^16.10.0 || ^18.0.0 || >=20.0.0} hasBin: true @@ -8973,11 +8984,11 @@ packages: lodash.memoize: 4.1.2 make-error: 1.3.6 semver: 7.6.0 - typescript: 5.4.5 + typescript: 5.4.2 yargs-parser: 21.1.1 dev: true - /ts-node@10.9.2(@types/node@20.11.30)(typescript@5.4.5): + /ts-node@10.9.2(@types/node@20.11.30)(typescript@5.4.2): resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} hasBin: true peerDependencies: @@ -9003,18 +9014,18 @@ packages: create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 5.4.5 + typescript: 5.4.2 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 dev: true - /tsc-files@1.1.4(typescript@5.4.5): + /tsc-files@1.1.4(typescript@5.4.2): resolution: {integrity: sha512-RePsRsOLru3BPpnf237y1Xe1oCGta8rmSYzM76kYo5tLGsv5R2r3s64yapYorGTPuuLyfS9NVbh9ydzmvNie2w==} hasBin: true peerDependencies: typescript: '>=3' dependencies: - typescript: 5.4.5 + typescript: 5.4.2 dev: true /tsconfig-paths@3.15.0: @@ -9060,7 +9071,6 @@ packages: /type-fest@2.19.0: resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} engines: {node: '>=12.20'} - dev: true /type-fest@3.13.1: resolution: {integrity: sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==} @@ -9113,8 +9123,8 @@ packages: is-typedarray: 1.0.0 dev: true - /typescript@5.4.5: - resolution: {integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==} + /typescript@5.4.2: + resolution: {integrity: sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==} engines: {node: '>=14.17'} hasBin: true @@ -9237,7 +9247,7 @@ packages: convert-source-map: 2.0.0 dev: true - /vite-plugin-pwa@0.19.5(vite@5.2.8)(workbox-build@7.0.0)(workbox-window@7.0.0): + /vite-plugin-pwa@0.19.5(vite@5.2.6)(workbox-build@7.0.0)(workbox-window@7.0.0): resolution: {integrity: sha512-3xJEc2Gmq6SBf730UAV1N2/MqOm+MiyvaLToSTglg+pH9b9qm666yPVxrBBlcOhGoJJWjJpu+Z9tROKek2CODg==} engines: {node: '>=16.0.0'} peerDependencies: @@ -9252,15 +9262,15 @@ packages: debug: 4.3.4 fast-glob: 3.3.2 pretty-bytes: 6.1.1 - vite: 5.2.8(@types/node@20.11.30) + vite: 5.2.6(@types/node@20.11.30) workbox-build: 7.0.0 workbox-window: 7.0.0 transitivePeerDependencies: - supports-color dev: false - /vite@5.2.8(@types/node@20.11.30): - resolution: {integrity: sha512-OyZR+c1CE8yeHw5V5t59aXsUPPVTHMDjEZz8MgguLL/Q7NblxhZUlTu9xSPqlsUO/y+X7dlU05jdhvyycD55DA==} + /vite@5.2.6(@types/node@20.11.30): + resolution: {integrity: sha512-FPtnxFlSIKYjZ2eosBQamz4CbyrTizbZ3hnGJlh/wMtCrlp1Hah6AzBLjGI5I2urTfNnpovpHdrL6YRuBOPnCA==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: @@ -9290,7 +9300,7 @@ packages: '@types/node': 20.11.30 esbuild: 0.20.2 postcss: 8.4.38 - rollup: 4.14.2 + rollup: 4.14.0 optionalDependencies: fsevents: 2.3.3 @@ -9548,7 +9558,6 @@ packages: /workbox-google-analytics@7.0.0: resolution: {integrity: sha512-MEYM1JTn/qiC3DbpvP2BVhyIH+dV/5BjHk756u9VbwuAhu0QHyKscTnisQuz21lfRpOwiS9z4XdqeVAKol0bzg==} - deprecated: It is not compatible with newer versions of GA starting with v4, as long as you are using GAv3 it should be ok, but the package is not longer being maintained dependencies: workbox-background-sync: 7.0.0 workbox-core: 7.0.0 @@ -9760,3 +9769,12 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} dev: true + + /yup@1.4.0: + resolution: {integrity: sha512-wPbgkJRCqIf+OHyiTBQoJiP5PFuAXaWiJK6AmYkzQAh5/c2K9hzSApBZG5wV9KoKSePF7sAxmNSvh/13YHkFDg==} + dependencies: + property-expr: 2.0.6 + tiny-case: 1.0.3 + toposort: 2.0.2 + type-fest: 2.19.0 + dev: false diff --git a/frontend/src/constants/fileConfig.ts b/frontend/src/constants/fileConfig.ts index 459e33cdff..faa29d14c7 100644 --- a/frontend/src/constants/fileConfig.ts +++ b/frontend/src/constants/fileConfig.ts @@ -1,4 +1,4 @@ -import { SortType } from '@src/containers/ConfigStep/DateRangePicker/DateRangePickerGroup'; +import { SortType } from '@src/containers/ConfigStep/DateRangePicker/types'; import { CALENDAR, REWORK_TIME_LIST } from '@src/constants/resources'; import { IReworkConfig } from '@src/context/Metrics/metricsSlice'; diff --git a/frontend/src/constants/resources.ts b/frontend/src/constants/resources.ts index 5a06599746..b805715ce6 100644 --- a/frontend/src/constants/resources.ts +++ b/frontend/src/constants/resources.ts @@ -257,10 +257,6 @@ export enum REPORT_SUFFIX_UNITS { export const MESSAGE = { VERIFY_FAILED_ERROR: 'verify failed', - VERIFY_MAIL_FAILED_ERROR: 'Email is incorrect!', - VERIFY_TOKEN_FAILED_ERROR: 'Token is invalid, please change your token with correct access permission!', - VERIFY_SITE_FAILED_ERROR: 'Site is incorrect!', - VERIFY_BOARD_FAILED_ERROR: 'Board Id is incorrect!', UNKNOWN_ERROR: 'Unknown', GET_STEPS_FAILED: 'Failed to get', HOME_VERIFY_IMPORT_WARNING: 'The content of the imported JSON file is empty. Please confirm carefully', @@ -437,8 +433,6 @@ export const TIME_RANGE_TITLE = 'Time range settings'; export const ADD_TIME_RANGE_BUTTON_TEXT = 'New time range'; export const REMOVE_BUTTON_TEXT = 'Remove'; export const MAX_TIME_RANGE_AMOUNT = 6; -export const START_DATE_INVALID_TEXT = 'Start date is invalid'; -export const END_DATE_INVALID_TEXT = 'End date is invalid'; export enum SORTING_DATE_RANGE_TEXT { DEFAULT = 'Default sort', diff --git a/frontend/src/containers/ConfigStep/BasicInfo/RequiredMetrics/index.tsx b/frontend/src/containers/ConfigStep/BasicInfo/RequiredMetrics/index.tsx index 07f490286d..e75fcacb05 100644 --- a/frontend/src/containers/ConfigStep/BasicInfo/RequiredMetrics/index.tsx +++ b/frontend/src/containers/ConfigStep/BasicInfo/RequiredMetrics/index.tsx @@ -1,10 +1,12 @@ import { Checkbox, FormHelperText, InputLabel, ListItemText, MenuItem, Select, SelectChangeEvent } from '@mui/material'; import { RequireDataSelections } from '@src/containers/ConfigStep/BasicInfo/RequiredMetrics/style'; +import { BASIC_INFO_ERROR_MESSAGE } from '@src/containers/ConfigStep/Form/literal'; import { selectMetrics, updateMetrics } from '@src/context/config/configSlice'; import { useAppDispatch, useAppSelector } from '@src/hooks/useAppDispatch'; +import { METRICS_LITERAL } from '@src/containers/ConfigStep/Form/literal'; import { SELECTED_VALUE_SEPARATOR } from '@src/constants/commons'; +import { Controller, useFormContext } from 'react-hook-form'; import { REQUIRED_DATA } from '@src/constants/resources'; -import { useMemo, useCallback } from 'react'; const ALL = 'All'; const ALL_REQUIRED_DATA = Object.values(REQUIRED_DATA) as string[]; @@ -12,50 +14,55 @@ const ALL_REQUIRED_DATA = Object.values(REQUIRED_DATA) as string[]; export const RequiredMetrics = () => { const dispatch = useAppDispatch(); const metrics = useAppSelector(selectMetrics); - - const isEveryOptionsSelected = useCallback( - (options: string[]) => ALL_REQUIRED_DATA.every((metric) => options.includes(metric)), - [], - ); - - const isAllSelected = useMemo(() => isEveryOptionsSelected(metrics), [isEveryOptionsSelected, metrics]); - - const isClickedAll = (options: string[]) => isEveryOptionsSelected(options) || options[options.length - 1] === ALL; - - const onChange = ({ target: { value: selectedOptions } }: SelectChangeEvent) => { - const nextSelectedOptions = isClickedAll(selectedOptions as string[]) - ? isAllSelected - ? [] - : ALL_REQUIRED_DATA - : selectedOptions; - dispatch(updateMetrics(nextSelectedOptions)); - }; - + const { control } = useFormContext(); const onRender = (selected: string[]) => selected.join(SELECTED_VALUE_SEPARATOR); return ( <> Required metrics - - {metrics.length === 0 && Metrics is required} + { + const isEveryOptionsSelected = ALL_REQUIRED_DATA.every((metric) => field.value.includes(metric)); + const onChange = ({ target: { value: selectedOptions } }: SelectChangeEvent) => { + const isClickingAll = selectedOptions[selectedOptions.length - 1] === ALL; + const nextSelectedOptions = isClickingAll + ? isEveryOptionsSelected + ? [] + : ALL_REQUIRED_DATA + : selectedOptions; + field.onChange(nextSelectedOptions); + dispatch(updateMetrics(nextSelectedOptions)); + }; + return ( + <> + + {field.value.length === 0 && ( + {BASIC_INFO_ERROR_MESSAGE.metrics.required} + )} + + ); + }} + /> ); diff --git a/frontend/src/containers/ConfigStep/BasicInfo/index.tsx b/frontend/src/containers/ConfigStep/BasicInfo/index.tsx index d1ad2bee12..e5b6f3191a 100644 --- a/frontend/src/containers/ConfigStep/BasicInfo/index.tsx +++ b/frontend/src/containers/ConfigStep/BasicInfo/index.tsx @@ -1,59 +1,69 @@ -import { - selectCalendarType, - selectProjectName, - selectWarningMessage, - updateCalendarType, - updateProjectName, -} from '@src/context/config/configSlice'; +import { selectWarningMessage, updateCalendarType, updateProjectName } from '@src/context/config/configSlice'; import { CollectionDateLabel, ProjectNameInput, StyledFormControlLabel } from './style'; import { RequiredMetrics } from '@src/containers/ConfigStep/BasicInfo/RequiredMetrics'; import { DateRangePickerSection } from '@src/containers/ConfigStep/DateRangePicker'; +import { BASIC_INFO_ERROR_MESSAGE } from '@src/containers/ConfigStep/Form/literal'; import { WarningNotification } from '@src/components/Common/WarningNotification'; import { ConfigSectionContainer } from '@src/components/Common/ConfigForms'; import { useAppDispatch, useAppSelector } from '@src/hooks/useAppDispatch'; import { ConfigSelectionTitle } from '@src/containers/MetricsStep/style'; -import { DEFAULT_HELPER_TEXT } from '@src/constants/commons'; +import { Controller, useFormContext } from 'react-hook-form'; import { CALENDAR } from '@src/constants/resources'; import { Radio, RadioGroup } from '@mui/material'; -import { useState } from 'react'; const BasicInfo = () => { const dispatch = useAppDispatch(); - const projectName = useAppSelector(selectProjectName); - const calendarType = useAppSelector(selectCalendarType); const warningMessage = useAppSelector(selectWarningMessage); - const [isEmptyProjectName, setIsEmptyProjectName] = useState(false); + const { setError, control } = useFormContext(); return ( <> {warningMessage && } Basic information - { - setIsEmptyProjectName(e.target.value === ''); - }} - onChange={(e) => { - dispatch(updateProjectName(e.target.value)); - setIsEmptyProjectName(e.target.value === ''); - }} - error={isEmptyProjectName} - helperText={isEmptyProjectName ? 'Project name is required' : DEFAULT_HELPER_TEXT} + ( + { + dispatch(updateProjectName(e.target.value)); + field.onChange(e.target.value); + }} + onFocus={() => { + if (field.value === '') { + setError('projectName', { message: BASIC_INFO_ERROR_MESSAGE.projectName.required }); + } + }} + error={fieldState.invalid} + helperText={fieldState.error?.message || ''} + /> + )} /> + Collection Date - { - dispatch(updateCalendarType(e.target.value)); + { + return ( + { + field.onChange(e.target.value); + dispatch(updateCalendarType(e.target.value)); + }} + > + } label={CALENDAR.REGULAR} /> + } label={CALENDAR.CHINA} /> + + ); }} - > - } label={CALENDAR.REGULAR} /> - } label={CALENDAR.CHINA} /> - + /> diff --git a/frontend/src/containers/ConfigStep/Board/FormTextField.tsx b/frontend/src/containers/ConfigStep/Board/FormTextField.tsx new file mode 100644 index 0000000000..fd5213c026 --- /dev/null +++ b/frontend/src/containers/ConfigStep/Board/FormTextField.tsx @@ -0,0 +1,66 @@ +import { BOARD_CONFIG_ERROR_MESSAGE } from '@src/containers/ConfigStep/Form/literal'; +import { IBoardConfigData } from '@src/containers/ConfigStep/Form/schema'; +import { TBoardFieldKeys } from '@src/containers/ConfigStep/Form/type'; +import { StyledTextField } from '@src/components/Common/ConfigForms'; +import { updateBoard } from '@src/context/config/configSlice'; +import { Controller, useFormContext } from 'react-hook-form'; +import { useAppDispatch } from '@src/hooks/useAppDispatch'; +import { KEYS } from '@src/hooks/useVerifyBoardEffect'; +interface IFormTextField { + name: Exclude; + col: number; + label: string; +} + +export const FormTextField = ({ name, col, label }: IFormTextField) => { + const dispatch = useAppDispatch(); + const { + control, + setError, + reset, + formState: { isSubmitSuccessful }, + getValues, + } = useFormContext(); + return ( + { + return ( + { + if (field.value === '') { + setError(name, { message: BOARD_CONFIG_ERROR_MESSAGE[name].required }); + } + }} + onChange={(e) => { + if (isSubmitSuccessful) { + reset(undefined, { keepValues: true, keepErrors: true }); + } + const values = getValues() as IBoardConfigData; + const boardConfig: IBoardConfigData = { + ...values, + [name]: e.target.value, + }; + dispatch(updateBoard(boardConfig)); + field.onChange(e.target.value); + }} + error={fieldState.invalid && fieldState.error?.message !== BOARD_CONFIG_ERROR_MESSAGE.token.timeout} + helperText={ + fieldState.error?.message && fieldState.error?.message !== BOARD_CONFIG_ERROR_MESSAGE.token.timeout + ? fieldState.error?.message + : '' + } + sx={{ gridColumn: `span ${col}` }} + /> + ); + }} + /> + ); +}; diff --git a/frontend/src/containers/ConfigStep/Board/index.tsx b/frontend/src/containers/ConfigStep/Board/index.tsx index ff3406aefc..d3923b9f1b 100644 --- a/frontend/src/containers/ConfigStep/Board/index.tsx +++ b/frontend/src/containers/ConfigStep/Board/index.tsx @@ -1,93 +1,55 @@ -import { - ConfigSectionContainer, - StyledForm, - StyledTextField, - StyledTypeSelections, -} from '@src/components/Common/ConfigForms'; -import { updateShouldGetBoardConfig } from '@src/context/Metrics/metricsSlice'; -import { KEYS, useVerifyBoardEffect } from '@src/hooks/useVerifyBoardEffect'; +import { ConfigSectionContainer, StyledForm } from '@src/components/Common/ConfigForms'; +import { BOARD_CONFIG_ERROR_MESSAGE } from '@src/containers/ConfigStep/Form/literal'; +import { FIELD_KEY, useVerifyBoardEffect } from '@src/hooks/useVerifyBoardEffect'; +import { FormTextField } from '@src/containers/ConfigStep/Board/FormTextField'; +import { FormSingleSelect } from '@src/containers/ConfigStep/Form/FormSelect'; import { ConfigButtonGrop } from '@src/containers/ConfigStep/ConfigButton'; -import { useAppSelector, useAppDispatch } from '@src/hooks/useAppDispatch'; -import { InputLabel, ListItemText, MenuItem, Select } from '@mui/material'; import { ConfigSelectionTitle } from '@src/containers/MetricsStep/style'; -import { selectIsBoardVerified } from '@src/context/config/configSlice'; import { TimeoutAlert } from '@src/containers/ConfigStep/TimeoutAlert'; import { StyledAlterWrapper } from '@src/containers/ConfigStep/style'; -import { BOARD_TYPES, CONFIG_TITLE } from '@src/constants/resources'; +import { CONFIG_TITLE, BOARD_TYPES } from '@src/constants/resources'; import { Loading } from '@src/components/Loading'; -import { FormEvent, useMemo } from 'react'; +import { useFormContext } from 'react-hook-form'; + export const Board = () => { - const dispatch = useAppDispatch(); - const isVerified = useAppSelector(selectIsBoardVerified); + const { verifyJira, isLoading, fields, resetFields } = useVerifyBoardEffect(); const { - verifyJira, - isLoading, - fields, - updateField, - isShowAlert, - setIsShowAlert, - validateField, - resetFields, - isVerifyTimeOut, - } = useVerifyBoardEffect(); - - const onSubmit = async (e: FormEvent) => { - e.preventDefault(); - await verifyJira(); - dispatch(updateShouldGetBoardConfig(true)); - }; + clearErrors, + formState: { isValid, isSubmitSuccessful, errors }, + handleSubmit, + } = useFormContext(); + const isVerifyTimeOut = errors.token?.message === BOARD_CONFIG_ERROR_MESSAGE.token.timeout; + const isVerified = isValid && isSubmitSuccessful; - const isDisableVerifyButton = useMemo( - () => isLoading || fields.some((field) => !field.value || field.validatedError || field.verifiedError), - [fields, isLoading], - ); + const onSubmit = async () => await verifyJira(); + const closeTimeoutAlert = () => clearErrors(fields[FIELD_KEY.TOKEN].key); return ( {isLoading && } {CONFIG_TITLE.BOARD} - + - - {fields.map(({ key, value, validatedError, verifiedError, col }, index) => - !index ? ( - - Board - - - ) : ( - validateField(key)} - onChange={(e) => updateField(key, e.target.value)} - error={!!validatedError || !!verifiedError} - type={key === KEYS.TOKEN ? 'password' : 'text'} - helperText={validatedError || verifiedError} - sx={{ gridColumn: `span ${col}` }} + + {fields.map(({ key, col, label }) => + key === 'type' ? ( + + ) : ( + ), )} diff --git a/frontend/src/containers/ConfigStep/DateRangePicker/DateRangePicker.tsx b/frontend/src/containers/ConfigStep/DateRangePicker/DateRangePicker.tsx index 418d94d22a..9dae32ca9b 100644 --- a/frontend/src/containers/ConfigStep/DateRangePicker/DateRangePicker.tsx +++ b/frontend/src/containers/ConfigStep/DateRangePicker/DateRangePicker.tsx @@ -4,30 +4,36 @@ import { StyledDateRangePicker, RemoveButton, } from '@src/containers/ConfigStep/DateRangePicker/style'; -import { - DEFAULT_SPRINT_INTERVAL_OFFSET_DAYS, - REMOVE_BUTTON_TEXT, - DATE_RANGE_FORMAT, - START_DATE_INVALID_TEXT, - END_DATE_INVALID_TEXT, -} from '@src/constants/resources'; +import { DEFAULT_SPRINT_INTERVAL_OFFSET_DAYS, REMOVE_BUTTON_TEXT, DATE_RANGE_FORMAT } from '@src/constants/resources'; import { isDateDisabled, calculateLastAvailableDate } from '@src/containers/ConfigStep/DateRangePicker/validation'; +import { BASIC_INFO_ERROR_MESSAGE, AGGREGATED_DATE_ERROR_REASON } from '@src/containers/ConfigStep/Form/literal'; import { IRangePickerProps } from '@src/containers/ConfigStep/DateRangePicker/types'; import CalendarTodayIcon from '@mui/icons-material/CalendarToday'; import { DateValidationError } from '@mui/x-date-pickers'; import { TextField, TextFieldProps } from '@mui/material'; import { Z_INDEX } from '@src/constants/commons'; +import { useFormContext } from 'react-hook-form'; import { Nullable } from '@src/utils/types'; import dayjs, { Dayjs } from 'dayjs'; import isNull from 'lodash/isNull'; -const HelperTextForStartDate = (props: TextFieldProps) => ( - -); +const HelperTextForStartDate = (props: TextFieldProps) => { + const isBlank = props.value === null || props.value === ''; + const isError = props.error || isBlank; + const helperText = isBlank + ? BASIC_INFO_ERROR_MESSAGE.dateRange.startDate.required + : BASIC_INFO_ERROR_MESSAGE.dateRange.startDate.invalid; + return ; +}; -const HelperTextForEndDate = (props: TextFieldProps) => ( - -); +const HelperTextForEndDate = (props: TextFieldProps) => { + const isBlank = props.value === null || props.value === ''; + const isError = props.error || isBlank; + const helperText = isBlank + ? BASIC_INFO_ERROR_MESSAGE.dateRange.endDate.required + : BASIC_INFO_ERROR_MESSAGE.dateRange.endDate.invalid; + return ; +}; export const DateRangePicker = ({ startDate, @@ -42,6 +48,9 @@ export const DateRangePicker = ({ const dateRangeGroupExcludeSelf = rangeList!.filter(({ sortIndex }: { sortIndex: number }) => sortIndex !== index); const shouldStartDateDisableDate = isDateDisabled.bind(null, dateRangeGroupExcludeSelf); const shouldEndDateDisableDate = isDateDisabled.bind(null, dateRangeGroupExcludeSelf); + const startDateFieldName = `dateRange[${index}].startDate`; + const endDateFieldName = `dateRange[${index}].endDate`; + const { setValue } = useFormContext(); const changeStartDate = (value: Nullable, { validationError }: { validationError: DateValidationError }) => { let daysAddToEndDate = DEFAULT_SPRINT_INTERVAL_OFFSET_DAYS; @@ -64,7 +73,18 @@ export const DateRangePicker = ({ startDate: value.startOf('date').format(DATE_RANGE_FORMAT), endDate: value.endOf('date').add(daysAddToEndDate, 'day').format(DATE_RANGE_FORMAT), }; - isNull(validationError) ? onChange?.(result, index) : onError?.('startDateError', validationError, index); + + if (isNull(validationError)) { + if (isNull(value)) { + onError?.('startDateError', BASIC_INFO_ERROR_MESSAGE.dateRange.startDate.required, index); + } + setValue(startDateFieldName, result.startDate, { shouldValidate: true }); + setValue(endDateFieldName, result.endDate, { shouldValidate: true }); + onChange?.(result, index); + } else { + setValue(startDateFieldName, AGGREGATED_DATE_ERROR_REASON, { shouldValidate: true }); + onError?.('startDateError', validationError, index); + } }; const changeEndDate = (value: Nullable, { validationError }: { validationError: DateValidationError }) => { @@ -78,7 +98,17 @@ export const DateRangePicker = ({ endDate: value.endOf('date').format(DATE_RANGE_FORMAT), }; - isNull(validationError) ? onChange?.(result, index) : onError?.('endDateError', validationError, index); + if (isNull(validationError)) { + if (isNull(value)) { + onError?.('endDateError', BASIC_INFO_ERROR_MESSAGE.dateRange.endDate.required, index); + } + setValue(startDateFieldName, result.startDate, { shouldValidate: true }); + setValue(endDateFieldName, result.endDate, { shouldValidate: true }); + onChange?.(result, index); + } else { + setValue(endDateFieldName, AGGREGATED_DATE_ERROR_REASON, { shouldValidate: true }); + onError?.('endDateError', validationError, index); + } }; const removeSelfHandler = () => { @@ -91,15 +121,15 @@ export const DateRangePicker = ({ onError?.('startDateError', err, index)} slots={{ openPickerIcon: CalendarTodayIcon, textField: HelperTextForStartDate, }} slotProps={{ + textField: { required: true }, popper: { sx: { zIndex: Z_INDEX.DROPDOWN }, }, @@ -107,18 +137,18 @@ export const DateRangePicker = ({ /> onError?.('endDateError', err, index)} slots={{ openPickerIcon: CalendarTodayIcon, textField: HelperTextForEndDate, }} slotProps={{ + textField: { required: true }, popper: { sx: { zIndex: Z_INDEX.DROPDOWN }, }, diff --git a/frontend/src/containers/ConfigStep/DateRangePicker/DateRangePickerGroup.tsx b/frontend/src/containers/ConfigStep/DateRangePicker/DateRangePickerGroup.tsx index e52bcadb6e..08dfc6cfe8 100644 --- a/frontend/src/containers/ConfigStep/DateRangePicker/DateRangePickerGroup.tsx +++ b/frontend/src/containers/ConfigStep/DateRangePicker/DateRangePickerGroup.tsx @@ -1,49 +1,35 @@ import { updateShouldGetBoardConfig, updateShouldGetPipelineConfig } from '@src/context/Metrics/metricsSlice'; +import { Props, SortedDateRangeType, sortFn } from '@src/containers/ConfigStep/DateRangePicker/types'; import { DateRangePickerGroupContainer } from '@src/containers/ConfigStep/DateRangePicker/style'; import { DateRangePicker } from '@src/containers/ConfigStep/DateRangePicker/DateRangePicker'; import { ADD_TIME_RANGE_BUTTON_TEXT, MAX_TIME_RANGE_AMOUNT } from '@src/constants/resources'; +import { BASIC_INFO_ERROR_MESSAGE } from '@src/containers/ConfigStep/Form/literal'; import { selectDateRange, updateDateRange } from '@src/context/config/configSlice'; import { LocalizationProvider } from '@mui/x-date-pickers/LocalizationProvider'; import { useAppDispatch, useAppSelector } from '@src/hooks/useAppDispatch'; import { AddButton } from '@src/components/Common/AddButtonOneLine'; import { AdapterDayjs } from '@mui/x-date-pickers/AdapterDayjs'; import { DateValidationError } from '@mui/x-date-pickers'; -import { useState, useEffect } from 'react'; +import { useFormContext } from 'react-hook-form'; +import { Nullable } from '@src/utils/types'; +import { useEffect, useState } from 'react'; import sortBy from 'lodash/sortBy'; import remove from 'lodash/remove'; +import isNull from 'lodash/isNull'; import get from 'lodash/get'; -import dayjs from 'dayjs'; -export enum SortType { - DESCENDING = 'DESCENDING', - ASCENDING = 'ASCENDING', - DEFAULT = 'DEFAULT', -} +const deriveErrorMessageByDate = (date: Nullable, message: string) => (isNull(date) ? message : null); -export type SortedDateRangeType = { - startDate: string | null; - endDate: string | null; - sortIndex: number; - startDateError: DateValidationError | null; - endDateError: DateValidationError | null; -}; - -const sortFn = { - DEFAULT: ({ sortIndex }: SortedDateRangeType) => sortIndex, - DESCENDING: ({ startDate }: SortedDateRangeType) => -dayjs(startDate).unix(), - ASCENDING: ({ startDate }: SortedDateRangeType) => dayjs(startDate).unix(), -}; - -type Props = { - sortType: SortType; - onChange?: (data: SortedDateRangeType[]) => void; - onError?: (data: SortedDateRangeType[]) => void; -}; - -const fillDateRangeGroup = (item: T, index: number) => ({ +const fillDateRangeGroup = ( + item: { + startDate: string | null; + endDate: string | null; + }, + index: number, +) => ({ ...item, - startDateError: null, - endDateError: null, + startDateError: deriveErrorMessageByDate(item.startDate, BASIC_INFO_ERROR_MESSAGE.dateRange.startDate.required), + endDateError: deriveErrorMessageByDate(item.endDate, BASIC_INFO_ERROR_MESSAGE.dateRange.endDate.required), sortIndex: index, }); @@ -54,16 +40,18 @@ export const DateRangePickerGroup = ({ sortType, onError }: Props) => { const [sortedDateRangeList, setSortedDateRangeList] = useState( dateRangeGroup.map(fillDateRangeGroup), ); + const { setValue } = useFormContext(); useEffect(() => { - const errors = sortedDateRangeList.filter(({ startDateError, endDateError }) => startDateError || endDateError); - onError?.(errors); + const rangeListWithErrors = sortedDateRangeList.filter( + ({ startDateError, endDateError }) => startDateError || endDateError, + ); + onError?.(rangeListWithErrors); }, [onError, sortedDateRangeList]); - const handleError = (type: string, error: DateValidationError, index: number) => { - setSortedDateRangeList( - sortedDateRangeList.map((item) => ({ ...item, [type]: item.sortIndex === index ? error : null })), - ); + const handleError = (type: string, error: DateValidationError | string, index: number) => { + const newList = sortedDateRangeList.map((item) => ({ ...item, [type]: item.sortIndex === index ? error : null })); + setSortedDateRangeList(newList); }; const dispatchUpdateConfig = () => { @@ -74,6 +62,11 @@ export const DateRangePickerGroup = ({ sortType, onError }: Props) => { const addRangeHandler = () => { const result = [...sortedDateRangeList, { startDate: null, endDate: null }]; setSortedDateRangeList(result.map(fillDateRangeGroup)); + setValue( + `dateRange`, + result.map(({ startDate, endDate }) => ({ startDate, endDate })), + { shouldValidate: true }, + ); dispatch(updateDateRange(result.map(({ startDate, endDate }) => ({ startDate, endDate })))); }; @@ -82,7 +75,15 @@ export const DateRangePickerGroup = ({ sortType, onError }: Props) => { index: number, ) => { const result = sortedDateRangeList.map((item) => - item.sortIndex === index ? { ...item, startDate, endDate, startDateError: null, endDateError: null } : item, + item.sortIndex === index + ? { + ...item, + startDate, + endDate, + startDateError: deriveErrorMessageByDate(startDate, BASIC_INFO_ERROR_MESSAGE.dateRange.startDate.required), + endDateError: deriveErrorMessageByDate(endDate, BASIC_INFO_ERROR_MESSAGE.dateRange.endDate.required), + } + : item, ); setSortedDateRangeList(result); dispatchUpdateConfig(); @@ -92,6 +93,11 @@ export const DateRangePickerGroup = ({ sortType, onError }: Props) => { const handleRemove = (index: number) => { const result = [...sortedDateRangeList]; remove(result, ({ sortIndex }) => sortIndex === index); + setValue( + `dateRange`, + result.map(({ startDate, endDate }) => ({ startDate, endDate })), + { shouldValidate: true }, + ); setSortedDateRangeList(result); dispatchUpdateConfig(); dispatch(updateDateRange(result.map(({ startDate, endDate }) => ({ startDate, endDate })))); diff --git a/frontend/src/containers/ConfigStep/DateRangePicker/SortingDateRange.tsx b/frontend/src/containers/ConfigStep/DateRangePicker/SortingDateRange.tsx index 8caacc973d..3166967ce0 100644 --- a/frontend/src/containers/ConfigStep/DateRangePicker/SortingDateRange.tsx +++ b/frontend/src/containers/ConfigStep/DateRangePicker/SortingDateRange.tsx @@ -5,7 +5,7 @@ import { SortingButtoningContainer, SortingTextButton, } from '@src/containers/ConfigStep/DateRangePicker/style'; -import { SortType } from '@src/containers/ConfigStep/DateRangePicker/DateRangePickerGroup'; +import { SortType } from '@src/containers/ConfigStep/DateRangePicker/types'; import { updateDateRangeSortType } from '@src/context/config/configSlice'; import { SORTING_DATE_RANGE_TEXT } from '@src/constants/resources'; import { ArrowDropDown, ArrowDropUp } from '@mui/icons-material'; diff --git a/frontend/src/containers/ConfigStep/DateRangePicker/index.tsx b/frontend/src/containers/ConfigStep/DateRangePicker/index.tsx index 59cf8758a5..c569792c4f 100644 --- a/frontend/src/containers/ConfigStep/DateRangePicker/index.tsx +++ b/frontend/src/containers/ConfigStep/DateRangePicker/index.tsx @@ -1,5 +1,5 @@ -import { DateRangePickerGroup, SortType } from '@src/containers/ConfigStep/DateRangePicker/DateRangePickerGroup'; -import { SortedDateRangeType } from '@src/containers/ConfigStep/DateRangePicker/DateRangePickerGroup'; +import { DateRangePickerGroup } from '@src/containers/ConfigStep/DateRangePicker/DateRangePickerGroup'; +import { SortedDateRangeType, SortType } from '@src/containers/ConfigStep/DateRangePicker/types'; import { SortingDateRange } from '@src/containers/ConfigStep/DateRangePicker/SortingDateRange'; import { selectDateRange, selectDateRangeSortType } from '@src/context/config/configSlice'; import SectionTitleWithTooltip from '@src/components/Common/SectionTitleWithTooltip'; @@ -11,9 +11,7 @@ import { useMemo, useState } from 'react'; export const DateRangePickerSection = () => { const dateRangeGroup = useAppSelector(selectDateRange); const dateRangeGroupSortType = useAppSelector(selectDateRangeSortType); - const [sortType, setSortType] = useState( - dateRangeGroupSortType ? dateRangeGroupSortType : SortType.DEFAULT, - ); + const [sortType, setSortType] = useState(dateRangeGroupSortType); const [hasError, setHasError] = useState(false); const isDateRangeValid = useMemo(() => { diff --git a/frontend/src/containers/ConfigStep/DateRangePicker/types.ts b/frontend/src/containers/ConfigStep/DateRangePicker/types.ts index edac53cfae..31bad4a649 100644 --- a/frontend/src/containers/ConfigStep/DateRangePicker/types.ts +++ b/frontend/src/containers/ConfigStep/DateRangePicker/types.ts @@ -1,13 +1,38 @@ -import { SortedDateRangeType } from '@src/containers/ConfigStep/DateRangePicker/DateRangePickerGroup'; import { DateValidationError } from '@mui/x-date-pickers'; +import dayjs from 'dayjs'; + +export type SortedDateRangeType = { + startDate: string | null; + endDate: string | null; + sortIndex: number; + startDateError: DateValidationError | string | null; + endDateError: DateValidationError | string | null; +}; export interface IRangePickerProps { startDate: string | null; endDate: string | null; index: number; key?: string | number; - onError?: (type: string, error: DateValidationError, index: number) => void; + onError?: (type: string, error: DateValidationError | string, index: number) => void; onChange?: (data: { startDate: string | null; endDate: string | null }, index: number) => void; onRemove?: (index: number) => void; rangeList?: SortedDateRangeType[]; } + +export enum SortType { + DESCENDING = 'DESCENDING', + ASCENDING = 'ASCENDING', + DEFAULT = 'DEFAULT', +} + +export const sortFn = { + DEFAULT: ({ sortIndex }: SortedDateRangeType) => sortIndex, + DESCENDING: ({ startDate }: SortedDateRangeType) => -dayjs(startDate).unix(), + ASCENDING: ({ startDate }: SortedDateRangeType) => dayjs(startDate).unix(), +}; +export type Props = { + sortType: SortType; + onChange?: (data: SortedDateRangeType[]) => void; + onError?: (data: SortedDateRangeType[]) => void; +}; diff --git a/frontend/src/containers/ConfigStep/Form/FormSelect.tsx b/frontend/src/containers/ConfigStep/Form/FormSelect.tsx new file mode 100644 index 0000000000..1762a3ccab --- /dev/null +++ b/frontend/src/containers/ConfigStep/Form/FormSelect.tsx @@ -0,0 +1,43 @@ +import { InputLabel, ListItemText, MenuItem, Select } from '@mui/material'; +import { StyledTypeSelections } from '@src/components/Common/ConfigForms'; +import { Controller, useFormContext } from 'react-hook-form'; + +interface IFormSingleSelect { + name: string; + options: string[]; + labelText: string; + labelId?: string; + selectLabelId?: string; + selectAriaLabel?: string; +} + +export const FormSingleSelect = ({ + name, + options, + labelText, + labelId, + selectLabelId, + selectAriaLabel, +}: IFormSingleSelect) => { + const { control } = useFormContext(); + return ( + { + return ( + + {labelText} + + + ); + }} + /> + ); +}; diff --git a/frontend/src/containers/ConfigStep/Form/literal.ts b/frontend/src/containers/ConfigStep/Form/literal.ts new file mode 100644 index 0000000000..b2ac5423c5 --- /dev/null +++ b/frontend/src/containers/ConfigStep/Form/literal.ts @@ -0,0 +1,81 @@ +import { + IBasicInfoErrorMessage, + IBoardConfigErrorMessage, + IPipelineToolErrorMessage, + ISourceControlErrorMessage, +} from '@src/containers/ConfigStep/Form/type'; + +export const AGGREGATED_DATE_ERROR_REASON = 'Invalid date'; +export const CALENDAR_TYPE_LITERAL = ['Regular Calendar(Weekend Considered)', 'Calendar with Chinese Holiday']; +export const METRICS_LITERAL = [ + 'Velocity', + 'Cycle time', + 'Classification', + 'Rework times', + 'Lead time for changes', + 'Deployment frequency', + 'Dev change failure rate', + 'Dev mean time to recovery', +]; +export const BOARD_TYPE_LITERAL = ['Jira']; +export const PIPELINE_TOOL_TYPE_LITERAL = ['BuildKite']; +export const SOURCE_CONTROL_TYPE_LITERAL = ['GitHub']; + +export const BASIC_INFO_ERROR_MESSAGE: IBasicInfoErrorMessage = { + projectName: { + required: 'Project name is required', + }, + metrics: { + required: 'Metrics is required', + }, + dateRange: { + startDate: { + required: 'Start date is required', + invalid: 'Start date is invalid', + }, + endDate: { + required: 'End date is required', + invalid: 'End date is invalid', + }, + }, +}; +export const BOARD_CONFIG_ERROR_MESSAGE: IBoardConfigErrorMessage = { + boardId: { + required: 'Board Id is required!', + invalid: 'Board Id is invalid!', + verifyFailed: 'Board Id is incorrect!', + }, + email: { + required: 'Email is required!', + invalid: 'Email is invalid!', + verifyFailed: 'Email is incorrect!', + }, + site: { + required: 'Site is required!', + verifyFailed: 'Site is incorrect!', + }, + token: { + required: 'Token is required!', + invalid: 'Token is invalid!', + verifyFailed: 'Token is invalid, please change your token with correct access permission!', + timeout: 'Timeout!', + }, +}; +export const PIPELINE_TOOL_ERROR_MESSAGE: IPipelineToolErrorMessage = { + token: { + required: 'Token is required!', + invalid: 'Token is invalid!', + unauthorized: 'Token is incorrect!', + forbidden: 'Forbidden request, please change your token with correct access permission.', + timeout: 'Timeout!', + }, +}; + +export const SOURCE_CONTROL_ERROR_MESSAGE: ISourceControlErrorMessage = { + token: { + required: 'Token is required!', + invalid: 'Token is invalid!', + unauthorized: 'Token is incorrect!', + timeout: 'Timeout!', + }, +}; diff --git a/frontend/src/containers/ConfigStep/Form/schema.ts b/frontend/src/containers/ConfigStep/Form/schema.ts new file mode 100644 index 0000000000..39fa622797 --- /dev/null +++ b/frontend/src/containers/ConfigStep/Form/schema.ts @@ -0,0 +1,101 @@ +import { + CALENDAR_TYPE_LITERAL, + METRICS_LITERAL, + BOARD_TYPE_LITERAL, + PIPELINE_TOOL_TYPE_LITERAL, + SOURCE_CONTROL_TYPE_LITERAL, + BASIC_INFO_ERROR_MESSAGE, + BOARD_CONFIG_ERROR_MESSAGE, + PIPELINE_TOOL_ERROR_MESSAGE, + SOURCE_CONTROL_ERROR_MESSAGE, + AGGREGATED_DATE_ERROR_REASON, +} from '@src/containers/ConfigStep/Form/literal'; +import { object, string, mixed, InferType, array } from 'yup'; +import { REGEX } from '@src/constants/regex'; + +export const basicInfoSchema = object().shape({ + projectName: string().required(BASIC_INFO_ERROR_MESSAGE.projectName.required), + dateRange: array() + .of( + object().shape({ + startDate: string() + .nullable() + .test({ + name: 'CustomStartDateValidation', + test: function (value, context) { + if (value === null) { + return this.createError({ + path: context.path, + message: BASIC_INFO_ERROR_MESSAGE.dateRange.startDate.required, + }); + } + if (value === AGGREGATED_DATE_ERROR_REASON) { + return this.createError({ + path: context.path, + message: BASIC_INFO_ERROR_MESSAGE.dateRange.startDate.invalid, + }); + } else { + return true; + } + }, + }), + endDate: string() + .nullable() + .test({ + name: 'CustomEndDateValidation', + test: function (value, context) { + if (value === null) { + return this.createError({ + path: context.path, + message: BASIC_INFO_ERROR_MESSAGE.dateRange.endDate.required, + }); + } + if (value === AGGREGATED_DATE_ERROR_REASON) { + return this.createError({ + path: context.path, + message: BASIC_INFO_ERROR_MESSAGE.dateRange.endDate.invalid, + }); + } else { + return true; + } + }, + }), + }), + ) + .required(), + calendarType: mixed().oneOf(CALENDAR_TYPE_LITERAL), + metrics: array().of(mixed().oneOf(METRICS_LITERAL)).min(1, BASIC_INFO_ERROR_MESSAGE.metrics.required), +}); + +export const boardConfigSchema = object().shape({ + type: mixed().oneOf(BOARD_TYPE_LITERAL), + boardId: string() + .required(BOARD_CONFIG_ERROR_MESSAGE.boardId.required) + .matches(REGEX.BOARD_ID, { message: BOARD_CONFIG_ERROR_MESSAGE.boardId.invalid }), + email: string() + .required(BOARD_CONFIG_ERROR_MESSAGE.email.required) + .matches(REGEX.EMAIL, { message: BOARD_CONFIG_ERROR_MESSAGE.email.invalid }), + site: string().required(BOARD_CONFIG_ERROR_MESSAGE.site.required), + token: string() + .required(BOARD_CONFIG_ERROR_MESSAGE.token.invalid) + .matches(REGEX.BOARD_TOKEN, { message: BOARD_CONFIG_ERROR_MESSAGE.token.invalid }), +}); + +export const pipelineToolSchema = object().shape({ + type: mixed().oneOf(PIPELINE_TOOL_TYPE_LITERAL), + token: string() + .required(PIPELINE_TOOL_ERROR_MESSAGE.token.required) + .matches(REGEX.BUILDKITE_TOKEN, { message: PIPELINE_TOOL_ERROR_MESSAGE.token.invalid }), +}); + +export const sourceControlSchema = object().shape({ + type: mixed().oneOf(SOURCE_CONTROL_TYPE_LITERAL), + token: string() + .required(SOURCE_CONTROL_ERROR_MESSAGE.token.required) + .matches(REGEX.GITHUB_TOKEN, { message: SOURCE_CONTROL_ERROR_MESSAGE.token.invalid }), +}); + +export type IBasicInfoData = InferType; +export type IBoardConfigData = InferType; +export type IPipelineToolData = InferType; +export type ISourceControlData = InferType; diff --git a/frontend/src/containers/ConfigStep/Form/type.ts b/frontend/src/containers/ConfigStep/Form/type.ts new file mode 100644 index 0000000000..e315cb7094 --- /dev/null +++ b/frontend/src/containers/ConfigStep/Form/type.ts @@ -0,0 +1,69 @@ +export type TBoardFieldKeys = 'type' | 'boardId' | 'email' | 'site' | 'token'; +export type TPipelineToolFieldKeys = 'type' | 'token'; +export type TSourceControlFieldKeys = 'type' | 'token'; +export type TBasicInfoFieldKeys = 'projectName' | 'calendarType' | 'dateRange' | 'metrics'; + +export interface IDateRangeErrorMessage { + startDate: { + required: string; + invalid: string; + }; + endDate: { + required: string; + invalid: string; + }; +} +export interface IBasicInfoErrorMessage + extends Record, Record | IDateRangeErrorMessage> { + projectName: { + required: string; + }; + dateRange: IDateRangeErrorMessage; + metrics: { + required: string; + }; +} +export interface IBoardConfigErrorMessage extends Record, Record> { + boardId: { + required: string; + invalid: string; + verifyFailed: string; + }; + email: { + required: string; + invalid: string; + verifyFailed: string; + }; + site: { + required: string; + verifyFailed: string; + }; + token: { + required: string; + invalid: string; + verifyFailed: string; + timeout: string; + [other: string]: string; + }; +} +export interface IPipelineToolErrorMessage + extends Record, Record> { + token: { + required: string; + invalid: string; + unauthorized: string; + forbidden: string; + timeout: string; + [other: string]: string; + }; +} +export interface ISourceControlErrorMessage + extends Record, Record> { + token: { + required: string; + invalid: string; + unauthorized: string; + timeout: string; + [other: string]: string; + }; +} diff --git a/frontend/src/containers/ConfigStep/Form/useDefaultValues.ts b/frontend/src/containers/ConfigStep/Form/useDefaultValues.ts new file mode 100644 index 0000000000..3bcc57c13a --- /dev/null +++ b/frontend/src/containers/ConfigStep/Form/useDefaultValues.ts @@ -0,0 +1,86 @@ +import { + CALENDAR_TYPE_LITERAL, + BOARD_TYPE_LITERAL, + PIPELINE_TOOL_TYPE_LITERAL, + SOURCE_CONTROL_TYPE_LITERAL, +} from '@src/containers/ConfigStep/Form/literal'; +import { + IBasicInfoData, + IBoardConfigData, + IPipelineToolData, + ISourceControlData, +} from '@src/containers/ConfigStep/Form/schema'; +import { selectBasicInfo, selectBoard, selectPipelineTool, selectSourceControl } from '@src/context/config/configSlice'; +import { SortType } from '@src/containers/ConfigStep/DateRangePicker/types'; +import { useAppSelector } from '@src/hooks/useAppDispatch'; + +export const basicInfoDefaultValues: IBasicInfoData = { + projectName: '', + dateRange: [], + calendarType: CALENDAR_TYPE_LITERAL[0], + metrics: [], +}; + +export const boardConfigDefaultValues: IBoardConfigData = { + type: BOARD_TYPE_LITERAL[0], + boardId: '', + email: '', + site: '', + token: '', +}; + +export const pipelineToolDefaultValues: IPipelineToolData = { + type: PIPELINE_TOOL_TYPE_LITERAL[0], + token: '', +}; + +export const sourceControlDefaultValues: ISourceControlData = { + type: SOURCE_CONTROL_TYPE_LITERAL[0], + token: '', +}; + +export const useDefaultValues = () => { + const basicInfo = useAppSelector(selectBasicInfo); + const boardConfig = useAppSelector(selectBoard); + const pipelineTool = useAppSelector(selectPipelineTool); + const sourceControl = useAppSelector(selectSourceControl); + + const basicInfoWithImport: IBasicInfoData & { sortType: SortType } = { + ...basicInfoDefaultValues, + projectName: basicInfo.projectName, + calendarType: basicInfo.calendarType, + dateRange: basicInfo.dateRange as { startDate: string; endDate: string }[], + metrics: basicInfo.metrics, + sortType: basicInfo.sortType, + }; + + const boardConfigWithImport: IBoardConfigData = { + ...boardConfigDefaultValues, + type: boardConfig.type, + boardId: boardConfig.boardId, + email: boardConfig.email, + site: boardConfig.site, + token: boardConfig.token, + }; + + const pipelineToolWithImport: IPipelineToolData = { + ...pipelineToolDefaultValues, + ...pipelineTool, + }; + + const sourceControlWithImport: ISourceControlData = { + ...sourceControlDefaultValues, + ...sourceControl, + }; + + return { + basicInfoOriginal: basicInfoDefaultValues, + basicInfoWithImport, + boardConfigOriginal: boardConfigDefaultValues, + boardConfigWithImport, + pipelineToolOriginal: pipelineToolDefaultValues, + pipelineToolWithImport, + sourceControlOriginal: sourceControlDefaultValues, + sourceControlWithImport, + }; +}; diff --git a/frontend/src/containers/ConfigStep/MetricsTypeCheckbox/index.tsx b/frontend/src/containers/ConfigStep/MetricsTypeCheckbox/index.tsx deleted file mode 100644 index 789cdc02f6..0000000000 --- a/frontend/src/containers/ConfigStep/MetricsTypeCheckbox/index.tsx +++ /dev/null @@ -1,20 +0,0 @@ -import { SourceControl } from '@src/containers/ConfigStep/SourceControl'; -import { PipelineTool } from '@src/containers/ConfigStep/PipelineTool'; -import { selectConfig } from '@src/context/config/configSlice'; -import { useAppSelector } from '@src/hooks/useAppDispatch'; -import { Board } from '@src/containers/ConfigStep/Board'; - -export const MetricsTypeCheckbox = () => { - const configData = useAppSelector(selectConfig); - const { isShow: isShowBoard } = configData.board; - const { isShow: isShowPipeline } = configData.pipelineTool; - const { isShow: isShowSourceControl } = configData.sourceControl; - - return ( - <> - {isShowBoard && } - {isShowPipeline && } - {isShowSourceControl && } - - ); -}; diff --git a/frontend/src/containers/ConfigStep/PipelineTool/index.tsx b/frontend/src/containers/ConfigStep/PipelineTool/index.tsx index 5ef8da234b..f40e56e9f8 100644 --- a/frontend/src/containers/ConfigStep/PipelineTool/index.tsx +++ b/frontend/src/containers/ConfigStep/PipelineTool/index.tsx @@ -1,168 +1,99 @@ -import { - isPipelineToolVerified, - selectPipelineTool, - updatePipelineTool, - updatePipelineToolVerifyState, -} from '@src/context/config/configSlice'; -import { - ConfigSectionContainer, - StyledForm, - StyledTextField, - StyledTypeSelections, -} from '@src/components/Common/ConfigForms'; -import { CONFIG_TITLE, PIPELINE_TOOL_TYPES, TOKEN_HELPER_TEXT } from '@src/constants/resources'; -import { useVerifyPipelineToolEffect } from '@src/hooks/useVerifyPipelineToolEffect'; -import { updateShouldGetPipelineConfig } from '@src/context/Metrics/metricsSlice'; +import { ConfigSectionContainer, StyledForm, StyledTextField } from '@src/components/Common/ConfigForms'; +import { FIELD_KEY, useVerifyPipelineToolEffect } from '@src/hooks/useVerifyPipelineToolEffect'; +import { PIPELINE_TOOL_ERROR_MESSAGE } from '@src/containers/ConfigStep/Form/literal'; +import { FormSingleSelect } from '@src/containers/ConfigStep/Form/FormSelect'; +import { CONFIG_TITLE, PIPELINE_TOOL_TYPES } from '@src/constants/resources'; import { ConfigButtonGrop } from '@src/containers/ConfigStep/ConfigButton'; -import { useAppDispatch, useAppSelector } from '@src/hooks/useAppDispatch'; -import { DEFAULT_HELPER_TEXT, EMPTY_STRING } from '@src/constants/commons'; -import { InputLabel, ListItemText, MenuItem, Select } from '@mui/material'; +import { IPipelineToolData } from '@src/containers/ConfigStep/Form/schema'; import { ConfigSelectionTitle } from '@src/containers/MetricsStep/style'; import { TimeoutAlert } from '@src/containers/ConfigStep/TimeoutAlert'; import { StyledAlterWrapper } from '@src/containers/ConfigStep/style'; -import { findCaseInsensitiveType } from '@src/utils/util'; -import { FormEvent, useMemo, useState } from 'react'; +import { updatePipelineTool } from '@src/context/config/configSlice'; +import { Controller, useFormContext } from 'react-hook-form'; +import { useAppDispatch } from '@src/hooks/useAppDispatch'; import { Loading } from '@src/components/Loading'; -import { REGEX } from '@src/constants/regex'; - -enum FIELD_KEY { - TYPE = 0, - TOKEN = 1, -} - -const getErrorMessage = (value: string) => { - if (!value) { - return TOKEN_HELPER_TEXT.RequiredTokenText; - } - if (!REGEX.BUILDKITE_TOKEN.test(value.trim())) { - return TOKEN_HELPER_TEXT.InvalidTokenText; - } - return DEFAULT_HELPER_TEXT; -}; export const PipelineTool = () => { const dispatch = useAppDispatch(); - const pipelineToolFields = useAppSelector(selectPipelineTool); - const isVerified = useAppSelector(isPipelineToolVerified); + const { fields, verifyPipelineTool, isLoading, resetFields } = useVerifyPipelineToolEffect(); const { - verifyPipelineTool, - isLoading, - verifiedError, - clearVerifiedError, - isVerifyTimeOut, - isShowAlert, - setIsShowAlert, - } = useVerifyPipelineToolEffect(); - const type = findCaseInsensitiveType(Object.values(PIPELINE_TOOL_TYPES), pipelineToolFields.type); - const [fields, setFields] = useState([ - { - key: 'PipelineTool', - value: type, - validatedError: '', - }, - { - key: 'Token', - value: pipelineToolFields.token, - validatedError: pipelineToolFields.token ? getErrorMessage(pipelineToolFields.token) : '', - }, - ]); - - const handleUpdate = (fields: { key: string; value: string; validatedError: string }[]) => { - clearVerifiedError(); - setFields(fields); - dispatch(updatePipelineToolVerifyState(false)); - dispatch( - updatePipelineTool({ - type: fields[FIELD_KEY.TYPE].value, - token: fields[FIELD_KEY.TOKEN].value, - }), - ); - }; - - const getNewFields = (value: string) => - fields.map((field, index) => - index === FIELD_KEY.TOKEN - ? { - key: field.key, - value: value.trim(), - validatedError: getErrorMessage(value.trim()), - } - : field, - ); - - const onInputUpdate = (value: string) => handleUpdate(getNewFields(value)); - - const onInputFocus = (value: string) => setFields(getNewFields(value)); + control, + setError, + clearErrors, + formState: { isValid, isSubmitSuccessful, errors }, + handleSubmit, + reset, + getValues, + } = useFormContext(); + const isVerifyTimeOut = errors.token?.message === PIPELINE_TOOL_ERROR_MESSAGE.token.timeout; + const isVerified = isValid && isSubmitSuccessful; - const onReset = () => { - const newFields = fields.map(({ key }, index) => ({ - key, - value: index === FIELD_KEY.TYPE ? PIPELINE_TOOL_TYPES.BUILD_KITE : EMPTY_STRING, - validatedError: '', - })); - handleUpdate(newFields); - setIsShowAlert(false); - }; - - const onSubmit = async (e: FormEvent) => { - e.preventDefault(); - await verifyPipelineTool({ - type: fields[FIELD_KEY.TYPE].value, - token: fields[FIELD_KEY.TOKEN].value, - }); - dispatch(updateShouldGetPipelineConfig(true)); - }; - - const isDisableVerifyButton = useMemo( - () => isLoading || fields.some((field) => !field.value || field.validatedError) || !!verifiedError, - [fields, isLoading, verifiedError], - ); + const onSubmit = async () => await verifyPipelineTool(); + const closeTimeoutAlert = () => clearErrors(fields[FIELD_KEY.TOKEN].key); return ( {isLoading && } {CONFIG_TITLE.PIPELINE_TOOL} - + - - - Pipeline Tool - - - onInputFocus(e.target.value)} - onChange={(e) => onInputUpdate(e.target.value)} - error={!!fields[FIELD_KEY.TOKEN].validatedError || !!verifiedError} - helperText={fields[FIELD_KEY.TOKEN].validatedError || verifiedError} + + + { + return ( + { + if (field.value === '') { + setError(fields[FIELD_KEY.TOKEN].key, { + message: PIPELINE_TOOL_ERROR_MESSAGE.token.required, + }); + } + }} + onChange={(e) => { + if (isSubmitSuccessful) { + reset(undefined, { keepValues: true, keepErrors: true }); + } + const pipelineToolConfig: IPipelineToolData = { + ...getValues(), + token: e.target.value, + }; + dispatch(updatePipelineTool(pipelineToolConfig)); + field.onChange(e.target.value); + }} + error={fieldState.invalid && fieldState.error?.message !== PIPELINE_TOOL_ERROR_MESSAGE.token.timeout} + helperText={ + fieldState.error?.message && fieldState.error?.message !== PIPELINE_TOOL_ERROR_MESSAGE.token.timeout + ? fieldState.error?.message + : '' + } + /> + ); + }} /> diff --git a/frontend/src/containers/ConfigStep/SourceControl/index.tsx b/frontend/src/containers/ConfigStep/SourceControl/index.tsx index 39863d0eae..f7503b2ece 100644 --- a/frontend/src/containers/ConfigStep/SourceControl/index.tsx +++ b/frontend/src/containers/ConfigStep/SourceControl/index.tsx @@ -1,157 +1,98 @@ -import { - isSourceControlVerified, - selectSourceControl, - updateSourceControl, - updateSourceControlVerifyState, -} from '@src/context/config/configSlice'; -import { - ConfigSectionContainer, - StyledForm, - StyledTextField, - StyledTypeSelections, -} from '@src/components/Common/ConfigForms'; -import { useVerifySourceControlTokenEffect } from '@src/hooks/useVerifySourceControlTokenEffect'; -import { CONFIG_TITLE, SOURCE_CONTROL_TYPES, TOKEN_HELPER_TEXT } from '@src/constants/resources'; -import { updateShouldGetPipelineConfig } from '@src/context/Metrics/metricsSlice'; +import { FIELD_KEY, useVerifySourceControlTokenEffect } from '@src/hooks/useVerifySourceControlTokenEffect'; +import { ConfigSectionContainer, StyledForm, StyledTextField } from '@src/components/Common/ConfigForms'; +import { SOURCE_CONTROL_ERROR_MESSAGE } from '@src/containers/ConfigStep/Form/literal'; +import { FormSingleSelect } from '@src/containers/ConfigStep/Form/FormSelect'; +import { CONFIG_TITLE, SOURCE_CONTROL_TYPES } from '@src/constants/resources'; +import { ISourceControlData } from '@src/containers/ConfigStep/Form/schema'; import { ConfigButtonGrop } from '@src/containers/ConfigStep/ConfigButton'; -import { useAppDispatch, useAppSelector } from '@src/hooks/useAppDispatch'; -import { InputLabel, ListItemText, MenuItem, Select } from '@mui/material'; import { ConfigSelectionTitle } from '@src/containers/MetricsStep/style'; import { TimeoutAlert } from '@src/containers/ConfigStep/TimeoutAlert'; import { StyledAlterWrapper } from '@src/containers/ConfigStep/style'; -import { DEFAULT_HELPER_TEXT } from '@src/constants/commons'; -import { findCaseInsensitiveType } from '@src/utils/util'; -import { FormEvent, useMemo, useState } from 'react'; +import { updateSourceControl } from '@src/context/config/configSlice'; +import { Controller, useFormContext } from 'react-hook-form'; +import { useAppDispatch } from '@src/hooks/useAppDispatch'; import { Loading } from '@src/components/Loading'; -import { REGEX } from '@src/constants/regex'; - -enum FIELD_KEY { - TYPE = 0, - TOKEN = 1, -} - -const getErrorMessage = (value: string) => { - if (!value) { - return TOKEN_HELPER_TEXT.RequiredTokenText; - } - if (!REGEX.GITHUB_TOKEN.test(value.trim())) { - return TOKEN_HELPER_TEXT.InvalidTokenText; - } - return DEFAULT_HELPER_TEXT; -}; export const SourceControl = () => { const dispatch = useAppDispatch(); - const sourceControlFields = useAppSelector(selectSourceControl); - const isVerified = useAppSelector(isSourceControlVerified); - const { verifyToken, isLoading, verifiedError, clearVerifiedError, isVerifyTimeOut, isShowAlert, setIsShowAlert } = - useVerifySourceControlTokenEffect(); - const type = findCaseInsensitiveType(Object.values(SOURCE_CONTROL_TYPES), sourceControlFields.type); - const [fields, setFields] = useState([ - { - key: 'SourceControl', - value: type, - validatedError: '', - }, - { - key: 'Token', - value: sourceControlFields.token, - validatedError: sourceControlFields.token ? getErrorMessage(sourceControlFields.token) : '', - }, - ]); - - const handleUpdate = (fields: { key: string; value: string; validatedError: string }[]) => { - clearVerifiedError(); - setFields(fields); - dispatch(updateSourceControlVerifyState(false)); - dispatch( - updateSourceControl({ - type: fields[FIELD_KEY.TYPE].value, - token: fields[FIELD_KEY.TOKEN].value, - }), - ); - dispatch(updateShouldGetPipelineConfig(true)); - }; - - const getNewFields = (value: string) => - fields.map((field, index) => - index === FIELD_KEY.TOKEN - ? { - key: field.key, - value: value.trim(), - validatedError: getErrorMessage(value.trim()), - } - : field, - ); - - const onInputChange = (value: string) => handleUpdate(getNewFields(value)); - - const onInputFocus = (value: string) => setFields(getNewFields(value)); + const { fields, verifyToken, isLoading, resetFields } = useVerifySourceControlTokenEffect(); + const { + control, + setError, + clearErrors, + formState: { isValid, isSubmitSuccessful, errors }, + handleSubmit, + reset, + getValues, + } = useFormContext(); + const isVerifyTimeOut = errors.token?.message === SOURCE_CONTROL_ERROR_MESSAGE.token.timeout; + const isVerified = isValid && isSubmitSuccessful; - const onReset = () => { - const newFields = fields.map(({ key }, index) => ({ - key, - value: index === FIELD_KEY.TOKEN ? '' : SOURCE_CONTROL_TYPES.GITHUB, - validatedError: '', - })); - handleUpdate(newFields); - setIsShowAlert(false); - }; - - const onSubmit = async (e: FormEvent) => { - e.preventDefault(); - await verifyToken({ - type: fields[FIELD_KEY.TYPE].value as SOURCE_CONTROL_TYPES, - token: fields[FIELD_KEY.TOKEN].value, - }); - }; - - const isDisableVerifyButton = useMemo( - () => isLoading || fields.some((field) => !field.value || field.validatedError) || !!verifiedError, - [verifiedError, fields, isLoading], - ); + const onSubmit = async () => await verifyToken(); + const closeTimeoutAlert = () => clearErrors(fields[FIELD_KEY.TOKEN].key); return ( {isLoading && } {CONFIG_TITLE.SOURCE_CONTROL} - + - - - Source Control - - - onInputFocus(e.target.value)} - onChange={(e) => onInputChange(e.target.value)} - error={!!fields[FIELD_KEY.TOKEN].validatedError || !!verifiedError} - helperText={fields[FIELD_KEY.TOKEN].validatedError || verifiedError} + + + { + return ( + { + if (field.value === '') { + setError(fields[FIELD_KEY.TOKEN].key, { + message: SOURCE_CONTROL_ERROR_MESSAGE.token.required, + }); + } + }} + onChange={(e) => { + if (isSubmitSuccessful) { + reset(undefined, { keepValues: true, keepErrors: true }); + } + const sourceControl: ISourceControlData = { + ...getValues(), + token: e.target.value, + }; + dispatch(updateSourceControl(sourceControl)); + field.onChange(e.target.value); + }} + error={fieldState.invalid && fieldState.error?.message !== SOURCE_CONTROL_ERROR_MESSAGE.token.timeout} + helperText={ + fieldState.error?.message && fieldState.error?.message !== SOURCE_CONTROL_ERROR_MESSAGE.token.timeout + ? fieldState.error?.message + : '' + } + /> + ); + }} /> diff --git a/frontend/src/containers/ConfigStep/TimeoutAlert/index.tsx b/frontend/src/containers/ConfigStep/TimeoutAlert/index.tsx index 4a66619849..f855dcf0f0 100644 --- a/frontend/src/containers/ConfigStep/TimeoutAlert/index.tsx +++ b/frontend/src/containers/ConfigStep/TimeoutAlert/index.tsx @@ -4,22 +4,19 @@ import BoldText from '@src/components/Common/BoldText'; import CancelIcon from '@mui/icons-material/Cancel'; interface PropsInterface { - isVerifyTimeOut: boolean; - isShowAlert: boolean; - setIsShowAlert: (value: boolean) => void; + showAlert: boolean; + onClose: () => void; moduleType: string; } -export const TimeoutAlert = ({ isVerifyTimeOut, isShowAlert, setIsShowAlert, moduleType }: PropsInterface) => { +export const TimeoutAlert = ({ showAlert, onClose, moduleType }: PropsInterface) => { return ( <> - {isVerifyTimeOut && isShowAlert && ( + {showAlert && ( } severity='error' - onClose={() => { - setIsShowAlert(false); - }} + onClose={onClose} > Submission timeout on {moduleType}, please reverify! diff --git a/frontend/src/containers/ConfigStep/index.tsx b/frontend/src/containers/ConfigStep/index.tsx index 327f131468..7ab849a79a 100644 --- a/frontend/src/containers/ConfigStep/index.tsx +++ b/frontend/src/containers/ConfigStep/index.tsx @@ -1,22 +1,69 @@ -import { MetricsTypeCheckbox } from '@src/containers/ConfigStep/MetricsTypeCheckbox'; +import { + IBasicInfoData, + IBoardConfigData, + IPipelineToolData, + ISourceControlData, +} from '@src/containers/ConfigStep/Form/schema'; import { closeAllNotifications } from '@src/context/notification/NotificationSlice'; +import { useAppSelector, useAppDispatch } from '@src/hooks/useAppDispatch'; +import { SourceControl } from '@src/containers/ConfigStep/SourceControl'; +import { PipelineTool } from '@src/containers/ConfigStep/PipelineTool'; +import { selectConfig } from '@src/context/config/configSlice'; +import { FormProvider, UseFormReturn } from 'react-hook-form'; import BasicInfo from '@src/containers/ConfigStep/BasicInfo'; -import { useAppDispatch } from '@src/hooks/useAppDispatch'; +import { Board } from '@src/containers/ConfigStep/Board'; +import { useEffect, useLayoutEffect } from 'react'; import { ConfigStepWrapper } from './style'; -import { useLayoutEffect } from 'react'; -const ConfigStep = () => { - const dispatch = useAppDispatch(); +interface IConfigStepProps { + basicInfoMethods: UseFormReturn; + boardConfigMethods: UseFormReturn; + pipelineToolMethods: UseFormReturn; + sourceControlMethods: UseFormReturn; +} +const ConfigStep = ({ + basicInfoMethods, + boardConfigMethods, + pipelineToolMethods, + sourceControlMethods, +}: IConfigStepProps) => { + const dispatch = useAppDispatch(); useLayoutEffect(() => { dispatch(closeAllNotifications()); // eslint-disable-next-line react-hooks/exhaustive-deps }, []); + const configData = useAppSelector(selectConfig); + const { isShow: isShowBoard } = configData.board; + const { isShow: isShowPipeline } = configData.pipelineTool; + const { isShow: isShowSourceControl } = configData.sourceControl; + + useEffect(() => { + basicInfoMethods.trigger(); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + return ( - - + + + + {isShowBoard && ( + + + + )} + {isShowPipeline && ( + + + + )} + {isShowSourceControl && ( + + + + )} ); }; diff --git a/frontend/src/containers/MetricsStep/Advance/Advance.tsx b/frontend/src/containers/MetricsStep/Advance/Advance.tsx index aef862eeda..d9c5c4a043 100644 --- a/frontend/src/containers/MetricsStep/Advance/Advance.tsx +++ b/frontend/src/containers/MetricsStep/Advance/Advance.tsx @@ -4,11 +4,19 @@ import { ItemCheckbox, TitleAndTooltipContainer, TooltipContainer } from '../Cyc import HelpOutlineOutlinedIcon from '@mui/icons-material/HelpOutlineOutlined'; import { StyledLink } from '@src/containers/MetricsStep/style'; import { useAppDispatch } from '@src/hooks/useAppDispatch'; -import { Field } from '@src/hooks/useVerifyBoardEffect'; import { useAppSelector } from '@src/hooks'; import { TextField } from '@mui/material'; import React, { useState } from 'react'; +export interface Field { + key: string; + value: string; + validateRule?: (value: string) => boolean; + validatedError: string; + verifiedError: string; + col: number; +} + export const Advance = () => { const url = 'https://github.com/au-heartbeat/Heartbeat/blob/main/README.md#323-setting-advanced-setting'; const dispatch = useAppDispatch(); diff --git a/frontend/src/containers/MetricsStep/index.tsx b/frontend/src/containers/MetricsStep/index.tsx index 62c14dd589..5397620e99 100644 --- a/frontend/src/containers/MetricsStep/index.tsx +++ b/frontend/src/containers/MetricsStep/index.tsx @@ -1,13 +1,3 @@ -import { - selectBoard, - selectDateRange, - selectIsProjectCreated, - selectJiraColumns, - selectMetrics, - selectUsers, - updateBoardVerifyState, - updateJiraVerifyResponse, -} from '@src/context/config/configSlice'; import { selectMetricsContent, selectShouldGetBoardConfig, @@ -15,6 +5,15 @@ import { updateMetricsState, updateShouldGetBoardConfig, } from '@src/context/Metrics/metricsSlice'; +import { + selectDateRange, + selectIsProjectCreated, + selectMetrics, + selectBoard, + updateJiraVerifyResponse, + selectUsers, + selectJiraColumns, +} from '@src/context/config/configSlice'; import { MetricSelectionHeader, MetricSelectionWrapper, @@ -82,7 +81,6 @@ const MetricsStep = () => { }).then((res) => { if (res && res.length) { const commonPayload = combineBoardInfo(res); - dispatch(updateBoardVerifyState(true)); dispatch(updateJiraVerifyResponse(commonPayload)); dispatch(updateMetricsState(merge(commonPayload, { isProjectCreated: isProjectCreated }))); dispatch(updateShouldGetBoardConfig(false)); diff --git a/frontend/src/containers/MetricsStepper/index.tsx b/frontend/src/containers/MetricsStepper/index.tsx index 4e823172bb..2b5de424c2 100644 --- a/frontend/src/containers/MetricsStepper/index.tsx +++ b/frontend/src/containers/MetricsStepper/index.tsx @@ -1,3 +1,13 @@ +import { + basicInfoSchema, + boardConfigSchema, + pipelineToolSchema, + sourceControlSchema, + IBasicInfoData, + IBoardConfigData, + IPipelineToolData, + ISourceControlData, +} from '@src/containers/ConfigStep/Form/schema'; import { BackButton, ButtonContainer, @@ -18,14 +28,17 @@ import { backStep, nextStep, selectStepNumber, updateTimeStamp } from '@src/cont import { useMetricsStepValidationCheckContext } from '@src/hooks/useMetricsStepValidationCheckContext'; import { convertCycleTimeSettings, exportToJsonFile, onlyEmptyAndDoneState } from '@src/utils/util'; import { selectConfig, selectMetrics, selectPipelineList } from '@src/context/config/configSlice'; +import { useDefaultValues } from '@src/containers/ConfigStep/Form/useDefaultValues'; import { COMMON_BUTTONS, METRICS_STEPS, STEPS } from '@src/constants/commons'; import { ConfirmDialog } from '@src/containers/MetricsStepper/ConfirmDialog'; import { useAppDispatch, useAppSelector } from '@src/hooks/useAppDispatch'; import { lazy, Suspense, useEffect, useMemo, useState } from 'react'; import { getFormMeta } from '@src/context/meta/metaSlice'; import SaveAltIcon from '@mui/icons-material/SaveAlt'; +import { yupResolver } from '@hookform/resolvers/yup'; import { useNavigate } from 'react-router-dom'; import { ROUTE } from '@src/constants/router'; +import { useForm } from 'react-hook-form'; import { Tooltip } from '@mui/material'; import isEmpty from 'lodash/isEmpty'; import every from 'lodash/every'; @@ -49,10 +62,78 @@ const MetricsStepper = () => { const { getDuplicatedPipeLineIds } = useMetricsStepValidationCheckContext(); const formMeta = useAppSelector(getFormMeta); const pipelineList = useAppSelector(selectPipelineList); + const defaultValues = useDefaultValues(); + const { isShow: isShowBoard } = config.board; + const { isShow: isShowPipeline } = config.pipelineTool; + const { isShow: isShowSourceControl } = config.sourceControl; + + const basicInfoMethods = useForm({ + defaultValues: defaultValues.basicInfoWithImport, + resolver: yupResolver(basicInfoSchema), + mode: 'onChange', + }); + + const boardConfigMethods = useForm({ + defaultValues: defaultValues.boardConfigWithImport, + resolver: yupResolver(boardConfigSchema), + mode: 'onChange', + }); + + const pipelineToolMethods = useForm({ + defaultValues: defaultValues.pipelineToolWithImport, + resolver: yupResolver(pipelineToolSchema), + mode: 'onChange', + }); + + const sourceControlMethods = useForm({ + defaultValues: defaultValues.sourceControlWithImport, + resolver: yupResolver(sourceControlSchema), + mode: 'onChange', + }); + + useEffect(() => { + basicInfoMethods.trigger(); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + const { isValid: isBasicInfoValid } = basicInfoMethods.formState; + const { isValid: isBoardConfigValid, isSubmitSuccessful: isBoardConfigSubmitSuccessful } = + boardConfigMethods.formState; + const { isValid: isPipelineToolValid, isSubmitSuccessful: isPipelineToolSubmitSuccessful } = + pipelineToolMethods.formState; + const { isValid: isSourceControlValid, isSubmitSuccessful: isSourceControlSubmitSuccessful } = + sourceControlMethods.formState; + + const configPageFormMeta = useMemo( + () => [ + { isShow: isShowBoard, isValid: isBoardConfigValid, isSubmitSuccessful: isBoardConfigSubmitSuccessful }, + { isShow: isShowPipeline, isValid: isPipelineToolValid, isSubmitSuccessful: isPipelineToolSubmitSuccessful }, + { + isShow: isShowSourceControl, + isValid: isSourceControlValid, + isSubmitSuccessful: isSourceControlSubmitSuccessful, + }, + ], + [ + isShowBoard, + isBoardConfigValid, + isBoardConfigSubmitSuccessful, + isShowPipeline, + isPipelineToolValid, + isPipelineToolSubmitSuccessful, + isShowSourceControl, + isSourceControlValid, + isSourceControlSubmitSuccessful, + ], + ); + const activeFormMeta = useMemo(() => configPageFormMeta.filter(({ isShow }) => isShow), [configPageFormMeta]); + const shownFormsVerified = useMemo( + () => + activeFormMeta.length > 0 && + activeFormMeta.every(({ isValid, isSubmitSuccessful }) => isValid && isSubmitSuccessful), + [activeFormMeta], + ); - const { isShow: isShowBoard, isVerified: isBoardVerified } = config.board; - const { isShow: isShowPipeline, isVerified: isPipelineToolVerified } = config.pipelineTool; - const { isShow: isShowSourceControl, isVerified: isSourceControlVerified } = config.sourceControl; const isShowCycleTimeSettings = requiredData.includes(REQUIRED_DATA.CYCLE_TIME) || requiredData.includes(REQUIRED_DATA.CLASSIFICATION) || @@ -100,18 +181,6 @@ const MetricsStepper = () => { }, [pipelineList, formMeta.metrics.pipelines, getDuplicatedPipeLineIds, metricsConfig.deploymentFrequencySettings]); useEffect(() => { - if (activeStep === METRICS_STEPS.CONFIG) { - const nextButtonValidityOptions = [ - { isShow: isShowBoard, isValid: isBoardVerified }, - { isShow: isShowPipeline, isValid: isPipelineToolVerified }, - { isShow: isShowSourceControl, isValid: isSourceControlVerified }, - ]; - const activeNextButtonValidityOptions = nextButtonValidityOptions.filter(({ isShow }) => isShow); - projectName && dateRange && dateRange.length && metrics.length - ? setIsDisableNextButton(!activeNextButtonValidityOptions.every(({ isValid }) => isValid)) - : setIsDisableNextButton(true); - } - if (activeStep === METRICS_STEPS.METRICS) { const nextButtonValidityOptions = [ { isShow: isShowBoard, isValid: isCrewsSettingValid }, @@ -131,12 +200,9 @@ const MetricsStepper = () => { } }, [ activeStep, - isBoardVerified, - isPipelineToolVerified, isShowBoard, isShowSourceControl, isShowPipeline, - isSourceControlVerified, metrics, projectName, dateRange, @@ -156,6 +222,9 @@ const MetricsStepper = () => { onlyIncludeReworkMetrics, ]); + const isNextDisabledTempForFormRefactor = + activeStep === METRICS_STEPS.CONFIG ? !(isBasicInfoValid && shownFormsVerified) : isDisableNextButton; + const filterMetricsConfig = (metricsConfig: ISavedMetricsSettingState) => { return Object.fromEntries( Object.entries(metricsConfig).filter(([, value]) => { @@ -261,7 +330,14 @@ const MetricsStepper = () => { - {activeStep === METRICS_STEPS.CONFIG && } + {activeStep === METRICS_STEPS.CONFIG && ( + + )} {activeStep === METRICS_STEPS.METRICS && } {activeStep === METRICS_STEPS.REPORT && } @@ -278,7 +354,7 @@ const MetricsStepper = () => { {COMMON_BUTTONS.BACK} - + {COMMON_BUTTONS.NEXT} diff --git a/frontend/src/context/config/board/boardSlice.ts b/frontend/src/context/config/board/boardSlice.ts index ba01fc7718..a4fff1aff2 100644 --- a/frontend/src/context/config/board/boardSlice.ts +++ b/frontend/src/context/config/board/boardSlice.ts @@ -14,7 +14,6 @@ export interface IBoardState { site: string; token: string; }; - isVerified: boolean; isShow: boolean; verifiedResponse: IBoardVerifyResponseState; } @@ -34,7 +33,6 @@ export const initialBoardState: IBoardState = { site: '', token: '', }, - isVerified: false, isShow: false, verifiedResponse: initialVerifiedBoardState, }; diff --git a/frontend/src/context/config/configSlice.ts b/frontend/src/context/config/configSlice.ts index 3d1af27439..24b7aff82c 100644 --- a/frontend/src/context/config/configSlice.ts +++ b/frontend/src/context/config/configSlice.ts @@ -9,10 +9,10 @@ import { } from '@src/constants/resources'; import { initialPipelineToolState, IPipelineToolState } from '@src/context/config/pipelineTool/pipelineToolSlice'; import { initialSourceControlState, ISourceControl } from '@src/context/config/sourceControl/sourceControlSlice'; -import { SortType } from '@src/containers/ConfigStep/DateRangePicker/DateRangePickerGroup'; import { IBoardState, initialBoardState } from '@src/context/config/board/boardSlice'; import { pipeline } from '@src/context/config/pipelineTool/verifyResponseSlice'; import { uniqPipelineListCrews, updateResponseCrews } from '@src/utils/util'; +import { SortType } from '@src/containers/ConfigStep/DateRangePicker/types'; import { createSlice } from '@reduxjs/toolkit'; import type { RootState } from '@src/store'; import merge from 'lodash/merge'; @@ -50,7 +50,7 @@ export const initialBasicConfigState: BasicConfigState = { endDate: null, }, ], - sortType: SortType?.DEFAULT, + sortType: SortType.DEFAULT, metrics: [], }, board: initialBoardState, @@ -144,16 +144,13 @@ export const configSlice = createSlice({ ? null : MESSAGE.CONFIG_PAGE_VERIFY_IMPORT_ERROR; } - state.board.config = merge(action.payload.board, { type: 'jira' }); + state.board.config = merge(action.payload.board, { type: 'Jira' }); state.pipelineTool.config = action.payload.pipelineTool || state.pipelineTool.config; state.sourceControl.config = action.payload.sourceControl || state.sourceControl.config; }, updateProjectCreatedState: (state, action) => { state.isProjectCreated = action.payload; }, - updateBoardVerifyState: (state, action) => { - state.board.isVerified = action.payload; - }, updateBoard: (state, action) => { state.board.config = action.payload; }, @@ -163,10 +160,6 @@ export const configSlice = createSlice({ state.board.verifiedResponse.targetFields = targetFields; state.board.verifiedResponse.users = users; }, - - updatePipelineToolVerifyState: (state, action) => { - state.pipelineTool.isVerified = action.payload; - }, updatePipelineTool: (state, action) => { state.pipelineTool.config = action.payload; }, @@ -191,9 +184,6 @@ export const configSlice = createSlice({ : pipeline, ); }, - updateSourceControlVerifyState: (state, action) => { - state.sourceControl.isVerified = action.payload; - }, updateSourceControl: (state, action) => { state.sourceControl.config = action.payload; }, @@ -220,22 +210,18 @@ export const { updateDateRangeSortType, updateMetrics, updateBoard, - updateBoardVerifyState, updateJiraVerifyResponse, updateBasicConfigState, - updatePipelineToolVerifyState, updatePipelineTool, updatePipelineToolVerifyResponse, updateSourceControl, - updateSourceControlVerifyState, updateSourceControlVerifiedResponse, updatePipelineToolVerifyResponseSteps, resetImportedData, updatePipelineToolVerifyResponseCrews, } = configSlice.actions; -export const selectProjectName = (state: RootState) => state.config.basic.projectName; -export const selectCalendarType = (state: RootState) => state.config.basic.calendarType; +export const selectBasicInfo = (state: RootState) => state.config.basic; export const selectDateRange = (state: RootState) => state.config.basic.dateRange; export const selectDateRangeSortType = (state: RootState) => state.config.basic.sortType; export const selectMetrics = (state: RootState) => state.config.basic.metrics; @@ -246,15 +232,10 @@ export const isSelectDoraMetrics = (state: RootState) => export const isOnlySelectClassification = (state: RootState) => state.config.basic.metrics.length === 1 && state.config.basic.metrics[0] === REQUIRED_DATA.CLASSIFICATION; export const selectBoard = (state: RootState) => state.config.board.config; -export const isPipelineToolVerified = (state: RootState) => state.config.pipelineTool.isVerified; export const selectPipelineTool = (state: RootState) => state.config.pipelineTool.config; -export const isSourceControlVerified = (state: RootState) => state.config.sourceControl.isVerified; export const selectSourceControl = (state: RootState) => state.config.sourceControl.config; export const selectWarningMessage = (state: RootState) => state.config.warningMessage; - export const selectConfig = (state: RootState) => state.config; - -export const selectIsBoardVerified = (state: RootState) => state.config.board.isVerified; export const selectUsers = (state: RootState) => state.config.board.verifiedResponse.users; export const selectJiraColumns = (state: RootState) => state.config.board.verifiedResponse.jiraColumns; export const selectIsProjectCreated = (state: RootState) => state.config.isProjectCreated; diff --git a/frontend/src/context/config/pipelineTool/pipelineToolSlice.ts b/frontend/src/context/config/pipelineTool/pipelineToolSlice.ts index 2179ae7994..010826e2c4 100644 --- a/frontend/src/context/config/pipelineTool/pipelineToolSlice.ts +++ b/frontend/src/context/config/pipelineTool/pipelineToolSlice.ts @@ -3,7 +3,6 @@ import { PIPELINE_TOOL_TYPES } from '@src/constants/resources'; export interface IPipelineToolState { config: { type: string; token: string }; - isVerified: boolean; isShow: boolean; verifiedResponse: IPipelineToolVerifyResponse; } @@ -13,7 +12,6 @@ export const initialPipelineToolState: IPipelineToolState = { type: PIPELINE_TOOL_TYPES.BUILD_KITE, token: '', }, - isVerified: false, isShow: false, verifiedResponse: initialPipelineToolVerifiedResponseState, }; diff --git a/frontend/src/context/config/sourceControl/sourceControlSlice.ts b/frontend/src/context/config/sourceControl/sourceControlSlice.ts index 06cb9dae12..c5d0a3bbeb 100644 --- a/frontend/src/context/config/sourceControl/sourceControlSlice.ts +++ b/frontend/src/context/config/sourceControl/sourceControlSlice.ts @@ -3,7 +3,6 @@ import { SOURCE_CONTROL_TYPES } from '@src/constants/resources'; export interface ISourceControl { config: { type: string; token: string }; - isVerified: boolean; isShow: boolean; verifiedResponse: ISourceControlVerifyResponse; } @@ -13,7 +12,6 @@ export const initialSourceControlState: ISourceControl = { type: SOURCE_CONTROL_TYPES.GITHUB, token: '', }, - isVerified: false, isShow: false, verifiedResponse: initSourceControlVerifyResponseState, }; diff --git a/frontend/src/hooks/useGetPipelineToolInfoEffect.ts b/frontend/src/hooks/useGetPipelineToolInfoEffect.ts index 37320c7e83..26138168c9 100644 --- a/frontend/src/hooks/useGetPipelineToolInfoEffect.ts +++ b/frontend/src/hooks/useGetPipelineToolInfoEffect.ts @@ -1,6 +1,5 @@ import { updatePipelineToolVerifyResponse, - isPipelineToolVerified, selectIsProjectCreated, selectPipelineTool, } from '@src/context/config/configSlice'; @@ -28,7 +27,6 @@ export const useGetPipelineToolInfoEffect = (): IUseVerifyPipeLineToolStateInter const [isLoading, setIsLoading] = useState(false); const apiTouchedRef = useRef(false); const [info, setInfo] = useState(defaultInfoStructure); - const pipelineToolVerified = useAppSelector(isPipelineToolVerified); const isProjectCreated = useAppSelector(selectIsProjectCreated); const restoredPipelineTool = useAppSelector(selectPipelineTool); const shouldLoad = useAppSelector(shouldMetricsLoad); @@ -45,12 +43,12 @@ export const useGetPipelineToolInfoEffect = (): IUseVerifyPipeLineToolStateInter const response = await pipelineToolClient.getInfo(params); setInfo(response); dispatch(updatePipelineToolVerifyResponse(response.data)); - pipelineToolVerified && dispatch(updatePipelineSettings({ ...response.data, isProjectCreated })); + dispatch(updatePipelineSettings({ ...response.data, isProjectCreated })); } finally { setIsLoading(false); setIsFirstFetch(false); } - }, [dispatch, isProjectCreated, pipelineToolVerified, restoredPipelineTool.type, restoredPipelineTool.token]); + }, [dispatch, isProjectCreated, restoredPipelineTool.type, restoredPipelineTool.token]); useEffect(() => { if (!apiTouchedRef.current && !isLoading && shouldLoad && shouldGetPipelineConfig) { diff --git a/frontend/src/hooks/useVerifyBoardEffect.ts b/frontend/src/hooks/useVerifyBoardEffect.ts index d44643a4f2..6f5e3f4796 100644 --- a/frontend/src/hooks/useVerifyBoardEffect.ts +++ b/frontend/src/hooks/useVerifyBoardEffect.ts @@ -1,35 +1,40 @@ -import { BOARD_TYPES, AXIOS_REQUEST_ERROR_CODE, MESSAGE, UNKNOWN_ERROR_TITLE } from '@src/constants/resources'; -import { selectBoard, updateBoard, updateBoardVerifyState } from '@src/context/config/configSlice'; -import { findCaseInsensitiveType, getJiraBoardToken } from '@src/utils/util'; -import { useAppDispatch, useAppSelector } from '@src/hooks/useAppDispatch'; -import { DEFAULT_HELPER_TEXT, EMPTY_STRING } from '@src/constants/commons'; +import { AXIOS_REQUEST_ERROR_CODE, UNKNOWN_ERROR_TITLE } from '@src/constants/resources'; +import { BOARD_CONFIG_ERROR_MESSAGE } from '@src/containers/ConfigStep/Form/literal'; +import { useDefaultValues } from '@src/containers/ConfigStep/Form/useDefaultValues'; +import { updateTreatFlagCardAsBlock } from '@src/context/Metrics/metricsSlice'; +import { updateShouldGetBoardConfig } from '@src/context/Metrics/metricsSlice'; +import { IBoardConfigData } from '@src/containers/ConfigStep/Form/schema'; +import { TBoardFieldKeys } from '@src/containers/ConfigStep/Form/type'; import { BoardRequestDTO } from '@src/clients/board/dto/request'; +import { updateBoard } from '@src/context/config/configSlice'; import { boardClient } from '@src/clients/board/BoardClient'; +import { useAppDispatch } from '@src/hooks/useAppDispatch'; +import { getJiraBoardToken } from '@src/utils/util'; import { IAppError } from '@src/errors/ErrorType'; -import { REGEX } from '@src/constants/regex'; +import { useFormContext } from 'react-hook-form'; import { isAppError } from '@src/errors'; import { HttpStatusCode } from 'axios'; import { useState } from 'react'; -export interface Field { - key: string; - value: string; - validateRule?: (value: string) => boolean; - validatedError: string; - verifiedError: string; +export enum FIELD_KEY { + TYPE = 0, + BOARD_ID = 1, + EMAIL = 2, + SITE = 3, + TOKEN = 4, +} + +export interface IField { + key: TBoardFieldKeys; col: number; + label: string; } export interface useVerifyBoardStateInterface { - isVerifyTimeOut: boolean; verifyJira: () => Promise; isLoading: boolean; - fields: Field[]; - updateField: (key: string, value: string) => void; - validateField: (key: string) => void; + fields: IField[]; resetFields: () => void; - setIsShowAlert: (value: boolean) => void; - isShowAlert: boolean; } const ERROR_INFO = { @@ -37,186 +42,85 @@ const ERROR_INFO = { BOARD_NOT_FOUND: 'boardId is incorrect', }; -const VALIDATOR = { - EMAIL: (value: string) => REGEX.EMAIL.test(value), - TOKEN: (value: string) => REGEX.BOARD_TOKEN.test(value), - BOARD_ID: (value: string) => REGEX.BOARD_ID.test(value), -}; - -export const KEYS = { - BOARD: 'Board', - BOARD_ID: 'Board Id', - EMAIL: 'Email', - SITE: 'Site', - TOKEN: 'Token', -}; - -const getValidatedError = (key: string, value: string, validateRule?: (value: string) => boolean) => { - if (!value) { - return `${key} is required!`; - } - if (validateRule && !validateRule(value)) { - return `${key} is invalid!`; - } - return DEFAULT_HELPER_TEXT; +export const KEYS: { [key: string]: TBoardFieldKeys } = { + BOARD: 'type', + BOARD_ID: 'boardId', + EMAIL: 'email', + SITE: 'site', + TOKEN: 'token', }; export const useVerifyBoardEffect = (): useVerifyBoardStateInterface => { const [isLoading, setIsLoading] = useState(false); - const [isVerifyTimeOut, setIsVerifyTimeOut] = useState(false); - const [isShowAlert, setIsShowAlert] = useState(false); - const boardFields = useAppSelector(selectBoard); const dispatch = useAppDispatch(); - const type = findCaseInsensitiveType(Object.values(BOARD_TYPES), boardFields.type); - const [fields, setFields] = useState([ + const { boardConfigOriginal } = useDefaultValues(); + const { reset, setError, getValues } = useFormContext(); + + const originalFields: IField[] = [ { key: KEYS.BOARD, - value: type, - validatedError: '', - verifiedError: '', col: 1, + label: 'Board', }, { key: KEYS.BOARD_ID, - value: boardFields.boardId, - validateRule: VALIDATOR.BOARD_ID, - validatedError: boardFields.boardId - ? getValidatedError(KEYS.BOARD_ID, boardFields.boardId, VALIDATOR.BOARD_ID) - : '', - verifiedError: '', col: 1, + label: 'Board Id', }, { key: KEYS.EMAIL, - value: boardFields.email, - validateRule: VALIDATOR.EMAIL, - validatedError: boardFields.email ? getValidatedError(KEYS.EMAIL, boardFields.email, VALIDATOR.EMAIL) : '', - verifiedError: '', col: 1, + label: 'Email', }, { key: KEYS.SITE, - value: boardFields.site, - validatedError: '', - verifiedError: '', col: 1, + label: 'Site', }, { key: KEYS.TOKEN, - value: boardFields.token, - validateRule: VALIDATOR.TOKEN, - validatedError: boardFields.token ? getValidatedError(KEYS.TOKEN, boardFields.token, VALIDATOR.TOKEN) : '', - verifiedError: '', col: 2, + label: 'Token', }, - ]); - - const getBoardInfo = (fields: Field[]) => { - const keys = ['type', 'boardId', 'email', 'site', 'token']; - return keys.reduce((board, key, index) => ({ ...board, [key]: fields[index].value }), {}); - }; + ]; - const handleUpdate = (fields: Field[]) => { - setFields(fields); - dispatch(updateBoardVerifyState(false)); - dispatch(updateBoard(getBoardInfo(fields))); + const persistReduxData = (shouldGetBoardConfig: boolean, boardInfo: IBoardConfigData & { projectKey?: string }) => { + dispatch(updateShouldGetBoardConfig(shouldGetBoardConfig)); + dispatch(updateBoard(boardInfo)); }; const resetFields = () => { - const newFields = fields.map((field) => - field.key === KEYS.BOARD - ? field - : { - ...field, - value: EMPTY_STRING, - validatedError: '', - verifiedError: '', - }, - ); - handleUpdate(newFields); - setIsShowAlert(false); - }; - - const getFieldsWithNoVerifiedError = (fields: Field[]) => - fields.map((field) => ({ - ...field, - verifiedError: '', - })); - - const updateField = (key: string, value: string) => { - const shouldClearVerifiedError = !!fields.find((field) => field.key === key)?.verifiedError; - const fieldsWithError = shouldClearVerifiedError ? getFieldsWithNoVerifiedError(fields) : fields; - const newFields = fieldsWithError.map((field) => - field.key === key - ? { - ...field, - value: value.trim(), - validatedError: getValidatedError(field.key, value.trim(), field.validateRule), - } - : field, - ); - handleUpdate(newFields); - }; - - const validateField = (key: string) => { - const newFields = fields.map((field) => - field.key === key - ? { - ...field, - validatedError: getValidatedError(field.key, field.value, field.validateRule), - } - : field, - ); - setFields(newFields); - }; - - const setVerifiedError = (keys: string[], messages: string[]) => { - setFields( - fields.map((field) => { - return keys.includes(field.key) - ? { - ...field, - validatedError: '', - verifiedError: messages[keys.findIndex((key) => key === field.key)], - } - : field; - }), - ); + reset(boardConfigOriginal); + persistReduxData(false, boardConfigOriginal); }; const verifyJira = async () => { setIsLoading(true); - const boardInfo = getBoardInfo(fields) as BoardRequestDTO; + dispatch(updateTreatFlagCardAsBlock(true)); + const boardInfo = getValues() as BoardRequestDTO; try { const res: { response: Record } = await boardClient.getVerifyBoard({ ...boardInfo, token: getJiraBoardToken(boardInfo.token, boardInfo.email), }); if (res?.response) { - setIsShowAlert(false); - setIsVerifyTimeOut(false); - dispatch(updateBoardVerifyState(true)); - dispatch(updateBoard({ ...boardInfo, projectKey: res.response.projectKey })); + persistReduxData(true, { ...boardInfo, projectKey: res.response.projectKey }); + reset(boardConfigOriginal, { keepValues: true }); } } catch (e) { if (isAppError(e)) { const { description, code } = e as IAppError; - setIsVerifyTimeOut(false); - setIsShowAlert(false); if (code === HttpStatusCode.Unauthorized) { - setVerifiedError( - [KEYS.EMAIL, KEYS.TOKEN], - [MESSAGE.VERIFY_MAIL_FAILED_ERROR, MESSAGE.VERIFY_TOKEN_FAILED_ERROR], - ); + setError(KEYS.EMAIL, { message: BOARD_CONFIG_ERROR_MESSAGE.email.verifyFailed }); + setError(KEYS.TOKEN, { message: BOARD_CONFIG_ERROR_MESSAGE.token.verifyFailed }); } else if (code === HttpStatusCode.NotFound && description === ERROR_INFO.SITE_NOT_FOUND) { - setVerifiedError([KEYS.SITE], [MESSAGE.VERIFY_SITE_FAILED_ERROR]); + setError(KEYS.SITE, { message: BOARD_CONFIG_ERROR_MESSAGE.site.verifyFailed }); } else if (code === HttpStatusCode.NotFound && description === ERROR_INFO.BOARD_NOT_FOUND) { - setVerifiedError([KEYS.BOARD_ID], [MESSAGE.VERIFY_BOARD_FAILED_ERROR]); + setError(KEYS.BOARD_ID, { message: BOARD_CONFIG_ERROR_MESSAGE.boardId.verifyFailed }); } else if (code === AXIOS_REQUEST_ERROR_CODE.TIMEOUT) { - setIsVerifyTimeOut(true); - setIsShowAlert(true); + setError(KEYS.TOKEN, { message: BOARD_CONFIG_ERROR_MESSAGE.token.timeout }); } else { - setVerifiedError([KEYS.TOKEN], [UNKNOWN_ERROR_TITLE]); + setError(KEYS.TOKEN, { message: UNKNOWN_ERROR_TITLE }); } } } @@ -226,12 +130,7 @@ export const useVerifyBoardEffect = (): useVerifyBoardStateInterface => { return { verifyJira, isLoading, - fields, - updateField, - validateField, + fields: originalFields, resetFields, - isVerifyTimeOut, - isShowAlert, - setIsShowAlert, }; }; diff --git a/frontend/src/hooks/useVerifyPipelineToolEffect.ts b/frontend/src/hooks/useVerifyPipelineToolEffect.ts index f006acc9d1..c07048512e 100644 --- a/frontend/src/hooks/useVerifyPipelineToolEffect.ts +++ b/frontend/src/hooks/useVerifyPipelineToolEffect.ts @@ -1,44 +1,70 @@ -import { updatePipelineToolVerifyState } from '@src/context/config/configSlice'; +import { PIPELINE_TOOL_ERROR_MESSAGE } from '@src/containers/ConfigStep/Form/literal'; +import { useDefaultValues } from '@src/containers/ConfigStep/Form/useDefaultValues'; +import { initDeploymentFrequencySettings } from '@src/context/Metrics/metricsSlice'; +import { updateShouldGetPipelineConfig } from '@src/context/Metrics/metricsSlice'; import { pipelineToolClient } from '@src/clients/pipeline/PipelineToolClient'; +import { TPipelineToolFieldKeys } from '@src/containers/ConfigStep/Form/type'; import { IPipelineVerifyRequestDTO } from '@src/clients/pipeline/dto/request'; +import { IPipelineToolData } from '@src/containers/ConfigStep/Form/schema'; +import { updatePipelineTool } from '@src/context/config/configSlice'; import { AXIOS_REQUEST_ERROR_CODE } from '@src/constants/resources'; +import { useFormContext } from 'react-hook-form'; import { useAppDispatch } from '@src/hooks'; import { HttpStatusCode } from 'axios'; import { useState } from 'react'; +export enum FIELD_KEY { + TYPE = 0, + TOKEN = 1, +} +interface IField { + key: TPipelineToolFieldKeys; + label: string; +} + export const useVerifyPipelineToolEffect = () => { const [isLoading, setIsLoading] = useState(false); - const [verifiedError, setVerifiedError] = useState(''); const dispatch = useAppDispatch(); - const [isVerifyTimeOut, setIsVerifyTimeOut] = useState(false); - const [isShowAlert, setIsShowAlert] = useState(false); - const verifyPipelineTool = async (params: IPipelineVerifyRequestDTO): Promise => { + const { pipelineToolOriginal } = useDefaultValues(); + const fields: IField[] = [ + { key: 'type', label: 'Pipeline Tool' }, + { key: 'token', label: 'Token' }, + ]; + const { reset, setError, getValues } = useFormContext(); + const persistReduxData = (pipelineToolConfig: IPipelineToolData) => { + dispatch(updatePipelineTool(pipelineToolConfig)); + dispatch(updateShouldGetPipelineConfig(true)); + dispatch(initDeploymentFrequencySettings()); + }; + + const resetFields = () => { + reset(pipelineToolOriginal); + persistReduxData(pipelineToolOriginal); + }; + + const verifyPipelineTool = async (): Promise => { setIsLoading(true); - const response = await pipelineToolClient.verify(params); - setIsVerifyTimeOut(false); - setIsShowAlert(false); + const values = getValues() as IPipelineVerifyRequestDTO; + const response = await pipelineToolClient.verify(values); if (response.code === HttpStatusCode.NoContent) { - dispatch(updatePipelineToolVerifyState(true)); + reset(pipelineToolOriginal, { keepValues: true }); + persistReduxData(values); } else if (response.code === AXIOS_REQUEST_ERROR_CODE.TIMEOUT) { - setIsVerifyTimeOut(true); - setIsShowAlert(true); + setError(fields[FIELD_KEY.TOKEN].key, { message: PIPELINE_TOOL_ERROR_MESSAGE.token.timeout }); + } else if (response.code === HttpStatusCode.Unauthorized) { + setError(fields[FIELD_KEY.TOKEN].key, { message: PIPELINE_TOOL_ERROR_MESSAGE.token.unauthorized }); + } else if (response.code === HttpStatusCode.Forbidden) { + setError(fields[FIELD_KEY.TOKEN].key, { message: PIPELINE_TOOL_ERROR_MESSAGE.token.forbidden }); } else { - setVerifiedError(response.errorTitle); + setError(fields[FIELD_KEY.TOKEN].key, { message: response.errorTitle }); } setIsLoading(false); }; - const clearVerifiedError = () => { - if (verifiedError) setVerifiedError(''); - }; - return { + fields, verifyPipelineTool, isLoading, - verifiedError, - clearVerifiedError, - isVerifyTimeOut, - isShowAlert, - setIsShowAlert, + resetFields, }; }; diff --git a/frontend/src/hooks/useVerifySourceControlTokenEffect.ts b/frontend/src/hooks/useVerifySourceControlTokenEffect.ts index 53729da0db..87bbbd13f6 100644 --- a/frontend/src/hooks/useVerifySourceControlTokenEffect.ts +++ b/frontend/src/hooks/useVerifySourceControlTokenEffect.ts @@ -1,46 +1,67 @@ +import { initDeploymentFrequencySettings, updateShouldGetPipelineConfig } from '@src/context/Metrics/metricsSlice'; +import { SOURCE_CONTROL_ERROR_MESSAGE } from '@src/containers/ConfigStep/Form/literal'; import { SourceControlVerifyRequestDTO } from '@src/clients/sourceControl/dto/request'; import { sourceControlClient } from '@src/clients/sourceControl/SourceControlClient'; -import { updateSourceControlVerifyState } from '@src/context/config/configSlice'; +import { useDefaultValues } from '@src/containers/ConfigStep/Form/useDefaultValues'; +import { TSourceControlFieldKeys } from '@src/containers/ConfigStep/Form/type'; +import { ISourceControlData } from '@src/containers/ConfigStep/Form/schema'; +import { updateSourceControl } from '@src/context/config/configSlice'; import { AXIOS_REQUEST_ERROR_CODE } from '@src/constants/resources'; import { useAppDispatch } from '@src/hooks/index'; -import { useCallback, useState } from 'react'; +import { useFormContext } from 'react-hook-form'; import { HttpStatusCode } from 'axios'; +import { useState } from 'react'; + +export enum FIELD_KEY { + TYPE = 0, + TOKEN = 1, +} + +interface IField { + key: TSourceControlFieldKeys; + label: string; +} export const useVerifySourceControlTokenEffect = () => { const dispatch = useAppDispatch(); const [isLoading, setIsLoading] = useState(false); - const [verifiedError, setVerifiedError] = useState(); - const [isVerifyTimeOut, setIsVerifyTimeOut] = useState(false); - const [isShowAlert, setIsShowAlert] = useState(false); - const verifyToken = async (params: SourceControlVerifyRequestDTO) => { + const fields: IField[] = [ + { key: 'type', label: 'Source Control' }, + { key: 'token', label: 'Token' }, + ]; + const { sourceControlOriginal } = useDefaultValues(); + const { reset, setError, getValues } = useFormContext(); + const persistReduxData = (sourceControlConfig: ISourceControlData) => { + dispatch(updateSourceControl(sourceControlConfig)); + dispatch(updateShouldGetPipelineConfig(true)); + dispatch(initDeploymentFrequencySettings()); + }; + const resetFields = () => { + reset(sourceControlOriginal); + }; + + const verifyToken = async () => { setIsLoading(true); - const response = await sourceControlClient.verifyToken(params); - setIsVerifyTimeOut(false); - setIsShowAlert(false); + const values = getValues() as SourceControlVerifyRequestDTO; + const response = await sourceControlClient.verifyToken(values); if (response.code === HttpStatusCode.NoContent) { - dispatch(updateSourceControlVerifyState(true)); + persistReduxData(values); + reset(sourceControlOriginal, { keepValues: true }); } else if (response.code === AXIOS_REQUEST_ERROR_CODE.TIMEOUT) { - setIsVerifyTimeOut(true); - setIsShowAlert(true); + setError(fields[FIELD_KEY.TOKEN].key, { message: SOURCE_CONTROL_ERROR_MESSAGE.token.timeout }); + } else if (response.code === HttpStatusCode.Unauthorized) { + setError(fields[FIELD_KEY.TOKEN].key, { message: SOURCE_CONTROL_ERROR_MESSAGE.token.unauthorized }); } else { - dispatch(updateSourceControlVerifyState(false)); - setVerifiedError(response.errorTitle); + setError(fields[FIELD_KEY.TOKEN].key, { message: response.errorTitle }); } setIsLoading(false); return response; }; - const clearVerifiedError = useCallback(() => { - setVerifiedError(''); - }, []); - return { verifyToken, isLoading, - verifiedError, - clearVerifiedError, - isVerifyTimeOut, - isShowAlert, - setIsShowAlert, + fields, + resetFields, }; }; From 7db10fcdbae8c9adbbf893c7e597b9064fcc255b Mon Sep 17 00:00:00 2001 From: Chao <89126516+mrcuriosity-tw@users.noreply.github.com> Date: Fri, 26 Apr 2024 15:45:23 +0800 Subject: [PATCH 46/81] [ADM-887] fix: adjust the aria-label selector to fix the e2e test. (#1411) --- frontend/e2e/pages/metrics/config-step.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/e2e/pages/metrics/config-step.ts b/frontend/e2e/pages/metrics/config-step.ts index bc03e04b3e..678194fccd 100644 --- a/frontend/e2e/pages/metrics/config-step.ts +++ b/frontend/e2e/pages/metrics/config-step.ts @@ -85,14 +85,14 @@ export class ConfigStep { this.projectNameInput = page.getByLabel('Project name *'); this.regularCalendar = page.getByText('Regular Calendar(Weekend'); this.chineseCalendar = page.getByText('Calendar with Chinese Holiday'); - this.fromDateInput = page.getByRole('textbox', { name: 'From *' }); + this.fromDateInput = page.getByRole('textbox', { name: 'From' }); this.fromDateInputButton = page .locator('div') .filter({ hasText: /^From \*$/ }) .getByRole('button', { name: 'Choose date' }); this.fromDateInputValueSelect = (fromDay: Dayjs) => page.getByRole('dialog', { name: 'From *' }).getByRole('gridcell', { name: `${fromDay.date()}` }); - this.toDateInput = page.getByRole('textbox', { name: 'To *' }); + this.toDateInput = page.getByRole('textbox', { name: 'To' }); this.toDateInputButton = page .locator('div') .filter({ hasText: /^To \*$/ }) From b4e7b53f05adf9c7470480b7423c63847577a394 Mon Sep 17 00:00:00 2001 From: Chao <89126516+mrcuriosity-tw@users.noreply.github.com> Date: Fri, 26 Apr 2024 16:24:23 +0800 Subject: [PATCH 47/81] [ADM-887]: adjust unique selector to fix the e2e. (#1412) * [ADM-887] fix: adjust the aria-label selector to fix the e2e test. * [ADM-887]: fix: adjust unique selector to fix e2e test. --- frontend/e2e/pages/metrics/config-step.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/frontend/e2e/pages/metrics/config-step.ts b/frontend/e2e/pages/metrics/config-step.ts index 678194fccd..691315f463 100644 --- a/frontend/e2e/pages/metrics/config-step.ts +++ b/frontend/e2e/pages/metrics/config-step.ts @@ -26,6 +26,7 @@ export class ConfigStep { readonly projectNameInput: Locator; readonly regularCalendar: Locator; readonly chineseCalendar: Locator; + readonly basicInfoContainer: Locator; readonly fromDateInput: Locator; readonly fromDateInputButton: Locator; readonly fromDateInputValueSelect: (fromDay: Dayjs) => Locator; @@ -85,14 +86,15 @@ export class ConfigStep { this.projectNameInput = page.getByLabel('Project name *'); this.regularCalendar = page.getByText('Regular Calendar(Weekend'); this.chineseCalendar = page.getByText('Calendar with Chinese Holiday'); - this.fromDateInput = page.getByRole('textbox', { name: 'From' }); + this.basicInfoContainer = page.getByLabel('Basic information'); + this.fromDateInput = this.basicInfoContainer.getByRole('textbox', { name: 'From' }); this.fromDateInputButton = page .locator('div') .filter({ hasText: /^From \*$/ }) .getByRole('button', { name: 'Choose date' }); this.fromDateInputValueSelect = (fromDay: Dayjs) => page.getByRole('dialog', { name: 'From *' }).getByRole('gridcell', { name: `${fromDay.date()}` }); - this.toDateInput = page.getByRole('textbox', { name: 'To' }); + this.toDateInput = this.basicInfoContainer.getByRole('textbox', { name: 'To' }); this.toDateInputButton = page .locator('div') .filter({ hasText: /^To \*$/ }) From 94f7fd2844666d351e6f45d029566889cc61df01 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 27 Apr 2024 22:46:15 +0800 Subject: [PATCH 48/81] chore(deps): update dependency @astrojs/sitemap to v3.1.4 (#1413)[docs] Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- docs/package.json | 2 +- docs/pnpm-lock.yaml | 100 +++++++++++++++++++++++++------------------- 2 files changed, 58 insertions(+), 44 deletions(-) diff --git a/docs/package.json b/docs/package.json index fc6f6bbcb8..b0cafe0075 100644 --- a/docs/package.json +++ b/docs/package.json @@ -37,7 +37,7 @@ "@actions/core": "^1.10.1", "@astrojs/mdx": "^2.2.0", "@astrojs/preact": "^3.1.1", - "@astrojs/sitemap": "3.1.2", + "@astrojs/sitemap": "3.1.4", "@babel/core": "^7.24.3", "@docsearch/css": "^3.6.0", "@docsearch/react": "^3.6.0", diff --git a/docs/pnpm-lock.yaml b/docs/pnpm-lock.yaml index 79bca4d640..b3c449c45c 100644 --- a/docs/pnpm-lock.yaml +++ b/docs/pnpm-lock.yaml @@ -56,13 +56,13 @@ importers: version: 1.10.1 '@astrojs/mdx': specifier: ^2.2.0 - version: 2.2.2(astro@4.5.7) + version: 2.2.2(astro@4.5.7(@types/node@20.12.7)(sass@1.72.0)(typescript@5.4.5)) '@astrojs/preact': specifier: ^3.1.1 - version: 3.1.1(@babel/core@7.24.3)(preact@10.19.7) + version: 3.1.1(@babel/core@7.24.3)(preact@10.19.7)(vite@5.2.8(@types/node@20.12.7)(sass@1.72.0)) '@astrojs/sitemap': - specifier: 3.1.2 - version: 3.1.2 + specifier: 3.1.4 + version: 3.1.4 '@babel/core': specifier: ^7.24.3 version: 7.24.3 @@ -89,7 +89,7 @@ importers: version: 20.12.7 '@typescript-eslint/eslint-plugin': specifier: ^7.3.1 - version: 7.4.0(@typescript-eslint/parser@7.4.0)(eslint@8.57.0)(typescript@5.4.5) + version: 7.4.0(@typescript-eslint/parser@7.4.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5) '@typescript-eslint/parser': specifier: ^7.3.1 version: 7.4.0(eslint@8.57.0)(typescript@5.4.5) @@ -101,16 +101,16 @@ importers: version: 4.5.7(@types/node@20.12.7)(sass@1.72.0)(typescript@5.4.5) astro-auto-import: specifier: ^0.4.2 - version: 0.4.2(astro@4.5.7) + version: 0.4.2(astro@4.5.7(@types/node@20.12.7)(sass@1.72.0)(typescript@5.4.5)) astro-eslint-parser: specifier: ^0.16.3 version: 0.16.3 astro-expressive-code: specifier: ^0.33.5 - version: 0.33.5(astro@4.5.7) + version: 0.33.5(astro@4.5.7(@types/node@20.12.7)(sass@1.72.0)(typescript@5.4.5)) astro-og-canvas: specifier: ^0.4.2 - version: 0.4.2(astro@4.5.7) + version: 0.4.2(astro@4.5.7(@types/node@20.12.7)(sass@1.72.0)(typescript@5.4.5)) bcp-47-normalize: specifier: ^2.3.0 version: 2.3.0 @@ -402,8 +402,8 @@ packages: resolution: {integrity: sha512-g61lZupWq1bYbcBnYZqdjndShr/J3l/oFobBKPA3+qMat146zce3nz2kdO4giGbhYDt4gYdhmoBz0vZJ4sIurQ==} engines: {node: '>=18.14.1'} - '@astrojs/sitemap@3.1.2': - resolution: {integrity: sha512-FxOJldIl5ltZ5CNjocQxHkAO9orwHBjqtaU28o4smobp9vowS0nbGp+I9CrPxkzWdl1crSDm9vjL9tnvG1DSug==} + '@astrojs/sitemap@3.1.4': + resolution: {integrity: sha512-po8CqDCK14O6phU1mB5C8SyVLyQEa+7pJM8oXxs1mVh8DgvxxaA5E7lak1vzOmBcyyyHBW32jakGqNYc66sBRw==} '@astrojs/telemetry@3.0.4': resolution: {integrity: sha512-A+0c7k/Xy293xx6odsYZuXiaHO0PL+bnDoXOc47sGDF5ffIKdKQGRPFl2NMlCF4L0NqN4Ynbgnaip+pPF0s7pQ==} @@ -966,9 +966,6 @@ packages: peerDependencies: '@babel/core': 7.x vite: 2.x || 3.x || 4.x || 5.x - peerDependenciesMeta: - vite: - optional: true '@preact/signals-core@1.5.1': resolution: {integrity: sha512-dE6f+WCX5ZUDwXzUIWNMhhglmuLpqJhuy3X3xHrhZYI0Hm2LyQwOu0l9mdPiWrVNsE+Q7txOnJPgtIqHCYoBVA==} @@ -994,9 +991,6 @@ packages: peerDependencies: preact: ^10.4.0 vite: '>=2.0.0' - peerDependenciesMeta: - vite: - optional: true '@rollup/pluginutils@4.2.1': resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==} @@ -1708,7 +1702,7 @@ packages: resolution: {integrity: sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==} concat-map@0.0.1: - resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=} + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} @@ -3743,6 +3737,9 @@ packages: resolution: {integrity: sha512-68Kl+79cE0RGKemKkhxTSg8+6AGrqBt+cbZAXevg2iJ6Y3zX4JhA/sZeGzLpxW9cXhmqAcE7KnJCisUmIUfnFQ==} engines: {node: '>=0.10.0'} + stream-replace-string@2.0.0: + resolution: {integrity: sha512-TlnjJ1C0QrmxRNrON00JvaFFlNh5TTG00APw23j74ET7gkQpTASi6/L2fuiav8pzK715HXtUeClpBTw2NPSn6w==} + stream-via@1.0.4: resolution: {integrity: sha512-DBp0lSvX5G9KGRDTkR/R+a29H+Wk2xItOF+MpZLLNDWbEV9tGPnqLPxHEYjmiz8xGtJHRIqmI+hCjmNzqoA4nQ==} engines: {node: '>=0.10.0'} @@ -4553,8 +4550,6 @@ snapshots: '@volar/language-service': 2.1.6 '@volar/typescript': 2.1.6 fast-glob: 3.3.2 - prettier: 3.2.5 - prettier-plugin-astro: 0.13.0 volar-service-css: 0.0.34(@volar/language-service@2.1.6) volar-service-emmet: 0.0.34(@volar/language-service@2.1.6) volar-service-html: 0.0.34(@volar/language-service@2.1.6) @@ -4563,6 +4558,9 @@ snapshots: volar-service-typescript-twoslash-queries: 0.0.34(@volar/language-service@2.1.6) vscode-html-languageservice: 5.2.0 vscode-uri: 3.0.8 + optionalDependencies: + prettier: 3.2.5 + prettier-plugin-astro: 0.13.0 transitivePeerDependencies: - typescript @@ -4612,7 +4610,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@astrojs/mdx@2.2.2(astro@4.5.7)': + '@astrojs/mdx@2.2.2(astro@4.5.7(@types/node@20.12.7)(sass@1.72.0)(typescript@5.4.5))': dependencies: '@astrojs/markdown-remark': 4.3.2 '@mdx-js/mdx': 3.0.1 @@ -4633,11 +4631,11 @@ snapshots: transitivePeerDependencies: - supports-color - '@astrojs/preact@3.1.1(@babel/core@7.24.3)(preact@10.19.7)': + '@astrojs/preact@3.1.1(@babel/core@7.24.3)(preact@10.19.7)(vite@5.2.8(@types/node@20.12.7)(sass@1.72.0))': dependencies: '@babel/plugin-transform-react-jsx': 7.23.4(@babel/core@7.24.3) '@babel/plugin-transform-react-jsx-development': 7.22.5(@babel/core@7.24.3) - '@preact/preset-vite': 2.8.2(@babel/core@7.24.3)(preact@10.19.7) + '@preact/preset-vite': 2.8.2(@babel/core@7.24.3)(preact@10.19.7)(vite@5.2.8(@types/node@20.12.7)(sass@1.72.0)) '@preact/signals': 1.2.2(preact@10.19.7) babel-plugin-transform-hook-names: 1.0.2(@babel/core@7.24.3) preact: 10.19.7 @@ -4652,9 +4650,10 @@ snapshots: dependencies: prismjs: 1.29.0 - '@astrojs/sitemap@3.1.2': + '@astrojs/sitemap@3.1.4': dependencies: sitemap: 7.1.1 + stream-replace-string: 2.0.0 zod: 3.22.4 '@astrojs/telemetry@3.0.4': @@ -4846,6 +4845,7 @@ snapshots: '@algolia/autocomplete-preset-algolia': 1.9.3(@algolia/client-search@4.23.3)(algoliasearch@4.22.1) '@docsearch/css': 3.6.0 algoliasearch: 4.22.1 + optionalDependencies: search-insights: 2.13.0 transitivePeerDependencies: - '@algolia/client-search' @@ -5147,12 +5147,12 @@ snapshots: '@pkgr/core@0.1.1': {} - '@preact/preset-vite@2.8.2(@babel/core@7.24.3)(preact@10.19.7)': + '@preact/preset-vite@2.8.2(@babel/core@7.24.3)(preact@10.19.7)(vite@5.2.8(@types/node@20.12.7)(sass@1.72.0))': dependencies: '@babel/core': 7.24.3 '@babel/plugin-transform-react-jsx': 7.23.4(@babel/core@7.24.3) '@babel/plugin-transform-react-jsx-development': 7.22.5(@babel/core@7.24.3) - '@prefresh/vite': 2.4.5(preact@10.19.7) + '@prefresh/vite': 2.4.5(preact@10.19.7)(vite@5.2.8(@types/node@20.12.7)(sass@1.72.0)) '@rollup/pluginutils': 4.2.1 babel-plugin-transform-hook-names: 1.0.2(@babel/core@7.24.3) debug: 4.3.4 @@ -5162,6 +5162,7 @@ snapshots: resolve: 1.22.8 source-map: 0.7.4 stack-trace: 1.0.0-pre2 + vite: 5.2.8(@types/node@20.12.7)(sass@1.72.0) transitivePeerDependencies: - preact - supports-color @@ -5181,7 +5182,7 @@ snapshots: '@prefresh/utils@1.2.0': {} - '@prefresh/vite@2.4.5(preact@10.19.7)': + '@prefresh/vite@2.4.5(preact@10.19.7)(vite@5.2.8(@types/node@20.12.7)(sass@1.72.0))': dependencies: '@babel/core': 7.24.3 '@prefresh/babel-plugin': 0.5.1 @@ -5189,6 +5190,7 @@ snapshots: '@prefresh/utils': 1.2.0 '@rollup/pluginutils': 4.2.1 preact: 10.19.7 + vite: 5.2.8(@types/node@20.12.7)(sass@1.72.0) transitivePeerDependencies: - supports-color @@ -5351,7 +5353,7 @@ snapshots: '@types/unist@3.0.2': {} - '@typescript-eslint/eslint-plugin@7.4.0(@typescript-eslint/parser@7.4.0)(eslint@8.57.0)(typescript@5.4.5)': + '@typescript-eslint/eslint-plugin@7.4.0(@typescript-eslint/parser@7.4.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5)': dependencies: '@eslint-community/regexpp': 4.10.0 '@typescript-eslint/parser': 7.4.0(eslint@8.57.0)(typescript@5.4.5) @@ -5366,6 +5368,7 @@ snapshots: natural-compare: 1.4.0 semver: 7.6.0 ts-api-utils: 1.3.0(typescript@5.4.5) + optionalDependencies: typescript: 5.4.5 transitivePeerDependencies: - supports-color @@ -5378,6 +5381,7 @@ snapshots: '@typescript-eslint/visitor-keys': 7.4.0 debug: 4.3.4 eslint: 8.57.0 + optionalDependencies: typescript: 5.4.5 transitivePeerDependencies: - supports-color @@ -5399,6 +5403,7 @@ snapshots: debug: 4.3.4 eslint: 8.57.0 ts-api-utils: 1.3.0(typescript@5.4.5) + optionalDependencies: typescript: 5.4.5 transitivePeerDependencies: - supports-color @@ -5417,6 +5422,7 @@ snapshots: minimatch: 9.0.3 semver: 7.6.0 ts-api-utils: 1.3.0(typescript@5.4.5) + optionalDependencies: typescript: 5.4.5 transitivePeerDependencies: - supports-color @@ -5690,7 +5696,7 @@ snapshots: astring@1.8.6: {} - astro-auto-import@0.4.2(astro@4.5.7): + astro-auto-import@0.4.2(astro@4.5.7(@types/node@20.12.7)(sass@1.72.0)(typescript@5.4.5)): dependencies: '@types/node': 18.19.26 acorn: 8.11.3 @@ -5710,13 +5716,13 @@ snapshots: transitivePeerDependencies: - supports-color - astro-expressive-code@0.33.5(astro@4.5.7): + astro-expressive-code@0.33.5(astro@4.5.7(@types/node@20.12.7)(sass@1.72.0)(typescript@5.4.5)): dependencies: astro: 4.5.7(@types/node@20.12.7)(sass@1.72.0)(typescript@5.4.5) hast-util-to-html: 8.0.4 remark-expressive-code: 0.33.5 - astro-og-canvas@0.4.2(astro@4.5.7): + astro-og-canvas@0.4.2(astro@4.5.7(@types/node@20.12.7)(sass@1.72.0)(typescript@5.4.5)): dependencies: astro: 4.5.7(@types/node@20.12.7)(sass@1.72.0)(typescript@5.4.5) canvaskit-wasm: 0.37.2 @@ -5782,7 +5788,7 @@ snapshots: unist-util-visit: 5.0.0 vfile: 6.0.1 vite: 5.2.8(@types/node@20.12.7)(sass@1.72.0) - vitefu: 0.2.5(vite@5.2.8) + vitefu: 0.2.5(vite@5.2.8(@types/node@20.12.7)(sass@1.72.0)) which-pm: 2.1.1 yargs-parser: 21.1.1 zod: 3.22.4 @@ -8847,6 +8853,8 @@ snapshots: dependencies: array-back: 1.0.4 + stream-replace-string@2.0.0: {} + stream-via@1.0.4: {} streamx@2.16.1: @@ -9037,7 +9045,7 @@ snapshots: code-block-writer: 11.0.3 tsconfck@3.0.3(typescript@5.4.5): - dependencies: + optionalDependencies: typescript: 5.4.5 tsconfig@7.0.0: @@ -9323,21 +9331,20 @@ snapshots: vite@5.2.8(@types/node@20.12.7)(sass@1.72.0): dependencies: - '@types/node': 20.12.7 esbuild: 0.20.2 postcss: 8.4.38 rollup: 4.13.0 - sass: 1.72.0 optionalDependencies: + '@types/node': 20.12.7 fsevents: 2.3.3 + sass: 1.72.0 - vitefu@0.2.5(vite@5.2.8): - dependencies: + vitefu@0.2.5(vite@5.2.8(@types/node@20.12.7)(sass@1.72.0)): + optionalDependencies: vite: 5.2.8(@types/node@20.12.7)(sass@1.72.0) vitest@1.4.0(@types/node@20.12.7)(sass@1.72.0): dependencies: - '@types/node': 20.12.7 '@vitest/expect': 1.4.0 '@vitest/runner': 1.4.0 '@vitest/snapshot': 1.4.0 @@ -9358,6 +9365,8 @@ snapshots: vite: 5.2.8(@types/node@20.12.7)(sass@1.72.0) vite-node: 1.4.0(@types/node@20.12.7)(sass@1.72.0) why-is-node-running: 2.2.2 + optionalDependencies: + '@types/node': 20.12.7 transitivePeerDependencies: - less - lightningcss @@ -9369,42 +9378,47 @@ snapshots: volar-service-css@0.0.34(@volar/language-service@2.1.6): dependencies: - '@volar/language-service': 2.1.6 vscode-css-languageservice: 6.2.14 vscode-languageserver-textdocument: 1.0.11 vscode-uri: 3.0.8 + optionalDependencies: + '@volar/language-service': 2.1.6 volar-service-emmet@0.0.34(@volar/language-service@2.1.6): dependencies: - '@volar/language-service': 2.1.6 '@vscode/emmet-helper': 2.9.3 vscode-html-languageservice: 5.2.0 + optionalDependencies: + '@volar/language-service': 2.1.6 volar-service-html@0.0.34(@volar/language-service@2.1.6): dependencies: - '@volar/language-service': 2.1.6 vscode-html-languageservice: 5.2.0 vscode-languageserver-textdocument: 1.0.11 vscode-uri: 3.0.8 + optionalDependencies: + '@volar/language-service': 2.1.6 volar-service-prettier@0.0.34(@volar/language-service@2.1.6)(prettier@3.2.5): dependencies: + vscode-uri: 3.0.8 + optionalDependencies: '@volar/language-service': 2.1.6 prettier: 3.2.5 - vscode-uri: 3.0.8 volar-service-typescript-twoslash-queries@0.0.34(@volar/language-service@2.1.6): - dependencies: + optionalDependencies: '@volar/language-service': 2.1.6 volar-service-typescript@0.0.34(@volar/language-service@2.1.6): dependencies: - '@volar/language-service': 2.1.6 path-browserify: 1.0.1 semver: 7.6.0 typescript-auto-import-cache: 0.3.2 vscode-languageserver-textdocument: 1.0.11 vscode-nls: 5.2.0 + optionalDependencies: + '@volar/language-service': 2.1.6 vscode-css-languageservice@6.2.14: dependencies: From aa00eada5f47e4d4c7615aee534da6bad02b7e30 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 27 Apr 2024 23:29:31 +0800 Subject: [PATCH 49/81] chore(deps): update dependency eslint-plugin-n to v17 (#1398)[frontend] Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- frontend/package.json | 2 +- frontend/pnpm-lock.yaml | 54 ++++++++++++++++++++++------------------- 2 files changed, 30 insertions(+), 26 deletions(-) diff --git a/frontend/package.json b/frontend/package.json index 893667ac41..0c971b7196 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -90,7 +90,7 @@ "eslint": "^8.57.0", "eslint-config-prettier": "^9.1.0", "eslint-plugin-import": "^2.29.1", - "eslint-plugin-n": "^16.6.2", + "eslint-plugin-n": "^17.0.0", "eslint-plugin-prettier": "^5.1.3", "eslint-plugin-promise": "^6.1.1", "eslint-plugin-react": "^7.34.1", diff --git a/frontend/pnpm-lock.yaml b/frontend/pnpm-lock.yaml index 9e275e1680..25d9649a97 100644 --- a/frontend/pnpm-lock.yaml +++ b/frontend/pnpm-lock.yaml @@ -140,8 +140,8 @@ devDependencies: specifier: ^2.29.1 version: 2.29.1(@typescript-eslint/parser@7.4.0)(eslint@8.57.0) eslint-plugin-n: - specifier: ^16.6.2 - version: 16.6.2(eslint@8.57.0) + specifier: ^17.0.0 + version: 17.3.1(eslint@8.57.0) eslint-plugin-prettier: specifier: ^5.1.3 version: 5.1.3(eslint-config-prettier@9.1.0)(eslint@8.57.0)(prettier@3.2.5) @@ -4168,12 +4168,7 @@ packages: /builtin-modules@3.3.0: resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} engines: {node: '>=6'} - - /builtins@5.0.1: - resolution: {integrity: sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==} - dependencies: - semver: 7.6.0 - dev: true + dev: false /cacheable-lookup@5.0.4: resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==} @@ -4870,6 +4865,14 @@ packages: once: 1.4.0 dev: true + /enhanced-resolve@5.16.0: + resolution: {integrity: sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA==} + engines: {node: '>=10.13.0'} + dependencies: + graceful-fs: 4.2.11 + tapable: 2.2.1 + dev: true + /entities@4.5.0: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} @@ -5222,23 +5225,20 @@ packages: - supports-color dev: true - /eslint-plugin-n@16.6.2(eslint@8.57.0): - resolution: {integrity: sha512-6TyDmZ1HXoFQXnhCTUjVFULReoBPOAjpuiKELMkeP40yffI/1ZRO+d9ug/VC6fqISo2WkuIBk3cvuRPALaWlOQ==} - engines: {node: '>=16.0.0'} + /eslint-plugin-n@17.3.1(eslint@8.57.0): + resolution: {integrity: sha512-25+HTtKe1F8U/M4ERmdzbz/xkm/gaY0OYC8Fcv1z/WvpLJ8Xfh9LzJ13JV5uj4QyCUD8kOPJrNjn/3y+tc57Vw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: '>=7.0.0' + eslint: '>=8.23.0' dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - builtins: 5.0.1 + enhanced-resolve: 5.16.0 eslint: 8.57.0 eslint-plugin-es-x: 7.5.0(eslint@8.57.0) get-tsconfig: 4.7.3 - globals: 13.24.0 + globals: 15.0.0 ignore: 5.3.1 - is-builtin-module: 3.2.1 - is-core-module: 2.13.1 - minimatch: 3.1.2 - resolve: 1.22.8 + minimatch: 9.0.3 semver: 7.6.0 dev: true @@ -5809,6 +5809,11 @@ packages: type-fest: 0.20.2 dev: true + /globals@15.0.0: + resolution: {integrity: sha512-m/C/yR4mjO6pXDTm9/R/SpYTAIyaUB4EOzcaaMEl7mds7Mshct9GfejiJNQGjHHbdMPey13Kpu4TMbYi9ex1pw==} + engines: {node: '>=18'} + dev: true + /globalthis@1.0.3: resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} engines: {node: '>= 0.4'} @@ -6139,13 +6144,6 @@ packages: call-bind: 1.0.7 has-tostringtag: 1.0.2 - /is-builtin-module@3.2.1: - resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} - engines: {node: '>=6'} - dependencies: - builtin-modules: 3.3.0 - dev: true - /is-callable@1.2.7: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} @@ -8837,6 +8835,11 @@ packages: tslib: 2.6.2 dev: true + /tapable@2.2.1: + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + engines: {node: '>=6'} + dev: true + /temp-dir@2.0.0: resolution: {integrity: sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==} engines: {node: '>=8'} @@ -9558,6 +9561,7 @@ packages: /workbox-google-analytics@7.0.0: resolution: {integrity: sha512-MEYM1JTn/qiC3DbpvP2BVhyIH+dV/5BjHk756u9VbwuAhu0QHyKscTnisQuz21lfRpOwiS9z4XdqeVAKol0bzg==} + deprecated: It is not compatible with newer versions of GA starting with v4, as long as you are using GAv3 it should be ok, but the package is not longer being maintained dependencies: workbox-background-sync: 7.0.0 workbox-core: 7.0.0 From 4bfb189fda3db75d8e4429040635b493b50d8ffc Mon Sep 17 00:00:00 2001 From: yulongcai <141199398+yulongcai@users.noreply.github.com> Date: Sun, 28 Apr 2024 14:53:05 +0800 Subject: [PATCH 50/81] ADM-926:[frontend]feat: add e2e test for charting (#1419) * ADM-926:[backend]feat: add e2e test for charting * chore(deps): update dependency @astrojs/sitemap to v3.1.4 (#1413)[docs] Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update dependency eslint-plugin-n to v17 (#1398)[frontend] Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * ADM-926:[frontend] fix: fix review issue * ADM-926:[frontend] fix: add config template for chart * ADM-926:[frontend] fix: refactor code --------- Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .../fixtures/import-file/chart-step-data.ts | 16 ++++ ...ing-unhappy-path-config-file.template.json | 95 +++++++++++++++++++ frontend/e2e/pages/metrics/config-step.ts | 32 +++++++ frontend/e2e/pages/metrics/metrics-step.ts | 9 ++ .../side-path/charting-unhappy-path.spec.ts | 59 ++++++++++++ 5 files changed, 211 insertions(+) create mode 100644 frontend/e2e/fixtures/import-file/chart-step-data.ts create mode 100644 frontend/e2e/fixtures/input-files/charting-unhappy-path-config-file.template.json create mode 100644 frontend/e2e/specs/side-path/charting-unhappy-path.spec.ts diff --git a/frontend/e2e/fixtures/import-file/chart-step-data.ts b/frontend/e2e/fixtures/import-file/chart-step-data.ts new file mode 100644 index 0000000000..41da2d0da3 --- /dev/null +++ b/frontend/e2e/fixtures/import-file/chart-step-data.ts @@ -0,0 +1,16 @@ +export const chartStepData = { + unSelectBranch: 'main', + addNewBranch: ['ADM-669'], + errorDateRange: [ + { + startDate: '2024-09-07T00:00:00.000+08:00', + endDate: '2024-04-08T23:59:59.999+08:00', + }, + ], + noCardDateRange: [ + { + startDate: '2021-04-07T00:00:00.000+08:00', + endDate: '2021-04-08T23:59:59.999+08:00', + }, + ], +}; diff --git a/frontend/e2e/fixtures/input-files/charting-unhappy-path-config-file.template.json b/frontend/e2e/fixtures/input-files/charting-unhappy-path-config-file.template.json new file mode 100644 index 0000000000..3f340a206e --- /dev/null +++ b/frontend/e2e/fixtures/input-files/charting-unhappy-path-config-file.template.json @@ -0,0 +1,95 @@ +{ + "projectName": "Heartbeat Metrics", + "dateRange": { + "startDate": "2024-02-12T00:00:00.000+08:00", + "endDate": "2024-02-16T23:59:59.999+08:00" + }, + "calendarType": "Calendar with Chinese Holiday", + "metrics": [ + "Velocity", + "Cycle time", + "Classification", + "Rework times", + "Lead time for changes", + "Deployment frequency", + "Change failure rate", + "Mean time to recovery" + ], + "board": { + "type": "Classic Jira", + "boardId": "2", + "email": "heartbeatuser2023@gmail.com", + "site": "dorametrics", + "token": "" + }, + "pipelineTool": { + "type": "BuildKite", + "token": "" + }, + "sourceControl": { + "type": "GitHub", + "token": "" + }, + "crews": ["heartbeat user"], + "assigneeFilter": "lastAssignee", + "pipelineCrews": ["heartbeat-user", "guzhongren", "Unknown"], + "cycleTime": { + "type": "byColumn", + "jiraColumns": [ + { + "TODO": "To do" + }, + { + "Doing": "In Dev" + }, + { + "Blocked": "Block" + }, + { + "Review": "Review" + }, + { + "READY FOR TESTING": "Waiting for testing" + }, + { + "Testing": "Testing" + }, + { + "Done": "Done" + } + ], + "treatFlagCardAsBlock": true + }, + "doneStatus": ["DONE"], + "classification": [ + "issuetype", + "parent", + "customfield_10061", + "customfield_10020", + "project", + "customfield_10021", + "fixVersions", + "priority", + "customfield_10037", + "labels", + "timetracking", + "customfield_10016", + "customfield_10038", + "assignee", + "customfield_10027", + "customfield_10060" + ], + "deployment": [ + { + "id": 0, + "organization": "Thoughtworks-Heartbeat", + "pipelineName": "Heartbeat", + "step": ":rocket: Deploy prod", + "branches": ["main"] + } + ], + "reworkTimesSettings": { + "reworkState": "In Dev", + "excludeStates": [] + } +} diff --git a/frontend/e2e/pages/metrics/config-step.ts b/frontend/e2e/pages/metrics/config-step.ts index 691315f463..c40e4912dd 100644 --- a/frontend/e2e/pages/metrics/config-step.ts +++ b/frontend/e2e/pages/metrics/config-step.ts @@ -27,6 +27,10 @@ export class ConfigStep { readonly regularCalendar: Locator; readonly chineseCalendar: Locator; readonly basicInfoContainer: Locator; + readonly newTimeRangeButton: Locator; + readonly removeTimeRangeButtons: Locator; + readonly fromDateErrorMessage: Locator; + readonly toDateErrorMessage: Locator; readonly fromDateInput: Locator; readonly fromDateInputButton: Locator; readonly fromDateInputValueSelect: (fromDay: Dayjs) => Locator; @@ -101,6 +105,10 @@ export class ConfigStep { .getByRole('button', { name: 'Choose date' }); this.toDateInputValueSelect = (toDay: Dayjs) => page.getByRole('dialog', { name: 'To *' }).getByRole('gridcell', { name: `${toDay.date()}` }); + this.newTimeRangeButton = this.basicInfoContainer.getByRole('button', { name: 'Button for adding date range' }); + this.fromDateErrorMessage = this.basicInfoContainer.getByText('Start date is invalid'); + this.toDateErrorMessage = this.basicInfoContainer.getByText('End date is invalid'); + this.removeTimeRangeButtons = this.basicInfoContainer.getByText('Remove'); this.requireDataButton = page.getByRole('button', { name: 'Required Data' }); this.velocityCheckbox = page.getByRole('option', { name: 'Velocity' }).getByRole('checkbox'); @@ -244,6 +252,22 @@ export class ConfigStep { await expect(this.nextButton).toBeDisabled(); } + async validateAddNewTimeRangeButtonNotClickable() { + await expect(this.newTimeRangeButton).toBeDisabled(); + } + + async validateRemoveTimeRangeButtonIsHidden() { + await expect(this.removeTimeRangeButtons.last()).toBeHidden(); + } + + async checkErrorStratTimeMessage() { + await expect(this.fromDateErrorMessage).toBeVisible(); + } + + async checkErrorEndTimeMessage() { + await expect(this.toDateErrorMessage).toBeVisible(); + } + async validateNextButtonClickable() { await expect(this.nextButton).toBeEnabled(); } @@ -450,6 +474,14 @@ export class ConfigStep { await this.boardVerifyButton.click(); } + async addNewTimeRange() { + await this.newTimeRangeButton.click(); + } + + async RemoveLastNewPipeline() { + await this.removeTimeRangeButtons.last().click(); + } + async checkAllConfigInvalid() { await expect(this.boardTokenErrorMessage).toBeVisible(); await expect(this.pipelineTokenErrorMessage).toBeVisible(); diff --git a/frontend/e2e/pages/metrics/metrics-step.ts b/frontend/e2e/pages/metrics/metrics-step.ts index 3cf09d296a..7969a4978d 100644 --- a/frontend/e2e/pages/metrics/metrics-step.ts +++ b/frontend/e2e/pages/metrics/metrics-step.ts @@ -557,6 +557,15 @@ export class MetricsStep { await this.page.keyboard.press('Escape'); } + async addBranch(branches: string[]) { + await this.pipelineBranchSelect.click(); + for (const branchName of branches) { + await this.page.getByRole('combobox', { name: 'Branches' }).fill(branchName); + await this.page.getByRole('option', { name: branchName }).getByRole('checkbox').check(); + } + await this.page.keyboard.press('Escape'); + } + async deselectBranch(branch: string) { await this.pipelineDefaultBranchSelectContainer.click(); await this.page.getByRole('option', { name: branch }).getByRole('checkbox').uncheck(); diff --git a/frontend/e2e/specs/side-path/charting-unhappy-path.spec.ts b/frontend/e2e/specs/side-path/charting-unhappy-path.spec.ts new file mode 100644 index 0000000000..4417b08f7b --- /dev/null +++ b/frontend/e2e/specs/side-path/charting-unhappy-path.spec.ts @@ -0,0 +1,59 @@ +import { importModifiedCorrectConfig as modifiedCorrectProjectFromFile } from '../../fixtures/import-file/unhappy-path-file'; +import { chartStepData } from '../../fixtures/import-file/chart-step-data'; +import { test } from '../../fixtures/test-with-extend-fixtures'; +import { clearTempDir } from '../../utils/clear-temp-dir'; +import { format } from '../../utils/date-time'; + +test.beforeAll(async () => { + await clearTempDir(); +}); + +test('Charting unhappy path on config and metri page', async ({ homePage, configStep, metricsStep }) => { + const rightDateRange = { + startDate: format(modifiedCorrectProjectFromFile.dateRange.startDate), + endDate: format(modifiedCorrectProjectFromFile.dateRange.endDate), + }; + const errorDateRange = { + startDate: format(chartStepData.errorDateRange[0].startDate), + endDate: format(chartStepData.errorDateRange[0].endDate), + }; + + const noCardDateRange = { + startDate: format(chartStepData.noCardDateRange[0].startDate), + endDate: format(chartStepData.noCardDateRange[0].endDate), + }; + await homePage.goto(); + + await homePage.importProjectFromFile('../fixtures/input-files/charting-unhappy-path-config-file.json'); + + await configStep.verifyAllConfig(); + await configStep.addNewTimeRange(); + await configStep.addNewTimeRange(); + await configStep.addNewTimeRange(); + await configStep.addNewTimeRange(); + await configStep.addNewTimeRange(); + await configStep.validateAddNewTimeRangeButtonNotClickable(); + await configStep.validateNextButtonNotClickable(); + await configStep.RemoveLastNewPipeline(); + await configStep.RemoveLastNewPipeline(); + await configStep.RemoveLastNewPipeline(); + await configStep.RemoveLastNewPipeline(); + await configStep.RemoveLastNewPipeline(); + await configStep.validateRemoveTimeRangeButtonIsHidden(); + await configStep.typeInDateRange(errorDateRange); + await configStep.checkErrorStratTimeMessage(); + await configStep.checkErrorEndTimeMessage(); + await configStep.validateNextButtonNotClickable(); + await configStep.typeInDateRange(noCardDateRange); + await configStep.goToMetrics(); + await metricsStep.waitForShown(); + await configStep.validateNextButtonNotClickable(); + await metricsStep.goToPreviousStep(); + await configStep.typeInDateRange(rightDateRange); + await configStep.goToMetrics(); + await metricsStep.waitForShown(); + await metricsStep.deselectBranch(chartStepData.unSelectBranch); + await metricsStep.addBranch(chartStepData.addNewBranch); + await metricsStep.checkBranchIsInvalid(); + await configStep.validateNextButtonNotClickable(); +}); From faf9ede62e25d247111fa419d0c4a90f343c8f1a Mon Sep 17 00:00:00 2001 From: PengxiWPix <113176309+PengxiWPix@users.noreply.github.com> Date: Sun, 28 Apr 2024 15:25:17 +0800 Subject: [PATCH 51/81] ADM 927: [frontend] Fix code smell and message text color (#1420) * ADM-927:[frontend]feat: add retry button * ADM-927:[frontend]feat: http client handle 5xx error with special route * ADM-927:[frontend]feat: add failed status for retry * ADM-927:[frontend]feat: add notification pop up when partial failed * ADM-927:[frontend]feat: implemented all no cards and all 4xx error cases * ADM-927:[frontend]feat: map correct api result to board * ADM-927:[frontend]refactor: restore the http client handle 500 logic * ADM-927:[frontend]fix: refactor from cr comments * ADM-927:[frontend]refactor: adapt code style * ADM-927:[frontend]refactor: remove retry for board info * ADM-927:[frontend]feat: add board info failed status ability * ADM-927:[frontend]refactor: adapt all no cards * ADM-927:[frontend]refactor: move board info response filter and map to hook * ADM-927:[frontend]test: fix test * ADM-927:[frontend]refactor: rename status and remove unnecessary variable * ADM-927:[frontend]feat: fixed test coverage * ADM-927:[frontend]fix: fix coverage to 100 by delete useless code * ADM-927:[frontend]feat: add partial error popup for metrics step * ADM-927:[frontend]fix: combined two tests using mockImplementation * ADM-927:[frontend]fix: use and logic for error code mapping * ADM-927:[frontend]fix: fix code space * ADM-927:[frontend]refactor: refactor pipeline info request error title * ADM-927:[frontend]test: add pipeline failed status test * ADM-927:[frontend]test: rename test * ADM-927:[frontend]test: rename test * ADM-927:[frontend]fix: fix code smell * ADM-927:[frontend]fix: fix pipeline error message color * ADM-927:[frontend]fix: fix type-check after merge * ADM-927:[frontend]fix: fix object check --------- Co-authored-by: weiraneve <907221539@qq.com> Co-authored-by: guzhongren --- .../PresentationForErrorCases/index.tsx | 12 +++++------- frontend/src/containers/MetricsStep/index.tsx | 6 +++--- frontend/src/hooks/useGetBoardInfo.ts | 3 +-- 3 files changed, 9 insertions(+), 12 deletions(-) diff --git a/frontend/src/components/Metrics/MetricsStep/DeploymentFrequencySettings/PresentationForErrorCases/index.tsx b/frontend/src/components/Metrics/MetricsStep/DeploymentFrequencySettings/PresentationForErrorCases/index.tsx index 0edbd8d040..1f0efcce60 100644 --- a/frontend/src/components/Metrics/MetricsStep/DeploymentFrequencySettings/PresentationForErrorCases/index.tsx +++ b/frontend/src/components/Metrics/MetricsStep/DeploymentFrequencySettings/PresentationForErrorCases/index.tsx @@ -2,17 +2,15 @@ import { StyledContainer, StyledImageContainer, StyledImage, - StyledCommonTitle, - StyledCommonMessage, StyledRetryMessage, StyledRetryButton, } from '@src/components/Metrics/MetricsStep/DeploymentFrequencySettings/PresentationForErrorCases/style'; +import { StyledErrorMessage, StyledErrorSection, StyledErrorTitle } from '@src/components/Common/EmptyContent/styles'; import { PIPELINE_TOOL_RETRY_MESSAGE, PIPELINE_TOOL_RETRY_TRIGGER_MESSAGE } from '@src/constants/resources'; import { IGetPipelineToolInfoResult } from '@src/clients/pipeline/PipelineToolClient'; import { AXIOS_REQUEST_ERROR_CODE } from '@src/constants/resources'; import errorSvg from '@src/assets/PipelineInfoError.svg'; import React, { useCallback } from 'react'; -import { Box } from '@mui/material'; export interface IPresentationForErrorCasesProps extends IGetPipelineToolInfoResult { retry: () => void; @@ -35,10 +33,10 @@ const PresentationForErrorCases = (props: IPresentationForErrorCasesProps) => { ) : ( - - {props.errorTitle} - {props.errorMessage} - + + {props.errorTitle} + {props.errorMessage} + )} ); diff --git a/frontend/src/containers/MetricsStep/index.tsx b/frontend/src/containers/MetricsStep/index.tsx index 5397620e99..af189434ac 100644 --- a/frontend/src/containers/MetricsStep/index.tsx +++ b/frontend/src/containers/MetricsStep/index.tsx @@ -142,9 +142,9 @@ const MetricsStep = () => { Board configuration {isEmpty(errorMessage) || - (boardInfoFailedStatus != METRICS_DATA_FAIL_STATUS.ALL_FAILED_4XX && - boardInfoFailedStatus != METRICS_DATA_FAIL_STATUS.ALL_FAILED_TIMEOUT && - boardInfoFailedStatus != METRICS_DATA_FAIL_STATUS.ALL_FAILED_NO_CARDS) ? ( + (boardInfoFailedStatus !== METRICS_DATA_FAIL_STATUS.ALL_FAILED_4XX && + boardInfoFailedStatus !== METRICS_DATA_FAIL_STATUS.ALL_FAILED_TIMEOUT && + boardInfoFailedStatus !== METRICS_DATA_FAIL_STATUS.ALL_FAILED_NO_CARDS) ? ( <> diff --git a/frontend/src/hooks/useGetBoardInfo.ts b/frontend/src/hooks/useGetBoardInfo.ts index 169e44c1dc..37d49dbdb8 100644 --- a/frontend/src/hooks/useGetBoardInfo.ts +++ b/frontend/src/hooks/useGetBoardInfo.ts @@ -103,9 +103,8 @@ export const useGetBoardInfoEffect = (): useGetBoardInfoInterface => { return res; }) .catch((err) => { - const { code } = err; errorCount++; - localBoardInfoFailedStatus = boardInfoPartialFailedStatusMapping(code); + localBoardInfoFailedStatus = boardInfoPartialFailedStatusMapping(err?.code); setBoardInfoFailedStatus(localBoardInfoFailedStatus); return err; }); From 8760abf7d39fee3294b70cb2a3e4b1fdb0040952 Mon Sep 17 00:00:00 2001 From: yulongcai <141199398+yulongcai@users.noreply.github.com> Date: Mon, 29 Apr 2024 10:45:13 +0800 Subject: [PATCH 52/81] ADM-926-fix:[frontend] fix: add two time range to test (#1421) * ADM-926-fix:[frontend] fix: add two time range to test * ADM-926-fix:[frontend] fix: fix review issue --- .../fixtures/import-file/chart-step-data.ts | 18 +++++++- frontend/e2e/pages/metrics/config-step.ts | 8 ++-- .../side-path/charting-unhappy-path.spec.ts | 43 ++++++++++++++----- 3 files changed, 52 insertions(+), 17 deletions(-) diff --git a/frontend/e2e/fixtures/import-file/chart-step-data.ts b/frontend/e2e/fixtures/import-file/chart-step-data.ts index 41da2d0da3..579c94f213 100644 --- a/frontend/e2e/fixtures/import-file/chart-step-data.ts +++ b/frontend/e2e/fixtures/import-file/chart-step-data.ts @@ -9,8 +9,22 @@ export const chartStepData = { ], noCardDateRange: [ { - startDate: '2021-04-07T00:00:00.000+08:00', - endDate: '2021-04-08T23:59:59.999+08:00', + startDate: '2011-04-07T00:00:00.000+08:00', + endDate: '2011-04-08T23:59:59.999+08:00', + }, + { + startDate: '2011-03-07T00:00:00.000+08:00', + endDate: '2011-03-08T23:59:59.999+08:00', + }, + ], + rightDateRange: [ + { + startDate: '2024-01-15T00:00:00.000+08:00', + endDate: '2024-01-16T23:59:59.999+08:00', + }, + { + startDate: '2024-01-17T00:00:00.000+08:00', + endDate: '2024-01-19T23:59:59.999+08:00', }, ], }; diff --git a/frontend/e2e/pages/metrics/config-step.ts b/frontend/e2e/pages/metrics/config-step.ts index c40e4912dd..7ab90047a5 100644 --- a/frontend/e2e/pages/metrics/config-step.ts +++ b/frontend/e2e/pages/metrics/config-step.ts @@ -243,9 +243,9 @@ export class ConfigStep { expect(this.requiredDataErrorMessage).toBeTruthy(); } - async typeInDateRange({ startDate, endDate }: { startDate: string; endDate: string }) { - await this.fromDateInput.fill(startDate); - await this.toDateInput.fill(endDate); + async typeInDateRange({ startDate, endDate, number = 0 }: { startDate: string; endDate: string; number?: number }) { + await this.fromDateInput.nth(number).fill(startDate); + await this.toDateInput.nth(number).fill(endDate); } async validateNextButtonNotClickable() { @@ -279,7 +279,7 @@ export class ConfigStep { } async selectBoardMetricsOnly() { - await this.requiredMetricsLabel.click(); + await this.requiredMetricsLabel.first().click(); await this.velocityCheckbox.click(); await this.classificationCheckbox.click(); await this.cycleTimeCheckbox.click(); diff --git a/frontend/e2e/specs/side-path/charting-unhappy-path.spec.ts b/frontend/e2e/specs/side-path/charting-unhappy-path.spec.ts index 4417b08f7b..5df0156530 100644 --- a/frontend/e2e/specs/side-path/charting-unhappy-path.spec.ts +++ b/frontend/e2e/specs/side-path/charting-unhappy-path.spec.ts @@ -1,4 +1,3 @@ -import { importModifiedCorrectConfig as modifiedCorrectProjectFromFile } from '../../fixtures/import-file/unhappy-path-file'; import { chartStepData } from '../../fixtures/import-file/chart-step-data'; import { test } from '../../fixtures/test-with-extend-fixtures'; import { clearTempDir } from '../../utils/clear-temp-dir'; @@ -9,18 +8,31 @@ test.beforeAll(async () => { }); test('Charting unhappy path on config and metri page', async ({ homePage, configStep, metricsStep }) => { - const rightDateRange = { - startDate: format(modifiedCorrectProjectFromFile.dateRange.startDate), - endDate: format(modifiedCorrectProjectFromFile.dateRange.endDate), + const rightDateRange_frist = { + startDate: format(chartStepData.rightDateRange[0].startDate), + endDate: format(chartStepData.rightDateRange[0].endDate), + number: 0, + }; + const rightDateRange_second = { + startDate: format(chartStepData.rightDateRange[1].startDate), + endDate: format(chartStepData.rightDateRange[1].endDate), + number: 1, }; const errorDateRange = { startDate: format(chartStepData.errorDateRange[0].startDate), endDate: format(chartStepData.errorDateRange[0].endDate), }; - const noCardDateRange = { + const noCardDateRange_frist = { startDate: format(chartStepData.noCardDateRange[0].startDate), endDate: format(chartStepData.noCardDateRange[0].endDate), + number: 0, + }; + + const noCardDateRange_second = { + startDate: format(chartStepData.noCardDateRange[1].startDate), + endDate: format(chartStepData.noCardDateRange[1].endDate), + number: 1, }; await homePage.goto(); @@ -34,26 +46,35 @@ test('Charting unhappy path on config and metri page', async ({ homePage, config await configStep.addNewTimeRange(); await configStep.validateAddNewTimeRangeButtonNotClickable(); await configStep.validateNextButtonNotClickable(); + await configStep.RemoveLastNewPipeline(); await configStep.RemoveLastNewPipeline(); await configStep.RemoveLastNewPipeline(); await configStep.RemoveLastNewPipeline(); await configStep.RemoveLastNewPipeline(); await configStep.validateRemoveTimeRangeButtonIsHidden(); + await configStep.typeInDateRange(errorDateRange); await configStep.checkErrorStratTimeMessage(); await configStep.checkErrorEndTimeMessage(); await configStep.validateNextButtonNotClickable(); - await configStep.typeInDateRange(noCardDateRange); + + await configStep.typeInDateRange(noCardDateRange_frist); + await configStep.addNewTimeRange(); + await configStep.typeInDateRange(noCardDateRange_second); + await configStep.selectAllRequiredMetrics(); + await configStep.selectBoardMetricsOnly(); await configStep.goToMetrics(); - await metricsStep.waitForShown(); - await configStep.validateNextButtonNotClickable(); + await metricsStep.checkBoardNoCard(); + await metricsStep.validateNextButtonNotClickable(); await metricsStep.goToPreviousStep(); - await configStep.typeInDateRange(rightDateRange); + + await configStep.typeInDateRange(rightDateRange_frist); + await configStep.typeInDateRange(rightDateRange_second); + await configStep.selectAllRequiredMetrics(); await configStep.goToMetrics(); - await metricsStep.waitForShown(); await metricsStep.deselectBranch(chartStepData.unSelectBranch); await metricsStep.addBranch(chartStepData.addNewBranch); await metricsStep.checkBranchIsInvalid(); - await configStep.validateNextButtonNotClickable(); + await metricsStep.validateNextButtonNotClickable(); }); From a0c43677dfbc7cc286ef90f6291562b3104e4239 Mon Sep 17 00:00:00 2001 From: yulongcai <141199398+yulongcai@users.noreply.github.com> Date: Mon, 29 Apr 2024 11:48:35 +0800 Subject: [PATCH 53/81] ADM-926-fix:[frontend] fix: add mapping in generate config file (#1422) --- frontend/scripts/generate-config-files.sh | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/frontend/scripts/generate-config-files.sh b/frontend/scripts/generate-config-files.sh index 9469cbfcfa..f81c237cb5 100755 --- a/frontend/scripts/generate-config-files.sh +++ b/frontend/scripts/generate-config-files.sh @@ -44,3 +44,11 @@ sed -i -e "s//${E2E_TOKEN_JIRA/%????/1234}/g" "${import_file_nam sed -i -e "s//${E2E_TOKEN_BUILD_KITE/%????/1234}/g" "${import_file_name}" sed -i -e "s//${E2E_TOKEN_GITHUB/%????/1234}/g" "${import_file_name}" echo "Successfully generate ${import_file_name}" + +import_file_name='./e2e/fixtures/input-files/charting-unhappy-path-config-file.json' +echo "Start to generate ${import_file_name}" +cat ./e2e/fixtures/input-files/charting-unhappy-path-config-file.template.json > "${import_file_name}" +sed -i -e "s//${E2E_TOKEN_JIRA}/g" "${import_file_name}" +sed -i -e "s//${E2E_TOKEN_BUILD_KITE}/g" "${import_file_name}" +sed -i -e "s//${E2E_TOKEN_GITHUB}/g" "${import_file_name}" +echo "Successfully generate ${import_file_name}" From d112ac8910f49f9407d3cd0ab847b512adf5378c Mon Sep 17 00:00:00 2001 From: guzhongren Date: Mon, 29 Apr 2024 23:25:51 +0800 Subject: [PATCH 54/81] ci(e2e): speedup e2e --- .github/workflows/build-and-deploy.yml | 159 +++++++++++++++++++++---- frontend/playwright.config.ts | 19 +-- ops/check.sh | 34 +++++- 3 files changed, 175 insertions(+), 37 deletions(-) diff --git a/.github/workflows/build-and-deploy.yml b/.github/workflows/build-and-deploy.yml index baddaa14aa..21d9d73430 100644 --- a/.github/workflows/build-and-deploy.yml +++ b/.github/workflows/build-and-deploy.yml @@ -446,31 +446,29 @@ jobs: # export SPRING_PROFILES_ACTIVE="e2e" # docker-compose up -d frontend - e2e: - runs-on: ubuntu-latest + buildkite-check: + runs-on: macos-latest needs: - deploy-e2e - container: - image: mcr.microsoft.com/playwright:latest steps: - name: Checkout repo uses: actions/checkout@v4 - with: - node-version: ${{ vars.NODE_VERSION }} - - name: Install - run: | - npm install -g pnpm - - name: Set env - run: echo "HOME=/root" >> $GITHUB_ENV - - name: Install shell deps - run: | - apt-get update && apt-get install -y jq - jq --version - name: Check e2e deployment env: BUILDKITE_TOKEN: ${{ secrets.BUILDKITE_TOKEN }} COMMIT_SHA: ${{ github.sha }} run: ./ops/check.sh buildkite-e2e-deployed + + e2e-google-chrome: + runs-on: macos-latest + needs: + - buildkite-check + steps: + - name: Checkout repo + uses: actions/checkout@v4 + - name: Install + run: | + npm install -g pnpm - name: Run E2E env: APP_ORIGIN: ${{ vars.APP_HTTP_SCHEDULE }}://${{ secrets.AWS_EC2_IP_E2E }}:${{ secrets.AWS_EC2_IP_E2E_FRONTEND_PORT }} @@ -478,27 +476,142 @@ jobs: E2E_TOKEN_BUILD_KITE: ${{ secrets.E2E_TOKEN_BUILD_KITE }} E2E_TOKEN_GITHUB: ${{ secrets.E2E_TOKEN_GITHUB }} E2E_TOKEN_PIPELINE_NO_ORG_CONFIG_BUILDKITE: ${{ secrets.E2E_TOKEN_PIPELINE_NO_ORG_CONFIG_BUILDKITE }} + E2E_PROJECT: "Google Chrome" shell: bash {0} run: ./ops/check.sh e2e - uses: actions/upload-artifact@v4 if: always() with: - name: playwright-report + name: playwright-report-google-chrome path: frontend/e2e/reports/ retention-days: 30 - - name: Slack Notification - uses: rtCamp/action-slack-notify@v2 + + e2e-microsoft-edge: + runs-on: macos-latest + env: + E2E_PLATFORM: "Microsoft Edge" + needs: + - buildkite-check + steps: + - name: Checkout repo + uses: actions/checkout@v4 + - name: Install + run: | + npm install -g pnpm + - name: Run E2E + env: + APP_ORIGIN: ${{ vars.APP_HTTP_SCHEDULE }}://${{ secrets.AWS_EC2_IP_E2E }}:${{ secrets.AWS_EC2_IP_E2E_FRONTEND_PORT }} + E2E_TOKEN_JIRA: ${{ secrets.E2E_TOKEN_JIRA }} + E2E_TOKEN_BUILD_KITE: ${{ secrets.E2E_TOKEN_BUILD_KITE }} + E2E_TOKEN_GITHUB: ${{ secrets.E2E_TOKEN_GITHUB }} + E2E_TOKEN_PIPELINE_NO_ORG_CONFIG_BUILDKITE: ${{ secrets.E2E_TOKEN_PIPELINE_NO_ORG_CONFIG_BUILDKITE }} + E2E_PROJECT: ${{ env.E2E_PLATFORM }} + shell: bash {0} + run: ./ops/check.sh e2e + - uses: actions/upload-artifact@v4 if: always() + with: + name: playwright-report-${{ env.E2E_PLATFORM }} + path: frontend/e2e/reports/ + retention-days: 30 + + e2e-webkit: + runs-on: macos-latest + env: + E2E_PLATFORM: webkit + needs: + - buildkite-check + steps: + - name: Checkout repo + uses: actions/checkout@v4 + - name: Install + run: | + npm install -g pnpm + + - name: Run E2E env: - SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }} - SLACK_ICON_EMOJI: ":heart-beat:" - SLACK_COLOR: ${{ job.status }} - SLACK_USERNAME: "Heartbeat E2E Status" + APP_ORIGIN: ${{ vars.APP_HTTP_SCHEDULE }}://${{ secrets.AWS_EC2_IP_E2E }}:${{ secrets.AWS_EC2_IP_E2E_FRONTEND_PORT }} + E2E_TOKEN_JIRA: ${{ secrets.E2E_TOKEN_JIRA }} + E2E_TOKEN_BUILD_KITE: ${{ secrets.E2E_TOKEN_BUILD_KITE }} + E2E_TOKEN_GITHUB: ${{ secrets.E2E_TOKEN_GITHUB }} + E2E_TOKEN_PIPELINE_NO_ORG_CONFIG_BUILDKITE: ${{ secrets.E2E_TOKEN_PIPELINE_NO_ORG_CONFIG_BUILDKITE }} + E2E_PROJECT: ${{ env.E2E_PLATFORM }} + shell: bash {0} + run: ./ops/check.sh e2e + - uses: actions/upload-artifact@v4 + if: always() + with: + name: playwright-report-${{ env.E2E_PLATFORM }} + path: frontend/e2e/reports/ + retention-days: 30 + + e2e-firefox: + runs-on: macos-latest + env: + E2E_PLATFORM: firefox + needs: + - buildkite-check + steps: + - name: Checkout repo + uses: actions/checkout@v4 + - name: Install + run: | + npm install -g pnpm + + - name: Run E2E + env: + APP_ORIGIN: ${{ vars.APP_HTTP_SCHEDULE }}://${{ secrets.AWS_EC2_IP_E2E }}:${{ secrets.AWS_EC2_IP_E2E_FRONTEND_PORT }} + E2E_TOKEN_JIRA: ${{ secrets.E2E_TOKEN_JIRA }} + E2E_TOKEN_BUILD_KITE: ${{ secrets.E2E_TOKEN_BUILD_KITE }} + E2E_TOKEN_GITHUB: ${{ secrets.E2E_TOKEN_GITHUB }} + E2E_TOKEN_PIPELINE_NO_ORG_CONFIG_BUILDKITE: ${{ secrets.E2E_TOKEN_PIPELINE_NO_ORG_CONFIG_BUILDKITE }} + E2E_PROJECT: ${{ env.E2E_PLATFORM }} + shell: bash {0} + run: ./ops/check.sh e2e + - uses: actions/upload-artifact@v4 + if: always() + with: + name: playwright-report-${{ env.E2E_PLATFORM }} + path: frontend/e2e/reports/ + retention-days: 30 + + e2e-chromium: + runs-on: macos-latest + env: + E2E_PLATFORM: chromium + needs: + - buildkite-check + steps: + - name: Checkout repo + uses: actions/checkout@v4 + - name: Install + run: | + npm install -g pnpm + - name: Run E2E + env: + APP_ORIGIN: ${{ vars.APP_HTTP_SCHEDULE }}://${{ secrets.AWS_EC2_IP_E2E }}:${{ secrets.AWS_EC2_IP_E2E_FRONTEND_PORT }} + E2E_TOKEN_JIRA: ${{ secrets.E2E_TOKEN_JIRA }} + E2E_TOKEN_BUILD_KITE: ${{ secrets.E2E_TOKEN_BUILD_KITE }} + E2E_TOKEN_GITHUB: ${{ secrets.E2E_TOKEN_GITHUB }} + E2E_TOKEN_PIPELINE_NO_ORG_CONFIG_BUILDKITE: ${{ secrets.E2E_TOKEN_PIPELINE_NO_ORG_CONFIG_BUILDKITE }} + E2E_PROJECT: ${{ env.E2E_PLATFORM }} + shell: bash {0} + run: ./ops/check.sh e2e + - uses: actions/upload-artifact@v4 + if: always() + with: + name: playwright-report-${{ env.E2E_PLATFORM }} + path: frontend/e2e/reports/ + retention-days: 30 deploy: runs-on: ubuntu-latest needs: - - e2e + - e2e-chromium + - e2e-webkit + - e2e-firefox + - e2e-microsoft-edge + - e2e-google-chrome steps: - name: Checkout repo # uses: actions/checkout@v4 diff --git a/frontend/playwright.config.ts b/frontend/playwright.config.ts index 08b3e4c619..cf7b267ff6 100644 --- a/frontend/playwright.config.ts +++ b/frontend/playwright.config.ts @@ -26,7 +26,7 @@ export default defineConfig({ /* Retry on CI only */ retries: process.env.CI ? 1 : 0, /* Opt out of parallel tests on CI. */ - workers: process.env.CI ? 1 : undefined, + workers: process.env.CI ? '80%' : undefined, /* Reporter to use. See https://playwright.dev/docs/test-reporters */ outputDir: './e2e/test-results', reporter: [['html', { open: process.env.CI ? 'never' : 'on-failure', outputFolder: './e2e/reports/html' }], ['list']], @@ -35,6 +35,7 @@ export default defineConfig({ /* Base URL to use in actions like `await page.goto('/')`. */ baseURL: process.env.APP_ORIGIN, viewport: VIEWPORT_DEFAULT, + timezoneId: "Asia/Shanghai", /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */ trace: 'on', @@ -53,17 +54,17 @@ export default defineConfig({ use: { ...devices['Desktop Safari'] }, }, - // { - // name: 'firefox', - // use: { ...devices['Desktop Firefox'] }, - // }, - - /* Test against Tablet viewports. */ { - name: 'Tablet', - use: devices['iPad landscape'], + name: 'firefox', + use: { ...devices['Desktop Firefox'] }, }, + /* Test against Tablet viewports. */ + // { + // name: 'Tablet', + // use: devices['iPad landscape'], + // }, + /* Test against branded browsers. */ { name: 'Microsoft Edge', diff --git a/ops/check.sh b/ops/check.sh index 4da9eb1c73..45455935f1 100755 --- a/ops/check.sh +++ b/ops/check.sh @@ -284,15 +284,39 @@ e2e_container_check() { } e2e_check() { - echo "start to run e2e" + local project="${E2E_PROJECT:-Google Chrome}" + echo "start to run e2e for project: ${project}" export TZ=Asia/Shanghai npm install -g pnpm cd frontend pnpm install --no-frozen-lockfile - pnpm exec playwright install - pnpm exec playwright install msedge - pnpm exec playwright install chrome - pnpm run e2e:ci + case "$project" in + "Google Chrome") + echo "Installing Chrome browser" + pnpm exec playwright install chrome + ;; + "Microsoft Edge") + echo "Installing Microsoft Edge browser" + pnpm exec playwright install msedge + ;; + "webkit") + echo "Installing WebKit browser" + pnpm exec playwright install webkit + ;; + "firefox") + echo "Installing WebKit browser" + pnpm exec playwright install firefox + ;; + "chromium") + echo "Installing WebKit browser" + pnpm exec playwright install chromium + ;; + *) + echo "No browser is found for $project type, install default browsers." + pnpm exec playwright install + ;; + esac + pnpm run e2e:ci --project="${project}" } buildkite_status_check() { From 6c7b877f332e219a189e4f585137e37e6ff6ac83 Mon Sep 17 00:00:00 2001 From: guzhongren Date: Mon, 29 Apr 2024 23:30:16 +0800 Subject: [PATCH 55/81] fix(e2e): format --- frontend/playwright.config.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/playwright.config.ts b/frontend/playwright.config.ts index cf7b267ff6..17a48128a7 100644 --- a/frontend/playwright.config.ts +++ b/frontend/playwright.config.ts @@ -35,7 +35,7 @@ export default defineConfig({ /* Base URL to use in actions like `await page.goto('/')`. */ baseURL: process.env.APP_ORIGIN, viewport: VIEWPORT_DEFAULT, - timezoneId: "Asia/Shanghai", + timezoneId: 'Asia/Shanghai', /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */ trace: 'on', From 43866326e6996822d0d041b389114d061dc3c547 Mon Sep 17 00:00:00 2001 From: zhou-yinyuan <147299494+zhou-yinyuan@users.noreply.github.com> Date: Tue, 30 Apr 2024 10:45:05 +0800 Subject: [PATCH 56/81] Adm 937[backend][frontend]: Pipeline crew setting could filter out dependentbot pipeline (#1423) * ADM-937: Change the crew list from buildkite creator to buildkite author * ADM-937: Change filter logic when generating report from creator to author * ADM-937 [frontend]: fix e2e test * ADM-937 [frontend]: fix e2e test * ADM-937 [frontend]: update readme * ADM-937: format code * ADM-937[backend]: fix sonar issue * ADM-937 [frontend]: fix comment --------- Co-authored-by: Enternity <83950478+Enternity-Yu@users.noreply.github.com> --- README.md | 6 ++- README.zh-CN.md | 11 ++--- .../pipeline/buildkite/BuildKiteService.java | 4 +- .../service/report/PipelineService.java | 4 +- .../buildkite/BuildKiteServiceTest.java | 5 ++- .../service/report/PipelineServiceTest.java | 11 +++-- .../e2e/fixtures/create-new/metrics-step.ts | 44 ++++++++++++++++++- .../unhappy-path-config-file.template.json | 22 +++++++++- frontend/e2e/pages/metrics/report-step.ts | 2 - 9 files changed, 89 insertions(+), 20 deletions(-) diff --git a/README.md b/README.md index 4dc2aa139a..643707211d 100644 --- a/README.md +++ b/README.md @@ -294,10 +294,12 @@ _Image 3-19,Settings for Pipeline_ They are sharing the similar settings which you need to specify the pipeline step so that Heartbeat will know in which pipeline and step, team consider it as deploy to PROD. So that we could use it to calculate metrics. | Items | Description | -| ------------- --|----------------------------------------------------------------- | +|---------------|---------------------------------------------------| | Organization | The organization for your pipelines | | Pipeline Name | Your pipeline name | -| Steps | The pipeline step that consider as deploy to PROD || Branches | Your selected branches | +| Steps | The pipeline step that consider as deploy to PROD | +| Branches | Your selected branches | +| Crew setting | Your selected author from github | ## 3.3 Export and import config info diff --git a/README.zh-CN.md b/README.zh-CN.md index 495e3388f4..ceb40bdf96 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -127,11 +127,12 @@ _Image 3-6,Classification Settings_ ![Image 3-7](https://user-images.githubusercontent.com/995849/89784260-f6a08800-db4a-11ea-8ce2-87983363aa18.png)\ _Image 3-7,Settings for Pipeline_ -| Items | Description | -| ------------- | ------------------------ | -| Organization | 您的部署流水线所属的组织 | -| Pipeline Name | 您的流水线名 | -| Steps | 流水线步骤名 | +| Items | Description | +| ------------- |--------------| +| Organization | 你的部署流水线所属的组织 | +| Pipeline Name | 你的流水线名 | +| Steps | 流水线步骤名 | +| Crew setting | 代码提交者 | ## 3.2 导入导出配置信息 diff --git a/backend/src/main/java/heartbeat/service/pipeline/buildkite/BuildKiteService.java b/backend/src/main/java/heartbeat/service/pipeline/buildkite/BuildKiteService.java index 7d4ba73e58..b2c1ce576f 100644 --- a/backend/src/main/java/heartbeat/service/pipeline/buildkite/BuildKiteService.java +++ b/backend/src/main/java/heartbeat/service/pipeline/buildkite/BuildKiteService.java @@ -80,8 +80,8 @@ public List getPipelineStepNames(List buildKiteBuild public List getPipelineCrewNames(List buildKiteBuildInfos) { List buildInfoList = new ArrayList<>(buildKiteBuildInfos.stream() - .filter(buildKiteBuildInfo -> Objects.nonNull(buildKiteBuildInfo.getCreator())) - .map(buildKiteBuildInfo -> buildKiteBuildInfo.getCreator().getName()) + .filter(buildKiteBuildInfo -> Objects.nonNull(buildKiteBuildInfo.getAuthor())) + .map(buildKiteBuildInfo -> buildKiteBuildInfo.getAuthor().getName()) .distinct() .sorted() .toList()); diff --git a/backend/src/main/java/heartbeat/service/report/PipelineService.java b/backend/src/main/java/heartbeat/service/report/PipelineService.java index a60bb92429..df25ec0812 100644 --- a/backend/src/main/java/heartbeat/service/report/PipelineService.java +++ b/backend/src/main/java/heartbeat/service/report/PipelineService.java @@ -150,8 +150,8 @@ private List getBuildKiteBuildInfo(String startTime, String if (!CollectionUtils.isEmpty(pipelineCrews)) { buildKiteBuildInfo = buildKiteBuildInfo.stream() - .filter(info -> ((pipelineCrews.contains("Unknown") && info.getCreator() == null)) - || (info.getCreator() != null && pipelineCrews.contains(info.getCreator().getName()))) + .filter(info -> ((pipelineCrews.contains("Unknown") && info.getAuthor() == null)) + || (info.getAuthor() != null && pipelineCrews.contains(info.getAuthor().getName()))) .toList(); } return buildKiteBuildInfo; diff --git a/backend/src/test/java/heartbeat/service/pipeline/buildkite/BuildKiteServiceTest.java b/backend/src/test/java/heartbeat/service/pipeline/buildkite/BuildKiteServiceTest.java index a686fd522f..87d72a8040 100644 --- a/backend/src/test/java/heartbeat/service/pipeline/buildkite/BuildKiteServiceTest.java +++ b/backend/src/test/java/heartbeat/service/pipeline/buildkite/BuildKiteServiceTest.java @@ -132,7 +132,7 @@ public void shouldReturnResponseWhenFetchPipelineStepsSuccess() { List buildKiteBuildInfoList = new ArrayList<>(); buildKiteBuildInfoList.add(BuildKiteBuildInfo.builder() .jobs(List.of(testJob)) - .author(BuildKiteBuildInfo.Author.builder().name("xx").build()) + .author(BuildKiteBuildInfo.Author.builder().name("author").build()) .creator(BuildKiteBuildInfo.Creator.builder().name("xx").build()) .build()); ResponseEntity> responseEntity = new ResponseEntity<>(buildKiteBuildInfoList, @@ -146,6 +146,9 @@ public void shouldReturnResponseWhenFetchPipelineStepsSuccess() { assertNotNull(pipelineStepsDTO); assertThat(pipelineStepsDTO.getSteps().get(0)).isEqualTo(TEST_JOB_NAME); + assertEquals(2, pipelineStepsDTO.getPipelineCrews().size()); + assertEquals("author", pipelineStepsDTO.getPipelineCrews().get(0)); + assertEquals("Unknown", pipelineStepsDTO.getPipelineCrews().get(1)); } @Test diff --git a/backend/src/test/java/heartbeat/service/report/PipelineServiceTest.java b/backend/src/test/java/heartbeat/service/report/PipelineServiceTest.java index 73b8b980a1..23999b918e 100644 --- a/backend/src/test/java/heartbeat/service/report/PipelineServiceTest.java +++ b/backend/src/test/java/heartbeat/service/report/PipelineServiceTest.java @@ -213,6 +213,7 @@ void shouldReturnEmptyWhenDeploymentEnvListIsEmpty() { void shouldReturnValueWhenDeploymentEnvListIsNotEmpty() { List fakeBuildKiteBuildInfos = List.of(BuildKiteBuildInfo.builder() .creator(BuildKiteBuildInfo.Creator.builder().name("someone").build()) + .author(BuildKiteBuildInfo.Author.builder().name("someone").build()) .build()); GenerateReportRequest request = GenerateReportRequest.builder() .buildKiteSetting(BuildKiteSetting.builder() @@ -235,24 +236,28 @@ void shouldReturnValueWhenDeploymentEnvListIsNotEmpty() { assertEquals(result.getDeployTimesList().size(), 1); assertEquals(result.getBuildInfosList().size(), 1); + assertEquals(1, result.getBuildInfosList().get(0).getValue().size()); + assertEquals("someone", result.getBuildInfosList().get(0).getValue().get(0).getAuthor().getName()); verify(buildKiteService, times(1)).fetchPipelineBuilds(any(), any(), any(), any()); verify(buildKiteService, times(1)).countDeployTimes(any(), any(), any(), any()); } @Test - void shouldFilterCreatorByInputCrews() { + void shouldFilterAuthorsByInputCrews() { List fakeBuildKiteBuildInfos = List.of( BuildKiteBuildInfo.builder() .creator(BuildKiteBuildInfo.Creator.builder().name("test-creator1").build()) + .author(BuildKiteBuildInfo.Author.builder().name("test-author1").build()) .build(), BuildKiteBuildInfo.builder() .creator(BuildKiteBuildInfo.Creator.builder().name("test-creator2").build()) + .author(BuildKiteBuildInfo.Author.builder().name("test-author2").build()) .build(), - BuildKiteBuildInfo.builder().creator(null).build()); + BuildKiteBuildInfo.builder().author(null).build()); GenerateReportRequest request = GenerateReportRequest.builder() .buildKiteSetting(BuildKiteSetting.builder() .deploymentEnvList(List.of(DeploymentEnvironment.builder().id("env1").repository("repo1").build())) - .pipelineCrews(List.of("test-creator2", "test-creator3", "Unknown")) + .pipelineCrews(List.of("test-author2", "test-author3", "Unknown")) .build()) .startTime(MOCK_START_TIME) .endTime(MOCK_END_TIME) diff --git a/frontend/e2e/fixtures/create-new/metrics-step.ts b/frontend/e2e/fixtures/create-new/metrics-step.ts index d6aa3cdd6e..9d916dab9b 100644 --- a/frontend/e2e/fixtures/create-new/metrics-step.ts +++ b/frontend/e2e/fixtures/create-new/metrics-step.ts @@ -48,7 +48,27 @@ export const config = { 'Yunsong Yang', ], assigneeFilter: 'lastAssignee', - pipelineCrews: ['guzhongren', 'heartbeat-user', 'Unknown'], + pipelineCrews: [ + 'Chao', + 'GuangbinMa', + 'JiangRu1', + 'Jianxun.Ma', + 'Nathan Wang', + 'Steveay', + 'Yunsong', + 'andrea999', + 'guzhongren', + 'junbo dai', + 'junbo.dai', + 'mjx20045912', + 'neomgb', + 'sqsq5566', + 'weiran.sun', + 'xuebing', + 'yichen.wang', + '李雪冰', + 'Unknown', + ], cycleTime: { type: 'byColumn', jiraColumns: [ @@ -146,7 +166,27 @@ export const modifiedConfig = { }, crews: ['heartbeat user', 'Weiran Sun'], assigneeFilter: 'lastAssignee', - pipelineCrews: ['guzhongren', 'heartbeat-user'], + pipelineCrews: [ + 'Chao', + 'GuangbinMa', + 'JiangRu1', + 'Jianxun.Ma', + 'Nathan Wang', + 'Steveay', + 'Yunsong', + 'andrea999', + 'guzhongren', + 'junbo dai', + 'junbo.dai', + 'mjx20045912', + 'neomgb', + 'sqsq5566', + 'weiran.sun', + 'xuebing', + 'yichen.wang', + '李雪冰', + 'Unknown', + ], cycleTime: { type: 'byStatus', jiraColumns: [ diff --git a/frontend/e2e/fixtures/input-files/unhappy-path-config-file.template.json b/frontend/e2e/fixtures/input-files/unhappy-path-config-file.template.json index b3c0348aa2..52056366a2 100644 --- a/frontend/e2e/fixtures/input-files/unhappy-path-config-file.template.json +++ b/frontend/e2e/fixtures/input-files/unhappy-path-config-file.template.json @@ -32,7 +32,27 @@ }, "crews": [], "assigneeFilter": "lastAssignee", - "pipelineCrews": ["heartbeat-user", "guzhongren", "Unknown"], + "pipelineCrews": [ + "Chao", + "GuangbinMa", + "JiangRu1", + "Jianxun.Ma", + "Nathan Wang", + "Steveay", + "Yunsong", + "andrea999", + "guzhongren", + "junbo dai", + "junbo.dai", + "mjx20045912", + "neomgb", + "sqsq5566", + "weiran.sun", + "xuebing", + "yichen.wang", + "李雪冰", + "Unknown" + ], "cycleTime": { "type": "byColumn", "jiraColumns": [ diff --git a/frontend/e2e/pages/metrics/report-step.ts b/frontend/e2e/pages/metrics/report-step.ts index 71b3d6515c..043b22c92e 100644 --- a/frontend/e2e/pages/metrics/report-step.ts +++ b/frontend/e2e/pages/metrics/report-step.ts @@ -103,8 +103,6 @@ export class ReportStep { await expect(this.leadTimeForChangesRows.nth(3)).toContainText(this.combineStrings(['Pipeline Lead Time', '0.50'])); await expect(this.leadTimeForChangesRows.nth(4)).toContainText(this.combineStrings(['Total Lead Time', '6.62'])); - await expect(this.leadTimeForChangesRows.nth(4)).toContainText(this.combineStrings(['Total Lead Time', '6.62'])); - await expect(this.devChangeFailureRateRows.getByRole('cell').nth(0)).toContainText('Heartbeat/ Deploy prod'); await expect(this.devChangeFailureRateRows.getByRole('cell').nth(1)).toContainText('17.50%(7/40)'); await expect(this.devMeanTimeToRecoveryRows.getByRole('cell').nth(0)).toContainText('Heartbeat/ Deploy prod'); From 0684495882dbbb694baf8056b908bfc17a8653b8 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 30 Apr 2024 11:28:32 +0800 Subject: [PATCH 57/81] chore(deps): update gradle/gradle-build-action action to v3.3.2 (#1416) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/workflows/Release.yaml | 2 +- .github/workflows/build-and-deploy.yml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/Release.yaml b/.github/workflows/Release.yaml index 14bd37a3ec..c23cc09575 100644 --- a/.github/workflows/Release.yaml +++ b/.github/workflows/Release.yaml @@ -24,7 +24,7 @@ jobs: - name: Validate Gradle wrapper uses: gradle/wrapper-validation-action@v3 - name: Set up Gradle - uses: gradle/gradle-build-action@v3.3.1 + uses: gradle/gradle-build-action@v3.3.2 - name: Build run: ./gradlew clean build - uses: actions/upload-artifact@v4 diff --git a/.github/workflows/build-and-deploy.yml b/.github/workflows/build-and-deploy.yml index 21d9d73430..8a97159263 100644 --- a/.github/workflows/build-and-deploy.yml +++ b/.github/workflows/build-and-deploy.yml @@ -91,7 +91,7 @@ jobs: - name: Validate Gradle wrapper uses: gradle/wrapper-validation-action@v3 - name: Set up Gradle - uses: gradle/gradle-build-action@v3.3.1 + uses: gradle/gradle-build-action@v3.3.2 - name: Test and check run: ./gradlew clean check - name: Build @@ -120,7 +120,7 @@ jobs: - name: Validate Gradle wrapper uses: gradle/wrapper-validation-action@v3 - name: Set up Gradle - uses: gradle/gradle-build-action@v3.3.1 + uses: gradle/gradle-build-action@v3.3.2 - name: License check run: ./gradlew clean checkLicense - uses: actions/upload-artifact@v4 From 3f82e95328a5735fde4bd3f49e6776fc3e5ea31b Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 30 Apr 2024 12:11:20 +0800 Subject: [PATCH 58/81] fix(deps): update dependency @emotion/styled to v11.11.5 (#1417)[frontend] Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- frontend/pnpm-lock.yaml | 1224 +++++++++++++++++++++------------------ 1 file changed, 664 insertions(+), 560 deletions(-) diff --git a/frontend/pnpm-lock.yaml b/frontend/pnpm-lock.yaml index 25d9649a97..fa626306d1 100644 --- a/frontend/pnpm-lock.yaml +++ b/frontend/pnpm-lock.yaml @@ -10,7 +10,7 @@ dependencies: version: 11.11.4(@types/react@18.2.67)(react@18.2.0) '@emotion/styled': specifier: ^11.11.0 - version: 11.11.0(@emotion/react@11.11.4)(@types/react@18.2.67)(react@18.2.0) + version: 11.11.5(@emotion/react@11.11.4)(@types/react@18.2.67)(react@18.2.0) '@fontsource/roboto': specifier: ^5.0.12 version: 5.0.12 @@ -22,10 +22,10 @@ dependencies: version: 5.15.14(@mui/material@5.15.14)(@types/react@18.2.67)(react@18.2.0) '@mui/material': specifier: ^5.15.14 - version: 5.15.14(@emotion/react@11.11.4)(@emotion/styled@11.11.0)(@types/react@18.2.67)(react-dom@18.2.0)(react@18.2.0) + version: 5.15.14(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.2.67)(react-dom@18.2.0)(react@18.2.0) '@mui/x-date-pickers': specifier: ^7.0.0 - version: 7.0.0(@emotion/react@11.11.4)(@emotion/styled@11.11.0)(@mui/material@5.15.14)(@types/react@18.2.67)(dayjs@1.11.10)(react-dom@18.2.0)(react@18.2.0) + version: 7.0.0(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@mui/material@5.15.14)(@types/react@18.2.67)(dayjs@1.11.10)(react-dom@18.2.0)(react@18.2.0) '@reduxjs/toolkit': specifier: ^2.2.2 version: 2.2.2(react-redux@9.1.0)(react@18.2.0) @@ -67,7 +67,7 @@ dependencies: version: 5.2.6(@types/node@20.11.30) vite-plugin-pwa: specifier: ^0.19.5 - version: 0.19.5(vite@5.2.6)(workbox-build@7.0.0)(workbox-window@7.0.0) + version: 0.19.5(vite@5.2.6)(workbox-build@7.1.0)(workbox-window@7.1.0) yup: specifier: ^1.4.0 version: 1.4.0 @@ -87,7 +87,7 @@ devDependencies: version: 14.2.2(react-dom@18.2.0)(react@18.2.0) '@testing-library/user-event': specifier: ^14.5.2 - version: 14.5.2(@testing-library/dom@9.3.4) + version: 14.5.2(@testing-library/dom@10.1.0) '@types/jest': specifier: ^29.5.12 version: 29.5.12 @@ -215,13 +215,13 @@ packages: '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 - /@apideck/better-ajv-errors@0.3.6(ajv@8.12.0): + /@apideck/better-ajv-errors@0.3.6(ajv@8.13.0): resolution: {integrity: sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==} engines: {node: '>=10'} peerDependencies: ajv: '>=8' dependencies: - ajv: 8.12.0 + ajv: 8.13.0 json-schema: 0.4.0 jsonpointer: 5.0.1 leven: 3.1.0 @@ -266,20 +266,20 @@ packages: - supports-color dev: true - /@babel/core@7.24.4: - resolution: {integrity: sha512-MBVlMXP+kkl5394RBLSxxk/iLTeVGuXTV3cIDXavPpMMqnSnt6apKgan/U8O3USWZCWZT/TbgfEpKa4uMgN4Dg==} + /@babel/core@7.24.5: + resolution: {integrity: sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA==} engines: {node: '>=6.9.0'} dependencies: '@ampproject/remapping': 2.3.0 '@babel/code-frame': 7.24.2 - '@babel/generator': 7.24.4 + '@babel/generator': 7.24.5 '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.4) - '@babel/helpers': 7.24.4 - '@babel/parser': 7.24.4 + '@babel/helper-module-transforms': 7.24.5(@babel/core@7.24.5) + '@babel/helpers': 7.24.5 + '@babel/parser': 7.24.5 '@babel/template': 7.24.0 - '@babel/traverse': 7.24.1 - '@babel/types': 7.24.0 + '@babel/traverse': 7.24.5 + '@babel/types': 7.24.5 convert-source-map: 2.0.0 debug: 4.3.4 gensync: 1.0.0-beta.2 @@ -297,12 +297,13 @@ packages: '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 jsesc: 2.5.2 + dev: true - /@babel/generator@7.24.4: - resolution: {integrity: sha512-Xd6+v6SnjWVx/nus+y0l1sxMOTOMBkyL4+BIdbALyatQnAe/SRVjANeDPSCYaX+i1iJmuGSKf3Z+E+V/va1Hvw==} + /@babel/generator@7.24.5: + resolution: {integrity: sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.24.0 + '@babel/types': 7.24.5 '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 jsesc: 2.5.2 @@ -312,14 +313,14 @@ packages: resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.24.0 + '@babel/types': 7.24.5 dev: false /@babel/helper-builder-binary-assignment-operator-visitor@7.22.15: resolution: {integrity: sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.24.0 + '@babel/types': 7.24.5 dev: false /@babel/helper-compilation-targets@7.23.6: @@ -332,44 +333,44 @@ packages: lru-cache: 5.1.1 semver: 6.3.1 - /@babel/helper-create-class-features-plugin@7.24.4(@babel/core@7.24.4): - resolution: {integrity: sha512-lG75yeuUSVu0pIcbhiYMXBXANHrpUPaOfu7ryAzskCgKUHuAxRQI5ssrtmF0X9UXldPlvT0XM/A4F44OXRt6iQ==} + /@babel/helper-create-class-features-plugin@7.24.5(@babel/core@7.24.5): + resolution: {integrity: sha512-uRc4Cv8UQWnE4NXlYTIIdM7wfFkOqlFztcC/gVXDKohKoVB3OyonfelUBaJzSwpBntZ2KYGF/9S7asCHsXwW6g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.4 + '@babel/core': 7.24.5 '@babel/helper-annotate-as-pure': 7.22.5 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-function-name': 7.23.0 - '@babel/helper-member-expression-to-functions': 7.23.0 + '@babel/helper-member-expression-to-functions': 7.24.5 '@babel/helper-optimise-call-expression': 7.22.5 - '@babel/helper-replace-supers': 7.24.1(@babel/core@7.24.4) + '@babel/helper-replace-supers': 7.24.1(@babel/core@7.24.5) '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 + '@babel/helper-split-export-declaration': 7.24.5 semver: 6.3.1 dev: false - /@babel/helper-create-regexp-features-plugin@7.22.15(@babel/core@7.24.4): + /@babel/helper-create-regexp-features-plugin@7.22.15(@babel/core@7.24.5): resolution: {integrity: sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.4 + '@babel/core': 7.24.5 '@babel/helper-annotate-as-pure': 7.22.5 regexpu-core: 5.3.2 semver: 6.3.1 dev: false - /@babel/helper-define-polyfill-provider@0.6.1(@babel/core@7.24.4): - resolution: {integrity: sha512-o7SDgTJuvx5vLKD6SFvkydkSMBvahDKGiNJzG22IZYXhiqoe9efY7zocICBgzHV4IRg5wdgl2nEL/tulKIEIbA==} + /@babel/helper-define-polyfill-provider@0.6.2(@babel/core@7.24.5): + resolution: {integrity: sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: - '@babel/core': 7.24.4 + '@babel/core': 7.24.5 '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.5 debug: 4.3.4 lodash.debounce: 4.0.8 resolve: 1.22.8 @@ -394,18 +395,18 @@ packages: dependencies: '@babel/types': 7.24.0 - /@babel/helper-member-expression-to-functions@7.23.0: - resolution: {integrity: sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==} + /@babel/helper-member-expression-to-functions@7.24.5: + resolution: {integrity: sha512-4owRteeihKWKamtqg4JmWSsEZU445xpFRXPEwp44HbgbxdWlUV1b4Agg4lkA806Lil5XM/e+FJyS0vj5T6vmcA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.24.0 + '@babel/types': 7.24.5 dev: false /@babel/helper-module-imports@7.24.3: resolution: {integrity: sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.24.0 + '@babel/types': 7.24.5 /@babel/helper-module-transforms@7.23.3(@babel/core@7.24.3): resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} @@ -421,52 +422,57 @@ packages: '@babel/helper-validator-identifier': 7.22.20 dev: true - /@babel/helper-module-transforms@7.23.3(@babel/core@7.24.4): - resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} + /@babel/helper-module-transforms@7.24.5(@babel/core@7.24.5): + resolution: {integrity: sha512-9GxeY8c2d2mdQUP1Dye0ks3VDyIMS98kt/llQ2nUId8IsWqTF0l1LkSX0/uP7l7MCDrzXS009Hyhe2gzTiGW8A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.4 + '@babel/core': 7.24.5 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-module-imports': 7.24.3 - '@babel/helper-simple-access': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/helper-validator-identifier': 7.22.20 + '@babel/helper-simple-access': 7.24.5 + '@babel/helper-split-export-declaration': 7.24.5 + '@babel/helper-validator-identifier': 7.24.5 dev: false /@babel/helper-optimise-call-expression@7.22.5: resolution: {integrity: sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.24.0 + '@babel/types': 7.24.5 dev: false /@babel/helper-plugin-utils@7.24.0: resolution: {integrity: sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==} engines: {node: '>=6.9.0'} - /@babel/helper-remap-async-to-generator@7.22.20(@babel/core@7.24.4): + /@babel/helper-plugin-utils@7.24.5: + resolution: {integrity: sha512-xjNLDopRzW2o6ba0gKbkZq5YWEBaK3PCyTOY1K2P/O07LGMhMqlMXPxwN4S5/RhWuCobT8z0jrlKGlYmeR1OhQ==} + engines: {node: '>=6.9.0'} + dev: false + + /@babel/helper-remap-async-to-generator@7.22.20(@babel/core@7.24.5): resolution: {integrity: sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.4 + '@babel/core': 7.24.5 '@babel/helper-annotate-as-pure': 7.22.5 '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-wrap-function': 7.22.20 + '@babel/helper-wrap-function': 7.24.5 dev: false - /@babel/helper-replace-supers@7.24.1(@babel/core@7.24.4): + /@babel/helper-replace-supers@7.24.1(@babel/core@7.24.5): resolution: {integrity: sha512-QCR1UqC9BzG5vZl8BMicmZ28RuUBnHhAMddD8yHFHDRH9lLTZ9uUPehX8ctVPT8l0TKblJidqcgUUKGVrePleQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.4 + '@babel/core': 7.24.5 '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-member-expression-to-functions': 7.23.0 + '@babel/helper-member-expression-to-functions': 7.24.5 '@babel/helper-optimise-call-expression': 7.22.5 dev: false @@ -475,12 +481,20 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.24.0 + dev: true + + /@babel/helper-simple-access@7.24.5: + resolution: {integrity: sha512-uH3Hmf5q5n7n8mz7arjUlDOCbttY/DW4DYhE6FUsjKJ/oYC1kQQUvwEQWxRwUpX9qQKRXeqLwWxrqilMrf32sQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.5 + dev: false /@babel/helper-skip-transparent-expression-wrappers@7.22.5: resolution: {integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.24.0 + '@babel/types': 7.24.5 dev: false /@babel/helper-split-export-declaration@7.22.6: @@ -488,6 +502,14 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.24.0 + dev: true + + /@babel/helper-split-export-declaration@7.24.5: + resolution: {integrity: sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.5 + dev: false /@babel/helper-string-parser@7.24.1: resolution: {integrity: sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==} @@ -497,17 +519,21 @@ packages: resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} engines: {node: '>=6.9.0'} + /@babel/helper-validator-identifier@7.24.5: + resolution: {integrity: sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA==} + engines: {node: '>=6.9.0'} + /@babel/helper-validator-option@7.23.5: resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} engines: {node: '>=6.9.0'} - /@babel/helper-wrap-function@7.22.20: - resolution: {integrity: sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==} + /@babel/helper-wrap-function@7.24.5: + resolution: {integrity: sha512-/xxzuNvgRl4/HLNKvnFwdhdgN3cpLxgLROeLDl83Yx0AJ1SGvq1ak0OszTOjDfiB8Vx03eJbeDWh9r+jCCWttw==} engines: {node: '>=6.9.0'} dependencies: '@babel/helper-function-name': 7.23.0 '@babel/template': 7.24.0 - '@babel/types': 7.24.0 + '@babel/types': 7.24.5 dev: false /@babel/helpers@7.24.1: @@ -521,13 +547,13 @@ packages: - supports-color dev: true - /@babel/helpers@7.24.4: - resolution: {integrity: sha512-FewdlZbSiwaVGlgT1DPANDuCHaDMiOo+D/IDYRFYjHOuv66xMSJ7fQwwODwRNAPkADIO/z1EoF/l2BCWlWABDw==} + /@babel/helpers@7.24.5: + resolution: {integrity: sha512-CiQmBMMpMQHwM5m01YnrM6imUG1ebgYJ+fAIW4FZe6m4qHTPaRHti+R8cggAwkdz4oXhtO4/K9JWlh+8hIfR2Q==} engines: {node: '>=6.9.0'} dependencies: '@babel/template': 7.24.0 - '@babel/traverse': 7.24.1 - '@babel/types': 7.24.0 + '@babel/traverse': 7.24.5 + '@babel/types': 7.24.5 transitivePeerDependencies: - supports-color dev: false @@ -548,65 +574,65 @@ packages: dependencies: '@babel/types': 7.24.0 - /@babel/parser@7.24.4: - resolution: {integrity: sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==} + /@babel/parser@7.24.5: + resolution: {integrity: sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==} engines: {node: '>=6.0.0'} hasBin: true dependencies: - '@babel/types': 7.24.0 + '@babel/types': 7.24.5 dev: false - /@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.24.4(@babel/core@7.24.4): - resolution: {integrity: sha512-qpl6vOOEEzTLLcsuqYYo8yDtrTocmu2xkGvgNebvPjT9DTtfFYGmgDqY+rBYXNlqL4s9qLDn6xkrJv4RxAPiTA==} + /@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.24.5(@babel/core@7.24.5): + resolution: {integrity: sha512-LdXRi1wEMTrHVR4Zc9F8OewC3vdm5h4QB6L71zy6StmYeqGi1b3ttIO8UC+BfZKcH9jdr4aI249rBkm+3+YvHw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.4 + '@babel/core': 7.24.5 '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.5 dev: false - /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.24.1(@babel/core@7.24.4): + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.24.1(@babel/core@7.24.5): resolution: {integrity: sha512-y4HqEnkelJIOQGd+3g1bTeKsA5c6qM7eOn7VggGVbBc0y8MLSKHacwcIE2PplNlQSj0PqS9rrXL/nkPVK+kUNg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.24.5 + '@babel/helper-plugin-utils': 7.24.5 dev: false - /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.24.1(@babel/core@7.24.4): + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.24.1(@babel/core@7.24.5): resolution: {integrity: sha512-Hj791Ii4ci8HqnaKHAlLNs+zaLXb0EzSDhiAWp5VNlyvCNymYfacs64pxTxbH1znW/NcArSmwpmG9IKE/TUVVQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.13.0 dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.24.5 + '@babel/helper-plugin-utils': 7.24.5 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-transform-optional-chaining': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-optional-chaining': 7.24.5(@babel/core@7.24.5) dev: false - /@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.24.1(@babel/core@7.24.4): + /@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.24.1(@babel/core@7.24.5): resolution: {integrity: sha512-m9m/fXsXLiHfwdgydIFnpk+7jlVbnvlK5B2EKiPdLUb6WX654ZaaEWJUjk8TftRbZpK0XibovlLWX4KIZhV6jw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.4 + '@babel/core': 7.24.5 '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.5 dev: false - /@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.24.4): + /@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.24.5): resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.4 + '@babel/core': 7.24.5 dev: false /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.24.3): @@ -618,12 +644,12 @@ packages: '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.24.4): + /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.24.5): resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.4 + '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.24.0 dev: false @@ -645,61 +671,61 @@ packages: '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.24.4): + /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.24.5): resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.4 + '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.24.0 dev: false - /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.24.4): + /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.24.5): resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.24.5 + '@babel/helper-plugin-utils': 7.24.5 dev: false - /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.24.4): + /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.24.5): resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.24.5 + '@babel/helper-plugin-utils': 7.24.5 dev: false - /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.24.4): + /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.24.5): resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.24.5 + '@babel/helper-plugin-utils': 7.24.5 dev: false - /@babel/plugin-syntax-import-assertions@7.24.1(@babel/core@7.24.4): + /@babel/plugin-syntax-import-assertions@7.24.1(@babel/core@7.24.5): resolution: {integrity: sha512-IuwnI5XnuF189t91XbxmXeCDz3qs6iDRO7GJ++wcfgeXNs/8FmIlKcpDSXNVyuLQxlwvskmI3Ct73wUODkJBlQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.24.5 + '@babel/helper-plugin-utils': 7.24.5 dev: false - /@babel/plugin-syntax-import-attributes@7.24.1(@babel/core@7.24.4): + /@babel/plugin-syntax-import-attributes@7.24.1(@babel/core@7.24.5): resolution: {integrity: sha512-zhQTMH0X2nVLnb04tz+s7AMuasX8U0FnpE+nHTOhSOINjWMnopoZTxtIKsd45n4GQ/HIZLyfIpoul8e2m0DnRA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.24.5 + '@babel/helper-plugin-utils': 7.24.5 dev: false /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.24.3): @@ -711,12 +737,12 @@ packages: '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.24.4): + /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.24.5): resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.4 + '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.24.0 dev: false @@ -729,12 +755,12 @@ packages: '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.24.4): + /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.24.5): resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.4 + '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.24.0 dev: false @@ -757,12 +783,12 @@ packages: '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.24.4): + /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.24.5): resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.4 + '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.24.0 dev: false @@ -775,12 +801,12 @@ packages: '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.24.4): + /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.24.5): resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.4 + '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.24.0 dev: false @@ -793,12 +819,12 @@ packages: '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.24.4): + /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.24.5): resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.4 + '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.24.0 dev: false @@ -811,12 +837,12 @@ packages: '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.24.4): + /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.24.5): resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.4 + '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.24.0 dev: false @@ -829,12 +855,12 @@ packages: '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.24.4): + /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.24.5): resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.4 + '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.24.0 dev: false @@ -847,23 +873,23 @@ packages: '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.24.4): + /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.24.5): resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.4 + '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.24.0 dev: false - /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.24.4): + /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.24.5): resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.24.5 + '@babel/helper-plugin-utils': 7.24.5 dev: false /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.24.3): @@ -876,13 +902,13 @@ packages: '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.24.4): + /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.24.5): resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.4 + '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.24.0 dev: false @@ -896,648 +922,648 @@ packages: '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.24.4): + /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.24.5): resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.4 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.4) - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.24.5 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.5) + '@babel/helper-plugin-utils': 7.24.5 dev: false - /@babel/plugin-transform-arrow-functions@7.24.1(@babel/core@7.24.4): + /@babel/plugin-transform-arrow-functions@7.24.1(@babel/core@7.24.5): resolution: {integrity: sha512-ngT/3NkRhsaep9ck9uj2Xhv9+xB1zShY3tM3g6om4xxCELwCDN4g4Aq5dRn48+0hasAql7s2hdBOysCfNpr4fw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.24.5 + '@babel/helper-plugin-utils': 7.24.5 dev: false - /@babel/plugin-transform-async-generator-functions@7.24.3(@babel/core@7.24.4): + /@babel/plugin-transform-async-generator-functions@7.24.3(@babel/core@7.24.5): resolution: {integrity: sha512-Qe26CMYVjpQxJ8zxM1340JFNjZaF+ISWpr1Kt/jGo+ZTUzKkfw/pphEWbRCb+lmSM6k/TOgfYLvmbHkUQ0asIg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.4 + '@babel/core': 7.24.5 '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-plugin-utils': 7.24.0 - '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.24.4) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.4) + '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.24.5) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.5) dev: false - /@babel/plugin-transform-async-to-generator@7.24.1(@babel/core@7.24.4): + /@babel/plugin-transform-async-to-generator@7.24.1(@babel/core@7.24.5): resolution: {integrity: sha512-AawPptitRXp1y0n4ilKcGbRYWfbbzFWz2NqNu7dacYDtFtz0CMjG64b3LQsb3KIgnf4/obcUL78hfaOS7iCUfw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.4 + '@babel/core': 7.24.5 '@babel/helper-module-imports': 7.24.3 - '@babel/helper-plugin-utils': 7.24.0 - '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.24.4) + '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.24.5) dev: false - /@babel/plugin-transform-block-scoped-functions@7.24.1(@babel/core@7.24.4): + /@babel/plugin-transform-block-scoped-functions@7.24.1(@babel/core@7.24.5): resolution: {integrity: sha512-TWWC18OShZutrv9C6mye1xwtam+uNi2bnTOCBUd5sZxyHOiWbU6ztSROofIMrK84uweEZC219POICK/sTYwfgg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.24.5 + '@babel/helper-plugin-utils': 7.24.5 dev: false - /@babel/plugin-transform-block-scoping@7.24.4(@babel/core@7.24.4): - resolution: {integrity: sha512-nIFUZIpGKDf9O9ttyRXpHFpKC+X3Y5mtshZONuEUYBomAKoM4y029Jr+uB1bHGPhNmK8YXHevDtKDOLmtRrp6g==} + /@babel/plugin-transform-block-scoping@7.24.5(@babel/core@7.24.5): + resolution: {integrity: sha512-sMfBc3OxghjC95BkYrYocHL3NaOplrcaunblzwXhGmlPwpmfsxr4vK+mBBt49r+S240vahmv+kUxkeKgs+haCw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.24.5 + '@babel/helper-plugin-utils': 7.24.5 dev: false - /@babel/plugin-transform-class-properties@7.24.1(@babel/core@7.24.4): + /@babel/plugin-transform-class-properties@7.24.1(@babel/core@7.24.5): resolution: {integrity: sha512-OMLCXi0NqvJfORTaPQBwqLXHhb93wkBKZ4aNwMl6WtehO7ar+cmp+89iPEQPqxAnxsOKTaMcs3POz3rKayJ72g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.4 - '@babel/helper-create-class-features-plugin': 7.24.4(@babel/core@7.24.4) - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.24.5 + '@babel/helper-create-class-features-plugin': 7.24.5(@babel/core@7.24.5) + '@babel/helper-plugin-utils': 7.24.5 dev: false - /@babel/plugin-transform-class-static-block@7.24.4(@babel/core@7.24.4): + /@babel/plugin-transform-class-static-block@7.24.4(@babel/core@7.24.5): resolution: {integrity: sha512-B8q7Pz870Hz/q9UgP8InNpY01CSLDSCyqX7zcRuv3FcPl87A2G17lASroHWaCtbdIcbYzOZ7kWmXFKbijMSmFg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.12.0 dependencies: - '@babel/core': 7.24.4 - '@babel/helper-create-class-features-plugin': 7.24.4(@babel/core@7.24.4) - '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.24.4) + '@babel/core': 7.24.5 + '@babel/helper-create-class-features-plugin': 7.24.5(@babel/core@7.24.5) + '@babel/helper-plugin-utils': 7.24.5 + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.24.5) dev: false - /@babel/plugin-transform-classes@7.24.1(@babel/core@7.24.4): - resolution: {integrity: sha512-ZTIe3W7UejJd3/3R4p7ScyyOoafetUShSf4kCqV0O7F/RiHxVj/wRaRnQlrGwflvcehNA8M42HkAiEDYZu2F1Q==} + /@babel/plugin-transform-classes@7.24.5(@babel/core@7.24.5): + resolution: {integrity: sha512-gWkLP25DFj2dwe9Ck8uwMOpko4YsqyfZJrOmqqcegeDYEbp7rmn4U6UQZNj08UF6MaX39XenSpKRCvpDRBtZ7Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.4 + '@babel/core': 7.24.5 '@babel/helper-annotate-as-pure': 7.22.5 '@babel/helper-compilation-targets': 7.23.6 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-function-name': 7.23.0 - '@babel/helper-plugin-utils': 7.24.0 - '@babel/helper-replace-supers': 7.24.1(@babel/core@7.24.4) - '@babel/helper-split-export-declaration': 7.22.6 + '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-replace-supers': 7.24.1(@babel/core@7.24.5) + '@babel/helper-split-export-declaration': 7.24.5 globals: 11.12.0 dev: false - /@babel/plugin-transform-computed-properties@7.24.1(@babel/core@7.24.4): + /@babel/plugin-transform-computed-properties@7.24.1(@babel/core@7.24.5): resolution: {integrity: sha512-5pJGVIUfJpOS+pAqBQd+QMaTD2vCL/HcePooON6pDpHgRp4gNRmzyHTPIkXntwKsq3ayUFVfJaIKPw2pOkOcTw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.24.5 + '@babel/helper-plugin-utils': 7.24.5 '@babel/template': 7.24.0 dev: false - /@babel/plugin-transform-destructuring@7.24.1(@babel/core@7.24.4): - resolution: {integrity: sha512-ow8jciWqNxR3RYbSNVuF4U2Jx130nwnBnhRw6N6h1bOejNkABmcI5X5oz29K4alWX7vf1C+o6gtKXikzRKkVdw==} + /@babel/plugin-transform-destructuring@7.24.5(@babel/core@7.24.5): + resolution: {integrity: sha512-SZuuLyfxvsm+Ah57I/i1HVjveBENYK9ue8MJ7qkc7ndoNjqquJiElzA7f5yaAXjyW2hKojosOTAQQRX50bPSVg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.24.5 + '@babel/helper-plugin-utils': 7.24.5 dev: false - /@babel/plugin-transform-dotall-regex@7.24.1(@babel/core@7.24.4): + /@babel/plugin-transform-dotall-regex@7.24.1(@babel/core@7.24.5): resolution: {integrity: sha512-p7uUxgSoZwZ2lPNMzUkqCts3xlp8n+o05ikjy7gbtFJSt9gdU88jAmtfmOxHM14noQXBxfgzf2yRWECiNVhTCw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.4 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.4) - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.24.5 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.5) + '@babel/helper-plugin-utils': 7.24.5 dev: false - /@babel/plugin-transform-duplicate-keys@7.24.1(@babel/core@7.24.4): + /@babel/plugin-transform-duplicate-keys@7.24.1(@babel/core@7.24.5): resolution: {integrity: sha512-msyzuUnvsjsaSaocV6L7ErfNsa5nDWL1XKNnDePLgmz+WdU4w/J8+AxBMrWfi9m4IxfL5sZQKUPQKDQeeAT6lA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.24.5 + '@babel/helper-plugin-utils': 7.24.5 dev: false - /@babel/plugin-transform-dynamic-import@7.24.1(@babel/core@7.24.4): + /@babel/plugin-transform-dynamic-import@7.24.1(@babel/core@7.24.5): resolution: {integrity: sha512-av2gdSTyXcJVdI+8aFZsCAtR29xJt0S5tas+Ef8NvBNmD1a+N/3ecMLeMBgfcK+xzsjdLDT6oHt+DFPyeqUbDA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.24.4) + '@babel/core': 7.24.5 + '@babel/helper-plugin-utils': 7.24.5 + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.24.5) dev: false - /@babel/plugin-transform-exponentiation-operator@7.24.1(@babel/core@7.24.4): + /@babel/plugin-transform-exponentiation-operator@7.24.1(@babel/core@7.24.5): resolution: {integrity: sha512-U1yX13dVBSwS23DEAqU+Z/PkwE9/m7QQy8Y9/+Tdb8UWYaGNDYwTLi19wqIAiROr8sXVum9A/rtiH5H0boUcTw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.4 + '@babel/core': 7.24.5 '@babel/helper-builder-binary-assignment-operator-visitor': 7.22.15 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.5 dev: false - /@babel/plugin-transform-export-namespace-from@7.24.1(@babel/core@7.24.4): + /@babel/plugin-transform-export-namespace-from@7.24.1(@babel/core@7.24.5): resolution: {integrity: sha512-Ft38m/KFOyzKw2UaJFkWG9QnHPG/Q/2SkOrRk4pNBPg5IPZ+dOxcmkK5IyuBcxiNPyyYowPGUReyBvrvZs7IlQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.24.4) + '@babel/core': 7.24.5 + '@babel/helper-plugin-utils': 7.24.5 + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.24.5) dev: false - /@babel/plugin-transform-for-of@7.24.1(@babel/core@7.24.4): + /@babel/plugin-transform-for-of@7.24.1(@babel/core@7.24.5): resolution: {integrity: sha512-OxBdcnF04bpdQdR3i4giHZNZQn7cm8RQKcSwA17wAAqEELo1ZOwp5FFgeptWUQXFyT9kwHo10aqqauYkRZPCAg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.24.5 + '@babel/helper-plugin-utils': 7.24.5 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 dev: false - /@babel/plugin-transform-function-name@7.24.1(@babel/core@7.24.4): + /@babel/plugin-transform-function-name@7.24.1(@babel/core@7.24.5): resolution: {integrity: sha512-BXmDZpPlh7jwicKArQASrj8n22/w6iymRnvHYYd2zO30DbE277JO20/7yXJT3QxDPtiQiOxQBbZH4TpivNXIxA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.4 + '@babel/core': 7.24.5 '@babel/helper-compilation-targets': 7.23.6 '@babel/helper-function-name': 7.23.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.5 dev: false - /@babel/plugin-transform-json-strings@7.24.1(@babel/core@7.24.4): + /@babel/plugin-transform-json-strings@7.24.1(@babel/core@7.24.5): resolution: {integrity: sha512-U7RMFmRvoasscrIFy5xA4gIp8iWnWubnKkKuUGJjsuOH7GfbMkB+XZzeslx2kLdEGdOJDamEmCqOks6e8nv8DQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.4) + '@babel/core': 7.24.5 + '@babel/helper-plugin-utils': 7.24.5 + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.5) dev: false - /@babel/plugin-transform-literals@7.24.1(@babel/core@7.24.4): + /@babel/plugin-transform-literals@7.24.1(@babel/core@7.24.5): resolution: {integrity: sha512-zn9pwz8U7nCqOYIiBaOxoQOtYmMODXTJnkxG4AtX8fPmnCRYWBOHD0qcpwS9e2VDSp1zNJYpdnFMIKb8jmwu6g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.24.5 + '@babel/helper-plugin-utils': 7.24.5 dev: false - /@babel/plugin-transform-logical-assignment-operators@7.24.1(@babel/core@7.24.4): + /@babel/plugin-transform-logical-assignment-operators@7.24.1(@babel/core@7.24.5): resolution: {integrity: sha512-OhN6J4Bpz+hIBqItTeWJujDOfNP+unqv/NJgyhlpSqgBTPm37KkMmZV6SYcOj+pnDbdcl1qRGV/ZiIjX9Iy34w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.4) + '@babel/core': 7.24.5 + '@babel/helper-plugin-utils': 7.24.5 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.5) dev: false - /@babel/plugin-transform-member-expression-literals@7.24.1(@babel/core@7.24.4): + /@babel/plugin-transform-member-expression-literals@7.24.1(@babel/core@7.24.5): resolution: {integrity: sha512-4ojai0KysTWXzHseJKa1XPNXKRbuUrhkOPY4rEGeR+7ChlJVKxFa3H3Bz+7tWaGKgJAXUWKOGmltN+u9B3+CVg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.24.5 + '@babel/helper-plugin-utils': 7.24.5 dev: false - /@babel/plugin-transform-modules-amd@7.24.1(@babel/core@7.24.4): + /@babel/plugin-transform-modules-amd@7.24.1(@babel/core@7.24.5): resolution: {integrity: sha512-lAxNHi4HVtjnHd5Rxg3D5t99Xm6H7b04hUS7EHIXcUl2EV4yl1gWdqZrNzXnSrHveL9qMdbODlLF55mvgjAfaQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.4 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.4) - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.24.5 + '@babel/helper-module-transforms': 7.24.5(@babel/core@7.24.5) + '@babel/helper-plugin-utils': 7.24.5 dev: false - /@babel/plugin-transform-modules-commonjs@7.24.1(@babel/core@7.24.4): + /@babel/plugin-transform-modules-commonjs@7.24.1(@babel/core@7.24.5): resolution: {integrity: sha512-szog8fFTUxBfw0b98gEWPaEqF42ZUD/T3bkynW/wtgx2p/XCP55WEsb+VosKceRSd6njipdZvNogqdtI4Q0chw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.4 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.4) - '@babel/helper-plugin-utils': 7.24.0 - '@babel/helper-simple-access': 7.22.5 + '@babel/core': 7.24.5 + '@babel/helper-module-transforms': 7.24.5(@babel/core@7.24.5) + '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-simple-access': 7.24.5 dev: false - /@babel/plugin-transform-modules-systemjs@7.24.1(@babel/core@7.24.4): + /@babel/plugin-transform-modules-systemjs@7.24.1(@babel/core@7.24.5): resolution: {integrity: sha512-mqQ3Zh9vFO1Tpmlt8QPnbwGHzNz3lpNEMxQb1kAemn/erstyqw1r9KeOlOfo3y6xAnFEcOv2tSyrXfmMk+/YZA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.4 + '@babel/core': 7.24.5 '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.4) - '@babel/helper-plugin-utils': 7.24.0 - '@babel/helper-validator-identifier': 7.22.20 + '@babel/helper-module-transforms': 7.24.5(@babel/core@7.24.5) + '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-validator-identifier': 7.24.5 dev: false - /@babel/plugin-transform-modules-umd@7.24.1(@babel/core@7.24.4): + /@babel/plugin-transform-modules-umd@7.24.1(@babel/core@7.24.5): resolution: {integrity: sha512-tuA3lpPj+5ITfcCluy6nWonSL7RvaG0AOTeAuvXqEKS34lnLzXpDb0dcP6K8jD0zWZFNDVly90AGFJPnm4fOYg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.4 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.4) - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.24.5 + '@babel/helper-module-transforms': 7.24.5(@babel/core@7.24.5) + '@babel/helper-plugin-utils': 7.24.5 dev: false - /@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.24.4): + /@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.24.5): resolution: {integrity: sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.4 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.4) - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.24.5 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.5) + '@babel/helper-plugin-utils': 7.24.5 dev: false - /@babel/plugin-transform-new-target@7.24.1(@babel/core@7.24.4): + /@babel/plugin-transform-new-target@7.24.1(@babel/core@7.24.5): resolution: {integrity: sha512-/rurytBM34hYy0HKZQyA0nHbQgQNFm4Q/BOc9Hflxi2X3twRof7NaE5W46j4kQitm7SvACVRXsa6N/tSZxvPug==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.24.5 + '@babel/helper-plugin-utils': 7.24.5 dev: false - /@babel/plugin-transform-nullish-coalescing-operator@7.24.1(@babel/core@7.24.4): + /@babel/plugin-transform-nullish-coalescing-operator@7.24.1(@babel/core@7.24.5): resolution: {integrity: sha512-iQ+caew8wRrhCikO5DrUYx0mrmdhkaELgFa+7baMcVuhxIkN7oxt06CZ51D65ugIb1UWRQ8oQe+HXAVM6qHFjw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.4) + '@babel/core': 7.24.5 + '@babel/helper-plugin-utils': 7.24.5 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.5) dev: false - /@babel/plugin-transform-numeric-separator@7.24.1(@babel/core@7.24.4): + /@babel/plugin-transform-numeric-separator@7.24.1(@babel/core@7.24.5): resolution: {integrity: sha512-7GAsGlK4cNL2OExJH1DzmDeKnRv/LXq0eLUSvudrehVA5Rgg4bIrqEUW29FbKMBRT0ztSqisv7kjP+XIC4ZMNw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.4) + '@babel/core': 7.24.5 + '@babel/helper-plugin-utils': 7.24.5 + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.5) dev: false - /@babel/plugin-transform-object-rest-spread@7.24.1(@babel/core@7.24.4): - resolution: {integrity: sha512-XjD5f0YqOtebto4HGISLNfiNMTTs6tbkFf2TOqJlYKYmbo+mN9Dnpl4SRoofiziuOWMIyq3sZEUqLo3hLITFEA==} + /@babel/plugin-transform-object-rest-spread@7.24.5(@babel/core@7.24.5): + resolution: {integrity: sha512-7EauQHszLGM3ay7a161tTQH7fj+3vVM/gThlz5HpFtnygTxjrlvoeq7MPVA1Vy9Q555OB8SnAOsMkLShNkkrHA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.4 + '@babel/core': 7.24.5 '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.4) - '@babel/plugin-transform-parameters': 7.24.1(@babel/core@7.24.4) + '@babel/helper-plugin-utils': 7.24.5 + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.5) + '@babel/plugin-transform-parameters': 7.24.5(@babel/core@7.24.5) dev: false - /@babel/plugin-transform-object-super@7.24.1(@babel/core@7.24.4): + /@babel/plugin-transform-object-super@7.24.1(@babel/core@7.24.5): resolution: {integrity: sha512-oKJqR3TeI5hSLRxudMjFQ9re9fBVUU0GICqM3J1mi8MqlhVr6hC/ZN4ttAyMuQR6EZZIY6h/exe5swqGNNIkWQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 - '@babel/helper-replace-supers': 7.24.1(@babel/core@7.24.4) + '@babel/core': 7.24.5 + '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-replace-supers': 7.24.1(@babel/core@7.24.5) dev: false - /@babel/plugin-transform-optional-catch-binding@7.24.1(@babel/core@7.24.4): + /@babel/plugin-transform-optional-catch-binding@7.24.1(@babel/core@7.24.5): resolution: {integrity: sha512-oBTH7oURV4Y+3EUrf6cWn1OHio3qG/PVwO5J03iSJmBg6m2EhKjkAu/xuaXaYwWW9miYtvbWv4LNf0AmR43LUA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.4) + '@babel/core': 7.24.5 + '@babel/helper-plugin-utils': 7.24.5 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.5) dev: false - /@babel/plugin-transform-optional-chaining@7.24.1(@babel/core@7.24.4): - resolution: {integrity: sha512-n03wmDt+987qXwAgcBlnUUivrZBPZ8z1plL0YvgQalLm+ZE5BMhGm94jhxXtA1wzv1Cu2aaOv1BM9vbVttrzSg==} + /@babel/plugin-transform-optional-chaining@7.24.5(@babel/core@7.24.5): + resolution: {integrity: sha512-xWCkmwKT+ihmA6l7SSTpk8e4qQl/274iNbSKRRS8mpqFR32ksy36+a+LWY8OXCCEefF8WFlnOHVsaDI2231wBg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.24.5 + '@babel/helper-plugin-utils': 7.24.5 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.4) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.5) dev: false - /@babel/plugin-transform-parameters@7.24.1(@babel/core@7.24.4): - resolution: {integrity: sha512-8Jl6V24g+Uw5OGPeWNKrKqXPDw2YDjLc53ojwfMcKwlEoETKU9rU0mHUtcg9JntWI/QYzGAXNWEcVHZ+fR+XXg==} + /@babel/plugin-transform-parameters@7.24.5(@babel/core@7.24.5): + resolution: {integrity: sha512-9Co00MqZ2aoky+4j2jhofErthm6QVLKbpQrvz20c3CH9KQCLHyNB+t2ya4/UrRpQGR+Wrwjg9foopoeSdnHOkA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.24.5 + '@babel/helper-plugin-utils': 7.24.5 dev: false - /@babel/plugin-transform-private-methods@7.24.1(@babel/core@7.24.4): + /@babel/plugin-transform-private-methods@7.24.1(@babel/core@7.24.5): resolution: {integrity: sha512-tGvisebwBO5em4PaYNqt4fkw56K2VALsAbAakY0FjTYqJp7gfdrgr7YX76Or8/cpik0W6+tj3rZ0uHU9Oil4tw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.4 - '@babel/helper-create-class-features-plugin': 7.24.4(@babel/core@7.24.4) - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.24.5 + '@babel/helper-create-class-features-plugin': 7.24.5(@babel/core@7.24.5) + '@babel/helper-plugin-utils': 7.24.5 dev: false - /@babel/plugin-transform-private-property-in-object@7.24.1(@babel/core@7.24.4): - resolution: {integrity: sha512-pTHxDVa0BpUbvAgX3Gat+7cSciXqUcY9j2VZKTbSB6+VQGpNgNO9ailxTGHSXlqOnX1Hcx1Enme2+yv7VqP9bg==} + /@babel/plugin-transform-private-property-in-object@7.24.5(@babel/core@7.24.5): + resolution: {integrity: sha512-JM4MHZqnWR04jPMujQDTBVRnqxpLLpx2tkn7iPn+Hmsc0Gnb79yvRWOkvqFOx3Z7P7VxiRIR22c4eGSNj87OBQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.4 + '@babel/core': 7.24.5 '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-create-class-features-plugin': 7.24.4(@babel/core@7.24.4) - '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.24.4) + '@babel/helper-create-class-features-plugin': 7.24.5(@babel/core@7.24.5) + '@babel/helper-plugin-utils': 7.24.5 + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.24.5) dev: false - /@babel/plugin-transform-property-literals@7.24.1(@babel/core@7.24.4): + /@babel/plugin-transform-property-literals@7.24.1(@babel/core@7.24.5): resolution: {integrity: sha512-LetvD7CrHmEx0G442gOomRr66d7q8HzzGGr4PMHGr+5YIm6++Yke+jxj246rpvsbyhJwCLxcTn6zW1P1BSenqA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.24.5 + '@babel/helper-plugin-utils': 7.24.5 dev: false - /@babel/plugin-transform-regenerator@7.24.1(@babel/core@7.24.4): + /@babel/plugin-transform-regenerator@7.24.1(@babel/core@7.24.5): resolution: {integrity: sha512-sJwZBCzIBE4t+5Q4IGLaaun5ExVMRY0lYwos/jNecjMrVCygCdph3IKv0tkP5Fc87e/1+bebAmEAGBfnRD+cnw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.24.5 + '@babel/helper-plugin-utils': 7.24.5 regenerator-transform: 0.15.2 dev: false - /@babel/plugin-transform-reserved-words@7.24.1(@babel/core@7.24.4): + /@babel/plugin-transform-reserved-words@7.24.1(@babel/core@7.24.5): resolution: {integrity: sha512-JAclqStUfIwKN15HrsQADFgeZt+wexNQ0uLhuqvqAUFoqPMjEcFCYZBhq0LUdz6dZK/mD+rErhW71fbx8RYElg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.24.5 + '@babel/helper-plugin-utils': 7.24.5 dev: false - /@babel/plugin-transform-shorthand-properties@7.24.1(@babel/core@7.24.4): + /@babel/plugin-transform-shorthand-properties@7.24.1(@babel/core@7.24.5): resolution: {integrity: sha512-LyjVB1nsJ6gTTUKRjRWx9C1s9hE7dLfP/knKdrfeH9UPtAGjYGgxIbFfx7xyLIEWs7Xe1Gnf8EWiUqfjLhInZA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.24.5 + '@babel/helper-plugin-utils': 7.24.5 dev: false - /@babel/plugin-transform-spread@7.24.1(@babel/core@7.24.4): + /@babel/plugin-transform-spread@7.24.1(@babel/core@7.24.5): resolution: {integrity: sha512-KjmcIM+fxgY+KxPVbjelJC6hrH1CgtPmTvdXAfn3/a9CnWGSTY7nH4zm5+cjmWJybdcPSsD0++QssDsjcpe47g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.24.5 + '@babel/helper-plugin-utils': 7.24.5 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 dev: false - /@babel/plugin-transform-sticky-regex@7.24.1(@babel/core@7.24.4): + /@babel/plugin-transform-sticky-regex@7.24.1(@babel/core@7.24.5): resolution: {integrity: sha512-9v0f1bRXgPVcPrngOQvLXeGNNVLc8UjMVfebo9ka0WF3/7+aVUHmaJVT3sa0XCzEFioPfPHZiOcYG9qOsH63cw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.24.5 + '@babel/helper-plugin-utils': 7.24.5 dev: false - /@babel/plugin-transform-template-literals@7.24.1(@babel/core@7.24.4): + /@babel/plugin-transform-template-literals@7.24.1(@babel/core@7.24.5): resolution: {integrity: sha512-WRkhROsNzriarqECASCNu/nojeXCDTE/F2HmRgOzi7NGvyfYGq1NEjKBK3ckLfRgGc6/lPAqP0vDOSw3YtG34g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.24.5 + '@babel/helper-plugin-utils': 7.24.5 dev: false - /@babel/plugin-transform-typeof-symbol@7.24.1(@babel/core@7.24.4): - resolution: {integrity: sha512-CBfU4l/A+KruSUoW+vTQthwcAdwuqbpRNB8HQKlZABwHRhsdHZ9fezp4Sn18PeAlYxTNiLMlx4xUBV3AWfg1BA==} + /@babel/plugin-transform-typeof-symbol@7.24.5(@babel/core@7.24.5): + resolution: {integrity: sha512-UTGnhYVZtTAjdwOTzT+sCyXmTn8AhaxOS/MjG9REclZ6ULHWF9KoCZur0HSGU7hk8PdBFKKbYe6+gqdXWz84Jg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.24.5 + '@babel/helper-plugin-utils': 7.24.5 dev: false - /@babel/plugin-transform-unicode-escapes@7.24.1(@babel/core@7.24.4): + /@babel/plugin-transform-unicode-escapes@7.24.1(@babel/core@7.24.5): resolution: {integrity: sha512-RlkVIcWT4TLI96zM660S877E7beKlQw7Ig+wqkKBiWfj0zH5Q4h50q6er4wzZKRNSYpfo6ILJ+hrJAGSX2qcNw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.24.5 + '@babel/helper-plugin-utils': 7.24.5 dev: false - /@babel/plugin-transform-unicode-property-regex@7.24.1(@babel/core@7.24.4): + /@babel/plugin-transform-unicode-property-regex@7.24.1(@babel/core@7.24.5): resolution: {integrity: sha512-Ss4VvlfYV5huWApFsF8/Sq0oXnGO+jB+rijFEFugTd3cwSObUSnUi88djgR5528Csl0uKlrI331kRqe56Ov2Ng==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.4 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.4) - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.24.5 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.5) + '@babel/helper-plugin-utils': 7.24.5 dev: false - /@babel/plugin-transform-unicode-regex@7.24.1(@babel/core@7.24.4): + /@babel/plugin-transform-unicode-regex@7.24.1(@babel/core@7.24.5): resolution: {integrity: sha512-2A/94wgZgxfTsiLaQ2E36XAOdcZmGAaEEgVmxQWwZXWkGhvoHbaqXcKnU8zny4ycpu3vNqg0L/PcCiYtHtA13g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.4 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.4) - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.24.5 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.5) + '@babel/helper-plugin-utils': 7.24.5 dev: false - /@babel/plugin-transform-unicode-sets-regex@7.24.1(@babel/core@7.24.4): + /@babel/plugin-transform-unicode-sets-regex@7.24.1(@babel/core@7.24.5): resolution: {integrity: sha512-fqj4WuzzS+ukpgerpAoOnMfQXwUHFxXUZUE84oL2Kao2N8uSlvcpnAidKASgsNgzZHBsHWvcm8s9FPWUhAb8fA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.4 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.4) - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.24.5 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.5) + '@babel/helper-plugin-utils': 7.24.5 dev: false - /@babel/preset-env@7.24.4(@babel/core@7.24.4): - resolution: {integrity: sha512-7Kl6cSmYkak0FK/FXjSEnLJ1N9T/WA2RkMhu17gZ/dsxKJUuTYNIylahPTzqpLyJN4WhDif8X0XK1R8Wsguo/A==} + /@babel/preset-env@7.24.5(@babel/core@7.24.5): + resolution: {integrity: sha512-UGK2ifKtcC8i5AI4cH+sbLLuLc2ktYSFJgBAXorKAsHUZmrQ1q6aQ6i3BvU24wWs2AAKqQB6kq3N9V9Gw1HiMQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/compat-data': 7.24.4 - '@babel/core': 7.24.4 + '@babel/core': 7.24.5 '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.5 '@babel/helper-validator-option': 7.23.5 - '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.24.4(@babel/core@7.24.4) - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.24.4) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.4) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.24.4) - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.24.4) - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.24.4) - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.24.4) - '@babel/plugin-syntax-import-assertions': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-syntax-import-attributes': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.24.4) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.4) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.4) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.4) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.4) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.4) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.4) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.4) - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.24.4) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.24.4) - '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.24.4) - '@babel/plugin-transform-arrow-functions': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-async-generator-functions': 7.24.3(@babel/core@7.24.4) - '@babel/plugin-transform-async-to-generator': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-block-scoped-functions': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-block-scoping': 7.24.4(@babel/core@7.24.4) - '@babel/plugin-transform-class-properties': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-class-static-block': 7.24.4(@babel/core@7.24.4) - '@babel/plugin-transform-classes': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-computed-properties': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-destructuring': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-dotall-regex': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-duplicate-keys': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-dynamic-import': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-exponentiation-operator': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-export-namespace-from': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-for-of': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-function-name': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-json-strings': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-literals': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-logical-assignment-operators': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-member-expression-literals': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-modules-amd': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-modules-commonjs': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-modules-systemjs': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-modules-umd': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.24.4) - '@babel/plugin-transform-new-target': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-nullish-coalescing-operator': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-numeric-separator': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-object-rest-spread': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-object-super': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-optional-catch-binding': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-optional-chaining': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-parameters': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-private-methods': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-private-property-in-object': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-property-literals': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-regenerator': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-reserved-words': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-shorthand-properties': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-spread': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-sticky-regex': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-template-literals': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-typeof-symbol': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-unicode-escapes': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-unicode-property-regex': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-unicode-regex': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-unicode-sets-regex': 7.24.1(@babel/core@7.24.4) - '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.24.4) - babel-plugin-polyfill-corejs2: 0.4.10(@babel/core@7.24.4) - babel-plugin-polyfill-corejs3: 0.10.4(@babel/core@7.24.4) - babel-plugin-polyfill-regenerator: 0.6.1(@babel/core@7.24.4) - core-js-compat: 3.36.1 + '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.24.5(@babel/core@7.24.5) + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.24.1(@babel/core@7.24.5) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.24.1(@babel/core@7.24.5) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.24.1(@babel/core@7.24.5) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.24.5) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.5) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.24.5) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.24.5) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.24.5) + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.24.5) + '@babel/plugin-syntax-import-assertions': 7.24.1(@babel/core@7.24.5) + '@babel/plugin-syntax-import-attributes': 7.24.1(@babel/core@7.24.5) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.24.5) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.5) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.5) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.5) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.5) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.5) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.5) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.5) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.24.5) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.24.5) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.24.5) + '@babel/plugin-transform-arrow-functions': 7.24.1(@babel/core@7.24.5) + '@babel/plugin-transform-async-generator-functions': 7.24.3(@babel/core@7.24.5) + '@babel/plugin-transform-async-to-generator': 7.24.1(@babel/core@7.24.5) + '@babel/plugin-transform-block-scoped-functions': 7.24.1(@babel/core@7.24.5) + '@babel/plugin-transform-block-scoping': 7.24.5(@babel/core@7.24.5) + '@babel/plugin-transform-class-properties': 7.24.1(@babel/core@7.24.5) + '@babel/plugin-transform-class-static-block': 7.24.4(@babel/core@7.24.5) + '@babel/plugin-transform-classes': 7.24.5(@babel/core@7.24.5) + '@babel/plugin-transform-computed-properties': 7.24.1(@babel/core@7.24.5) + '@babel/plugin-transform-destructuring': 7.24.5(@babel/core@7.24.5) + '@babel/plugin-transform-dotall-regex': 7.24.1(@babel/core@7.24.5) + '@babel/plugin-transform-duplicate-keys': 7.24.1(@babel/core@7.24.5) + '@babel/plugin-transform-dynamic-import': 7.24.1(@babel/core@7.24.5) + '@babel/plugin-transform-exponentiation-operator': 7.24.1(@babel/core@7.24.5) + '@babel/plugin-transform-export-namespace-from': 7.24.1(@babel/core@7.24.5) + '@babel/plugin-transform-for-of': 7.24.1(@babel/core@7.24.5) + '@babel/plugin-transform-function-name': 7.24.1(@babel/core@7.24.5) + '@babel/plugin-transform-json-strings': 7.24.1(@babel/core@7.24.5) + '@babel/plugin-transform-literals': 7.24.1(@babel/core@7.24.5) + '@babel/plugin-transform-logical-assignment-operators': 7.24.1(@babel/core@7.24.5) + '@babel/plugin-transform-member-expression-literals': 7.24.1(@babel/core@7.24.5) + '@babel/plugin-transform-modules-amd': 7.24.1(@babel/core@7.24.5) + '@babel/plugin-transform-modules-commonjs': 7.24.1(@babel/core@7.24.5) + '@babel/plugin-transform-modules-systemjs': 7.24.1(@babel/core@7.24.5) + '@babel/plugin-transform-modules-umd': 7.24.1(@babel/core@7.24.5) + '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.24.5) + '@babel/plugin-transform-new-target': 7.24.1(@babel/core@7.24.5) + '@babel/plugin-transform-nullish-coalescing-operator': 7.24.1(@babel/core@7.24.5) + '@babel/plugin-transform-numeric-separator': 7.24.1(@babel/core@7.24.5) + '@babel/plugin-transform-object-rest-spread': 7.24.5(@babel/core@7.24.5) + '@babel/plugin-transform-object-super': 7.24.1(@babel/core@7.24.5) + '@babel/plugin-transform-optional-catch-binding': 7.24.1(@babel/core@7.24.5) + '@babel/plugin-transform-optional-chaining': 7.24.5(@babel/core@7.24.5) + '@babel/plugin-transform-parameters': 7.24.5(@babel/core@7.24.5) + '@babel/plugin-transform-private-methods': 7.24.1(@babel/core@7.24.5) + '@babel/plugin-transform-private-property-in-object': 7.24.5(@babel/core@7.24.5) + '@babel/plugin-transform-property-literals': 7.24.1(@babel/core@7.24.5) + '@babel/plugin-transform-regenerator': 7.24.1(@babel/core@7.24.5) + '@babel/plugin-transform-reserved-words': 7.24.1(@babel/core@7.24.5) + '@babel/plugin-transform-shorthand-properties': 7.24.1(@babel/core@7.24.5) + '@babel/plugin-transform-spread': 7.24.1(@babel/core@7.24.5) + '@babel/plugin-transform-sticky-regex': 7.24.1(@babel/core@7.24.5) + '@babel/plugin-transform-template-literals': 7.24.1(@babel/core@7.24.5) + '@babel/plugin-transform-typeof-symbol': 7.24.5(@babel/core@7.24.5) + '@babel/plugin-transform-unicode-escapes': 7.24.1(@babel/core@7.24.5) + '@babel/plugin-transform-unicode-property-regex': 7.24.1(@babel/core@7.24.5) + '@babel/plugin-transform-unicode-regex': 7.24.1(@babel/core@7.24.5) + '@babel/plugin-transform-unicode-sets-regex': 7.24.1(@babel/core@7.24.5) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.24.5) + babel-plugin-polyfill-corejs2: 0.4.11(@babel/core@7.24.5) + babel-plugin-polyfill-corejs3: 0.10.4(@babel/core@7.24.5) + babel-plugin-polyfill-regenerator: 0.6.2(@babel/core@7.24.5) + core-js-compat: 3.37.0 semver: 6.3.1 transitivePeerDependencies: - supports-color dev: false - /@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.24.4): + /@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.24.5): resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} peerDependencies: '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 - '@babel/types': 7.24.0 + '@babel/core': 7.24.5 + '@babel/helper-plugin-utils': 7.24.5 + '@babel/types': 7.24.5 esutils: 2.0.3 dev: false @@ -1551,12 +1577,11 @@ packages: dependencies: regenerator-runtime: 0.14.1 - /@babel/runtime@7.24.4: - resolution: {integrity: sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA==} + /@babel/runtime@7.24.5: + resolution: {integrity: sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g==} engines: {node: '>=6.9.0'} dependencies: regenerator-runtime: 0.14.1 - dev: false /@babel/template@7.24.0: resolution: {integrity: sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==} @@ -1582,6 +1607,25 @@ packages: globals: 11.12.0 transitivePeerDependencies: - supports-color + dev: true + + /@babel/traverse@7.24.5: + resolution: {integrity: sha512-7aaBLeDQ4zYcUFDUD41lJc1fG8+5IU9DaNSJAgal866FGvmD5EbWQgnEC6kO1gGLsX0esNkfnJSndbTXA3r7UA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.24.2 + '@babel/generator': 7.24.5 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-split-export-declaration': 7.24.5 + '@babel/parser': 7.24.5 + '@babel/types': 7.24.5 + debug: 4.3.4 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: false /@babel/types@7.24.0: resolution: {integrity: sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==} @@ -1591,6 +1635,14 @@ packages: '@babel/helper-validator-identifier': 7.22.20 to-fast-properties: 2.0.0 + /@babel/types@7.24.5: + resolution: {integrity: sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.24.1 + '@babel/helper-validator-identifier': 7.24.5 + to-fast-properties: 2.0.0 + /@bcoe/v8-coverage@0.2.3: resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} dev: true @@ -1657,10 +1709,10 @@ packages: resolution: {integrity: sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==} dependencies: '@babel/helper-module-imports': 7.24.3 - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.5 '@emotion/hash': 0.9.1 '@emotion/memoize': 0.8.1 - '@emotion/serialize': 1.1.3 + '@emotion/serialize': 1.1.4 babel-plugin-macros: 3.1.0 convert-source-map: 1.9.0 escape-string-regexp: 4.0.0 @@ -1724,12 +1776,22 @@ packages: csstype: 3.1.3 dev: false + /@emotion/serialize@1.1.4: + resolution: {integrity: sha512-RIN04MBT8g+FnDwgvIUi8czvr1LU1alUMI05LekWB5DGyTm8cCBMCRpq3GqaiyEDRptEXOyXnvZ58GZYu4kBxQ==} + dependencies: + '@emotion/hash': 0.9.1 + '@emotion/memoize': 0.8.1 + '@emotion/unitless': 0.8.1 + '@emotion/utils': 1.2.1 + csstype: 3.1.3 + dev: false + /@emotion/sheet@1.2.2: resolution: {integrity: sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==} dev: false - /@emotion/styled@11.11.0(@emotion/react@11.11.4)(@types/react@18.2.67)(react@18.2.0): - resolution: {integrity: sha512-hM5Nnvu9P3midq5aaXj4I+lnSfNi7Pmd4EWk1fOZ3pxookaQTNew6bp4JaCBYM4HVFZF9g7UjJmsUmC2JlxOng==} + /@emotion/styled@11.11.5(@emotion/react@11.11.4)(@types/react@18.2.67)(react@18.2.0): + resolution: {integrity: sha512-/ZjjnaNKvuMPxcIiUkf/9SHoG4Q196DRl1w82hQ3WCsjo1IUR8uaGWrC6a87CrYAW0Kb/pK7hk8BnLgLRi9KoQ==} peerDependencies: '@emotion/react': ^11.0.0-rc.0 '@types/react': '*' @@ -1738,11 +1800,11 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.5 '@emotion/babel-plugin': 11.11.0 '@emotion/is-prop-valid': 1.2.2 '@emotion/react': 11.11.4(@types/react@18.2.67)(react@18.2.0) - '@emotion/serialize': 1.1.3 + '@emotion/serialize': 1.1.4 '@emotion/use-insertion-effect-with-fallbacks': 1.0.1(react@18.2.0) '@emotion/utils': 1.2.1 '@types/react': 18.2.67 @@ -2528,12 +2590,12 @@ packages: optional: true dependencies: '@babel/runtime': 7.24.1 - '@mui/material': 5.15.14(@emotion/react@11.11.4)(@emotion/styled@11.11.0)(@types/react@18.2.67)(react-dom@18.2.0)(react@18.2.0) + '@mui/material': 5.15.14(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.2.67)(react-dom@18.2.0)(react@18.2.0) '@types/react': 18.2.67 react: 18.2.0 dev: false - /@mui/material@5.15.14(@emotion/react@11.11.4)(@emotion/styled@11.11.0)(@types/react@18.2.67)(react-dom@18.2.0)(react@18.2.0): + /@mui/material@5.15.14(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.2.67)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-kEbRw6fASdQ1SQ7LVdWR5OlWV3y7Y54ZxkLzd6LV5tmz+NpO3MJKZXSfgR0LHMP7meKsPiMm4AuzV0pXDpk/BQ==} engines: {node: '>=12.0.0'} peerDependencies: @@ -2552,10 +2614,10 @@ packages: dependencies: '@babel/runtime': 7.24.1 '@emotion/react': 11.11.4(@types/react@18.2.67)(react@18.2.0) - '@emotion/styled': 11.11.0(@emotion/react@11.11.4)(@types/react@18.2.67)(react@18.2.0) + '@emotion/styled': 11.11.5(@emotion/react@11.11.4)(@types/react@18.2.67)(react@18.2.0) '@mui/base': 5.0.0-beta.40(@types/react@18.2.67)(react-dom@18.2.0)(react@18.2.0) '@mui/core-downloads-tracker': 5.15.14 - '@mui/system': 5.15.14(@emotion/react@11.11.4)(@emotion/styled@11.11.0)(@types/react@18.2.67)(react@18.2.0) + '@mui/system': 5.15.14(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.2.67)(react@18.2.0) '@mui/types': 7.2.14(@types/react@18.2.67) '@mui/utils': 5.15.14(@types/react@18.2.67)(react@18.2.0) '@types/react': 18.2.67 @@ -2586,7 +2648,7 @@ packages: react: 18.2.0 dev: false - /@mui/styled-engine@5.15.14(@emotion/react@11.11.4)(@emotion/styled@11.11.0)(react@18.2.0): + /@mui/styled-engine@5.15.14(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(react@18.2.0): resolution: {integrity: sha512-RILkuVD8gY6PvjZjqnWhz8fu68dVkqhM5+jYWfB5yhlSQKg+2rHkmEwm75XIeAqI3qwOndK6zELK5H6Zxn4NHw==} engines: {node: '>=12.0.0'} peerDependencies: @@ -2602,13 +2664,13 @@ packages: '@babel/runtime': 7.24.1 '@emotion/cache': 11.11.0 '@emotion/react': 11.11.4(@types/react@18.2.67)(react@18.2.0) - '@emotion/styled': 11.11.0(@emotion/react@11.11.4)(@types/react@18.2.67)(react@18.2.0) + '@emotion/styled': 11.11.5(@emotion/react@11.11.4)(@types/react@18.2.67)(react@18.2.0) csstype: 3.1.3 prop-types: 15.8.1 react: 18.2.0 dev: false - /@mui/system@5.15.14(@emotion/react@11.11.4)(@emotion/styled@11.11.0)(@types/react@18.2.67)(react@18.2.0): + /@mui/system@5.15.14(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.2.67)(react@18.2.0): resolution: {integrity: sha512-auXLXzUaCSSOLqJXmsAaq7P96VPRXg2Rrz6OHNV7lr+kB8lobUF+/N84Vd9C4G/wvCXYPs5TYuuGBRhcGbiBGg==} engines: {node: '>=12.0.0'} peerDependencies: @@ -2626,9 +2688,9 @@ packages: dependencies: '@babel/runtime': 7.24.1 '@emotion/react': 11.11.4(@types/react@18.2.67)(react@18.2.0) - '@emotion/styled': 11.11.0(@emotion/react@11.11.4)(@types/react@18.2.67)(react@18.2.0) + '@emotion/styled': 11.11.5(@emotion/react@11.11.4)(@types/react@18.2.67)(react@18.2.0) '@mui/private-theming': 5.15.14(@types/react@18.2.67)(react@18.2.0) - '@mui/styled-engine': 5.15.14(@emotion/react@11.11.4)(@emotion/styled@11.11.0)(react@18.2.0) + '@mui/styled-engine': 5.15.14(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(react@18.2.0) '@mui/types': 7.2.14(@types/react@18.2.67) '@mui/utils': 5.15.14(@types/react@18.2.67)(react@18.2.0) '@types/react': 18.2.67 @@ -2667,7 +2729,7 @@ packages: react-is: 18.2.0 dev: false - /@mui/x-date-pickers@7.0.0(@emotion/react@11.11.4)(@emotion/styled@11.11.0)(@mui/material@5.15.14)(@types/react@18.2.67)(dayjs@1.11.10)(react-dom@18.2.0)(react@18.2.0): + /@mui/x-date-pickers@7.0.0(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@mui/material@5.15.14)(@types/react@18.2.67)(dayjs@1.11.10)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-/9mp4O2WMixHOso63DBoZVfJVYGrzOHF5voheV2tYQ4XqDdTKp2AdWS3oh8PGwrsvCzqkvb3quzTqhKoEsJUwA==} engines: {node: '>=14.0.0'} peerDependencies: @@ -2705,10 +2767,10 @@ packages: dependencies: '@babel/runtime': 7.24.1 '@emotion/react': 11.11.4(@types/react@18.2.67)(react@18.2.0) - '@emotion/styled': 11.11.0(@emotion/react@11.11.4)(@types/react@18.2.67)(react@18.2.0) + '@emotion/styled': 11.11.5(@emotion/react@11.11.4)(@types/react@18.2.67)(react@18.2.0) '@mui/base': 5.0.0-beta.40(@types/react@18.2.67)(react-dom@18.2.0)(react@18.2.0) - '@mui/material': 5.15.14(@emotion/react@11.11.4)(@emotion/styled@11.11.0)(@types/react@18.2.67)(react-dom@18.2.0)(react@18.2.0) - '@mui/system': 5.15.14(@emotion/react@11.11.4)(@emotion/styled@11.11.0)(@types/react@18.2.67)(react@18.2.0) + '@mui/material': 5.15.14(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.2.67)(react-dom@18.2.0)(react@18.2.0) + '@mui/system': 5.15.14(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.2.67)(react@18.2.0) '@mui/utils': 5.15.14(@types/react@18.2.67)(react@18.2.0) '@types/react-transition-group': 4.4.10 clsx: 2.1.0 @@ -2791,7 +2853,7 @@ packages: engines: {node: '>=14.0.0'} dev: false - /@rollup/plugin-babel@5.3.1(@babel/core@7.24.4)(rollup@2.79.1): + /@rollup/plugin-babel@5.3.1(@babel/core@7.24.5)(rollup@2.79.1): resolution: {integrity: sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==} engines: {node: '>= 10.0.0'} peerDependencies: @@ -2802,22 +2864,25 @@ packages: '@types/babel__core': optional: true dependencies: - '@babel/core': 7.24.4 + '@babel/core': 7.24.5 '@babel/helper-module-imports': 7.24.3 '@rollup/pluginutils': 3.1.0(rollup@2.79.1) rollup: 2.79.1 dev: false - /@rollup/plugin-node-resolve@11.2.1(rollup@2.79.1): - resolution: {integrity: sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==} - engines: {node: '>= 10.0.0'} + /@rollup/plugin-node-resolve@15.2.3(rollup@2.79.1): + resolution: {integrity: sha512-j/lym8nf5E21LwBT4Df1VD6hRO2L2iwUeUmP7litikRsVp1H6NWx20NEp0Y7su+7XGc476GnXXc4kFeZNGmaSQ==} + engines: {node: '>=14.0.0'} peerDependencies: - rollup: ^1.20.0||^2.0.0 + rollup: ^2.78.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true dependencies: - '@rollup/pluginutils': 3.1.0(rollup@2.79.1) - '@types/resolve': 1.17.1 - builtin-modules: 3.3.0 + '@rollup/pluginutils': 5.1.0(rollup@2.79.1) + '@types/resolve': 1.20.2 deepmerge: 4.3.1 + is-builtin-module: 3.2.1 is-module: 1.0.0 resolve: 1.22.8 rollup: 2.79.1 @@ -2833,6 +2898,21 @@ packages: rollup: 2.79.1 dev: false + /@rollup/plugin-terser@0.4.4(rollup@2.79.1): + resolution: {integrity: sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + dependencies: + rollup: 2.79.1 + serialize-javascript: 6.0.2 + smob: 1.5.0 + terser: 5.31.0 + dev: false + /@rollup/pluginutils@3.1.0(rollup@2.79.1): resolution: {integrity: sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==} engines: {node: '>= 8.0.0'} @@ -2845,6 +2925,21 @@ packages: rollup: 2.79.1 dev: false + /@rollup/pluginutils@5.1.0(rollup@2.79.1): + resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + dependencies: + '@types/estree': 1.0.5 + estree-walker: 2.0.2 + picomatch: 2.3.1 + rollup: 2.79.1 + dev: false + /@rollup/rollup-android-arm-eabi@4.14.0: resolution: {integrity: sha512-jwXtxYbRt1V+CdQSy6Z+uZti7JF5irRKF8hlKfEnF/xJpcNGuuiZMBvuoYM+x9sr9iWGnzrlM0+9hvQ1kgkf1w==} cpu: [arm] @@ -2988,7 +3083,7 @@ packages: /@surma/rollup-plugin-off-main-thread@2.2.3: resolution: {integrity: sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==} dependencies: - ejs: 3.1.9 + ejs: 3.1.10 json5: 2.2.3 magic-string: 0.25.9 string.prototype.matchall: 4.0.11 @@ -3126,6 +3221,20 @@ packages: defer-to-connect: 2.0.1 dev: true + /@testing-library/dom@10.1.0: + resolution: {integrity: sha512-wdsYKy5zupPyLCW2Je5DLHSxSfbIp6h80WoHOQc+RPtmPGA52O9x5MJEkv92Sjonpq+poOAtUKhh1kBGAXBrNA==} + engines: {node: '>=18'} + dependencies: + '@babel/code-frame': 7.24.2 + '@babel/runtime': 7.24.5 + '@types/aria-query': 5.0.4 + aria-query: 5.3.0 + chalk: 4.1.2 + dom-accessibility-api: 0.5.16 + lz-string: 1.5.0 + pretty-format: 27.5.1 + dev: true + /@testing-library/dom@9.3.4: resolution: {integrity: sha512-FlS4ZWlp97iiNWig0Muq8p+3rVDjRiYE+YKGbAqXOu9nwJFFOdL00kFpz42M+4huzYi86vAK1sOOfyOG45muIQ==} engines: {node: '>=14'} @@ -3187,13 +3296,13 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: true - /@testing-library/user-event@14.5.2(@testing-library/dom@9.3.4): + /@testing-library/user-event@14.5.2(@testing-library/dom@10.1.0): resolution: {integrity: sha512-YAh82Wh4TIrxYLmfGcixwD18oIjyC1pFQC2Y01F2lzV2HTMiYrI0nze0FD0ocB//CKS/7jIUgae+adPqxK5yCQ==} engines: {node: '>=12', npm: '>=6'} peerDependencies: '@testing-library/dom': '>=7.21.4' dependencies: - '@testing-library/dom': 9.3.4 + '@testing-library/dom': 10.1.0 dev: true /@tootallnate/once@2.0.0: @@ -3374,12 +3483,6 @@ packages: dependencies: undici-types: 5.26.5 - /@types/node@20.12.3: - resolution: {integrity: sha512-sD+ia2ubTeWrOu+YMF+MTAB7E+O7qsMqAbMfW7DG3K1URwhZ5hN1pLlRVGbf4wDFzSfikL05M17EyorS86jShw==} - dependencies: - undici-types: 5.26.5 - dev: false - /@types/parse-json@4.0.2: resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} dev: false @@ -3415,10 +3518,8 @@ packages: '@types/scheduler': 0.16.8 csstype: 3.1.3 - /@types/resolve@1.17.1: - resolution: {integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==} - dependencies: - '@types/node': 20.12.3 + /@types/resolve@1.20.2: + resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} dev: false /@types/responselike@1.0.3: @@ -3706,6 +3807,16 @@ packages: json-schema-traverse: 1.0.0 require-from-string: 2.0.2 uri-js: 4.4.1 + dev: true + + /ajv@8.13.0: + resolution: {integrity: sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==} + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + dev: false /ansi-align@3.0.1: resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} @@ -4009,43 +4120,43 @@ packages: resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} engines: {node: '>=10', npm: '>=6'} dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.5 cosmiconfig: 7.1.0 resolve: 1.22.8 dev: false - /babel-plugin-polyfill-corejs2@0.4.10(@babel/core@7.24.4): - resolution: {integrity: sha512-rpIuu//y5OX6jVU+a5BCn1R5RSZYWAl2Nar76iwaOdycqb6JPxediskWFMMl7stfwNJR4b7eiQvh5fB5TEQJTQ==} + /babel-plugin-polyfill-corejs2@0.4.11(@babel/core@7.24.5): + resolution: {integrity: sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: '@babel/compat-data': 7.24.4 - '@babel/core': 7.24.4 - '@babel/helper-define-polyfill-provider': 0.6.1(@babel/core@7.24.4) + '@babel/core': 7.24.5 + '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.24.5) semver: 6.3.1 transitivePeerDependencies: - supports-color dev: false - /babel-plugin-polyfill-corejs3@0.10.4(@babel/core@7.24.4): + /babel-plugin-polyfill-corejs3@0.10.4(@babel/core@7.24.5): resolution: {integrity: sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: - '@babel/core': 7.24.4 - '@babel/helper-define-polyfill-provider': 0.6.1(@babel/core@7.24.4) - core-js-compat: 3.36.1 + '@babel/core': 7.24.5 + '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.24.5) + core-js-compat: 3.37.0 transitivePeerDependencies: - supports-color dev: false - /babel-plugin-polyfill-regenerator@0.6.1(@babel/core@7.24.4): - resolution: {integrity: sha512-JfTApdE++cgcTWjsiCQlLyFBMbTUft9ja17saCc93lgV33h4tuCVj7tlvu//qpLwaG+3yEz7/KhahGrUMkVq9g==} + /babel-plugin-polyfill-regenerator@0.6.2(@babel/core@7.24.5): + resolution: {integrity: sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: - '@babel/core': 7.24.4 - '@babel/helper-define-polyfill-provider': 0.6.1(@babel/core@7.24.4) + '@babel/core': 7.24.5 + '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.24.5) transitivePeerDependencies: - supports-color dev: false @@ -4466,8 +4577,8 @@ packages: engines: {node: '>= 0.6'} dev: true - /core-js-compat@3.36.1: - resolution: {integrity: sha512-Dk997v9ZCt3X/npqzyGdTlq6t7lDBhZwGvV94PKzDArjp7BTRm7WlDAXYd/OWdeFHO8OChQYRJNJvUCqCbrtKA==} + /core-js-compat@3.37.0: + resolution: {integrity: sha512-vYq4L+T8aS5UuFg4UwDhc7YNRWVeVZwltad9C/jV3R2LgVOpS9BDr7l/WL6BN0dbV3k1XejPTHqqEzJgsa0frA==} dependencies: browserslist: 4.23.0 dev: false @@ -4827,8 +4938,8 @@ packages: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} dev: true - /ejs@3.1.9: - resolution: {integrity: sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==} + /ejs@3.1.10: + resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} engines: {node: '>=0.10.0'} hasBin: true dependencies: @@ -5406,6 +5517,10 @@ packages: resolution: {integrity: sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==} dev: false + /estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + dev: false + /esutils@2.0.3: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} @@ -6144,6 +6259,13 @@ packages: call-bind: 1.0.7 has-tostringtag: 1.0.2 + /is-builtin-module@3.2.1: + resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} + engines: {node: '>=6'} + dependencies: + builtin-modules: 3.3.0 + dev: false + /is-callable@1.2.7: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} @@ -6879,15 +7001,6 @@ packages: string-length: 4.0.2 dev: true - /jest-worker@26.6.2: - resolution: {integrity: sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==} - engines: {node: '>= 10.13.0'} - dependencies: - '@types/node': 20.12.3 - merge-stream: 2.0.0 - supports-color: 7.2.0 - dev: false - /jest-worker@29.7.0: resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -7303,6 +7416,7 @@ packages: /merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + dev: true /merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} @@ -8157,7 +8271,7 @@ packages: /regenerator-transform@0.15.2: resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} dependencies: - '@babel/runtime': 7.24.4 + '@babel/runtime': 7.24.5 dev: false /regexp.prototype.flags@1.5.2: @@ -8302,19 +8416,6 @@ packages: glob: 7.2.3 dev: true - /rollup-plugin-terser@7.0.2(rollup@2.79.1): - resolution: {integrity: sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==} - deprecated: This package has been deprecated and is no longer maintained. Please use @rollup/plugin-terser - peerDependencies: - rollup: ^2.0.0 - dependencies: - '@babel/code-frame': 7.24.2 - jest-worker: 26.6.2 - rollup: 2.79.1 - serialize-javascript: 4.0.0 - terser: 5.30.3 - dev: false - /rollup@2.79.1: resolution: {integrity: sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==} engines: {node: '>=10.0.0'} @@ -8428,8 +8529,8 @@ packages: lru-cache: 6.0.0 dev: true - /serialize-javascript@4.0.0: - resolution: {integrity: sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==} + /serialize-javascript@6.0.2: + resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} dependencies: randombytes: 2.1.0 dev: false @@ -8519,6 +8620,10 @@ packages: is-fullwidth-code-point: 5.0.0 dev: true + /smob@1.5.0: + resolution: {integrity: sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==} + dev: false + /source-map-js@1.2.0: resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} engines: {node: '>=0.10.0'} @@ -8855,8 +8960,8 @@ packages: unique-string: 2.0.0 dev: false - /terser@5.30.3: - resolution: {integrity: sha512-STdUgOUx8rLbMGO9IOwHLpCqolkDITFFQSMYYwKE1N2lY6MVSaeoi10z/EhWxRc6ybqoVmKSkhKYH/XUpl7vSA==} + /terser@5.31.0: + resolution: {integrity: sha512-Q1JFAoUKE5IMfI4Z/lkE/E6+SwgzO+x4tq4v1AyBLRj8VSYvRO6A/rQrPg1yud4g0En9EKI1TvFRF2tQFcoUkg==} engines: {node: '>=10'} hasBin: true dependencies: @@ -9250,7 +9355,7 @@ packages: convert-source-map: 2.0.0 dev: true - /vite-plugin-pwa@0.19.5(vite@5.2.6)(workbox-build@7.0.0)(workbox-window@7.0.0): + /vite-plugin-pwa@0.19.5(vite@5.2.6)(workbox-build@7.1.0)(workbox-window@7.1.0): resolution: {integrity: sha512-3xJEc2Gmq6SBf730UAV1N2/MqOm+MiyvaLToSTglg+pH9b9qm666yPVxrBBlcOhGoJJWjJpu+Z9tROKek2CODg==} engines: {node: '>=16.0.0'} peerDependencies: @@ -9266,8 +9371,8 @@ packages: fast-glob: 3.3.2 pretty-bytes: 6.1.1 vite: 5.2.6(@types/node@20.11.30) - workbox-build: 7.0.0 - workbox-window: 7.0.0 + workbox-build: 7.1.0 + workbox-window: 7.1.0 transitivePeerDependencies: - supports-color dev: false @@ -9483,32 +9588,33 @@ packages: winston-transport: 4.7.0 dev: true - /workbox-background-sync@7.0.0: - resolution: {integrity: sha512-S+m1+84gjdueM+jIKZ+I0Lx0BDHkk5Nu6a3kTVxP4fdj3gKouRNmhO8H290ybnJTOPfBDtTMXSQA/QLTvr7PeA==} + /workbox-background-sync@7.1.0: + resolution: {integrity: sha512-rMbgrzueVWDFcEq1610YyDW71z0oAXLfdRHRQcKw4SGihkfOK0JUEvqWHFwA6rJ+6TClnMIn7KQI5PNN1XQXwQ==} dependencies: idb: 7.1.1 - workbox-core: 7.0.0 + workbox-core: 7.1.0 dev: false - /workbox-broadcast-update@7.0.0: - resolution: {integrity: sha512-oUuh4jzZrLySOo0tC0WoKiSg90bVAcnE98uW7F8GFiSOXnhogfNDGZelPJa+6KpGBO5+Qelv04Hqx2UD+BJqNQ==} + /workbox-broadcast-update@7.1.0: + resolution: {integrity: sha512-O36hIfhjej/c5ar95pO67k1GQw0/bw5tKP7CERNgK+JdxBANQhDmIuOXZTNvwb2IHBx9hj2kxvcDyRIh5nzOgQ==} dependencies: - workbox-core: 7.0.0 + workbox-core: 7.1.0 dev: false - /workbox-build@7.0.0: - resolution: {integrity: sha512-CttE7WCYW9sZC+nUYhQg3WzzGPr4IHmrPnjKiu3AMXsiNQKx+l4hHl63WTrnicLmKEKHScWDH8xsGBdrYgtBzg==} + /workbox-build@7.1.0: + resolution: {integrity: sha512-F6R94XAxjB2j4ETMkP1EXKfjECOtDmyvt0vz3BzgWJMI68TNSXIVNkgatwUKBlPGOfy9n2F/4voYRNAhEvPJNg==} engines: {node: '>=16.0.0'} dependencies: - '@apideck/better-ajv-errors': 0.3.6(ajv@8.12.0) - '@babel/core': 7.24.4 - '@babel/preset-env': 7.24.4(@babel/core@7.24.4) - '@babel/runtime': 7.24.4 - '@rollup/plugin-babel': 5.3.1(@babel/core@7.24.4)(rollup@2.79.1) - '@rollup/plugin-node-resolve': 11.2.1(rollup@2.79.1) + '@apideck/better-ajv-errors': 0.3.6(ajv@8.13.0) + '@babel/core': 7.24.5 + '@babel/preset-env': 7.24.5(@babel/core@7.24.5) + '@babel/runtime': 7.24.5 + '@rollup/plugin-babel': 5.3.1(@babel/core@7.24.5)(rollup@2.79.1) + '@rollup/plugin-node-resolve': 15.2.3(rollup@2.79.1) '@rollup/plugin-replace': 2.4.2(rollup@2.79.1) + '@rollup/plugin-terser': 0.4.4(rollup@2.79.1) '@surma/rollup-plugin-off-main-thread': 2.2.3 - ajv: 8.12.0 + ajv: 8.13.0 common-tags: 1.8.2 fast-json-stable-stringify: 2.1.0 fs-extra: 9.1.0 @@ -9516,118 +9622,116 @@ packages: lodash: 4.17.21 pretty-bytes: 5.6.0 rollup: 2.79.1 - rollup-plugin-terser: 7.0.2(rollup@2.79.1) source-map: 0.8.0-beta.0 stringify-object: 3.3.0 strip-comments: 2.0.1 tempy: 0.6.0 upath: 1.2.0 - workbox-background-sync: 7.0.0 - workbox-broadcast-update: 7.0.0 - workbox-cacheable-response: 7.0.0 - workbox-core: 7.0.0 - workbox-expiration: 7.0.0 - workbox-google-analytics: 7.0.0 - workbox-navigation-preload: 7.0.0 - workbox-precaching: 7.0.0 - workbox-range-requests: 7.0.0 - workbox-recipes: 7.0.0 - workbox-routing: 7.0.0 - workbox-strategies: 7.0.0 - workbox-streams: 7.0.0 - workbox-sw: 7.0.0 - workbox-window: 7.0.0 + workbox-background-sync: 7.1.0 + workbox-broadcast-update: 7.1.0 + workbox-cacheable-response: 7.1.0 + workbox-core: 7.1.0 + workbox-expiration: 7.1.0 + workbox-google-analytics: 7.1.0 + workbox-navigation-preload: 7.1.0 + workbox-precaching: 7.1.0 + workbox-range-requests: 7.1.0 + workbox-recipes: 7.1.0 + workbox-routing: 7.1.0 + workbox-strategies: 7.1.0 + workbox-streams: 7.1.0 + workbox-sw: 7.1.0 + workbox-window: 7.1.0 transitivePeerDependencies: - '@types/babel__core' - supports-color dev: false - /workbox-cacheable-response@7.0.0: - resolution: {integrity: sha512-0lrtyGHn/LH8kKAJVOQfSu3/80WDc9Ma8ng0p2i/5HuUndGttH+mGMSvOskjOdFImLs2XZIimErp7tSOPmu/6g==} + /workbox-cacheable-response@7.1.0: + resolution: {integrity: sha512-iwsLBll8Hvua3xCuBB9h92+/e0wdsmSVgR2ZlvcfjepZWwhd3osumQB3x9o7flj+FehtWM2VHbZn8UJeBXXo6Q==} dependencies: - workbox-core: 7.0.0 + workbox-core: 7.1.0 dev: false - /workbox-core@7.0.0: - resolution: {integrity: sha512-81JkAAZtfVP8darBpfRTovHg8DGAVrKFgHpOArZbdFd78VqHr5Iw65f2guwjE2NlCFbPFDoez3D3/6ZvhI/rwQ==} + /workbox-core@7.1.0: + resolution: {integrity: sha512-5KB4KOY8rtL31nEF7BfvU7FMzKT4B5TkbYa2tzkS+Peqj0gayMT9SytSFtNzlrvMaWgv6y/yvP9C0IbpFjV30Q==} dev: false - /workbox-expiration@7.0.0: - resolution: {integrity: sha512-MLK+fogW+pC3IWU9SFE+FRStvDVutwJMR5if1g7oBJx3qwmO69BNoJQVaMXq41R0gg3MzxVfwOGKx3i9P6sOLQ==} + /workbox-expiration@7.1.0: + resolution: {integrity: sha512-m5DcMY+A63rJlPTbbBNtpJ20i3enkyOtSgYfv/l8h+D6YbbNiA0zKEkCUaMsdDlxggla1oOfRkyqTvl5Ni5KQQ==} dependencies: idb: 7.1.1 - workbox-core: 7.0.0 + workbox-core: 7.1.0 dev: false - /workbox-google-analytics@7.0.0: - resolution: {integrity: sha512-MEYM1JTn/qiC3DbpvP2BVhyIH+dV/5BjHk756u9VbwuAhu0QHyKscTnisQuz21lfRpOwiS9z4XdqeVAKol0bzg==} - deprecated: It is not compatible with newer versions of GA starting with v4, as long as you are using GAv3 it should be ok, but the package is not longer being maintained + /workbox-google-analytics@7.1.0: + resolution: {integrity: sha512-FvE53kBQHfVTcZyczeBVRexhh7JTkyQ8HAvbVY6mXd2n2A7Oyz/9fIwnY406ZcDhvE4NFfKGjW56N4gBiqkrew==} dependencies: - workbox-background-sync: 7.0.0 - workbox-core: 7.0.0 - workbox-routing: 7.0.0 - workbox-strategies: 7.0.0 + workbox-background-sync: 7.1.0 + workbox-core: 7.1.0 + workbox-routing: 7.1.0 + workbox-strategies: 7.1.0 dev: false - /workbox-navigation-preload@7.0.0: - resolution: {integrity: sha512-juWCSrxo/fiMz3RsvDspeSLGmbgC0U9tKqcUPZBCf35s64wlaLXyn2KdHHXVQrb2cqF7I0Hc9siQalainmnXJA==} + /workbox-navigation-preload@7.1.0: + resolution: {integrity: sha512-4wyAbo0vNI/X0uWNJhCMKxnPanNyhybsReMGN9QUpaePLTiDpKxPqFxl4oUmBNddPwIXug01eTSLVIFXimRG/A==} dependencies: - workbox-core: 7.0.0 + workbox-core: 7.1.0 dev: false - /workbox-precaching@7.0.0: - resolution: {integrity: sha512-EC0vol623LJqTJo1mkhD9DZmMP604vHqni3EohhQVwhJlTgyKyOkMrZNy5/QHfOby+39xqC01gv4LjOm4HSfnA==} + /workbox-precaching@7.1.0: + resolution: {integrity: sha512-LyxzQts+UEpgtmfnolo0hHdNjoB7EoRWcF7EDslt+lQGd0lW4iTvvSe3v5JiIckQSB5KTW5xiCqjFviRKPj1zA==} dependencies: - workbox-core: 7.0.0 - workbox-routing: 7.0.0 - workbox-strategies: 7.0.0 + workbox-core: 7.1.0 + workbox-routing: 7.1.0 + workbox-strategies: 7.1.0 dev: false - /workbox-range-requests@7.0.0: - resolution: {integrity: sha512-SxAzoVl9j/zRU9OT5+IQs7pbJBOUOlriB8Gn9YMvi38BNZRbM+RvkujHMo8FOe9IWrqqwYgDFBfv6sk76I1yaQ==} + /workbox-range-requests@7.1.0: + resolution: {integrity: sha512-m7+O4EHolNs5yb/79CrnwPR/g/PRzMFYEdo01LqwixVnc/sbzNSvKz0d04OE3aMRel1CwAAZQheRsqGDwATgPQ==} dependencies: - workbox-core: 7.0.0 + workbox-core: 7.1.0 dev: false - /workbox-recipes@7.0.0: - resolution: {integrity: sha512-DntcK9wuG3rYQOONWC0PejxYYIDHyWWZB/ueTbOUDQgefaeIj1kJ7pdP3LZV2lfrj8XXXBWt+JDRSw1lLLOnww==} + /workbox-recipes@7.1.0: + resolution: {integrity: sha512-NRrk4ycFN9BHXJB6WrKiRX3W3w75YNrNrzSX9cEZgFB5ubeGoO8s/SDmOYVrFYp9HMw6sh1Pm3eAY/1gVS8YLg==} dependencies: - workbox-cacheable-response: 7.0.0 - workbox-core: 7.0.0 - workbox-expiration: 7.0.0 - workbox-precaching: 7.0.0 - workbox-routing: 7.0.0 - workbox-strategies: 7.0.0 + workbox-cacheable-response: 7.1.0 + workbox-core: 7.1.0 + workbox-expiration: 7.1.0 + workbox-precaching: 7.1.0 + workbox-routing: 7.1.0 + workbox-strategies: 7.1.0 dev: false - /workbox-routing@7.0.0: - resolution: {integrity: sha512-8YxLr3xvqidnbVeGyRGkaV4YdlKkn5qZ1LfEePW3dq+ydE73hUUJJuLmGEykW3fMX8x8mNdL0XrWgotcuZjIvA==} + /workbox-routing@7.1.0: + resolution: {integrity: sha512-oOYk+kLriUY2QyHkIilxUlVcFqwduLJB7oRZIENbqPGeBP/3TWHYNNdmGNhz1dvKuw7aqvJ7CQxn27/jprlTdg==} dependencies: - workbox-core: 7.0.0 + workbox-core: 7.1.0 dev: false - /workbox-strategies@7.0.0: - resolution: {integrity: sha512-dg3qJU7tR/Gcd/XXOOo7x9QoCI9nk74JopaJaYAQ+ugLi57gPsXycVdBnYbayVj34m6Y8ppPwIuecrzkpBVwbA==} + /workbox-strategies@7.1.0: + resolution: {integrity: sha512-/UracPiGhUNehGjRm/tLUQ+9PtWmCbRufWtV0tNrALuf+HZ4F7cmObSEK+E4/Bx1p8Syx2tM+pkIrvtyetdlew==} dependencies: - workbox-core: 7.0.0 + workbox-core: 7.1.0 dev: false - /workbox-streams@7.0.0: - resolution: {integrity: sha512-moVsh+5to//l6IERWceYKGiftc+prNnqOp2sgALJJFbnNVpTXzKISlTIsrWY+ogMqt+x1oMazIdHj25kBSq/HQ==} + /workbox-streams@7.1.0: + resolution: {integrity: sha512-WyHAVxRXBMfysM8ORwiZnI98wvGWTVAq/lOyBjf00pXFvG0mNaVz4Ji+u+fKa/mf1i2SnTfikoYKto4ihHeS6w==} dependencies: - workbox-core: 7.0.0 - workbox-routing: 7.0.0 + workbox-core: 7.1.0 + workbox-routing: 7.1.0 dev: false - /workbox-sw@7.0.0: - resolution: {integrity: sha512-SWfEouQfjRiZ7GNABzHUKUyj8pCoe+RwjfOIajcx6J5mtgKkN+t8UToHnpaJL5UVVOf5YhJh+OHhbVNIHe+LVA==} + /workbox-sw@7.1.0: + resolution: {integrity: sha512-Hml/9+/njUXBglv3dtZ9WBKHI235AQJyLBV1G7EFmh4/mUdSQuXui80RtjDeVRrXnm/6QWgRUEHG3/YBVbxtsA==} dev: false - /workbox-window@7.0.0: - resolution: {integrity: sha512-j7P/bsAWE/a7sxqTzXo3P2ALb1reTfZdvVp6OJ/uLr/C2kZAMvjeWGm8V4htQhor7DOvYg0sSbFN2+flT5U0qA==} + /workbox-window@7.1.0: + resolution: {integrity: sha512-ZHeROyqR+AS5UPzholQRDttLFqGMwP0Np8MKWAdyxsDETxq3qOAyXvqessc3GniohG6e0mAqSQyKOHmT8zPF7g==} dependencies: '@types/trusted-types': 2.0.7 - workbox-core: 7.0.0 + workbox-core: 7.1.0 dev: false /wrap-ansi@6.2.0: From 6f99b2c3db80a92b1d3d46c9f1b2aa61c1a0206a Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 30 Apr 2024 12:32:29 +0800 Subject: [PATCH 59/81] chore(deps): update dependency prettier-plugin-sort-imports to v1.8.5 (#1415) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- frontend/pnpm-lock.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/frontend/pnpm-lock.yaml b/frontend/pnpm-lock.yaml index fa626306d1..5a8dbe9bc8 100644 --- a/frontend/pnpm-lock.yaml +++ b/frontend/pnpm-lock.yaml @@ -186,7 +186,7 @@ devDependencies: version: 3.2.5 prettier-plugin-sort-imports: specifier: ^1.8.4 - version: 1.8.4(typescript@5.4.2) + version: 1.8.5(typescript@5.4.2) ts-jest: specifier: ^29.1.2 version: 29.1.2(@babel/core@7.24.3)(jest@29.7.0)(typescript@5.4.2) @@ -7972,8 +7972,8 @@ packages: fast-diff: 1.3.0 dev: true - /prettier-plugin-sort-imports@1.8.4(typescript@5.4.2): - resolution: {integrity: sha512-3Y5TK68TXdP+ViIzRNp4bvjjjPZ0MULL96ImBVTwWtKiIOIcuBIzFmtfPEzOVHaX0tJa3MGChrzmJAsyObvPbA==} + /prettier-plugin-sort-imports@1.8.5(typescript@5.4.2): + resolution: {integrity: sha512-PkizzuO2S8h3kJeWHytnMZXqvv/fD6g+en/dhv4y5QjoiMm1wq3FWzFiFT7c/BilX95l0ZIqJTlMsXYs8z/WQQ==} peerDependencies: typescript: '>4.0.0' dependencies: From d3e5697a18e388df84a6a2703171ed8da527a3d7 Mon Sep 17 00:00:00 2001 From: Leiqiuhong <141199516+Leiqiuhong@users.noreply.github.com> Date: Tue, 30 Apr 2024 15:05:39 +0800 Subject: [PATCH 60/81] ADM-879 [frontend] Generate data reports for multiple time ranges (#1425) * ADM-879: [frontend] feat: set date range when select related date range * ADM-924:[frontend]feat: add disabled logic for DateRangeViewer * ADM-879-new feat: send multi fetch in report page * ADM-879-new refactor: rename * ADM-879-new refactor: rename and move function * ADM-879-new refactor: extract function * ADM-879-new feat: should change data when select other date range * ADM-879-new fix: fix update logic * ADM-879-new refactor: rename * ADM-879-new refactor: rename * ADM-924:[frontend]fix: pass disabled prop to SingleDateRange and DateRangeContainer * ADM-879-new feat: add status for alert * ADM-879: [frontend] feat: modify style * ADM-879-new feat: modify the notification opportunity * ADM-879-new feat: remove the notifications when change dateRange in report page * ADM-879-new fix: fix notification * ADM-879-new fix: fix test * ADM-879-new test: fix test * ADM-879-new test: add unit tests * ADM-879-new refactor: extract method * ADM-879-new refactor: remove useless code * ADM-879-new test: add unit test * ADM-879-new fix: fix sonarcloud * ADM-879-new refactor: fix rename * ADM-879-new refactor: rename * ADM-879-new fix: fix sonarcloud * ADM-879-new fix: fix sonarcloud * ADM-879-new fix: fix pr issues * ADM-879-new fix: fix sonarcloud * ADM-879-new fix: rename * ADM-879-new fix: fix test field name --------- Co-authored-by: GuangbinMa Co-authored-by: Tingyu Dong --- .../__tests__/client/ReportClient.test.ts | 5 +- .../DateRangeViewer/DateRangeViewer.test.tsx | 2 +- .../MetricsStepper/MetricsStepper.test.tsx | 38 +- .../containers/ReportStep/ReportStep.test.tsx | 228 ++++++++--- frontend/__tests__/fixtures.ts | 10 +- .../hooks/useGenerateReportEffect.test.tsx | 313 ++++++++------- frontend/src/clients/report/ReportClient.ts | 11 +- .../Common/DateRangeViewer/index.tsx | 37 +- .../Common/DateRangeViewer/style.tsx | 24 +- frontend/src/containers/MetricsStep/index.tsx | 7 +- frontend/src/containers/ReportStep/index.tsx | 243 +++++++----- frontend/src/context/config/configSlice.ts | 1 + frontend/src/hooks/useGenerateReportEffect.ts | 367 ++++++++++++++---- 13 files changed, 865 insertions(+), 421 deletions(-) diff --git a/frontend/__tests__/client/ReportClient.test.ts b/frontend/__tests__/client/ReportClient.test.ts index 41066ff8dc..d75f5d0032 100644 --- a/frontend/__tests__/client/ReportClient.test.ts +++ b/frontend/__tests__/client/ReportClient.test.ts @@ -21,9 +21,8 @@ describe('report client', () => { afterAll(() => server.close()); it('should get response when generate report request status 202', async () => { - const excepted = { - response: MOCK_RETRIEVE_REPORT_RESPONSE, - }; + const excepted = MOCK_RETRIEVE_REPORT_RESPONSE; + server.use( rest.post(MOCK_REPORT_URL, (req, res, ctx) => res(ctx.status(HttpStatusCode.Accepted), ctx.json(MOCK_RETRIEVE_REPORT_RESPONSE)), diff --git a/frontend/__tests__/components/Common/DateRangeViewer/DateRangeViewer.test.tsx b/frontend/__tests__/components/Common/DateRangeViewer/DateRangeViewer.test.tsx index 9a3c22332f..879e0abe61 100644 --- a/frontend/__tests__/components/Common/DateRangeViewer/DateRangeViewer.test.tsx +++ b/frontend/__tests__/components/Common/DateRangeViewer/DateRangeViewer.test.tsx @@ -5,7 +5,7 @@ import { render } from '@testing-library/react'; describe('DateRangeViewer', () => { const setup = (dateRanges: DateRange) => { - return render(); + return render(); }; const mockDateRanges = [ { diff --git a/frontend/__tests__/containers/MetricsStepper/MetricsStepper.test.tsx b/frontend/__tests__/containers/MetricsStepper/MetricsStepper.test.tsx index 1588c7214f..91970318a7 100644 --- a/frontend/__tests__/containers/MetricsStepper/MetricsStepper.test.tsx +++ b/frontend/__tests__/containers/MetricsStepper/MetricsStepper.test.tsx @@ -15,6 +15,7 @@ import { REQUIRED_DATA, MOCK_PIPELINE_VERIFY_URL, MOCK_BOARD_URL_FOR_JIRA, + MOCK_REPORT_RESPONSE, } from '../../fixtures'; import { updateCycleTimeSettings, @@ -24,9 +25,9 @@ import { updateDeploymentFrequencySettings, updateTreatFlagCardAsBlock, } from '@src/context/Metrics/metricsSlice'; +import { ASSIGNEE_FILTER_TYPES, DEFAULT_MESSAGE } from '@src/constants/resources'; +import { updateDateRange, updateMetrics } from '@src/context/config/configSlice'; import { act, render, screen, waitFor, within } from '@testing-library/react'; -import { ASSIGNEE_FILTER_TYPES } from '@src/constants/resources'; -import { updateMetrics } from '@src/context/config/configSlice'; import MetricsStepper from '@src/containers/MetricsStepper'; import { setupStore } from '../../utils/setupStoreUtil'; import userEvent from '@testing-library/user-event'; @@ -56,6 +57,11 @@ const mockValidationCheckContext = { getDuplicatedPipeLineIds: jest.fn().mockReturnValue([]), }; +const mockDateRange = { + startDate: '2024-02-18T00:00:00.000+08:00', + endDate: '2024-02-28T23:59:59.999+08:00', +}; + jest.mock('@src/hooks/useMetricsStepValidationCheckContext', () => ({ useMetricsStepValidationCheckContext: () => mockValidationCheckContext, })); @@ -88,12 +94,29 @@ jest.mock('@src/utils/util', () => ({ })); jest.mock('@src/hooks/useGenerateReportEffect', () => ({ + ...jest.requireActual('@src/hooks/useGenerateReportEffect'), useGenerateReportEffect: jest.fn().mockReturnValue({ startToRequestData: jest.fn(), - startToRequestDoraData: jest.fn(), stopPollingReports: jest.fn(), - isServerError: false, - errorMessage: '', + closeReportInfosErrorStatus: jest.fn(), + closeBoardMetricsError: jest.fn(), + closePipelineMetricsError: jest.fn(), + closeSourceControlMetricsError: jest.fn(), + reportInfos: [ + { + id: mockDateRange.startDate, + timeout4Board: { message: DEFAULT_MESSAGE, shouldShow: true }, + timeout4Dora: { message: DEFAULT_MESSAGE, shouldShow: true }, + timeout4Report: { message: DEFAULT_MESSAGE, shouldShow: true }, + generalError4Board: { message: DEFAULT_MESSAGE, shouldShow: true }, + generalError4Dora: { message: DEFAULT_MESSAGE, shouldShow: true }, + generalError4Report: { message: DEFAULT_MESSAGE, shouldShow: true }, + shouldShowBoardMetricsError: true, + shouldShowPipelineMetricsError: true, + shouldShowSourceControlMetricsError: true, + reportData: { ...MOCK_REPORT_RESPONSE, exportValidityTime: 30 }, + }, + ], }), })); @@ -160,6 +183,7 @@ const fillMetricsPageDate = async () => { updateDeploymentFrequencySettings({ updateId: 0, label: 'pipelineName', value: 'mock new pipelineName' }), ); store.dispatch(updateDeploymentFrequencySettings({ updateId: 0, label: 'step', value: 'mock new step' })); + store.dispatch(updateDateRange([mockDateRange])); }); }; @@ -396,8 +420,8 @@ describe('MetricsStepper', () => { calendarType: 'Regular Calendar(Weekend Considered)', dateRange: [ { - endDate: dayjs().endOf('date').add(0, 'day').format(COMMON_TIME_FORMAT), - startDate: dayjs().startOf('date').format(COMMON_TIME_FORMAT), + endDate: mockDateRange.endDate, + startDate: mockDateRange.startDate, }, ], metrics: ['Velocity'], diff --git a/frontend/__tests__/containers/ReportStep/ReportStep.test.tsx b/frontend/__tests__/containers/ReportStep/ReportStep.test.tsx index 90033308b7..69373d4042 100644 --- a/frontend/__tests__/containers/ReportStep/ReportStep.test.tsx +++ b/frontend/__tests__/containers/ReportStep/ReportStep.test.tsx @@ -7,7 +7,6 @@ import { EXPORT_METRIC_DATA, EXPORT_PIPELINE_DATA, LEAD_TIME_FOR_CHANGES, - MOCK_DATE_RANGE, MOCK_JIRA_VERIFY_RESPONSE, MOCK_REPORT_RESPONSE, PREVIOUS, @@ -24,21 +23,23 @@ import { updatePipelineToolVerifyResponse, } from '@src/context/config/configSlice'; import { addADeploymentFrequencySetting, updateDeploymentFrequencySettings } from '@src/context/Metrics/metricsSlice'; +import { act, render, renderHook, screen, waitFor } from '@testing-library/react'; +import { closeNotification } from '@src/context/notification/NotificationSlice'; import { addNotification } from '@src/context/notification/NotificationSlice'; import { useGenerateReportEffect } from '@src/hooks/useGenerateReportEffect'; -import { render, renderHook, screen, waitFor } from '@testing-library/react'; +import { DEFAULT_MESSAGE, MESSAGE } from '@src/constants/resources'; import { useExportCsvEffect } from '@src/hooks/useExportCsvEffect'; import { backStep } from '@src/context/stepper/StepperSlice'; import { setupStore } from '../../utils/setupStoreUtil'; import userEvent from '@testing-library/user-event'; import ReportStep from '@src/containers/ReportStep'; -import { MESSAGE } from '@src/constants/resources'; import { Provider } from 'react-redux'; -import React from 'react'; +import { ReactNode } from 'react'; jest.mock('@src/context/notification/NotificationSlice', () => ({ ...jest.requireActual('@src/context/notification/NotificationSlice'), addNotification: jest.fn().mockReturnValue({ type: 'ADD_NOTIFICATION' }), + closeNotification: jest.fn(), })); jest.mock('@src/context/stepper/StepperSlice', () => ({ @@ -54,12 +55,14 @@ jest.mock('@src/hooks/useExportCsvEffect', () => ({ })); jest.mock('@src/hooks/useGenerateReportEffect', () => ({ + ...jest.requireActual('@src/hooks/useGenerateReportEffect'), useGenerateReportEffect: jest.fn().mockReturnValue({ startToRequestData: jest.fn(), - startToRequestDoraData: jest.fn(), stopPollingReports: jest.fn(), - isServerError: false, - errorMessage: '', + closeReportInfosErrorStatus: jest.fn(), + closeBoardMetricsError: jest.fn(), + closePipelineMetricsError: jest.fn(), + closeSourceControlMetricsError: jest.fn(), }), })); @@ -77,20 +80,60 @@ jest.mock('@src/utils/util', () => ({ formatMillisecondsToHours: jest.fn().mockImplementation((time) => time / 60 / 60 / 1000), })); -let store = null; +let store = setupStore(); + +const emptyValueDateRange = { + startDate: '2024-02-04T00:00:00.000+08:00', + endDate: '2024-02-17T23:59:59.999+08:00', +}; + +const fullValueDateRange = { + startDate: '2024-02-18T00:00:00.000+08:00', + endDate: '2024-02-28T23:59:59.999+08:00', +}; + describe('Report Step', () => { - const { result: reportHook } = renderHook(() => useGenerateReportEffect()); + const { result: reportHook } = renderHook(() => useGenerateReportEffect(), { + wrapper: ({ children }: { children: ReactNode }) => { + return {children}; + }, + }); beforeEach(() => { + store = setupStore(); resetReportHook(); }); const resetReportHook = async () => { - reportHook.current.startToRequestData = jest.fn(); - reportHook.current.stopPollingReports = jest.fn(); - reportHook.current.reportData = { ...MOCK_REPORT_RESPONSE, exportValidityTime: 30 }; + reportHook.current.reportInfos = [ + { + id: fullValueDateRange.startDate, + timeout4Board: { message: DEFAULT_MESSAGE, shouldShow: true }, + timeout4Dora: { message: DEFAULT_MESSAGE, shouldShow: true }, + timeout4Report: { message: DEFAULT_MESSAGE, shouldShow: true }, + generalError4Board: { message: DEFAULT_MESSAGE, shouldShow: true }, + generalError4Dora: { message: DEFAULT_MESSAGE, shouldShow: true }, + generalError4Report: { message: DEFAULT_MESSAGE, shouldShow: true }, + shouldShowBoardMetricsError: true, + shouldShowPipelineMetricsError: true, + shouldShowSourceControlMetricsError: true, + reportData: { ...MOCK_REPORT_RESPONSE, exportValidityTime: 30 }, + }, + { + id: emptyValueDateRange.startDate, + timeout4Board: { message: DEFAULT_MESSAGE, shouldShow: true }, + timeout4Dora: { message: DEFAULT_MESSAGE, shouldShow: true }, + timeout4Report: { message: DEFAULT_MESSAGE, shouldShow: true }, + generalError4Board: { message: DEFAULT_MESSAGE, shouldShow: true }, + generalError4Dora: { message: DEFAULT_MESSAGE, shouldShow: true }, + generalError4Report: { message: DEFAULT_MESSAGE, shouldShow: true }, + shouldShowBoardMetricsError: true, + shouldShowPipelineMetricsError: true, + shouldShowSourceControlMetricsError: true, + reportData: { ...EMPTY_REPORT_VALUES }, + }, + ]; }; const handleSaveMock = jest.fn(); - const setup = (params: string[], dateRange?: DateRange) => { - store = setupStore(); + const setup = (params: string[], dateRange: DateRange = [fullValueDateRange]) => { dateRange && store.dispatch(updateDateRange(dateRange)); store.dispatch( updateJiraVerifyResponse({ @@ -129,13 +172,12 @@ describe('Report Step', () => { ); }; afterEach(() => { - store = null; jest.clearAllMocks(); }); describe('render correctly', () => { it('should render report page', () => { - setup(REQUIRED_DATA_LIST); + setup(REQUIRED_DATA_LIST, [emptyValueDateRange]); expect(screen.getByText('Board Metrics')).toBeInTheDocument(); expect(screen.getByText('Velocity')).toBeInTheDocument(); @@ -148,9 +190,7 @@ describe('Report Step', () => { }); it('should render loading page when report data is empty', () => { - reportHook.current.reportData = EMPTY_REPORT_VALUES; - - setup(REQUIRED_DATA_LIST); + setup(REQUIRED_DATA_LIST, [emptyValueDateRange]); expect(screen.getAllByTestId('loading-page')).toHaveLength(7); }); @@ -169,7 +209,6 @@ describe('Report Step', () => { it('should render the velocity component with correct props', async () => { setup([REQUIRED_DATA_LIST[1]]); - expect(screen.getByText('20')).toBeInTheDocument(); expect(screen.getByText('14')).toBeInTheDocument(); }); @@ -255,7 +294,7 @@ describe('Report Step', () => { it.each([[REQUIRED_DATA_LIST[2]], [REQUIRED_DATA_LIST[5]]])( 'should render detail page when clicking show more button given metric %s', async (requiredData) => { - setup([requiredData], MOCK_DATE_RANGE); + setup([requiredData]); await userEvent.click(screen.getByText(SHOW_MORE)); @@ -340,8 +379,8 @@ describe('Report Step', () => { expect(result.current.fetchExportData).toBeCalledWith({ csvTimeStamp: 0, dataType: 'pipeline', - endDate: '', - startDate: '', + endDate: '2024-02-28T23:59:59.999+08:00', + startDate: '2024-02-18T00:00:00.000+08:00', }); }); }); @@ -377,8 +416,8 @@ describe('Report Step', () => { expect(result.current.fetchExportData).toBeCalledWith({ csvTimeStamp: 0, dataType: 'board', - endDate: '', - startDate: '', + endDate: '2024-02-28T23:59:59.999+08:00', + startDate: '2024-02-18T00:00:00.000+08:00', }); }); }); @@ -403,8 +442,8 @@ describe('Report Step', () => { expect(result.current.fetchExportData).toBeCalledWith({ csvTimeStamp: 0, dataType: 'metric', - endDate: '', - startDate: '', + endDate: '2024-02-28T23:59:59.999+08:00', + startDate: '2024-02-18T00:00:00.000+08:00', }); }); @@ -419,40 +458,47 @@ describe('Report Step', () => { const error = 'error'; it('should call addNotification when having timeout4Board error', () => { - reportHook.current.timeout4Board = error; + reportHook.current.reportInfos = reportHook.current.reportInfos.slice(1); + reportHook.current.reportInfos[0].timeout4Board = { message: error, shouldShow: true }; - setup(REQUIRED_DATA_LIST); + setup(REQUIRED_DATA_LIST, [emptyValueDateRange]); + expect(addNotification).toHaveBeenCalledTimes(1); - expect(addNotification).toBeCalledWith({ + expect(addNotification).toHaveBeenCalledWith({ + id: expect.any(String), message: MESSAGE.LOADING_TIMEOUT('Board metrics'), type: 'error', }); }); it('should call addNotification when having timeout4Dora error', () => { - reportHook.current.timeout4Dora = error; + reportHook.current.reportInfos = reportHook.current.reportInfos.slice(1); + reportHook.current.reportInfos[0].timeout4Dora = { message: error, shouldShow: true }; - setup(REQUIRED_DATA_LIST); + setup(REQUIRED_DATA_LIST, [emptyValueDateRange]); - expect(addNotification).toBeCalledWith({ + expect(addNotification).toHaveBeenCalledWith({ + id: expect.any(String), message: MESSAGE.LOADING_TIMEOUT('DORA metrics'), type: 'error', }); }); it('should call addNotification when having timeout4Report error', () => { - reportHook.current.timeout4Report = error; + reportHook.current.reportInfos = reportHook.current.reportInfos.slice(1); + reportHook.current.reportInfos[0].timeout4Report = { message: error, shouldShow: true }; - setup(REQUIRED_DATA_LIST); + setup(REQUIRED_DATA_LIST, [emptyValueDateRange]); - expect(addNotification).toBeCalledWith({ + expect(addNotification).toHaveBeenCalledWith({ + id: expect.any(String), message: MESSAGE.LOADING_TIMEOUT('Report'), type: 'error', }); }); it('should call addNotification when having boardMetricsError', () => { - reportHook.current.reportData = { + reportHook.current.reportInfos[0].reportData = { ...MOCK_REPORT_RESPONSE, reportMetricsError: { boardMetricsError: { @@ -466,14 +512,15 @@ describe('Report Step', () => { setup(REQUIRED_DATA_LIST); - expect(addNotification).toBeCalledWith({ + expect(addNotification).toHaveBeenCalledWith({ + id: expect.any(String), message: MESSAGE.FAILED_TO_GET_DATA('Board Metrics'), type: 'error', }); }); it('should call addNotification when having pipelineMetricsError', () => { - reportHook.current.reportData = { + reportHook.current.reportInfos[0].reportData = { ...MOCK_REPORT_RESPONSE, reportMetricsError: { boardMetricsError: null, @@ -486,15 +533,16 @@ describe('Report Step', () => { }; setup(REQUIRED_DATA_LIST); - - expect(addNotification).toBeCalledWith({ + expect(addNotification).toHaveBeenCalledTimes(2); + expect(addNotification).toHaveBeenCalledWith({ + id: expect.any(String), message: MESSAGE.FAILED_TO_GET_DATA('Buildkite'), type: 'error', }); }); it('should call addNotification when having sourceControlMetricsError', () => { - reportHook.current.reportData = { + reportHook.current.reportInfos[0].reportData = { ...MOCK_REPORT_RESPONSE, reportMetricsError: { boardMetricsError: null, @@ -508,48 +556,52 @@ describe('Report Step', () => { setup(REQUIRED_DATA_LIST); - expect(addNotification).toBeCalledWith({ + expect(addNotification).toHaveBeenCalledWith({ + id: expect.any(String), message: MESSAGE.FAILED_TO_GET_DATA('GitHub'), type: 'error', }); }); it('should call addNotification when having generalError4Board error', () => { - reportHook.current.generalError4Board = error; + reportHook.current.reportInfos[1].generalError4Board = { message: error, shouldShow: true }; - setup(REQUIRED_DATA_LIST); + setup(REQUIRED_DATA_LIST, [emptyValueDateRange]); - expect(addNotification).toBeCalledWith({ + expect(addNotification).toHaveBeenCalledWith({ + id: expect.any(String), message: MESSAGE.FAILED_TO_REQUEST, type: 'error', }); }); it('should call addNotification when having generalError4Dora error', () => { - reportHook.current.generalError4Dora = error; + reportHook.current.reportInfos[1].generalError4Dora = { message: error, shouldShow: true }; - setup(REQUIRED_DATA_LIST); + setup(REQUIRED_DATA_LIST, [emptyValueDateRange]); - expect(addNotification).toBeCalledWith({ + expect(addNotification).toHaveBeenCalledWith({ + id: expect.any(String), message: MESSAGE.FAILED_TO_REQUEST, type: 'error', }); }); it('should call addNotification when having generalError4Report error', () => { - reportHook.current.generalError4Report = error; + reportHook.current.reportInfos[1].generalError4Report = { message: error, shouldShow: true }; - setup(REQUIRED_DATA_LIST); + setup(REQUIRED_DATA_LIST, [emptyValueDateRange]); - expect(addNotification).toBeCalledWith({ + expect(addNotification).toHaveBeenCalledWith({ + id: expect.any(String), message: MESSAGE.FAILED_TO_REQUEST, type: 'error', }); }); it('should retry startToRequestData when click the retry button in Board Metrics', async () => { - reportHook.current.generalError4Report = error; - setup(REQUIRED_DATA_LIST); + reportHook.current.reportInfos[1].generalError4Report = { message: error, shouldShow: true }; + setup(REQUIRED_DATA_LIST, [emptyValueDateRange]); await userEvent.click(screen.getAllByText(RETRY)[0]); @@ -559,8 +611,8 @@ describe('Report Step', () => { }); it('should retry startToRequestData when click the retry button in Dora Metrics', async () => { - reportHook.current.generalError4Report = error; - setup(REQUIRED_DATA_LIST); + reportHook.current.reportInfos[1].generalError4Report = { message: error, shouldShow: true }; + setup(REQUIRED_DATA_LIST, [emptyValueDateRange]); await userEvent.click(screen.getAllByText(RETRY)[1]); @@ -568,5 +620,69 @@ describe('Report Step', () => { expect(useGenerateReportEffect().startToRequestData).toHaveBeenCalledTimes(2); }); }); + + it('should not show notification when sending request', async () => { + reportHook.current.hasPollingStarted = true; + setup(REQUIRED_DATA_LIST, [emptyValueDateRange]); + + expect(addNotification).toHaveBeenCalledTimes(0); + }); + + it('should not show notification given the requests all failed', () => { + reportHook.current.hasPollingStarted = false; + reportHook.current.reportInfos[0].reportData = undefined; + reportHook.current.reportInfos[1].reportData = undefined; + setup(REQUIRED_DATA_LIST, [fullValueDateRange]); + expect(addNotification).toHaveBeenCalledTimes(0); + }); + + it('should show "file will expire ..." notification given the request is successful', () => { + reportHook.current.hasPollingStarted = false; + setup(REQUIRED_DATA_LIST, [fullValueDateRange]); + expect(addNotification).toHaveBeenCalledWith({ + message: MESSAGE.EXPIRE_INFORMATION(30), + }); + }); + + it('should not show notifications given shown once', () => { + reportHook.current.reportInfos = reportHook.current.reportInfos.slice(1); + reportHook.current.reportInfos[0].generalError4Report = { shouldShow: false, message: 'error' }; + reportHook.current.reportInfos[0].generalError4Dora = { shouldShow: false, message: 'error' }; + reportHook.current.reportInfos[0].generalError4Board = { shouldShow: false, message: 'error' }; + reportHook.current.reportInfos[0].timeout4Dora = { shouldShow: false, message: 'error' }; + reportHook.current.reportInfos[0].timeout4Board = { shouldShow: false, message: 'error' }; + reportHook.current.reportInfos[0].timeout4Report = { shouldShow: false, message: 'error' }; + reportHook.current.reportInfos[0].reportData!.reportMetricsError = { + boardMetricsError: { status: 400, message: 'error' }, + pipelineMetricsError: { status: 400, message: 'error' }, + sourceControlMetricsError: { status: 400, message: 'error' }, + }; + reportHook.current.reportInfos[0].shouldShowBoardMetricsError = false; + reportHook.current.reportInfos[0].shouldShowPipelineMetricsError = false; + reportHook.current.reportInfos[0].shouldShowSourceControlMetricsError = false; + setup(REQUIRED_DATA_LIST, [emptyValueDateRange]); + expect(addNotification).toHaveBeenCalledTimes(0); + }); + + it('should close error notification when change dateRange', async () => { + reportHook.current.reportInfos[1].timeout4Board = { shouldShow: true, message: 'error' }; + const { getByTestId, getByText } = setup(REQUIRED_DATA_LIST, [fullValueDateRange, emptyValueDateRange]); + const expandMoreIcon = getByTestId('ExpandMoreIcon'); + await act(async () => { + await userEvent.click(expandMoreIcon); + }); + const secondDateRange = await getByText(/2024\/02\/04/); + + await userEvent.click(secondDateRange); + await userEvent.click(expandMoreIcon); + const firstDateRange = screen.getByText(/2024\/02\/18/); + await userEvent.click(firstDateRange); + expect(addNotification).toHaveBeenCalledWith({ + id: expect.any(String), + message: MESSAGE.LOADING_TIMEOUT('Board metrics'), + type: 'error', + }); + expect(closeNotification).toHaveBeenCalledTimes(1); + }); }); }); diff --git a/frontend/__tests__/fixtures.ts b/frontend/__tests__/fixtures.ts index 47d570ae23..aedd61ce43 100644 --- a/frontend/__tests__/fixtures.ts +++ b/frontend/__tests__/fixtures.ts @@ -288,10 +288,14 @@ export const MOCK_IMPORT_FILE = { metrics: [], }; -export const MOCK_DATE_RANGE = [ +export const MockedDateRanges = [ { - startDate: '2023-04-04T00:00:00+08:00', - endDate: '2023-04-18T00:00:00+08:00', + startDate: '2024-02-04T00:00:00.000+08:00', + endDate: '2024-02-17T23:59:59.999+08:00', + }, + { + startDate: '2024-02-18T00:00:00.000+08:00', + endDate: '2024-02-28T23:59:59.999+08:00', }, ]; diff --git a/frontend/__tests__/hooks/useGenerateReportEffect.test.tsx b/frontend/__tests__/hooks/useGenerateReportEffect.test.tsx index cf7411582c..59474be55c 100644 --- a/frontend/__tests__/hooks/useGenerateReportEffect.test.tsx +++ b/frontend/__tests__/hooks/useGenerateReportEffect.test.tsx @@ -1,13 +1,30 @@ -import { MOCK_GENERATE_REPORT_REQUEST_PARAMS, MOCK_REPORT_RESPONSE, MOCK_RETRIEVE_REPORT_RESPONSE } from '../fixtures'; -import { useGenerateReportEffect } from '@src/hooks/useGenerateReportEffect'; +import { + GeneralErrorKey, + IReportError, + IReportInfo, + useGenerateReportEffect, + IUseGenerateReportEffect, + TimeoutErrorKey, +} from '@src/hooks/useGenerateReportEffect'; +import { + MOCK_GENERATE_REPORT_REQUEST_PARAMS, + MOCK_REPORT_RESPONSE, + MOCK_RETRIEVE_REPORT_RESPONSE, + MockedDateRanges, +} from '../fixtures'; +import { AXIOS_REQUEST_ERROR_CODE } from '@src/constants/resources'; +import { updateDateRange } from '@src/context/config/configSlice'; import { act, renderHook, waitFor } from '@testing-library/react'; import { reportClient } from '@src/clients/report/ReportClient'; +import { setupStore } from '@test/utils/setupStoreUtil'; import { TimeoutError } from '@src/errors/TimeoutError'; import { UnknownError } from '@src/errors/UnknownError'; +import { METRIC_TYPES } from '@src/constants/commons'; +import React, { ReactNode } from 'react'; +import { Provider } from 'react-redux'; import { HttpStatusCode } from 'axios'; import clearAllMocks = jest.clearAllMocks; import resetAllMocks = jest.resetAllMocks; -import { METRIC_TYPES } from '@src/constants/commons'; const MOCK_GENERATE_REPORT_REQUEST_PARAMS_WITH_BOARD_METRIC_TYPE = { ...MOCK_GENERATE_REPORT_REQUEST_PARAMS, @@ -18,11 +35,24 @@ const MOCK_GENERATE_REPORT_REQUEST_PARAMS_WITH_DORA_METRIC_TYPE = { metricTypes: [METRIC_TYPES.DORA], }; +let store = setupStore(); + +const Wrapper = ({ children }: { children: ReactNode }) => { + return {children}; +}; + +const setup = () => + renderHook(() => useGenerateReportEffect(), { + wrapper: Wrapper, + }); + describe('use generate report effect', () => { afterAll(() => { clearAllMocks(); }); beforeEach(() => { + store = setupStore(); + store.dispatch(updateDateRange(MockedDateRanges)); jest.useFakeTimers(); }); afterEach(() => { @@ -30,200 +60,215 @@ describe('use generate report effect', () => { jest.useRealTimers(); }); - it('should set "Data loading failed" for board metrics when board data retrieval times out', async () => { - reportClient.retrieveByUrl = jest.fn().mockRejectedValue(new TimeoutError('5xx error', 503)); - - const { result } = renderHook(() => useGenerateReportEffect()); - - await waitFor(() => { - result.current.startToRequestData(MOCK_GENERATE_REPORT_REQUEST_PARAMS_WITH_BOARD_METRIC_TYPE); - expect(result.current.timeout4Board).toEqual('Data loading failed'); - }); - }); - - it('should call polling report and setTimeout when request board data given pollingReport response return 204', async () => { - reportClient.polling = jest - .fn() - .mockImplementation(async () => ({ status: HttpStatusCode.NoContent, response: MOCK_REPORT_RESPONSE })); + it('should set "Data loading failed" for all board metrics when board data retrieval times out', async () => { reportClient.retrieveByUrl = jest .fn() - .mockImplementation(async () => ({ response: MOCK_RETRIEVE_REPORT_RESPONSE })); + .mockRejectedValue(new TimeoutError('timeout error', AXIOS_REQUEST_ERROR_CODE.TIMEOUT)); + reportClient.polling = jest.fn(); - const { result } = renderHook(() => useGenerateReportEffect()); + const { result } = setup(); - await waitFor(() => { - result.current.startToRequestData(MOCK_GENERATE_REPORT_REQUEST_PARAMS_WITH_BOARD_METRIC_TYPE); + await act(async () => { + await result.current.startToRequestData(MOCK_GENERATE_REPORT_REQUEST_PARAMS_WITH_BOARD_METRIC_TYPE); }); - jest.runOnlyPendingTimers(); - - await waitFor(() => { - expect(reportClient.polling).toHaveBeenCalledTimes(1); - }); + expect(result.current.reportInfos.length).toEqual(2); + expect(result.current.reportInfos[0].timeout4Board.message).toEqual('Data loading failed'); + expect(result.current.reportInfos[0].timeout4Board.shouldShow).toEqual(true); + expect(result.current.reportInfos[0].reportData).toEqual(undefined); + expect(result.current.reportInfos[1].timeout4Board.message).toEqual('Data loading failed'); + expect(result.current.reportInfos[1].timeout4Board.shouldShow).toEqual(true); + expect(result.current.reportInfos[1].reportData).toEqual(undefined); + expect(reportClient.polling).toHaveBeenCalledTimes(0); }); - it('should call polling report more than one time when metrics is loading', async () => { - reportClient.polling = jest.fn().mockImplementation(async () => ({ - status: HttpStatusCode.NoContent, - response: { ...MOCK_REPORT_RESPONSE, allMetricsCompleted: false }, - })); + it('should set "Data loading failed" for dora metrics when dora data retrieval times out', async () => { reportClient.retrieveByUrl = jest .fn() - .mockImplementation(async () => ({ response: MOCK_RETRIEVE_REPORT_RESPONSE })); + .mockRejectedValueOnce(new TimeoutError('timeout error', AXIOS_REQUEST_ERROR_CODE.TIMEOUT)) + .mockResolvedValueOnce(async () => MOCK_RETRIEVE_REPORT_RESPONSE); - const { result } = renderHook(() => useGenerateReportEffect()); + reportClient.polling = jest + .fn() + .mockImplementation(async () => ({ status: HttpStatusCode.Ok, response: MOCK_REPORT_RESPONSE })); + const { result } = setup(); - await waitFor(() => { - result.current.startToRequestData(MOCK_GENERATE_REPORT_REQUEST_PARAMS); - }); - act(() => { - jest.advanceTimersByTime(10000); + await act(async () => { + await result.current.startToRequestData(MOCK_GENERATE_REPORT_REQUEST_PARAMS_WITH_DORA_METRIC_TYPE); }); - await waitFor(() => { - expect(reportClient.polling).toHaveBeenCalledTimes(2); - }); + expect(result.current.reportInfos[0].timeout4Dora.message).toEqual('Data loading failed'); + expect(result.current.reportInfos[0].timeout4Dora.shouldShow).toEqual(true); + expect(result.current.reportInfos[0].reportData).toEqual(undefined); + expect(result.current.reportInfos[1].timeout4Dora.message).toEqual(''); + expect(result.current.reportInfos[1].reportData).toBeTruthy(); }); - it('should call polling report only once when request board data given dora data retrieval is called before', async () => { + it('should call polling report and setTimeout when request board data given pollingReport response return 200', async () => { reportClient.polling = jest .fn() - .mockImplementation(async () => ({ status: HttpStatusCode.NoContent, response: MOCK_REPORT_RESPONSE })); - reportClient.retrieveByUrl = jest - .fn() - .mockImplementation(async () => ({ response: MOCK_RETRIEVE_REPORT_RESPONSE })); + .mockImplementation(async () => ({ status: HttpStatusCode.Ok, response: MOCK_REPORT_RESPONSE })); + reportClient.retrieveByUrl = jest.fn().mockImplementation(async () => MOCK_RETRIEVE_REPORT_RESPONSE); - const { result } = renderHook(() => useGenerateReportEffect()); + const { result } = setup(); await waitFor(() => { result.current.startToRequestData(MOCK_GENERATE_REPORT_REQUEST_PARAMS_WITH_BOARD_METRIC_TYPE); - result.current.startToRequestData(MOCK_GENERATE_REPORT_REQUEST_PARAMS_WITH_DORA_METRIC_TYPE); }); jest.runOnlyPendingTimers(); await waitFor(() => { - expect(reportClient.polling).toHaveBeenCalledTimes(1); - }); - }); - - it('should set "Data loading failed" for dora metrics when dora data retrieval times out', async () => { - reportClient.retrieveByUrl = jest.fn().mockRejectedValue(new TimeoutError('5xx error', 503)); - - const { result } = renderHook(() => useGenerateReportEffect()); - - await waitFor(() => { - result.current.startToRequestData(MOCK_GENERATE_REPORT_REQUEST_PARAMS_WITH_DORA_METRIC_TYPE); - expect(result.current.timeout4Dora).toEqual('Data loading failed'); - }); - }); - - it('should set "Data loading failed" for report when polling times out', async () => { - reportClient.polling = jest.fn().mockImplementation(async () => { - throw new TimeoutError('5xx error', 503); - }); - - reportClient.retrieveByUrl = jest - .fn() - .mockImplementation(async () => ({ response: MOCK_RETRIEVE_REPORT_RESPONSE })); - - const { result } = renderHook(() => useGenerateReportEffect()); - - await waitFor(() => { - result.current.startToRequestData(MOCK_GENERATE_REPORT_REQUEST_PARAMS); - expect(result.current.timeout4Report).toEqual('Data loading failed'); + expect(reportClient.polling).toHaveBeenCalledTimes(2); }); }); - it('should call polling report and setTimeout when request dora data given pollingReport response return 204', async () => { + it('should call polling report more than one time when metrics is loading', async () => { reportClient.polling = jest .fn() - .mockImplementation(async () => ({ status: HttpStatusCode.NoContent, response: MOCK_REPORT_RESPONSE })); - + .mockReturnValueOnce({ + status: HttpStatusCode.Ok, + response: { ...MOCK_REPORT_RESPONSE, allMetricsCompleted: false }, + }) + .mockRejectedValue(new TimeoutError('timeout error', AXIOS_REQUEST_ERROR_CODE.TIMEOUT)) + .mockReturnValueOnce({ + status: HttpStatusCode.Ok, + response: { ...MOCK_REPORT_RESPONSE, allMetricsCompleted: true }, + }); reportClient.retrieveByUrl = jest .fn() - .mockImplementation(async () => ({ response: MOCK_RETRIEVE_REPORT_RESPONSE })); + .mockReturnValueOnce(MOCK_RETRIEVE_REPORT_RESPONSE) + .mockReturnValueOnce({ ...MOCK_RETRIEVE_REPORT_RESPONSE, callbackUrl: '/url/1234' }); - const { result } = renderHook(() => useGenerateReportEffect()); + const { result } = setup(); - await waitFor(() => { - result.current.startToRequestData(MOCK_GENERATE_REPORT_REQUEST_PARAMS_WITH_DORA_METRIC_TYPE); + await act(async () => { + await result.current.startToRequestData(MOCK_GENERATE_REPORT_REQUEST_PARAMS); + jest.advanceTimersByTime(10000); }); - jest.runOnlyPendingTimers(); - - await waitFor(() => { - expect(reportClient.polling).toHaveBeenCalledTimes(1); - }); + expect(reportClient.polling).toHaveBeenCalledTimes(3); + expect(result.current.reportInfos[0][TimeoutErrorKey[METRIC_TYPES.ALL] as keyof IReportError].message).toEqual( + 'Data loading failed', + ); + expect(result.current.reportInfos[0][TimeoutErrorKey[METRIC_TYPES.ALL] as keyof IReportError].shouldShow).toEqual( + true, + ); }); - it('should call polling report only once when request dora data given board data retrieval is called before', async () => { + it('should call polling report only once when request board data given dora data retrieval is called before', async () => { reportClient.polling = jest .fn() - .mockImplementation(async () => ({ status: HttpStatusCode.NoContent, response: MOCK_REPORT_RESPONSE })); + .mockImplementation(async () => ({ status: HttpStatusCode.Ok, response: MOCK_REPORT_RESPONSE })); + reportClient.retrieveByUrl = jest.fn().mockImplementation(async () => MOCK_RETRIEVE_REPORT_RESPONSE); - reportClient.retrieveByUrl = jest - .fn() - .mockImplementation(async () => ({ response: MOCK_RETRIEVE_REPORT_RESPONSE })); - - const { result } = renderHook(() => useGenerateReportEffect()); + const { result } = setup(); - await waitFor(() => { - result.current.startToRequestData(MOCK_GENERATE_REPORT_REQUEST_PARAMS_WITH_DORA_METRIC_TYPE); - result.current.startToRequestData(MOCK_GENERATE_REPORT_REQUEST_PARAMS_WITH_BOARD_METRIC_TYPE); + await waitFor(async () => { + await result.current.startToRequestData(MOCK_GENERATE_REPORT_REQUEST_PARAMS_WITH_BOARD_METRIC_TYPE); + await result.current.startToRequestData(MOCK_GENERATE_REPORT_REQUEST_PARAMS_WITH_DORA_METRIC_TYPE); }); jest.runOnlyPendingTimers(); - await waitFor(() => { - expect(reportClient.polling).toHaveBeenCalledTimes(1); - }); + expect(reportClient.polling).toHaveBeenCalledTimes(2); }); - it('should set "Data loading failed" for board metric when request board data given UnknownException', async () => { + it.each([ + { + params: MOCK_GENERATE_REPORT_REQUEST_PARAMS_WITH_BOARD_METRIC_TYPE, + errorKey: GeneralErrorKey[METRIC_TYPES.BOARD], + }, + { + params: MOCK_GENERATE_REPORT_REQUEST_PARAMS_WITH_DORA_METRIC_TYPE, + errorKey: GeneralErrorKey[METRIC_TYPES.DORA], + }, + { + params: MOCK_GENERATE_REPORT_REQUEST_PARAMS, + errorKey: GeneralErrorKey[METRIC_TYPES.ALL], + }, + ])('should set "Data loading failed" for board metric when request given UnknownException', async (_) => { reportClient.retrieveByUrl = jest.fn().mockRejectedValue(new UnknownError()); - const { result } = renderHook(() => useGenerateReportEffect()); + const { result } = setup(); - await waitFor(() => { - result.current.startToRequestData(MOCK_GENERATE_REPORT_REQUEST_PARAMS_WITH_BOARD_METRIC_TYPE); - expect(result.current.generalError4Board).toEqual('Data loading failed'); + await act(async () => { + await result.current.startToRequestData(_.params); }); - }); + const errorKey = _.errorKey as keyof IReportError; - it('should set "Data loading failed" for dora metric when request dora data given UnknownException', async () => { - reportClient.retrieveByUrl = jest.fn().mockRejectedValue(new UnknownError()); + expect(result.current.reportInfos[0][errorKey].message).toEqual('Data loading failed'); + expect(result.current.reportInfos[0][errorKey].shouldShow).toEqual(true); + expect(result.current.reportInfos[1][errorKey].message).toEqual('Data loading failed'); + expect(result.current.reportInfos[1][errorKey].shouldShow).toEqual(true); + }); - const { result } = renderHook(() => useGenerateReportEffect()); + it.each([ + { + errorKey: 'boardMetricsError', + stateKey: 'shouldShowBoardMetricsError', + updateMethod: 'closeBoardMetricsError', + }, + { + errorKey: 'pipelineMetricsError', + stateKey: 'shouldShowPipelineMetricsError', + updateMethod: 'closePipelineMetricsError', + }, + { + errorKey: 'sourceControlMetricsError', + stateKey: 'shouldShowSourceControlMetricsError', + updateMethod: 'closeSourceControlMetricsError', + }, + ])('should update the report error status when call the update method', async (_) => { + reportClient.polling = jest.fn().mockImplementation(async () => ({ + status: HttpStatusCode.Ok, + response: { + ...MOCK_REPORT_RESPONSE, + reportMetricsError: { + [_.errorKey]: { + status: 400, + message: 'error', + }, + }, + }, + })); + reportClient.retrieveByUrl = jest.fn().mockImplementation(async () => MOCK_RETRIEVE_REPORT_RESPONSE); + const { result } = setup(); - await waitFor(() => { - result.current.startToRequestData(MOCK_GENERATE_REPORT_REQUEST_PARAMS_WITH_DORA_METRIC_TYPE); - expect(result.current.generalError4Dora).toEqual('Data loading failed'); + await act(async () => { + await result.current.startToRequestData(MOCK_GENERATE_REPORT_REQUEST_PARAMS_WITH_BOARD_METRIC_TYPE); }); - }); - it('should set "Data loading failed" for report when polling given UnknownException', async () => { - reportClient.polling = jest.fn().mockRejectedValue(new UnknownError()); - reportClient.retrieveByUrl = jest - .fn() - .mockImplementation(async () => ({ response: MOCK_RETRIEVE_REPORT_RESPONSE })); - - const { result } = renderHook(() => useGenerateReportEffect()); + expect(result.current.reportInfos[0][_.stateKey as keyof IReportInfo]).toEqual(true); + expect(result.current.reportInfos[1][_.stateKey as keyof IReportInfo]).toEqual(true); - await waitFor(() => { - result.current.startToRequestData(MOCK_GENERATE_REPORT_REQUEST_PARAMS); - expect(result.current.generalError4Report).toEqual('Data loading failed'); + await act(async () => { + const updateMethod = result.current[_.updateMethod as keyof IUseGenerateReportEffect] as (id: string) => void; + updateMethod(MockedDateRanges[0].startDate); }); - }); - - it('should set "Data loading failed" for report when all data retrieval times out', async () => { - reportClient.retrieveByUrl = jest.fn().mockRejectedValue(new TimeoutError('5xx error', 503)); - const { result } = renderHook(() => useGenerateReportEffect()); + expect(result.current.reportInfos[0][_.stateKey as keyof IReportInfo]).toEqual(false); + expect(result.current.reportInfos[1][_.stateKey as keyof IReportInfo]).toEqual(true); + }); - await waitFor(() => { - result.current.startToRequestData(MOCK_GENERATE_REPORT_REQUEST_PARAMS); - expect(result.current.timeout4Report).toEqual('Data loading failed'); + it('should update the network error status when call the update method', async () => { + reportClient.retrieveByUrl = jest.fn().mockImplementation(async () => MOCK_RETRIEVE_REPORT_RESPONSE); + reportClient.polling = jest + .fn() + .mockRejectedValue(new TimeoutError('timeout error', AXIOS_REQUEST_ERROR_CODE.TIMEOUT)); + const { result } = setup(); + await act(async () => { + await result.current.startToRequestData(MOCK_GENERATE_REPORT_REQUEST_PARAMS_WITH_BOARD_METRIC_TYPE); + }); + expect(result.current.reportInfos[0].timeout4Dora.shouldShow).toEqual(true); + expect(result.current.reportInfos[1].timeout4Dora.shouldShow).toEqual(true); + await act(async () => { + await result.current.closeReportInfosErrorStatus( + MockedDateRanges[0].startDate, + TimeoutErrorKey[METRIC_TYPES.DORA], + ); }); + expect(result.current.reportInfos[0].timeout4Dora.shouldShow).toEqual(false); + expect(result.current.reportInfos[1].timeout4Dora.shouldShow).toEqual(true); }); }); diff --git a/frontend/src/clients/report/ReportClient.ts b/frontend/src/clients/report/ReportClient.ts index 811352c415..a7dfd7579c 100644 --- a/frontend/src/clients/report/ReportClient.ts +++ b/frontend/src/clients/report/ReportClient.ts @@ -2,6 +2,11 @@ import { ReportCallbackResponse, ReportResponseDTO } from '@src/clients/report/d import { ReportRequestDTO } from '@src/clients/report/dto/request'; import { HttpClient } from '@src/clients/HttpClient'; +export interface IPollingRes { + status: number; + response: ReportResponseDTO; +} + export class ReportClient extends HttpClient { status = 0; reportCallbackResponse: ReportCallbackResponse = { @@ -94,12 +99,10 @@ export class ReportClient extends HttpClient { .catch((e) => { throw e; }); - return { - response: this.reportCallbackResponse, - }; + return this.reportCallbackResponse; }; - polling = async (url: string) => { + polling = async (url: string): Promise => { await this.axiosInstance .get(url) .then((res) => { diff --git a/frontend/src/components/Common/DateRangeViewer/index.tsx b/frontend/src/components/Common/DateRangeViewer/index.tsx index d90e08e488..0f5a3f69d4 100644 --- a/frontend/src/components/Common/DateRangeViewer/index.tsx +++ b/frontend/src/components/Common/DateRangeViewer/index.tsx @@ -13,18 +13,14 @@ import { formatDate } from '@src/utils/util'; import { theme } from '@src/theme'; type Props = { - dateRanges: DateRange; - expandColor?: string; - expandBackgroundColor?: string; + dateRangeList: DateRange; + selectedDateRange?: Record; + changeDateRange?: (dateRange: Record) => void; + disabledAll?: boolean; }; -const DateRangeViewer = ({ - dateRanges, - expandColor = theme.palette.text.disabled, - expandBackgroundColor = theme.palette.secondary.dark, -}: Props) => { +const DateRangeViewer = ({ dateRangeList, changeDateRange, selectedDateRange, disabledAll = true }: Props) => { const [showMoreDateRange, setShowMoreDateRange] = useState(false); - const datePick = dateRanges[0]; const DateRangeExpandRef = useRef(null); const handleClickOutside = useCallback((event: MouseEvent) => { @@ -33,6 +29,11 @@ const DateRangeViewer = ({ } }, []); + const handleClick = (key: string) => { + changeDateRange && changeDateRange(dateRangeList.find((dateRange) => dateRange.startDate === key)!); + setShowMoreDateRange(false); + }; + useEffect(() => { document.addEventListener('mousedown', handleClickOutside); return () => { @@ -43,9 +44,14 @@ const DateRangeViewer = ({ const DateRangeExpand = forwardRef((props, ref: React.ForwardedRef) => { return ( - {dateRanges.map((dateRange, index) => { + {dateRangeList.map((dateRange) => { + const disabled = dateRange.disabled || disabledAll; return ( - + handleClick(dateRange.startDate!)} + key={dateRange.startDate!} + > {formatDate(dateRange.startDate as string)} {formatDate(dateRange.endDate as string)} @@ -57,10 +63,13 @@ const DateRangeViewer = ({ }); return ( - - {formatDate(datePick.startDate as string)} + + {formatDate((selectedDateRange || dateRangeList[0]).startDate as string)} - {formatDate(datePick.endDate as string)} + {formatDate((selectedDateRange || dateRangeList[0]).endDate as string)} setShowMoreDateRange(true)} /> diff --git a/frontend/src/components/Common/DateRangeViewer/style.tsx b/frontend/src/components/Common/DateRangeViewer/style.tsx index 531eaad9a0..760df7b6a7 100644 --- a/frontend/src/components/Common/DateRangeViewer/style.tsx +++ b/frontend/src/components/Common/DateRangeViewer/style.tsx @@ -4,20 +4,19 @@ import { Divider } from '@mui/material'; import styled from '@emotion/styled'; import { theme } from '@src/theme'; -export const DateRangeContainer = styled.div({ +export const DateRangeContainer = styled('div')(({ color }) => ({ position: 'relative', display: 'flex', justifyContent: 'flex-start', alignItems: 'center', - backgroundColor: theme.palette.secondary.dark, borderRadius: '0.5rem', border: '0.07rem solid', borderColor: theme.palette.grey[400], width: 'fit-content', padding: '.75rem', - color: theme.palette.text.disabled, fontSize: '.875rem', -}); + color: color, +})); export const DateRangeExpandContainer = styled.div({ position: 'absolute', @@ -47,27 +46,30 @@ export const DateRangeExpandContainer = styled.div({ }); interface SingleDateRangeProps { - backgroundColor: string; - color: string; + disabled: boolean; } -export const SingleDateRange = styled.div((props) => ({ +export const SingleDateRange = styled('div')(({ disabled }: SingleDateRangeProps) => ({ display: 'flex', justifyContent: 'center', alignItems: 'center', - backgroundColor: props.backgroundColor, - color: props.color, + color: theme.palette.text.primary, fontSize: '.875rem', padding: '0.5rem', + cursor: 'pointer', + + ...(disabled && { + color: theme.palette.text.disabled, + cursor: 'default', + }), })); + export const StyledArrowForward = styled(ArrowForward)({ - color: theme.palette.text.disabled, margin: '0 .5rem', fontSize: '0.875rem', }); export const StyledCalendarToday = styled(CalendarToday)({ - color: theme.palette.text.disabled, marginLeft: '1rem', fontSize: '.875rem', }); diff --git a/frontend/src/containers/MetricsStep/index.tsx b/frontend/src/containers/MetricsStep/index.tsx index af189434ac..14e917095e 100644 --- a/frontend/src/containers/MetricsStep/index.tsx +++ b/frontend/src/containers/MetricsStep/index.tsx @@ -46,7 +46,6 @@ import { Loading } from '@src/components/Loading'; import ReworkSettings from './ReworkSettings'; import { Advance } from './Advance/Advance'; import isEmpty from 'lodash/isEmpty'; -import { theme } from '@src/theme'; import merge from 'lodash/merge'; const MetricsStep = () => { @@ -129,11 +128,7 @@ const MetricsStep = () => { <> {startDate && endDate && ( - + )} {isShowCrewsAndRealDone && ( diff --git a/frontend/src/containers/ReportStep/index.tsx b/frontend/src/containers/ReportStep/index.tsx index 2b98f4c5e6..6183fbe859 100644 --- a/frontend/src/containers/ReportStep/index.tsx +++ b/frontend/src/containers/ReportStep/index.tsx @@ -1,12 +1,25 @@ import { filterAndMapCycleTimeSettings, - formatDateToTimestampString, formatDuplicatedNameWithSuffix, getJiraBoardToken, getRealDoneStatus, onlyEmptyAndDoneState, sortDateRanges, } from '@src/utils/util'; +import { + GeneralErrorKey, + initReportInfo, + IReportError, + IReportInfo, + TimeoutErrorKey, + useGenerateReportEffect, +} from '@src/hooks/useGenerateReportEffect'; +import { + addNotification, + closeAllNotifications, + closeNotification, + Notification, +} from '@src/context/notification/NotificationSlice'; import { isOnlySelectClassification, isSelectBoardMetrics, @@ -21,46 +34,57 @@ import { REPORT_PAGE_TYPE, REQUIRED_DATA, } from '@src/constants/resources'; -import { addNotification, closeAllNotifications, Notification } from '@src/context/notification/NotificationSlice'; import { IPipelineConfig, selectMetricsContent } from '@src/context/Metrics/metricsSlice'; import { backStep, selectTimeStamp } from '@src/context/stepper/StepperSlice'; -import { useGenerateReportEffect } from '@src/hooks/useGenerateReportEffect'; -import React, { useEffect, useLayoutEffect, useMemo, useState } from 'react'; import { StyledCalendarWrapper } from '@src/containers/ReportStep/style'; import { ReportButtonGroup } from '@src/containers/ReportButtonGroup'; import DateRangeViewer from '@src/components/Common/DateRangeViewer'; import { ReportResponseDTO } from '@src/clients/report/dto/response'; import BoardMetrics from '@src/containers/ReportStep/BoardMetrics'; import DoraMetrics from '@src/containers/ReportStep/DoraMetrics'; +import React, { useEffect, useMemo, useState } from 'react'; import { useAppDispatch } from '@src/hooks/useAppDispatch'; import { BoardDetail, DoraDetail } from './ReportDetail'; import { METRIC_TYPES } from '@src/constants/commons'; import { useAppSelector } from '@src/hooks'; +import { uniqueId } from 'lodash'; export interface ReportStepProps { handleSave: () => void; } +const timeoutNotificationMessages = { + [TimeoutErrorKey[METRIC_TYPES.BOARD]]: 'Board metrics', + [TimeoutErrorKey[METRIC_TYPES.DORA]]: 'DORA metrics', + [TimeoutErrorKey[METRIC_TYPES.ALL]]: 'Report', +}; + const ReportStep = ({ handleSave }: ReportStepProps) => { const dispatch = useAppDispatch(); + const configData = useAppSelector(selectConfig); + const descendingDateRanges = sortDateRanges(configData.basic.dateRange); + const [selectedDateRange, setSelectedDateRange] = useState>( + descendingDateRanges[0], + ); + const [currentDataInfo, setCurrentDataInfo] = useState(initReportInfo()); + const { startToRequestData, - reportData, + reportInfos, stopPollingReports, - timeout4Board, - timeout4Dora, - timeout4Report, - generalError4Board, - generalError4Dora, - generalError4Report, + closeReportInfosErrorStatus, + closeBoardMetricsError, + closePipelineMetricsError, + closeSourceControlMetricsError, + hasPollingStarted, } = useGenerateReportEffect(); const [exportValidityTimeMin, setExportValidityTimeMin] = useState(undefined); const [pageType, setPageType] = useState(REPORT_PAGE_TYPE.SUMMARY); const [isCsvFileGeneratedAtEnd, setIsCsvFileGeneratedAtEnd] = useState(false); const [notifications4SummaryPage, setNotifications4SummaryPage] = useState[]>([]); + const [notificationIds, setNotificationIds] = useState([]); - const configData = useAppSelector(selectConfig); const csvTimeStamp = useAppSelector(selectTimeStamp); const { cycleTimeSettingsType, @@ -76,9 +100,8 @@ const ReportStep = ({ handleSave }: ReportStepProps) => { leadTimeForChanges, } = useAppSelector(selectMetricsContent); - const descendingDateRanges = sortDateRanges(configData.basic.dateRange); - const startDate = configData.basic.dateRange[0]?.startDate ?? ''; - const endDate = configData.basic.dateRange[0]?.endDate ?? ''; + const startDate = selectedDateRange?.startDate as string; + const endDate = selectedDateRange?.endDate as string; const { metrics, calendarType } = configData.basic; const boardingMappingStates = [...new Set(cycleTimeSettings.map((item) => item.value))]; const isOnlyEmptyAndDoneState = onlyEmptyAndDoneState(boardingMappingStates); @@ -89,10 +112,15 @@ const ReportStep = ({ handleSave }: ReportStepProps) => { const isSummaryPage = useMemo(() => pageType === REPORT_PAGE_TYPE.SUMMARY, [pageType]); const getErrorMessage4Board = () => { - if (reportData?.reportMetricsError.boardMetricsError) { - return `Failed to get Jira info, status: ${reportData.reportMetricsError.boardMetricsError.status}`; + if (currentDataInfo.reportData?.reportMetricsError.boardMetricsError) { + return `Failed to get Jira info, status: ${currentDataInfo.reportData.reportMetricsError.boardMetricsError.status}`; } - return timeout4Board || timeout4Report || generalError4Board || generalError4Report; + return ( + currentDataInfo.timeout4Board.message || + currentDataInfo.timeout4Report.message || + currentDataInfo.generalError4Board.message || + currentDataInfo.generalError4Report.message + ); }; const getJiraBoardSetting = () => { @@ -172,8 +200,8 @@ const ReportStep = ({ handleSave }: ReportStepProps) => { }); const basicReportRequestBody = { - startTime: formatDateToTimestampString(startDate), - endTime: formatDateToTimestampString(endDate), + startTime: null, + endTime: null, considerHoliday: calendarType === CALENDAR.CHINA, csvTimeStamp, metrics, @@ -200,6 +228,15 @@ const ReportStep = ({ handleSave }: ReportStepProps) => { jiraBoardSetting: undefined, }; + useEffect(() => { + notificationIds.forEach((notificationId) => { + closeNotification(notificationId); + }); + setNotificationIds([]); + setCurrentDataInfo(reportInfos.find((singleResult) => singleResult.id === selectedDateRange.startDate)!); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [reportInfos, selectedDateRange]); + useEffect(() => { setPageType(onlySelectClassification ? REPORT_PAGE_TYPE.BOARD : REPORT_PAGE_TYPE.SUMMARY); return () => { @@ -208,7 +245,7 @@ const ReportStep = ({ handleSave }: ReportStepProps) => { // eslint-disable-next-line react-hooks/exhaustive-deps }, []); - useLayoutEffect(() => { + useEffect(() => { exportValidityTimeMin && isCsvFileGeneratedAtEnd && dispatch( @@ -218,7 +255,7 @@ const ReportStep = ({ handleSave }: ReportStepProps) => { ); }, [dispatch, exportValidityTimeMin, isCsvFileGeneratedAtEnd]); - useLayoutEffect(() => { + useEffect(() => { if (exportValidityTimeMin && isCsvFileGeneratedAtEnd) { const startTime = Date.now(); const timer = setInterval(() => { @@ -243,14 +280,19 @@ const ReportStep = ({ handleSave }: ReportStepProps) => { } }, [dispatch, exportValidityTimeMin, isCsvFileGeneratedAtEnd]); - useLayoutEffect(() => { + useEffect(() => { dispatch(closeAllNotifications()); }, [dispatch, pageType]); useEffect(() => { - setExportValidityTimeMin(reportData?.exportValidityTime); - reportData && setIsCsvFileGeneratedAtEnd(reportData.allMetricsCompleted && reportData.isSuccessfulCreateCsvFile); - }, [dispatch, reportData]); + if (hasPollingStarted) return; + const successfulReportInfos = reportInfos.filter((reportInfo) => reportInfo.reportData); + if (successfulReportInfos.length === 0) return; + setExportValidityTimeMin(successfulReportInfos[0].reportData?.exportValidityTime); + setIsCsvFileGeneratedAtEnd( + successfulReportInfos.some((reportInfo) => reportInfo.reportData?.isSuccessfulCreateCsvFile), + ); + }, [dispatch, reportInfos, hasPollingStarted]); useEffect(() => { if (isSummaryPage && notifications4SummaryPage.length > 0) { @@ -261,106 +303,71 @@ const ReportStep = ({ handleSave }: ReportStepProps) => { }, [dispatch, notifications4SummaryPage, isSummaryPage]); useEffect(() => { - if (reportData?.reportMetricsError.boardMetricsError) { + if (!currentDataInfo.shouldShowBoardMetricsError) return; + if (currentDataInfo.reportData?.reportMetricsError.boardMetricsError) { + const notificationId = uniqueId(); + setNotificationIds((pre) => [...pre, notificationId]); setNotifications4SummaryPage((prevState) => [ ...prevState, { + id: notificationId, message: MESSAGE.FAILED_TO_GET_DATA('Board Metrics'), type: 'error', }, ]); } - }, [reportData?.reportMetricsError.boardMetricsError]); + closeBoardMetricsError(selectedDateRange.startDate as string); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [currentDataInfo.reportData?.reportMetricsError.boardMetricsError]); useEffect(() => { - if (reportData?.reportMetricsError.pipelineMetricsError) { + if (!currentDataInfo.shouldShowPipelineMetricsError) return; + if (currentDataInfo.reportData?.reportMetricsError.pipelineMetricsError) { + const notificationId = uniqueId(); + setNotificationIds((pre) => [...pre, notificationId]); setNotifications4SummaryPage((prevState) => [ ...prevState, { + id: notificationId, message: MESSAGE.FAILED_TO_GET_DATA('Buildkite'), type: 'error', }, ]); } - }, [reportData?.reportMetricsError.pipelineMetricsError]); + closePipelineMetricsError(selectedDateRange.startDate as string); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [currentDataInfo.reportData?.reportMetricsError.pipelineMetricsError]); useEffect(() => { - if (reportData?.reportMetricsError.sourceControlMetricsError) { + if (!currentDataInfo.shouldShowSourceControlMetricsError) return; + if (currentDataInfo.reportData?.reportMetricsError.sourceControlMetricsError) { + const notificationId = uniqueId(); + setNotificationIds((pre) => [...pre, notificationId]); setNotifications4SummaryPage((prevState) => [ ...prevState, { + id: notificationId, message: MESSAGE.FAILED_TO_GET_DATA('GitHub'), type: 'error', }, ]); } - }, [reportData?.reportMetricsError.sourceControlMetricsError]); - - useEffect(() => { - timeout4Report && - setNotifications4SummaryPage((prevState) => [ - ...prevState, - { - message: MESSAGE.LOADING_TIMEOUT('Report'), - type: 'error', - }, - ]); - }, [timeout4Report]); - - useEffect(() => { - timeout4Board && - setNotifications4SummaryPage((prevState) => [ - ...prevState, - { - message: MESSAGE.LOADING_TIMEOUT('Board metrics'), - type: 'error', - }, - ]); - }, [timeout4Board]); - - useEffect(() => { - timeout4Dora && - setNotifications4SummaryPage((prevState) => [ - ...prevState, - { - message: MESSAGE.LOADING_TIMEOUT('DORA metrics'), - type: 'error', - }, - ]); - }, [timeout4Dora]); - - useEffect(() => { - generalError4Board && - setNotifications4SummaryPage((prevState) => [ - ...prevState, - { - message: MESSAGE.FAILED_TO_REQUEST, - type: 'error', - }, - ]); - }, [generalError4Board]); - - useEffect(() => { - generalError4Dora && - setNotifications4SummaryPage((prevState) => [ - ...prevState, - { - message: MESSAGE.FAILED_TO_REQUEST, - type: 'error', - }, - ]); - }, [generalError4Dora]); + closeSourceControlMetricsError(selectedDateRange.startDate as string); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [currentDataInfo.reportData?.reportMetricsError.sourceControlMetricsError]); useEffect(() => { - generalError4Report && - setNotifications4SummaryPage((prevState) => [ - ...prevState, - { - message: MESSAGE.FAILED_TO_REQUEST, - type: 'error', - }, - ]); - }, [generalError4Report]); + Object.values(TimeoutErrorKey).forEach((value) => handleTimeoutAndGeneralError(value)); + Object.values(GeneralErrorKey).forEach((value) => handleTimeoutAndGeneralError(value)); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [ + currentDataInfo.timeout4Board, + currentDataInfo.timeout4Report, + currentDataInfo.timeout4Dora, + currentDataInfo.generalError4Board, + currentDataInfo.generalError4Dora, + currentDataInfo.generalError4Report, + ]); useEffect(() => { startToRequestData(basicReportRequestBody); @@ -373,7 +380,7 @@ const ReportStep = ({ handleSave }: ReportStepProps) => { startToRequestData(boardReportRequestBody)} onShowDetail={() => setPageType(REPORT_PAGE_TYPE.BOARD)} - boardReport={reportData} + boardReport={currentDataInfo.reportData} errorMessage={getErrorMessage4Board()} /> )} @@ -381,8 +388,13 @@ const ReportStep = ({ handleSave }: ReportStepProps) => { startToRequestData(doraReportRequestBody)} onShowDetail={() => setPageType(REPORT_PAGE_TYPE.DORA)} - doraReport={reportData} - errorMessage={timeout4Dora || timeout4Report || generalError4Dora || generalError4Report} + doraReport={currentDataInfo.reportData} + errorMessage={ + currentDataInfo.timeout4Dora.message || + currentDataInfo.timeout4Report.message || + currentDataInfo.generalError4Dora.message || + currentDataInfo.generalError4Report.message + } /> )} @@ -400,18 +412,43 @@ const ReportStep = ({ handleSave }: ReportStepProps) => { setPageType(REPORT_PAGE_TYPE.SUMMARY); }; + const handleTimeoutAndGeneralError = (value: string) => { + const errorKey = value as keyof IReportError; + if (!currentDataInfo[errorKey].shouldShow) return; + if (currentDataInfo[errorKey].message) { + const notificationId = uniqueId(); + setNotificationIds((pre) => [...pre, notificationId]); + setNotifications4SummaryPage((prevState) => [ + ...prevState, + { + id: notificationId, + message: timeoutNotificationMessages[errorKey] + ? MESSAGE.LOADING_TIMEOUT(timeoutNotificationMessages[errorKey]) + : MESSAGE.FAILED_TO_REQUEST, + type: 'error', + }, + ]); + } + closeReportInfosErrorStatus(selectedDateRange.startDate as string, errorKey); + }; + return ( <> {startDate && endDate && ( - + setSelectedDateRange(dateRange)} + disabledAll={false} + /> )} {isSummaryPage ? showSummary() : pageType === REPORT_PAGE_TYPE.BOARD - ? showBoardDetail(reportData) - : !!reportData && showDoraDetail(reportData)} + ? showBoardDetail(currentDataInfo.reportData) + : !!currentDataInfo.reportData && showDoraDetail(currentDataInfo.reportData)} { isShowExportPipelineButton={isSummaryPage ? shouldShowDoraMetrics : pageType === REPORT_PAGE_TYPE.DORA} handleBack={() => handleBack()} handleSave={() => handleSave()} - reportData={reportData} + reportData={currentDataInfo.reportData} startDate={startDate} endDate={endDate} csvTimeStamp={csvTimeStamp} diff --git a/frontend/src/context/config/configSlice.ts b/frontend/src/context/config/configSlice.ts index 24b7aff82c..0cf6021d40 100644 --- a/frontend/src/context/config/configSlice.ts +++ b/frontend/src/context/config/configSlice.ts @@ -22,6 +22,7 @@ import dayjs from 'dayjs'; export type DateRange = { startDate: string | null; endDate: string | null; + disabled?: boolean; }[]; export interface BasicConfigState { diff --git a/frontend/src/hooks/useGenerateReportEffect.ts b/frontend/src/hooks/useGenerateReportEffect.ts index 009da1163c..ba03c492d9 100644 --- a/frontend/src/hooks/useGenerateReportEffect.ts +++ b/frontend/src/hooks/useGenerateReportEffect.ts @@ -1,118 +1,327 @@ +import { ReportCallbackResponse, ReportResponseDTO } from '@src/clients/report/dto/response'; import { exportValidityTimeMapper } from '@src/hooks/reportMapper/exportValidityTime'; import { DATA_LOADING_FAILED, DEFAULT_MESSAGE } from '@src/constants/resources'; -import { ReportResponseDTO } from '@src/clients/report/dto/response'; +import { IPollingRes, reportClient } from '@src/clients/report/ReportClient'; +import { DateRange, selectConfig } from '@src/context/config/configSlice'; import { ReportRequestDTO } from '@src/clients/report/dto/request'; -import { reportClient } from '@src/clients/report/ReportClient'; +import { formatDateToTimestampString } from '@src/utils/util'; import { TimeoutError } from '@src/errors/TimeoutError'; import { METRIC_TYPES } from '@src/constants/commons'; +import { useAppSelector } from '@src/hooks/index'; import { useRef, useState } from 'react'; +import get from 'lodash/get'; -export interface useGenerateReportEffectInterface { - startToRequestData: (params: ReportRequestDTO) => void; +export type PromiseSettledResultWithId = PromiseSettledResult & { + id: string; +}; + +export interface IUseGenerateReportEffect { + startToRequestData: (params: ReportRequestDTO) => Promise; stopPollingReports: () => void; - timeout4Board: string; - timeout4Dora: string; - timeout4Report: string; - generalError4Board: string; - generalError4Dora: string; - generalError4Report: string; + reportInfos: IReportInfo[]; + closeReportInfosErrorStatus: (id: string, errorKey: string) => void; + closeBoardMetricsError: (id: string) => void; + closePipelineMetricsError: (id: string) => void; + closeSourceControlMetricsError: (id: string) => void; + hasPollingStarted: boolean; +} + +interface IErrorInfo { + message: string; + shouldShow: boolean; +} + +export interface IReportError { + timeout4Board: IErrorInfo; + timeout4Dora: IErrorInfo; + timeout4Report: IErrorInfo; + generalError4Board: IErrorInfo; + generalError4Dora: IErrorInfo; + generalError4Report: IErrorInfo; +} + +export interface IReportInfo extends IReportError { + id: string; reportData: ReportResponseDTO | undefined; + shouldShowBoardMetricsError: boolean; + shouldShowPipelineMetricsError: boolean; + shouldShowSourceControlMetricsError: boolean; } -export const useGenerateReportEffect = (): useGenerateReportEffectInterface => { +export const initReportInfo = (): IReportInfo => ({ + id: '', + timeout4Board: { message: DEFAULT_MESSAGE, shouldShow: true }, + timeout4Dora: { message: DEFAULT_MESSAGE, shouldShow: true }, + timeout4Report: { message: DEFAULT_MESSAGE, shouldShow: true }, + generalError4Board: { message: DEFAULT_MESSAGE, shouldShow: true }, + generalError4Dora: { message: DEFAULT_MESSAGE, shouldShow: true }, + generalError4Report: { message: DEFAULT_MESSAGE, shouldShow: true }, + shouldShowBoardMetricsError: true, + shouldShowPipelineMetricsError: true, + shouldShowSourceControlMetricsError: true, + reportData: undefined, +}); + +export const TimeoutErrorKey = { + [METRIC_TYPES.BOARD]: 'timeout4Board', + [METRIC_TYPES.DORA]: 'timeout4Dora', + [METRIC_TYPES.ALL]: 'timeout4Report', +}; + +export const GeneralErrorKey = { + [METRIC_TYPES.BOARD]: 'generalError4Board', + [METRIC_TYPES.DORA]: 'generalError4Dora', + [METRIC_TYPES.ALL]: 'generalError4Report', +}; + +const REJECTED = 'rejected'; +const FULFILLED = 'fulfilled'; + +const getErrorKey = (error: Error, source: METRIC_TYPES): string => { + return error instanceof TimeoutError ? TimeoutErrorKey[source] : GeneralErrorKey[source]; +}; + +export const useGenerateReportEffect = (): IUseGenerateReportEffect => { const reportPath = '/reports'; - const [timeout4Board, setTimeout4Board] = useState(DEFAULT_MESSAGE); - const [timeout4Dora, setTimeout4Dora] = useState(DEFAULT_MESSAGE); - const [timeout4Report, setTimeout4Report] = useState(DEFAULT_MESSAGE); - const [generalError4Board, setGeneralError4Board] = useState(DEFAULT_MESSAGE); - const [generalError4Dora, setGeneralError4Dora] = useState(DEFAULT_MESSAGE); - const [generalError4Report, setGeneralError4Report] = useState(DEFAULT_MESSAGE); - const [reportData, setReportData] = useState(); + const configData = useAppSelector(selectConfig); const timerIdRef = useRef(); - let hasPollingStarted = false; - - const startToRequestData = (params: ReportRequestDTO) => { + const dateRangeList: DateRange = get(configData, 'basic.dateRange', []); + const [reportInfos, setReportInfos] = useState( + dateRangeList.map((dateRange) => ({ ...initReportInfo(), id: dateRange.startDate as string })), + ); + const [hasPollingStarted, setHasPollingStarted] = useState(false); + let nextHasPollingStarted = false; + const startToRequestData = async (params: ReportRequestDTO) => { const { metricTypes } = params; resetTimeoutMessage(metricTypes); - reportClient - .retrieveByUrl(params, reportPath) - .then((res) => { - if (hasPollingStarted) return; - hasPollingStarted = true; - pollingReport(res.response.callbackUrl, res.response.interval); - }) - .catch((e) => { - const source: METRIC_TYPES = metricTypes.length === 2 ? METRIC_TYPES.ALL : metricTypes[0]; - handleError(e, source); - }); + const res: PromiseSettledResult[] = await Promise.allSettled( + dateRangeList.map(({ startDate, endDate }) => + reportClient.retrieveByUrl( + { + ...params, + startTime: formatDateToTimestampString(startDate!), + endTime: formatDateToTimestampString(endDate!), + }, + reportPath, + ), + ), + ); + + updateErrorAfterFetchReport(res, metricTypes); + + if (hasPollingStarted) return; + nextHasPollingStarted = true; + setHasPollingStarted(nextHasPollingStarted); + + const { pollingInfos, pollingInterval } = assemblePollingParams(res); + + await pollingReport({ pollingInfos, interval: pollingInterval }); }; - const resetTimeoutMessage = (metricTypes: string[]) => { - if (metricTypes.length === 2) { - setTimeout4Report(DEFAULT_MESSAGE); - } else if (metricTypes.includes(METRIC_TYPES.BOARD)) { - setTimeout4Board(DEFAULT_MESSAGE); - } else { - setTimeout4Dora(DEFAULT_MESSAGE); + function getReportInfosAfterPolling( + preReportInfos: IReportInfo[], + pollingResponsesWithId: PromiseSettledResultWithId[], + ) { + return preReportInfos.map((reportInfo) => { + const matchedRes = pollingResponsesWithId.find((singleRes) => singleRes.id === reportInfo.id); + if (!matchedRes) return reportInfo; + + if (matchedRes.status === FULFILLED) { + const { response } = matchedRes.value; + reportInfo.reportData = assembleReportData(response); + reportInfo.shouldShowBoardMetricsError = true; + reportInfo.shouldShowPipelineMetricsError = true; + reportInfo.shouldShowSourceControlMetricsError = true; + } else { + const errorKey = getErrorKey(matchedRes.reason, METRIC_TYPES.ALL) as keyof IReportError; + reportInfo[errorKey] = { message: DATA_LOADING_FAILED, shouldShow: true }; + } + return reportInfo; + }); + } + + const pollingReport = async ({ + pollingInfos, + interval, + }: { + pollingInfos: Record[]; + interval: number; + }) => { + const pollingIds: string[] = pollingInfos.map((pollingInfo) => pollingInfo.id); + initReportInfosTimeout4Report(pollingIds); + + const pollingQueue: Promise[] = pollingInfos.map((pollingInfo) => + reportClient.polling(pollingInfo.callbackUrl), + ); + const pollingResponses = await Promise.allSettled(pollingQueue); + const pollingResponsesWithId = assemblePollingResWithId(pollingResponses, pollingInfos); + + setReportInfos((preReportInfos) => getReportInfosAfterPolling(preReportInfos, pollingResponsesWithId)); + + const nextPollingInfos = getNextPollingInfos(pollingResponsesWithId, pollingInfos); + if (nextPollingInfos.length === 0) { + stopPollingReports(); + return; } + timerIdRef.current = window.setTimeout(() => { + pollingReport({ pollingInfos: nextPollingInfos, interval }); + }, interval * 1000); }; - const handleTimeoutError = { - [METRIC_TYPES.BOARD]: setTimeout4Board, - [METRIC_TYPES.DORA]: setTimeout4Dora, - [METRIC_TYPES.ALL]: setTimeout4Report, + const stopPollingReports = () => { + window.clearTimeout(timerIdRef.current); + setHasPollingStarted(false); }; - const handleGeneralError = { - [METRIC_TYPES.BOARD]: setGeneralError4Board, - [METRIC_TYPES.DORA]: setGeneralError4Dora, - [METRIC_TYPES.ALL]: setGeneralError4Report, + const assembleReportData = (response: ReportResponseDTO): ReportResponseDTO => { + const exportValidityTime = exportValidityTimeMapper(response.exportValidityTime); + return { ...response, exportValidityTime: exportValidityTime }; }; - const handleError = (error: Error, source: METRIC_TYPES) => { - return error instanceof TimeoutError - ? handleTimeoutError[source](DATA_LOADING_FAILED) - : handleGeneralError[source](DATA_LOADING_FAILED); + const resetTimeoutMessage = (metricTypes: string[]) => { + setReportInfos((preReportInfos) => { + return preReportInfos.map((reportInfo) => { + if (metricTypes.length === 2) { + reportInfo.timeout4Report = { message: DEFAULT_MESSAGE, shouldShow: true }; + } else if (metricTypes.includes(METRIC_TYPES.BOARD)) { + reportInfo.timeout4Board = { message: DEFAULT_MESSAGE, shouldShow: true }; + } else { + reportInfo.timeout4Dora = { message: DEFAULT_MESSAGE, shouldShow: true }; + } + return reportInfo; + }); + }); }; - const pollingReport = (url: string, interval: number) => { - setTimeout4Report(DEFAULT_MESSAGE); - reportClient - .polling(url) - .then((res: { status: number; response: ReportResponseDTO }) => { - const response = res.response; - handleAndUpdateData(response); - if (response.allMetricsCompleted || !hasPollingStarted) { - stopPollingReports(); - } else { - timerIdRef.current = window.setTimeout(() => pollingReport(url, interval), interval * 1000); + const updateErrorAfterFetchReport = ( + res: PromiseSettledResult[], + metricTypes: METRIC_TYPES[], + ) => { + if (res.filter(({ status }) => status === REJECTED).length === 0) return; + + setReportInfos((preReportInfos: IReportInfo[]) => { + return preReportInfos.map((resInfo, index) => { + const currentRes = res[index]; + if (currentRes.status === REJECTED) { + const source: METRIC_TYPES = metricTypes.length === 2 ? METRIC_TYPES.ALL : metricTypes[0]; + const errorKey = getErrorKey(currentRes.reason, source) as keyof IReportError; + resInfo[errorKey] = { message: DATA_LOADING_FAILED, shouldShow: true }; } - }) - .catch((e) => { - handleError(e, METRIC_TYPES.ALL); - stopPollingReports(); + return resInfo; }); + }); }; - const stopPollingReports = () => { - window.clearTimeout(timerIdRef.current); - hasPollingStarted = false; + const assemblePollingParams = (res: PromiseSettledResult[]) => { + const resWithIds: PromiseSettledResultWithId[] = res.map((item, index) => ({ + ...item, + id: reportInfos[index].id, + })); + + const fulfilledResponses: PromiseSettledResultWithId[] = resWithIds.filter( + ({ status }) => status === FULFILLED, + ); + + const pollingInfos: Record[] = fulfilledResponses.map((v) => { + return { callbackUrl: (v as PromiseFulfilledResult).value.callbackUrl, id: v.id }; + }); + + const pollingInterval = (fulfilledResponses[0] as PromiseFulfilledResult)?.value.interval; + return { pollingInfos, pollingInterval }; }; - const handleAndUpdateData = (response: ReportResponseDTO) => { - const exportValidityTime = exportValidityTimeMapper(response.exportValidityTime); - setReportData({ ...response, exportValidityTime: exportValidityTime }); + const assemblePollingResWithId = ( + pollingResponses: Array>>>, + pollingInfos: Record[], + ) => { + const pollingResponsesWithId: PromiseSettledResultWithId[] = pollingResponses.map( + (singleRes, index) => ({ + ...singleRes, + id: pollingInfos[index].id, + }), + ); + return pollingResponsesWithId; + }; + + const getNextPollingInfos = ( + pollingResponsesWithId: PromiseSettledResultWithId[], + pollingInfos: Record[], + ) => { + const nextPollingInfos: Record[] = pollingResponsesWithId + .filter( + (pollingResponseWithId) => + pollingResponseWithId.status === FULFILLED && + !pollingResponseWithId.value.response.allMetricsCompleted && + nextHasPollingStarted, + ) + .map((pollingResponseWithId) => pollingInfos.find((pollingInfo) => pollingInfo.id === pollingResponseWithId.id)!); + return nextPollingInfos; + }; + + const initReportInfosTimeout4Report = (pollingIds: string[]) => { + setReportInfos((preInfos) => { + return preInfos.map((info) => { + if (pollingIds.includes(info.id)) { + info.timeout4Report = { message: DEFAULT_MESSAGE, shouldShow: true }; + } + return info; + }); + }); + }; + + const shutReportInfosErrorStatus = (id: string, errorKey: string) => { + setReportInfos((preReportInfos) => { + return preReportInfos.map((reportInfo) => { + if (reportInfo.id === id) { + const key = errorKey as keyof IReportError; + reportInfo[key].shouldShow = false; + } + return reportInfo; + }); + }); + }; + + const shutBoardMetricsError = (id: string) => { + setReportInfos((preReportInfos) => { + return preReportInfos.map((reportInfo) => { + if (reportInfo.id === id) { + reportInfo.shouldShowBoardMetricsError = false; + } + return reportInfo; + }); + }); + }; + + const shutPipelineMetricsError = (id: string) => { + setReportInfos((preReportInfos) => { + return preReportInfos.map((reportInfo) => { + if (reportInfo.id === id) { + reportInfo.shouldShowPipelineMetricsError = false; + } + return reportInfo; + }); + }); + }; + + const shutSourceControlMetricsError = (id: string) => { + setReportInfos((preReportInfos) => { + return preReportInfos.map((reportInfo) => { + if (reportInfo.id === id) { + reportInfo.shouldShowSourceControlMetricsError = false; + } + return reportInfo; + }); + }); }; return { startToRequestData, stopPollingReports, - reportData, - timeout4Board, - timeout4Dora, - timeout4Report, - generalError4Board, - generalError4Dora, - generalError4Report, + reportInfos, + closeReportInfosErrorStatus: shutReportInfosErrorStatus, + closeBoardMetricsError: shutBoardMetricsError, + closePipelineMetricsError: shutPipelineMetricsError, + closeSourceControlMetricsError: shutSourceControlMetricsError, + hasPollingStarted, }; }; From 79fe2d69519b32ae635225a5651e5e0a773115e3 Mon Sep 17 00:00:00 2001 From: Leiqiuhong <141199516+Leiqiuhong@users.noreply.github.com> Date: Tue, 30 Apr 2024 16:16:34 +0800 Subject: [PATCH 61/81] Adm-879-fix [frontend]: fix the notification close logic (#1426) * ADM-879-fix fix: use the dispatch to update redux * ADM-879-fix fix: fix test --- .../containers/ReportStep/ReportStep.test.tsx | 2 +- frontend/src/containers/ReportStep/index.tsx | 10 +++++++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/frontend/__tests__/containers/ReportStep/ReportStep.test.tsx b/frontend/__tests__/containers/ReportStep/ReportStep.test.tsx index 69373d4042..19982fe4d6 100644 --- a/frontend/__tests__/containers/ReportStep/ReportStep.test.tsx +++ b/frontend/__tests__/containers/ReportStep/ReportStep.test.tsx @@ -39,7 +39,7 @@ import { ReactNode } from 'react'; jest.mock('@src/context/notification/NotificationSlice', () => ({ ...jest.requireActual('@src/context/notification/NotificationSlice'), addNotification: jest.fn().mockReturnValue({ type: 'ADD_NOTIFICATION' }), - closeNotification: jest.fn(), + closeNotification: jest.fn().mockReturnValue({ type: 'CLOSE_NOTIFICATION' }), })); jest.mock('@src/context/stepper/StepperSlice', () => ({ diff --git a/frontend/src/containers/ReportStep/index.tsx b/frontend/src/containers/ReportStep/index.tsx index 6183fbe859..3f201a9398 100644 --- a/frontend/src/containers/ReportStep/index.tsx +++ b/frontend/src/containers/ReportStep/index.tsx @@ -228,14 +228,18 @@ const ReportStep = ({ handleSave }: ReportStepProps) => { jiraBoardSetting: undefined, }; + useEffect(() => { + setCurrentDataInfo(reportInfos.find((singleResult) => singleResult.id === selectedDateRange.startDate)!); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [reportInfos, selectedDateRange]); + useEffect(() => { notificationIds.forEach((notificationId) => { - closeNotification(notificationId); + dispatch(closeNotification(notificationId)); }); setNotificationIds([]); - setCurrentDataInfo(reportInfos.find((singleResult) => singleResult.id === selectedDateRange.startDate)!); // eslint-disable-next-line react-hooks/exhaustive-deps - }, [reportInfos, selectedDateRange]); + }, [selectedDateRange]); useEffect(() => { setPageType(onlySelectClassification ? REPORT_PAGE_TYPE.BOARD : REPORT_PAGE_TYPE.SUMMARY); From dae9844e10fafd93b4a406dc9edeb631b9050d49 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 3 May 2024 22:16:27 +0800 Subject: [PATCH 62/81] chore(deps): update dependency msw to v2 (#1374)[frontend] * chore(deps): update dependency msw to v2 * fix(e2e): setup and fix 1 test * fix(e2e): fix csvClient test * fix(e2e): fix HearderClient test * fix(e2e): fix MetricsClient.test test * fix(e2e): fix PipelineToolClient.test test * fix(e2e): fix ReportClient.test test * fix(e2e): fix SourceControlClient.test test * fix(e2e): fix all est * fix(e2e): fix security and format * fix(e2e): fix security and format * fix(e2e): fix e2e case * fix(e2e): upgrade * fix(e2e): upgrade * fix(e2e): ignore test cov --------- Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: guzhongren --- .trivyignore | 1 + frontend/__tests__/client/BoardClient.test.ts | 88 +- frontend/__tests__/client/CSVClient.test.ts | 21 +- .../__tests__/client/HeaderClient.test.ts | 32 +- .../__tests__/client/MetricsClient.test.ts | 37 +- .../client/PipelineToolClient.test.ts | 42 +- .../__tests__/client/ReportClient.test.ts | 73 +- .../client/SourceControlClient.test.ts | 24 +- .../containers/ConfigStep/Board.test.tsx | 24 +- .../containers/ConfigStep/ConfigStep.test.tsx | 23 +- .../ConfigStep/PipelineTool.test.tsx | 32 +- .../ConfigStep/SourceControl.test.tsx | 25 +- .../BranchSelection.test.tsx | 33 +- .../PipelineMetricSelection.test.tsx | 11 +- .../MetricsStep/MetricsStep.test.tsx | 154 +- .../MetricsStepper/MetricsStepper.test.tsx | 22 +- .../__tests__/hooks/useGetBoardInfo.test.tsx | 147 +- frontend/jest.config.json | 8 +- frontend/jest.polyfills.ts | 32 + frontend/jsdom.extended.ts | 25 + frontend/package.json | 6 +- frontend/pnpm-lock.yaml | 11918 +++++++++------- frontend/src/clients/HttpClient.ts | 5 + frontend/tsconfig.json | 8 +- 24 files changed, 7195 insertions(+), 5596 deletions(-) create mode 100644 frontend/jest.polyfills.ts create mode 100644 frontend/jsdom.extended.ts diff --git a/.trivyignore b/.trivyignore index 3c0f02da50..c5fb36668b 100644 --- a/.trivyignore +++ b/.trivyignore @@ -16,3 +16,4 @@ CVE-2024-22259 CVE-2024-28085 CVE-2024-22262 CVE-2024-2961 +CVE-2019-10744 diff --git a/frontend/__tests__/client/BoardClient.test.ts b/frontend/__tests__/client/BoardClient.test.ts index 853589ac13..889c4586ef 100644 --- a/frontend/__tests__/client/BoardClient.test.ts +++ b/frontend/__tests__/client/BoardClient.test.ts @@ -6,11 +6,17 @@ import { AXIOS_ERROR_MESSAGE, } from '../fixtures'; import { boardClient } from '@src/clients/board/BoardClient'; +import { http, HttpResponse } from 'msw'; import { setupServer } from 'msw/node'; import { HttpStatusCode } from 'axios'; -import { rest } from 'msw'; -const server = setupServer(rest.post(MOCK_BOARD_URL_FOR_JIRA, (req, res, ctx) => res(ctx.status(HttpStatusCode.Ok)))); +const server = setupServer( + http.post(MOCK_BOARD_URL_FOR_JIRA, () => { + return new HttpResponse('', { + status: HttpStatusCode.Ok, + }); + }), +); describe('verify board request', () => { beforeAll(() => server.listen()); @@ -29,7 +35,13 @@ describe('verify board request', () => { }); it('should isNoDoneCard is true when board verify response status 204', async () => { - server.use(rest.post(MOCK_BOARD_URL_FOR_JIRA, (req, res, ctx) => res(ctx.status(HttpStatusCode.NoContent)))); + server.use( + http.post(MOCK_BOARD_URL_FOR_JIRA, () => { + return new HttpResponse(null, { + status: HttpStatusCode.NoContent, + }); + }), + ); const result = await boardClient.getVerifyBoard(MOCK_BOARD_VERIFY_REQUEST_PARAMS); @@ -39,9 +51,16 @@ describe('verify board request', () => { it('should throw error when board verify response status 400', async () => { server.use( - rest.post(MOCK_BOARD_URL_FOR_JIRA, (req, res, ctx) => - res(ctx.status(HttpStatusCode.BadRequest), ctx.json({ hintInfo: VERIFY_ERROR_MESSAGE.BAD_REQUEST })), - ), + http.post(MOCK_BOARD_URL_FOR_JIRA, () => { + return new HttpResponse( + JSON.stringify({ + hintInfo: VERIFY_ERROR_MESSAGE.BAD_REQUEST, + }), + { + status: HttpStatusCode.BadRequest, + }, + ); + }), ); boardClient.getVerifyBoard(MOCK_BOARD_VERIFY_REQUEST_PARAMS).catch((e) => { @@ -52,9 +71,16 @@ describe('verify board request', () => { it('should throw error when board verify response status 401', async () => { server.use( - rest.post(MOCK_BOARD_URL_FOR_JIRA, (req, res, ctx) => - res(ctx.status(HttpStatusCode.Unauthorized), ctx.json({ hintInfo: VERIFY_ERROR_MESSAGE.UNAUTHORIZED })), - ), + http.post(MOCK_BOARD_URL_FOR_JIRA, () => { + return new HttpResponse( + JSON.stringify({ + hintInfo: VERIFY_ERROR_MESSAGE.UNAUTHORIZED, + }), + { + status: HttpStatusCode.Unauthorized, + }, + ); + }), ); await expect(async () => { @@ -64,14 +90,16 @@ describe('verify board request', () => { it('should throw error when board verify response status 500', async () => { server.use( - rest.post(MOCK_BOARD_URL_FOR_JIRA, (req, res, ctx) => - res( - ctx.status(HttpStatusCode.InternalServerError), - ctx.json({ + http.post(MOCK_BOARD_URL_FOR_JIRA, () => { + return new HttpResponse( + JSON.stringify({ hintInfo: VERIFY_ERROR_MESSAGE.INTERNAL_SERVER_ERROR, }), - ), - ), + { + status: HttpStatusCode.InternalServerError, + }, + ); + }), ); await expect(async () => { @@ -81,12 +109,16 @@ describe('verify board request', () => { it('should throw error when board verify response status 503', async () => { server.use( - rest.post(MOCK_BOARD_URL_FOR_JIRA, (req, res, ctx) => - res( - ctx.status(HttpStatusCode.ServiceUnavailable), - ctx.json({ hintInfo: VERIFY_ERROR_MESSAGE.REQUEST_TIMEOUT }), - ), - ), + http.post(MOCK_BOARD_URL_FOR_JIRA, () => { + return new HttpResponse( + JSON.stringify({ + hintInfo: VERIFY_ERROR_MESSAGE.REQUEST_TIMEOUT, + }), + { + status: HttpStatusCode.ServiceUnavailable, + }, + ); + }), ); await expect(async () => { @@ -95,7 +127,13 @@ describe('verify board request', () => { }); it('should throw error when board verify response status 300', async () => { - server.use(rest.post(MOCK_BOARD_URL_FOR_JIRA, (req, res, ctx) => res(ctx.status(HttpStatusCode.MultipleChoices)))); + server.use( + http.post(MOCK_BOARD_URL_FOR_JIRA, () => { + return new HttpResponse('', { + status: HttpStatusCode.MultipleChoices, + }); + }), + ); await expect(async () => { await boardClient.getVerifyBoard(MOCK_BOARD_VERIFY_REQUEST_PARAMS); @@ -103,7 +141,11 @@ describe('verify board request', () => { }); it('should throw `Network Error` when board verify encountered netwrok error', async () => { - server.use(rest.post(MOCK_BOARD_URL_FOR_JIRA, (req, res) => res.networkError('Network Error'))); + server.use( + http.post(MOCK_BOARD_URL_FOR_JIRA, () => { + return HttpResponse.error(); + }), + ); await expect(async () => { await boardClient.getVerifyBoard(MOCK_BOARD_VERIFY_REQUEST_PARAMS); diff --git a/frontend/__tests__/client/CSVClient.test.ts b/frontend/__tests__/client/CSVClient.test.ts index 1bda549e45..cd1c21f25f 100644 --- a/frontend/__tests__/client/CSVClient.test.ts +++ b/frontend/__tests__/client/CSVClient.test.ts @@ -1,17 +1,23 @@ import { MOCK_EXPORT_CSV_REQUEST_PARAMS, MOCK_EXPORT_CSV_URL, VERIFY_ERROR_MESSAGE } from '../fixtures'; import { csvClient } from '@src/clients/report/CSVClient'; +import { http, HttpResponse } from 'msw'; import { setupServer } from 'msw/node'; import { HttpStatusCode } from 'axios'; -import { rest } from 'msw'; -const server = setupServer(rest.get(MOCK_EXPORT_CSV_URL, (req, res, ctx) => res(ctx.status(HttpStatusCode.Ok)))); +const server = setupServer( + http.get(MOCK_EXPORT_CSV_URL, () => { + return new HttpResponse(null, { + status: HttpStatusCode.NoContent, + }); + }), +); describe('verify export csv', () => { beforeAll(() => server.listen()); afterAll(() => server.close()); it('should download the pipeline CSV file when export csv request status 200', async () => { - const mockBlob = new Blob(['CSV data'], { type: 'text/csv' }); + const mockBlob = new Blob([''], { type: 'application/octet-stream' }); const mockResponse = { data: mockBlob }; const mockGet = jest.fn().mockResolvedValue(mockResponse); const mockCreateObjectURL = jest.fn().mockImplementation((blob) => { @@ -31,9 +37,12 @@ describe('verify export csv', () => { it('should throw error when export csv request status 500', async () => { server.use( - rest.get(MOCK_EXPORT_CSV_URL, (req, res, ctx) => - res(ctx.status(HttpStatusCode.InternalServerError, VERIFY_ERROR_MESSAGE.INTERNAL_SERVER_ERROR)), - ), + http.get(MOCK_EXPORT_CSV_URL, () => { + return new HttpResponse(null, { + status: HttpStatusCode.InternalServerError, + statusText: VERIFY_ERROR_MESSAGE.INTERNAL_SERVER_ERROR, + }); + }), ); await expect(async () => { diff --git a/frontend/__tests__/client/HeaderClient.test.ts b/frontend/__tests__/client/HeaderClient.test.ts index 3815ef6082..1cde59b5b2 100644 --- a/frontend/__tests__/client/HeaderClient.test.ts +++ b/frontend/__tests__/client/HeaderClient.test.ts @@ -1,10 +1,16 @@ import { MOCK_VERSION_URL, VERIFY_ERROR_MESSAGE, VERSION_RESPONSE } from '../fixtures'; import { headerClient } from '@src/clients/header/HeaderClient'; +import { HttpResponse, http } from 'msw'; import { setupServer } from 'msw/node'; import { HttpStatusCode } from 'axios'; -import { rest } from 'msw'; -const server = setupServer(rest.get(MOCK_VERSION_URL, (req, res, ctx) => res(ctx.status(HttpStatusCode.Ok)))); +const server = setupServer( + http.get(MOCK_VERSION_URL, () => { + return new HttpResponse(null, { + status: HttpStatusCode.Ok, + }); + }), +); describe('header client', () => { beforeAll(() => server.listen()); @@ -14,9 +20,11 @@ describe('header client', () => { it('should get response when get header status 200', async () => { const excepted = '1.11'; server.use( - rest.get(MOCK_VERSION_URL, (req, res, ctx) => - res(ctx.status(HttpStatusCode.Accepted), ctx.json(VERSION_RESPONSE)), - ), + http.get(MOCK_VERSION_URL, () => { + return new HttpResponse(JSON.stringify(VERSION_RESPONSE), { + status: HttpStatusCode.Accepted, + }); + }), ); await expect(headerClient.getVersion()).resolves.toEqual(excepted); @@ -24,14 +32,16 @@ describe('header client', () => { it('should throw error when get version response status 500', () => { server.use( - rest.get(MOCK_VERSION_URL, (req, res, ctx) => - res( - ctx.status(HttpStatusCode.InternalServerError), - ctx.json({ + http.get(MOCK_VERSION_URL, () => { + return new HttpResponse( + JSON.stringify({ hintInfo: VERIFY_ERROR_MESSAGE.INTERNAL_SERVER_ERROR, }), - ), - ), + { + status: HttpStatusCode.InternalServerError, + }, + ); + }), ); expect(async () => { diff --git a/frontend/__tests__/client/MetricsClient.test.ts b/frontend/__tests__/client/MetricsClient.test.ts index 0befd29f61..7f32e8160b 100644 --- a/frontend/__tests__/client/MetricsClient.test.ts +++ b/frontend/__tests__/client/MetricsClient.test.ts @@ -1,8 +1,8 @@ import { BASE_URL, MOCK_GET_STEPS_PARAMS, VERIFY_ERROR_MESSAGE } from '../fixtures'; import { metricsClient } from '@src/clients/MetricsClient'; +import { HttpResponse, http } from 'msw'; import { setupServer } from 'msw/node'; import { HttpStatusCode } from 'axios'; -import { rest } from 'msw'; describe('get steps from metrics response', () => { const { params, buildId, organizationId, pipelineType, token } = MOCK_GET_STEPS_PARAMS; @@ -13,8 +13,10 @@ describe('get steps from metrics response', () => { it('should return steps when getSteps response status 200', async () => { server.use( - rest.get(getStepsUrl, (req, res, ctx) => { - return res(ctx.status(HttpStatusCode.Ok), ctx.json({ steps: ['step1'] })); + http.get(getStepsUrl, () => { + return new HttpResponse(JSON.stringify({ steps: ['step1'] }), { + status: HttpStatusCode.Ok, + }); }), ); @@ -25,14 +27,11 @@ describe('get steps from metrics response', () => { it('should throw error when getSteps response status 500', async () => { server.use( - rest.get(getStepsUrl, (req, res, ctx) => - res( - ctx.status(HttpStatusCode.InternalServerError), - ctx.json({ - hintInfo: VERIFY_ERROR_MESSAGE.INTERNAL_SERVER_ERROR, - }), - ), - ), + http.get(getStepsUrl, () => { + return new HttpResponse(JSON.stringify({ hintInfo: VERIFY_ERROR_MESSAGE.INTERNAL_SERVER_ERROR }), { + status: HttpStatusCode.InternalServerError, + }); + }), ); await expect(async () => { @@ -42,9 +41,11 @@ describe('get steps from metrics response', () => { it('should throw error when getSteps response status 400', async () => { server.use( - rest.get(getStepsUrl, (req, res, ctx) => - res(ctx.status(HttpStatusCode.BadRequest), ctx.json({ hintInfo: VERIFY_ERROR_MESSAGE.BAD_REQUEST })), - ), + http.get(getStepsUrl, () => { + return new HttpResponse(JSON.stringify({ hintInfo: VERIFY_ERROR_MESSAGE.BAD_REQUEST }), { + status: HttpStatusCode.BadRequest, + }); + }), ); await expect(async () => { @@ -53,7 +54,13 @@ describe('get steps from metrics response', () => { }); it('should show isNoStep True when getSteps response status 204', async () => { - server.use(rest.get(getStepsUrl, (req, res, ctx) => res(ctx.status(HttpStatusCode.NoContent)))); + server.use( + http.get(getStepsUrl, () => { + return new HttpResponse(null, { + status: HttpStatusCode.NoContent, + }); + }), + ); const result = await metricsClient.getSteps(params[0], buildId, organizationId, pipelineType, token); diff --git a/frontend/__tests__/client/PipelineToolClient.test.ts b/frontend/__tests__/client/PipelineToolClient.test.ts index acf485b6ec..37185d9103 100644 --- a/frontend/__tests__/client/PipelineToolClient.test.ts +++ b/frontend/__tests__/client/PipelineToolClient.test.ts @@ -5,13 +5,15 @@ import { MOCK_PIPELINE_VERIFY_URL, } from '../fixtures'; import { pipelineToolClient } from '@src/clients/pipeline/PipelineToolClient'; +import { HttpResponse, http } from 'msw'; import { setupServer } from 'msw/node'; import { HttpStatusCode } from 'axios'; -import { rest } from 'msw'; const server = setupServer( - rest.post(MOCK_PIPELINE_VERIFY_URL, (req, res, ctx) => { - return res(ctx.status(HttpStatusCode.NoContent)); + http.post(MOCK_PIPELINE_VERIFY_URL, () => { + return new HttpResponse(null, { + status: HttpStatusCode.NoContent, + }); }), ); @@ -43,7 +45,13 @@ describe('PipelineToolClient', () => { ]; it.each(errorCases)('should return error code when verify endponint returns error', async ({ code }) => { - server.use(rest.post(MOCK_PIPELINE_VERIFY_URL, (req, res, ctx) => res(ctx.status(code)))); + server.use( + http.post(MOCK_PIPELINE_VERIFY_URL, () => { + return new HttpResponse(null, { + status: code, + }); + }), + ); const result = await pipelineToolClient.verify(MOCK_PIPELINE_VERIFY_REQUEST_PARAMS); @@ -55,9 +63,11 @@ describe('PipelineToolClient', () => { describe('Get pipelineTool info request', () => { it('should return 200 code and corresponding data when pipelineTool get info returns code 200', async () => { server.use( - rest.post(MOCK_PIPELINE_GET_INFO_URL, (req, res, ctx) => - res(ctx.status(HttpStatusCode.Ok), ctx.json(MOCK_BUILD_KITE_GET_INFO_RESPONSE)), - ), + http.post(MOCK_PIPELINE_GET_INFO_URL, () => { + return new HttpResponse(JSON.stringify(MOCK_BUILD_KITE_GET_INFO_RESPONSE), { + status: HttpStatusCode.Ok, + }); + }), ); const result = await pipelineToolClient.getInfo(MOCK_PIPELINE_VERIFY_REQUEST_PARAMS); @@ -102,7 +112,13 @@ describe('PipelineToolClient', () => { it.each(errorCases)( `should return result with code:$code and title:$errorTitle and unify errorMessage when verify endpoint returns code:$code`, async ({ code, errorTitle, errorMessage }) => { - server.use(rest.post(MOCK_PIPELINE_GET_INFO_URL, (req, res, ctx) => res(ctx.status(code)))); + server.use( + http.post(MOCK_PIPELINE_GET_INFO_URL, () => { + return new HttpResponse(null, { + status: code, + }); + }), + ); const result = await pipelineToolClient.getInfo(MOCK_PIPELINE_VERIFY_REQUEST_PARAMS); @@ -115,8 +131,8 @@ describe('PipelineToolClient', () => { it('should return ERR_NETWORK error as its code when axios client detect network error', async () => { server.use( - rest.post(MOCK_PIPELINE_GET_INFO_URL, (req, res) => { - return res.networkError('mock network error'); + http.post(MOCK_PIPELINE_GET_INFO_URL, () => { + return HttpResponse.error(); }), ); @@ -128,8 +144,10 @@ describe('PipelineToolClient', () => { it('should return "Unknown error" as a last resort when axios error code didn\'t match the predeifned erorr cases', async () => { server.use( - rest.post(MOCK_PIPELINE_GET_INFO_URL, (req, res, ctx) => { - return res(ctx.status(-1), ctx.body('mock error not covered by httpClient')); + http.post(MOCK_PIPELINE_GET_INFO_URL, () => { + return new HttpResponse(JSON.stringify('mock error not covered by httpClient'), { + status: -1, + }); }), ); diff --git a/frontend/__tests__/client/ReportClient.test.ts b/frontend/__tests__/client/ReportClient.test.ts index d75f5d0032..9eb557e28a 100644 --- a/frontend/__tests__/client/ReportClient.test.ts +++ b/frontend/__tests__/client/ReportClient.test.ts @@ -5,14 +5,22 @@ import { VERIFY_ERROR_MESSAGE, } from '../fixtures'; import { reportClient } from '@src/clients/report/ReportClient'; +import { HttpResponse, http } from 'msw'; import { setupServer } from 'msw/node'; import { HttpStatusCode } from 'axios'; -import { rest } from 'msw'; const MOCK_REPORT_URL = 'http://localhost/api/v1/reports'; const server = setupServer( - rest.post(MOCK_REPORT_URL, (req, res, ctx) => res(ctx.status(HttpStatusCode.Ok))), - rest.get(MOCK_REPORT_URL, (req, res, ctx) => res(ctx.status(HttpStatusCode.Ok))), + http.post(MOCK_REPORT_URL, () => { + return new HttpResponse(null, { + status: HttpStatusCode.Ok, + }); + }), + http.get(MOCK_REPORT_URL, () => { + return new HttpResponse(null, { + status: HttpStatusCode.Ok, + }); + }), ); describe('report client', () => { @@ -22,11 +30,12 @@ describe('report client', () => { it('should get response when generate report request status 202', async () => { const excepted = MOCK_RETRIEVE_REPORT_RESPONSE; - server.use( - rest.post(MOCK_REPORT_URL, (req, res, ctx) => - res(ctx.status(HttpStatusCode.Accepted), ctx.json(MOCK_RETRIEVE_REPORT_RESPONSE)), - ), + http.post(MOCK_REPORT_URL, () => { + return new HttpResponse(JSON.stringify(MOCK_RETRIEVE_REPORT_RESPONSE), { + status: HttpStatusCode.Accepted, + }); + }), ); await expect(reportClient.retrieveByUrl(MOCK_GENERATE_REPORT_REQUEST_PARAMS, '/reports')).resolves.toStrictEqual( @@ -36,14 +45,16 @@ describe('report client', () => { it('should throw error when generate report response status 500', async () => { server.use( - rest.post(MOCK_REPORT_URL, (req, res, ctx) => - res( - ctx.status(HttpStatusCode.InternalServerError), - ctx.json({ + http.post(MOCK_REPORT_URL, () => { + return new HttpResponse( + JSON.stringify({ hintInfo: VERIFY_ERROR_MESSAGE.INTERNAL_SERVER_ERROR, }), - ), - ), + { + status: HttpStatusCode.InternalServerError, + }, + ); + }), ); await expect(async () => { @@ -53,14 +64,16 @@ describe('report client', () => { it('should throw error when generate report response status 400', async () => { server.use( - rest.post(MOCK_REPORT_URL, (req, res, ctx) => - res( - ctx.status(HttpStatusCode.BadRequest), - ctx.json({ + http.post(MOCK_REPORT_URL, () => { + return new HttpResponse( + JSON.stringify({ hintInfo: VERIFY_ERROR_MESSAGE.BAD_REQUEST, }), - ), - ), + { + status: HttpStatusCode.BadRequest, + }, + ); + }), ); await expect(async () => { @@ -70,14 +83,16 @@ describe('report client', () => { it('should throw error when calling pollingReport given response status 500', () => { server.use( - rest.get(MOCK_REPORT_URL, (req, res, ctx) => - res( - ctx.status(HttpStatusCode.InternalServerError), - ctx.json({ + http.get(MOCK_REPORT_URL, () => { + return new HttpResponse( + JSON.stringify({ hintInfo: VERIFY_ERROR_MESSAGE.INTERNAL_SERVER_ERROR, }), - ), - ), + { + status: HttpStatusCode.InternalServerError, + }, + ); + }), ); expect(async () => { @@ -91,9 +106,11 @@ describe('report client', () => { response: MOCK_REPORT_RESPONSE, }; server.use( - rest.get(MOCK_REPORT_URL, (req, res, ctx) => - res(ctx.status(HttpStatusCode.Created), ctx.json(MOCK_REPORT_RESPONSE)), - ), + http.get(MOCK_REPORT_URL, () => { + return new HttpResponse(JSON.stringify(MOCK_REPORT_RESPONSE), { + status: HttpStatusCode.Created, + }); + }), ); await expect(reportClient.polling(MOCK_REPORT_URL)).resolves.toEqual(excepted); diff --git a/frontend/__tests__/client/SourceControlClient.test.ts b/frontend/__tests__/client/SourceControlClient.test.ts index 8e33ec18e7..5e79e38684 100644 --- a/frontend/__tests__/client/SourceControlClient.test.ts +++ b/frontend/__tests__/client/SourceControlClient.test.ts @@ -1,10 +1,16 @@ import { MOCK_SOURCE_CONTROL_VERIFY_TOKEN_URL, MOCK_SOURCE_CONTROL_VERIFY_REQUEST_PARAMS } from '../fixtures'; import { sourceControlClient } from '@src/clients/sourceControl/SourceControlClient'; +import { HttpResponse, http } from 'msw'; import { setupServer } from 'msw/node'; import { HttpStatusCode } from 'axios'; -import { rest } from 'msw'; -const server = setupServer(rest.post(MOCK_SOURCE_CONTROL_VERIFY_TOKEN_URL, (req, res, ctx) => res(ctx.status(204)))); +const server = setupServer( + http.post(MOCK_SOURCE_CONTROL_VERIFY_TOKEN_URL, () => { + return new HttpResponse(null, { + status: HttpStatusCode.NoContent, + }); + }), +); describe('verify sourceControl request', () => { beforeAll(() => server.listen()); @@ -18,7 +24,11 @@ describe('verify sourceControl request', () => { it('should set error title when sourceControl verify response status is 401', async () => { server.use( - rest.post(MOCK_SOURCE_CONTROL_VERIFY_TOKEN_URL, (req, res, ctx) => res(ctx.status(HttpStatusCode.Unauthorized))), + http.post(MOCK_SOURCE_CONTROL_VERIFY_TOKEN_URL, () => { + return new HttpResponse(null, { + status: HttpStatusCode.Unauthorized, + }); + }), ); const result = await sourceControlClient.verifyToken(MOCK_SOURCE_CONTROL_VERIFY_REQUEST_PARAMS); @@ -28,9 +38,11 @@ describe('verify sourceControl request', () => { it('should set default error title when sourceControl verify response status 500', async () => { server.use( - rest.post(MOCK_SOURCE_CONTROL_VERIFY_TOKEN_URL, (req, res, ctx) => - res(ctx.status(HttpStatusCode.InternalServerError)), - ), + http.post(MOCK_SOURCE_CONTROL_VERIFY_TOKEN_URL, () => { + return new HttpResponse(null, { + status: HttpStatusCode.InternalServerError, + }); + }), ); const result = await sourceControlClient.verifyToken(MOCK_SOURCE_CONTROL_VERIFY_REQUEST_PARAMS); diff --git a/frontend/__tests__/containers/ConfigStep/Board.test.tsx b/frontend/__tests__/containers/ConfigStep/Board.test.tsx index 5dd859cbed..cfed37773b 100644 --- a/frontend/__tests__/containers/ConfigStep/Board.test.tsx +++ b/frontend/__tests__/containers/ConfigStep/Board.test.tsx @@ -20,10 +20,10 @@ import { setupStore } from '../../utils/setupStoreUtil'; import { FormProvider } from '@test/utils/FormProvider'; import { TimeoutError } from '@src/errors/TimeoutError'; import userEvent from '@testing-library/user-event'; +import { HttpResponse, http, delay } from 'msw'; import { Provider } from 'react-redux'; import { setupServer } from 'msw/node'; import { HttpStatusCode } from 'axios'; -import { rest } from 'msw'; export const fillBoardFieldsInformation = async () => { await userEvent.type(screen.getByLabelText(/board id/i), '1'); @@ -36,16 +36,16 @@ let store = null; const server = setupServer(); -const mockVerifySuccess = (delay = 0) => { +const mockVerifySuccess = (delayValue = 0) => { server.use( - rest.post(MOCK_BOARD_URL_FOR_JIRA, (_, res, ctx) => - res( - ctx.json({ + http.post(MOCK_BOARD_URL_FOR_JIRA, async () => { + await delay(delayValue); + return new HttpResponse( + JSON.stringify({ projectKey: 'FAKE', }), - ctx.delay(delay), - ), - ), + ); + }), ); }; @@ -245,7 +245,13 @@ describe('Board', () => { }); it('should show error message when board verify response status is 401', async () => { - server.use(rest.post(MOCK_BOARD_URL_FOR_JIRA, (_, res, ctx) => res(ctx.status(HttpStatusCode.Unauthorized)))); + server.use( + http.post(MOCK_BOARD_URL_FOR_JIRA, () => { + return new HttpResponse(null, { + status: HttpStatusCode.Unauthorized, + }); + }), + ); setup(); await fillBoardFieldsInformation(); diff --git a/frontend/__tests__/containers/ConfigStep/ConfigStep.test.tsx b/frontend/__tests__/containers/ConfigStep/ConfigStep.test.tsx index 83d64fb636..3b25695ade 100644 --- a/frontend/__tests__/containers/ConfigStep/ConfigStep.test.tsx +++ b/frontend/__tests__/containers/ConfigStep/ConfigStep.test.tsx @@ -42,21 +42,28 @@ import userEvent from '@testing-library/user-event'; import ConfigStep from '@src/containers/ConfigStep'; import { closeMuiModal } from '@test/testUtils'; import { useForm } from 'react-hook-form'; +import { HttpResponse, http } from 'msw'; import { Provider } from 'react-redux'; import { setupServer } from 'msw/node'; -import { rest } from 'msw'; +import { HttpStatusCode } from 'axios'; import dayjs from 'dayjs'; const server = setupServer( - rest.post(MOCK_PIPELINE_VERIFY_URL, (_, res, ctx) => res(ctx.status(204))), - rest.post(MOCK_BOARD_URL_FOR_JIRA, (_, res, ctx) => - res( - ctx.status(200), - ctx.json({ + http.post(MOCK_PIPELINE_VERIFY_URL, () => { + return new HttpResponse(null, { + status: HttpStatusCode.NoContent, + }); + }), + http.post(MOCK_BOARD_URL_FOR_JIRA, () => { + return new HttpResponse( + JSON.stringify({ projectKey: 'FAKE', }), - ), - ), + { + status: HttpStatusCode.Ok, + }, + ); + }), ); export const fillBoardFieldsInformation = async () => { diff --git a/frontend/__tests__/containers/ConfigStep/PipelineTool.test.tsx b/frontend/__tests__/containers/ConfigStep/PipelineTool.test.tsx index e83a5eac44..cb86e8fa89 100644 --- a/frontend/__tests__/containers/ConfigStep/PipelineTool.test.tsx +++ b/frontend/__tests__/containers/ConfigStep/PipelineTool.test.tsx @@ -23,10 +23,10 @@ import { setupStore } from '../../utils/setupStoreUtil'; import { FormProvider } from '@test/utils/FormProvider'; import { TimeoutError } from '@src/errors/TimeoutError'; import userEvent from '@testing-library/user-event'; +import { HttpResponse, delay, http } from 'msw'; import { Provider } from 'react-redux'; import { setupServer } from 'msw/node'; import { HttpStatusCode } from 'axios'; -import { rest } from 'msw'; export const fillPipelineToolFieldsInformation = async () => { const tokenInput = within(screen.getByTestId('pipelineToolTextField')).getByLabelText( @@ -39,7 +39,13 @@ export const fillPipelineToolFieldsInformation = async () => { let store = null; -const server = setupServer(rest.post(MOCK_PIPELINE_VERIFY_URL, (req, res, ctx) => res(ctx.status(204)))); +const server = setupServer( + http.post(MOCK_PIPELINE_VERIFY_URL, () => { + return new HttpResponse(null, { + status: HttpStatusCode.NoContent, + }); + }), +); const originalVerify = pipelineToolClient.verify; @@ -213,7 +219,12 @@ describe('PipelineTool', () => { it('should check loading animation when click verify button', async () => { server.use( - rest.post(MOCK_PIPELINE_VERIFY_URL, (_, res, ctx) => res(ctx.delay(300), ctx.status(HttpStatusCode.Ok))), + http.post(MOCK_PIPELINE_VERIFY_URL, async () => { + await delay(300); + return new HttpResponse(null, { + status: HttpStatusCode.Ok, + }); + }), ); const { container } = setup(); await fillPipelineToolFieldsInformation(); @@ -223,7 +234,13 @@ describe('PipelineTool', () => { }); it('should check error text appear when pipelineTool verify response status is 401', async () => { - server.use(rest.post(MOCK_PIPELINE_VERIFY_URL, (req, res, ctx) => res(ctx.status(HttpStatusCode.Unauthorized)))); + server.use( + http.post(MOCK_PIPELINE_VERIFY_URL, () => { + return new HttpResponse(null, { + status: HttpStatusCode.Unauthorized, + }); + }), + ); const { getByText } = setup(); await fillPipelineToolFieldsInformation(); @@ -251,7 +268,12 @@ describe('PipelineTool', () => { it('should allow user to re-submit when user interact again with form given form is already submit successfully', async () => { server.use( - rest.post(MOCK_PIPELINE_VERIFY_URL, (_, res, ctx) => res(ctx.delay(100), ctx.status(HttpStatusCode.NoContent))), + http.post(MOCK_PIPELINE_VERIFY_URL, async () => { + await delay(100); + return new HttpResponse(null, { + status: HttpStatusCode.NoContent, + }); + }), ); setup(); await fillPipelineToolFieldsInformation(); diff --git a/frontend/__tests__/containers/ConfigStep/SourceControl.test.tsx b/frontend/__tests__/containers/ConfigStep/SourceControl.test.tsx index 351ea399e0..c06de088a8 100644 --- a/frontend/__tests__/containers/ConfigStep/SourceControl.test.tsx +++ b/frontend/__tests__/containers/ConfigStep/SourceControl.test.tsx @@ -20,10 +20,10 @@ import { render, screen, act, waitFor } from '@testing-library/react'; import { setupStore } from '../../utils/setupStoreUtil'; import { FormProvider } from '@test/utils/FormProvider'; import userEvent from '@testing-library/user-event'; +import { HttpResponse, delay, http } from 'msw'; import { Provider } from 'react-redux'; import { setupServer } from 'msw/node'; import { HttpStatusCode } from 'axios'; -import { rest } from 'msw'; import React from 'react'; const mockValidFormtToken = 'AAAAA_XXXXXX' @@ -40,7 +40,13 @@ export const fillSourceControlFieldsInformation = async () => { let store = null; -const server = setupServer(rest.post(MOCK_SOURCE_CONTROL_VERIFY_TOKEN_URL, (req, res, ctx) => res(ctx.status(204)))); +const server = setupServer( + http.post(MOCK_SOURCE_CONTROL_VERIFY_TOKEN_URL, () => { + return new HttpResponse(null, { + status: HttpStatusCode.NoContent, + }); + }), +); const originalVerifyToken = sourceControlClient.verifyToken; @@ -225,7 +231,11 @@ describe('SourceControl', () => { it('should show error notification when sourceControl verify response status is 401', async () => { server.use( - rest.post(MOCK_SOURCE_CONTROL_VERIFY_TOKEN_URL, (req, res, ctx) => res(ctx.status(HttpStatusCode.Unauthorized))), + http.post(MOCK_SOURCE_CONTROL_VERIFY_TOKEN_URL, () => { + return new HttpResponse(null, { + status: HttpStatusCode.Unauthorized, + }); + }), ); setup(); @@ -253,9 +263,12 @@ describe('SourceControl', () => { it('should allow user to re-submit when user interact again with form given form is already submit successfully', async () => { server.use( - rest.post(MOCK_SOURCE_CONTROL_VERIFY_TOKEN_URL, (req, res, ctx) => - res(ctx.delay(100), ctx.status(HttpStatusCode.NoContent)), - ), + http.post(MOCK_SOURCE_CONTROL_VERIFY_TOKEN_URL, async () => { + await delay(100); + return new HttpResponse(null, { + status: HttpStatusCode.NoContent, + }); + }), ); setup(); await fillSourceControlFieldsInformation(); diff --git a/frontend/__tests__/containers/MetricsStep/DeploymentFrequencySettings/BranchSelection.test.tsx b/frontend/__tests__/containers/MetricsStep/DeploymentFrequencySettings/BranchSelection.test.tsx index caf16fc35d..47690d1e41 100644 --- a/frontend/__tests__/containers/MetricsStep/DeploymentFrequencySettings/BranchSelection.test.tsx +++ b/frontend/__tests__/containers/MetricsStep/DeploymentFrequencySettings/BranchSelection.test.tsx @@ -4,12 +4,19 @@ import { updatePipelineToolVerifyResponse, updateSourceControl } from '@src/cont import { render, screen, waitFor } from '@testing-library/react'; import { setupStore } from '@test/utils/setupStoreUtil'; import userEvent from '@testing-library/user-event'; +import { HttpResponse, http } from 'msw'; import { Provider } from 'react-redux'; import { setupServer } from 'msw/node'; -import { rest } from 'msw'; +import { HttpStatusCode } from 'axios'; import React from 'react'; -const server = setupServer(rest.post(MOCK_SOURCE_CONTROL_VERIFY_BRANCH_URL, (req, res, ctx) => res(ctx.status(204)))); +const server = setupServer( + http.post(MOCK_SOURCE_CONTROL_VERIFY_BRANCH_URL, () => { + return new HttpResponse(null, { + status: HttpStatusCode.NoContent, + }); + }), +); export const MOCK_SOURCE_CONTROL_BRANCHES_SELECTED = ['OPT-1', 'OPT-2', 'OPT-3']; @@ -85,7 +92,13 @@ describe('BranchSelection', () => { }); it('should show error text when API return 400 error', async () => { - server.use(rest.post(MOCK_SOURCE_CONTROL_VERIFY_BRANCH_URL, (req, res, ctx) => res(ctx.status(400)))); + server.use( + http.post(MOCK_SOURCE_CONTROL_VERIFY_BRANCH_URL, () => { + return new HttpResponse(null, { + status: HttpStatusCode.BadRequest, + }); + }), + ); setup(); await waitFor(() => { @@ -94,10 +107,20 @@ describe('BranchSelection', () => { }); it('should show cancel button when retry successfully', async () => { - server.use(rest.post(MOCK_SOURCE_CONTROL_VERIFY_BRANCH_URL, (req, res) => res.networkError('error'))); + server.use( + http.post(MOCK_SOURCE_CONTROL_VERIFY_BRANCH_URL, () => { + return HttpResponse.error(); + }), + ); setup(); const retryButtons = await screen.findAllByTestId('ReplayIcon'); - server.use(rest.post(MOCK_SOURCE_CONTROL_VERIFY_BRANCH_URL, (req, res, ctx) => res(ctx.status(204)))); + server.use( + http.post(MOCK_SOURCE_CONTROL_VERIFY_BRANCH_URL, () => { + return new HttpResponse(null, { + status: HttpStatusCode.NoContent, + }); + }), + ); await userEvent.click(retryButtons[0]); diff --git a/frontend/__tests__/containers/MetricsStep/DeploymentFrequencySettings/PipelineMetricSelection.test.tsx b/frontend/__tests__/containers/MetricsStep/DeploymentFrequencySettings/PipelineMetricSelection.test.tsx index a93c406955..b93549b9d9 100644 --- a/frontend/__tests__/containers/MetricsStep/DeploymentFrequencySettings/PipelineMetricSelection.test.tsx +++ b/frontend/__tests__/containers/MetricsStep/DeploymentFrequencySettings/PipelineMetricSelection.test.tsx @@ -15,11 +15,18 @@ import { act, render, screen, waitFor, within } from '@testing-library/react'; import { metricsClient } from '@src/clients/MetricsClient'; import { setupStore } from '@test/utils/setupStoreUtil'; import userEvent from '@testing-library/user-event'; +import { HttpResponse, http } from 'msw'; import { Provider } from 'react-redux'; import { setupServer } from 'msw/node'; -import { rest } from 'msw'; +import { HttpStatusCode } from 'axios'; -const server = setupServer(rest.post(MOCK_SOURCE_CONTROL_VERIFY_BRANCH_URL, (req, res, ctx) => res(ctx.status(204)))); +const server = setupServer( + http.post(MOCK_SOURCE_CONTROL_VERIFY_BRANCH_URL, () => { + return new HttpResponse(null, { + status: HttpStatusCode.NoContent, + }); + }), +); jest.mock('@src/context/Metrics/metricsSlice', () => ({ ...jest.requireActual('@src/context/Metrics/metricsSlice'), diff --git a/frontend/__tests__/containers/MetricsStep/MetricsStep.test.tsx b/frontend/__tests__/containers/MetricsStep/MetricsStep.test.tsx index c1af8a8fc1..02de1c90cc 100644 --- a/frontend/__tests__/containers/MetricsStep/MetricsStep.test.tsx +++ b/frontend/__tests__/containers/MetricsStep/MetricsStep.test.tsx @@ -1,9 +1,9 @@ import { render, waitFor, within, screen } from '@testing-library/react'; import { setupStore } from '../../utils/setupStoreUtil'; import MetricsStep from '@src/containers/MetricsStep'; +import { HttpResponse, http } from 'msw'; import { Provider } from 'react-redux'; import { setupServer } from 'msw/node'; -import { rest } from 'msw'; import { CLASSIFICATION_SETTING, @@ -41,9 +41,11 @@ jest.mock('@src/context/notification/NotificationSlice', () => ({ let store = setupStore(); const server = setupServer( - rest.post(MOCK_PIPELINE_GET_INFO_URL, (req, res, ctx) => - res(ctx.status(200), ctx.body(JSON.stringify(MOCK_BUILD_KITE_GET_INFO_RESPONSE))), - ), + http.post(MOCK_PIPELINE_GET_INFO_URL, () => { + return new HttpResponse(JSON.stringify(MOCK_BUILD_KITE_GET_INFO_RESPONSE), { + status: HttpStatusCode.Ok, + }); + }), ); const setup = () => @@ -207,7 +209,13 @@ describe('MetricsStep', () => { }); it('should reset real done when change Cycle time settings DONE to other status', async () => { - server.use(rest.post(MOCK_BOARD_INFO_URL, (req, res, ctx) => res(ctx.status(500)))); + server.use( + http.post(MOCK_BOARD_INFO_URL, () => { + return new HttpResponse(null, { + status: HttpStatusCode.InternalServerError, + }); + }), + ); setup(); const realDoneSettingSection = screen.getByLabelText(REAL_DONE_SETTING_SECTION); @@ -223,7 +231,13 @@ describe('MetricsStep', () => { }); it('should reset real done when change Cycle time settings other status to DONE', async () => { - server.use(rest.post(MOCK_BOARD_INFO_URL, (req, res, ctx) => res(ctx.status(500)))); + server.use( + http.post(MOCK_BOARD_INFO_URL, () => { + return new HttpResponse(null, { + status: HttpStatusCode.InternalServerError, + }); + }), + ); setup(); const cycleTimeSettingsSection = screen.getByLabelText(CYCLE_TIME_SETTINGS_SECTION); const realDoneSettingSection = screen.getByLabelText(REAL_DONE_SETTING_SECTION); @@ -287,8 +301,10 @@ describe('MetricsStep', () => { it('should be render no card container when get board card when no data', async () => { store.dispatch(updateShouldGetBoardConfig(true)); server.use( - rest.post(MOCK_BOARD_INFO_URL, (_, res, ctx) => { - return res(ctx.status(HttpStatusCode.Ok)); + http.post(MOCK_BOARD_INFO_URL, () => { + return new HttpResponse(null, { + status: HttpStatusCode.Ok, + }); }), ); @@ -307,8 +323,10 @@ describe('MetricsStep', () => { it('should be render failed message container when get 4xx error', async () => { store.dispatch(updateShouldGetBoardConfig(true)); server.use( - rest.post(MOCK_BOARD_INFO_URL, (_, res, ctx) => { - return res(ctx.status(HttpStatusCode.BadRequest)); + http.post(MOCK_BOARD_INFO_URL, () => { + return new HttpResponse(null, { + status: HttpStatusCode.BadRequest, + }); }), ); @@ -333,63 +351,63 @@ describe('MetricsStep', () => { it('should be render form container when got board card success', async () => { store.dispatch(updateShouldGetBoardConfig(true)); + const mockResponse = { + ignoredTargetFields: [ + { + key: 'description', + name: 'Description', + flag: false, + }, + { + key: 'customfield_10015', + name: 'Start date', + flag: false, + }, + ], + jiraColumns: [ + { + key: 'To Do', + value: { + name: 'TODO', + statuses: ['TODO'], + }, + }, + { + key: 'In Progress', + value: { + name: 'Doing', + statuses: ['DOING'], + }, + }, + ], + targetFields: [ + { + key: 'issuetype', + name: 'Issue Type', + flag: false, + }, + { + key: 'parent', + name: 'Parent', + flag: false, + }, + ], + users: [ + 'heartbeat user', + 'Yunsong Yang', + 'Yufan Wang', + 'Weiran Sun', + 'Xuebing Li', + 'Junbo Dai', + 'Wenting Yan', + 'Xingmeng Tao', + ], + }; server.use( - rest.post(MOCK_BOARD_INFO_URL, (_, res, ctx) => { - return res( - ctx.status(HttpStatusCode.Ok), - ctx.json({ - ignoredTargetFields: [ - { - key: 'description', - name: 'Description', - flag: false, - }, - { - key: 'customfield_10015', - name: 'Start date', - flag: false, - }, - ], - jiraColumns: [ - { - key: 'To Do', - value: { - name: 'TODO', - statuses: ['TODO'], - }, - }, - { - key: 'In Progress', - value: { - name: 'Doing', - statuses: ['DOING'], - }, - }, - ], - targetFields: [ - { - key: 'issuetype', - name: 'Issue Type', - flag: false, - }, - { - key: 'parent', - name: 'Parent', - flag: false, - }, - ], - users: [ - 'heartbeat user', - 'Yunsong Yang', - 'Yufan Wang', - 'Weiran Sun', - 'Xuebing Li', - 'Junbo Dai', - 'Wenting Yan', - 'Xingmeng Tao', - ], - }), - ); + http.post(MOCK_BOARD_INFO_URL, () => { + return new HttpResponse(JSON.stringify(mockResponse), { + status: HttpStatusCode.Ok, + }); }), ); @@ -404,8 +422,8 @@ describe('MetricsStep', () => { it('should show retry button when call get info timeout', async () => { store.dispatch(updateShouldGetBoardConfig(true)); server.use( - rest.post(MOCK_BOARD_INFO_URL, (_, res) => { - return res.networkError('NETWORK_TIMEOUT'); + http.post(MOCK_BOARD_INFO_URL, () => { + return HttpResponse.error(); }), ); setup(); diff --git a/frontend/__tests__/containers/MetricsStepper/MetricsStepper.test.tsx b/frontend/__tests__/containers/MetricsStepper/MetricsStepper.test.tsx index 91970318a7..1220137b0b 100644 --- a/frontend/__tests__/containers/MetricsStepper/MetricsStepper.test.tsx +++ b/frontend/__tests__/containers/MetricsStepper/MetricsStepper.test.tsx @@ -33,10 +33,10 @@ import { setupStore } from '../../utils/setupStoreUtil'; import userEvent from '@testing-library/user-event'; import { exportToJsonFile } from '@src/utils/util'; import { navigateMock } from '../../setupTests'; +import { HttpResponse, http } from 'msw'; import { Provider } from 'react-redux'; import { setupServer } from 'msw/node'; import { HttpStatusCode } from 'axios'; -import { rest } from 'msw'; import dayjs from 'dayjs'; import React from 'react'; @@ -121,8 +121,16 @@ jest.mock('@src/hooks/useGenerateReportEffect', () => ({ })); const server = setupServer( - rest.post(MOCK_REPORT_URL, (_, res, ctx) => res(ctx.status(HttpStatusCode.Ok))), - rest.post(MOCK_BOARD_URL_FOR_JIRA, (_, res, ctx) => res(ctx.status(HttpStatusCode.NoContent))), + http.post(MOCK_REPORT_URL, () => { + return new HttpResponse(null, { + status: HttpStatusCode.Ok, + }); + }), + http.post(MOCK_BOARD_URL_FOR_JIRA, () => { + return new HttpResponse(null, { + status: HttpStatusCode.NoContent, + }); + }), ); const mockLocation = { ...window.location, reload: jest.fn() }; @@ -263,7 +271,13 @@ describe('MetricsStepper', () => { }); it('should enable next when every selected component is show and verified', async () => { - server.use(rest.post(MOCK_PIPELINE_VERIFY_URL, (_, res, ctx) => res(ctx.status(HttpStatusCode.NoContent)))); + server.use( + http.post(MOCK_PIPELINE_VERIFY_URL, () => { + return new HttpResponse(null, { + status: HttpStatusCode.NoContent, + }); + }), + ); await act(async () => { setup(); }); diff --git a/frontend/__tests__/hooks/useGetBoardInfo.test.tsx b/frontend/__tests__/hooks/useGetBoardInfo.test.tsx index 750b0ea271..e0a4ee8d8d 100644 --- a/frontend/__tests__/hooks/useGetBoardInfo.test.tsx +++ b/frontend/__tests__/hooks/useGetBoardInfo.test.tsx @@ -2,9 +2,9 @@ import { MOCK_BOARD_INFO_URL, FAKE_TOKEN, FAKE_DATE_EARLIER, FAKE_DATE_LATER } f import { AXIOS_REQUEST_ERROR_CODE } from '@src/constants/resources'; import { useGetBoardInfoEffect } from '@src/hooks/useGetBoardInfo'; import { renderHook, act, waitFor } from '@testing-library/react'; +import { HttpResponse, http } from 'msw'; import { setupServer } from 'msw/node'; import { HttpStatusCode } from 'axios'; -import { rest } from 'msw'; const server = setupServer(); @@ -67,8 +67,10 @@ describe('use get board info', () => { ], ])('should got error message when got code is %s', async (code, title, message) => { server.use( - rest.post(MOCK_BOARD_INFO_URL, (_, res, ctx) => { - return res(ctx.status(code)); + http.post(MOCK_BOARD_INFO_URL, () => { + return new HttpResponse(null, { + status: code, + }); }), ); @@ -84,37 +86,37 @@ describe('use get board info', () => { }); it('should get data when mock 4xx error', async () => { + const mockResponse = { + ignoredTargetFields: [ + { + key: 'description', + name: 'Description', + flag: false, + }, + ], + jiraColumns: [ + { + key: 'To Do', + value: { + name: 'TODO', + statuses: ['TODO'], + }, + }, + ], + targetFields: [ + { + key: 'issuetype', + name: 'Issue Type', + flag: false, + }, + ], + users: ['heartbeat user'], + }; server.use( - rest.post(MOCK_BOARD_INFO_URL, (_, res, ctx) => { - return res( - ctx.status(HttpStatusCode.BadRequest), - ctx.json({ - ignoredTargetFields: [ - { - key: 'description', - name: 'Description', - flag: false, - }, - ], - jiraColumns: [ - { - key: 'To Do', - value: { - name: 'TODO', - statuses: ['TODO'], - }, - }, - ], - targetFields: [ - { - key: 'issuetype', - name: 'Issue Type', - flag: false, - }, - ], - users: ['heartbeat user'], - }), - ); + http.post(MOCK_BOARD_INFO_URL, () => { + return new HttpResponse(JSON.stringify(mockResponse), { + status: HttpStatusCode.BadRequest, + }); }), ); const { result } = renderHook(() => useGetBoardInfoEffect()); @@ -132,12 +134,14 @@ describe('use get board info', () => { it('should get data when mock 3xx error', async () => { server.use( - rest.post(MOCK_BOARD_INFO_URL, (_, res, ctx) => { - return res( - ctx.status(HttpStatusCode.Unused), - ctx.json({ + http.post(MOCK_BOARD_INFO_URL, () => { + return new HttpResponse( + JSON.stringify({ code: AXIOS_REQUEST_ERROR_CODE.TIMEOUT, }), + { + status: HttpStatusCode.Unused, + }, ); }), ); @@ -155,38 +159,45 @@ describe('use get board info', () => { }); it('should get data when status is OK', async () => { + const mockResponse = { + ignoredTargetFields: [ + { + key: 'description', + name: 'Description', + flag: false, + }, + ], + jiraColumns: [ + { + key: 'To Do', + value: { + name: 'TODO', + statuses: ['TODO'], + }, + }, + ], + targetFields: [ + { + key: 'issuetype', + name: 'Issue Type', + flag: false, + }, + ], + users: ['heartbeat user'], + }; + server.use( - rest.post(MOCK_BOARD_INFO_URL, (_, res, ctx) => { - return res.once( - ctx.status(HttpStatusCode.Ok), - ctx.json({ - ignoredTargetFields: [ - { - key: 'description', - name: 'Description', - flag: false, - }, - ], - jiraColumns: [ - { - key: 'To Do', - value: { - name: 'TODO', - statuses: ['TODO'], - }, - }, - ], - targetFields: [ - { - key: 'issuetype', - name: 'Issue Type', - flag: false, - }, - ], - users: ['heartbeat user'], - }), - ); - }), + http.post( + MOCK_BOARD_INFO_URL, + () => { + return new HttpResponse(JSON.stringify(mockResponse), { + status: HttpStatusCode.Ok, + }); + }, + { + once: true, + }, + ), ); const { result } = renderHook(() => useGetBoardInfoEffect()); await act(() => { diff --git a/frontend/jest.config.json b/frontend/jest.config.json index 833a472a39..eaf91a9801 100644 --- a/frontend/jest.config.json +++ b/frontend/jest.config.json @@ -5,8 +5,9 @@ ".+\\.svg": "/__tests__/__mocks__/svgTransformer.ts" }, "globalSetup": "./global-setup.ts", + "setupFiles": ["./jest.polyfills.ts"], "setupFilesAfterEnv": ["/__tests__/setupTests.ts"], - "testEnvironment": "jsdom", + "testEnvironment": "/jsdom.extended.ts", "testRegex": "/__tests__/.*(test|spec)\\.(jsx?|tsx?|ts?)$", "moduleFileExtensions": ["ts", "tsx", "js", "jsx", "json", "node"], "moduleNameMapper": { @@ -28,5 +29,8 @@ "statements": 100 } }, - "testTimeout": 30000 + "testTimeout": 30000, + "testEnvironmentOptions": { + "customExportConditions": [""] + } } diff --git a/frontend/jest.polyfills.ts b/frontend/jest.polyfills.ts new file mode 100644 index 0000000000..575d8e1c04 --- /dev/null +++ b/frontend/jest.polyfills.ts @@ -0,0 +1,32 @@ +/* eslint-disable @typescript-eslint/no-var-requires */ +/** + * @note The block below contains polyfills for Node.js globals + * required for Jest to function when running JSDOM tests. + * These HAVE to be require's and HAVE to be in this exact + * order, since "undici" depends on the "TextEncoder" global API. + * + * Consider migrating to a more modern test runner if + * you don't want to deal with this. + */ + +import { ReadableStream } from 'web-streams-polyfill'; +import { TextDecoder, TextEncoder } from 'node:util'; + +Object.defineProperties(globalThis, { + TextDecoder: { value: TextDecoder }, + TextEncoder: { value: TextEncoder }, + ReadableStream: { value: ReadableStream }, +}); + +import { fetch, Headers, FormData, Request, Response } from 'undici'; +import { Blob } from 'node:buffer'; + +Object.defineProperties(globalThis, { + fetch: { value: fetch, writable: true }, + Blob: { value: Blob }, + // File: { value: File }, + Headers: { value: Headers }, + FormData: { value: FormData }, + Request: { value: Request }, + Response: { value: Response }, +}); diff --git a/frontend/jsdom.extended.ts b/frontend/jsdom.extended.ts new file mode 100644 index 0000000000..4cf426208d --- /dev/null +++ b/frontend/jsdom.extended.ts @@ -0,0 +1,25 @@ +// eslint-disable-next-line @typescript-eslint/no-var-requires +const JSDOMEnvironment = require('jest-environment-jsdom').default; // or import JSDOMEnvironment from 'jest-environment-jsdom' if you are using ESM modules + +class JSDOMEnvironmentExtended extends JSDOMEnvironment { + constructor(...args: unknown[]) { + super(...args); + + this.global.ReadableStream = ReadableStream; + this.global.TextDecoder = TextDecoder; + this.global.TextEncoder = TextEncoder; + + this.global.Blob = Blob; + this.global.File = File; + this.global.Headers = Headers; + this.global.FormData = FormData; + this.global.Request = Request; + this.global.Response = Response; + this.global.Request = Request; + this.global.Response = Response; + this.global.fetch = fetch; + this.global.structuredClone = structuredClone; + } +} + +module.exports = JSDOMEnvironmentExtended; diff --git a/frontend/package.json b/frontend/package.json index 0c971b7196..1cad939091 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -102,13 +102,15 @@ "jest-environment-jsdom": "^29.7.0", "license-compliance": "^3.0.0", "lint-staged": "^15.2.2", - "msw": "^1.3.3", + "msw": "^2.0.0", "node-fetch": "^3.3.2", "prettier": "3.2.5", "prettier-plugin-sort-imports": "^1.8.4", "ts-jest": "^29.1.2", "ts-node": "^10.9.2", - "tsc-files": "^1.1.4" + "tsc-files": "^1.1.4", + "undici": "^6.15.0", + "web-streams-polyfill": "^4.0.0" }, "engines": { "node": ">=16.18.0" diff --git a/frontend/pnpm-lock.yaml b/frontend/pnpm-lock.yaml index 5a8dbe9bc8..470f91cae3 100644 --- a/frontend/pnpm-lock.yaml +++ b/frontend/pnpm-lock.yaml @@ -1,251 +1,5291 @@ -lockfileVersion: '6.0' +lockfileVersion: '9.0' settings: autoInstallPeers: true excludeLinksFromLockfile: false -dependencies: - '@emotion/react': - specifier: ^11.11.4 - version: 11.11.4(@types/react@18.2.67)(react@18.2.0) - '@emotion/styled': - specifier: ^11.11.0 - version: 11.11.5(@emotion/react@11.11.4)(@types/react@18.2.67)(react@18.2.0) - '@fontsource/roboto': - specifier: ^5.0.12 - version: 5.0.12 - '@hookform/resolvers': - specifier: ^3.3.4 - version: 3.3.4(react-hook-form@7.51.3) - '@mui/icons-material': - specifier: ^5.15.14 - version: 5.15.14(@mui/material@5.15.14)(@types/react@18.2.67)(react@18.2.0) - '@mui/material': - specifier: ^5.15.14 - version: 5.15.14(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.2.67)(react-dom@18.2.0)(react@18.2.0) - '@mui/x-date-pickers': - specifier: ^7.0.0 - version: 7.0.0(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@mui/material@5.15.14)(@types/react@18.2.67)(dayjs@1.11.10)(react-dom@18.2.0)(react@18.2.0) - '@reduxjs/toolkit': - specifier: ^2.2.2 - version: 2.2.2(react-redux@9.1.0)(react@18.2.0) - axios: - specifier: ^1.6.8 - version: 1.6.8 - dayjs: - specifier: ^1.11.10 - version: 1.11.10 - lodash: - specifier: ^4.17.21 - version: 4.17.21 - lodash.camelcase: - specifier: ^4.3.0 - version: 4.3.0 - react: - specifier: ^18.2.0 - version: 18.2.0 - react-dom: - specifier: ^18.2.0 - version: 18.2.0(react@18.2.0) - react-error-boundary: - specifier: ^4.0.13 - version: 4.0.13(react@18.2.0) - react-hook-form: - specifier: ^7.51.3 - version: 7.51.3(react@18.2.0) - react-redux: - specifier: ^9.0.0 - version: 9.1.0(@types/react@18.2.67)(react@18.2.0)(redux@5.0.1) - react-router-dom: - specifier: ^6.22.3 - version: 6.22.3(react-dom@18.2.0)(react@18.2.0) - typescript: - specifier: ^5.4.2 - version: 5.4.2 - vite: - specifier: ^5.2.2 - version: 5.2.6(@types/node@20.11.30) - vite-plugin-pwa: - specifier: ^0.19.5 - version: 0.19.5(vite@5.2.6)(workbox-build@7.1.0)(workbox-window@7.1.0) - yup: - specifier: ^1.4.0 - version: 1.4.0 - -devDependencies: - '@dotenvx/dotenvx': - specifier: ^0.27.0 - version: 0.27.0 - '@playwright/test': - specifier: ^1.42.1 - version: 1.42.1 - '@testing-library/jest-dom': - specifier: ^6.4.2 - version: 6.4.2(@types/jest@29.5.12)(jest@29.7.0) - '@testing-library/react': - specifier: ^14.2.2 - version: 14.2.2(react-dom@18.2.0)(react@18.2.0) - '@testing-library/user-event': - specifier: ^14.5.2 - version: 14.5.2(@testing-library/dom@10.1.0) - '@types/jest': - specifier: ^29.5.12 - version: 29.5.12 - '@types/lodash': - specifier: ^4.17.0 - version: 4.17.0 - '@types/lodash.camelcase': - specifier: ^4.3.9 - version: 4.3.9 - '@types/node': - specifier: ^20.11.30 - version: 20.11.30 - '@types/node-fetch': - specifier: ^2.6.11 - version: 2.6.11 - '@types/react': - specifier: ^18.2.67 - version: 18.2.67 - '@types/react-dom': - specifier: ^18.2.22 - version: 18.2.22 - '@types/react-redux': - specifier: ^7.1.33 - version: 7.1.33 - '@typescript-eslint/eslint-plugin': - specifier: ^7.3.1 - version: 7.4.0(@typescript-eslint/parser@7.4.0)(eslint@8.57.0)(typescript@5.4.2) - '@typescript-eslint/parser': - specifier: ^7.3.1 - version: 7.4.0(eslint@8.57.0)(typescript@5.4.2) - '@vitejs/plugin-react-swc': - specifier: ^3.6.0 - version: 3.6.0(vite@5.2.6) - audit-ci: - specifier: ^6.6.1 - version: 6.6.1 - autoprefixer: - specifier: ^10.4.18 - version: 10.4.18(postcss@8.4.38) - csv-parse: - specifier: ^5.5.5 - version: 5.5.5 - eslint: - specifier: ^8.57.0 - version: 8.57.0 - eslint-config-prettier: - specifier: ^9.1.0 - version: 9.1.0(eslint@8.57.0) - eslint-plugin-import: - specifier: ^2.29.1 - version: 2.29.1(@typescript-eslint/parser@7.4.0)(eslint@8.57.0) - eslint-plugin-n: - specifier: ^17.0.0 - version: 17.3.1(eslint@8.57.0) - eslint-plugin-prettier: - specifier: ^5.1.3 - version: 5.1.3(eslint-config-prettier@9.1.0)(eslint@8.57.0)(prettier@3.2.5) - eslint-plugin-promise: - specifier: ^6.1.1 - version: 6.1.1(eslint@8.57.0) - eslint-plugin-react: - specifier: ^7.34.1 - version: 7.34.1(eslint@8.57.0) - eslint-plugin-react-hooks: - specifier: ^4.6.0 - version: 4.6.0(eslint@8.57.0) - execa: - specifier: ^8.0.1 - version: 8.0.1 - husky: - specifier: ^9.0.11 - version: 9.0.11 - identity-obj-proxy: - specifier: ^3.0.0 - version: 3.0.0 - jest: - specifier: ^29.7.0 - version: 29.7.0(@types/node@20.11.30)(ts-node@10.9.2) - jest-environment-jsdom: - specifier: ^29.7.0 - version: 29.7.0 - license-compliance: - specifier: ^3.0.0 - version: 3.0.0(typescript@5.4.2) - lint-staged: - specifier: ^15.2.2 - version: 15.2.2 - msw: - specifier: ^1.3.3 - version: 1.3.3(typescript@5.4.2) - node-fetch: - specifier: ^3.3.2 - version: 3.3.2 - prettier: - specifier: 3.2.5 - version: 3.2.5 - prettier-plugin-sort-imports: - specifier: ^1.8.4 - version: 1.8.5(typescript@5.4.2) - ts-jest: - specifier: ^29.1.2 - version: 29.1.2(@babel/core@7.24.3)(jest@29.7.0)(typescript@5.4.2) - ts-node: - specifier: ^10.9.2 - version: 10.9.2(@types/node@20.11.30)(typescript@5.4.2) - tsc-files: - specifier: ^1.1.4 - version: 1.1.4(typescript@5.4.2) +importers: + + .: + dependencies: + '@emotion/react': + specifier: ^11.11.4 + version: 11.11.4(@types/react@18.2.67)(react@18.2.0) + '@emotion/styled': + specifier: ^11.11.0 + version: 11.11.5(@emotion/react@11.11.4(@types/react@18.2.67)(react@18.2.0))(@types/react@18.2.67)(react@18.2.0) + '@fontsource/roboto': + specifier: ^5.0.12 + version: 5.0.12 + '@hookform/resolvers': + specifier: ^3.3.4 + version: 3.3.4(react-hook-form@7.51.3(react@18.2.0)) + '@mui/icons-material': + specifier: ^5.15.14 + version: 5.15.14(@mui/material@5.15.14(@emotion/react@11.11.4(@types/react@18.2.67)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.67)(react@18.2.0))(@types/react@18.2.67)(react@18.2.0))(@types/react@18.2.67)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@types/react@18.2.67)(react@18.2.0) + '@mui/material': + specifier: ^5.15.14 + version: 5.15.14(@emotion/react@11.11.4(@types/react@18.2.67)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.67)(react@18.2.0))(@types/react@18.2.67)(react@18.2.0))(@types/react@18.2.67)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@mui/x-date-pickers': + specifier: ^7.0.0 + version: 7.0.0(@emotion/react@11.11.4(@types/react@18.2.67)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.67)(react@18.2.0))(@types/react@18.2.67)(react@18.2.0))(@mui/material@5.15.14(@emotion/react@11.11.4(@types/react@18.2.67)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.67)(react@18.2.0))(@types/react@18.2.67)(react@18.2.0))(@types/react@18.2.67)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@types/react@18.2.67)(dayjs@1.11.10)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@reduxjs/toolkit': + specifier: ^2.2.2 + version: 2.2.2(react-redux@9.1.0(@types/react@18.2.67)(react@18.2.0)(redux@5.0.1))(react@18.2.0) + axios: + specifier: ^1.6.8 + version: 1.6.8 + dayjs: + specifier: ^1.11.10 + version: 1.11.10 + lodash: + specifier: ^4.17.21 + version: 4.17.21 + lodash.camelcase: + specifier: ^4.3.0 + version: 4.3.0 + react: + specifier: ^18.2.0 + version: 18.2.0 + react-dom: + specifier: ^18.2.0 + version: 18.2.0(react@18.2.0) + react-error-boundary: + specifier: ^4.0.13 + version: 4.0.13(react@18.2.0) + react-hook-form: + specifier: ^7.51.3 + version: 7.51.3(react@18.2.0) + react-redux: + specifier: ^9.0.0 + version: 9.1.0(@types/react@18.2.67)(react@18.2.0)(redux@5.0.1) + react-router-dom: + specifier: ^6.22.3 + version: 6.22.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + typescript: + specifier: ^5.4.2 + version: 5.4.2 + vite: + specifier: ^5.2.2 + version: 5.2.6(@types/node@20.11.30)(terser@5.31.0) + vite-plugin-pwa: + specifier: ^0.19.5 + version: 0.19.5(vite@5.2.6(@types/node@20.11.30)(terser@5.31.0))(workbox-build@7.1.0(@types/babel__core@7.20.5))(workbox-window@7.1.0) + yup: + specifier: ^1.4.0 + version: 1.4.0 + devDependencies: + '@dotenvx/dotenvx': + specifier: ^0.27.0 + version: 0.27.0 + '@playwright/test': + specifier: ^1.42.1 + version: 1.42.1 + '@testing-library/jest-dom': + specifier: ^6.4.2 + version: 6.4.2(@jest/globals@29.7.0)(@types/jest@29.5.12)(jest@29.7.0(@types/node@20.11.30)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.4.8)(@types/node@20.11.30)(typescript@5.4.2))) + '@testing-library/react': + specifier: ^14.2.2 + version: 14.2.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@testing-library/user-event': + specifier: ^14.5.2 + version: 14.5.2(@testing-library/dom@10.1.0) + '@types/jest': + specifier: ^29.5.12 + version: 29.5.12 + '@types/lodash': + specifier: ^4.17.0 + version: 4.17.0 + '@types/lodash.camelcase': + specifier: ^4.3.9 + version: 4.3.9 + '@types/node': + specifier: ^20.11.30 + version: 20.11.30 + '@types/node-fetch': + specifier: ^2.6.11 + version: 2.6.11 + '@types/react': + specifier: ^18.2.67 + version: 18.2.67 + '@types/react-dom': + specifier: ^18.2.22 + version: 18.2.22 + '@types/react-redux': + specifier: ^7.1.33 + version: 7.1.33 + '@typescript-eslint/eslint-plugin': + specifier: ^7.3.1 + version: 7.4.0(@typescript-eslint/parser@7.4.0(eslint@8.57.0)(typescript@5.4.2))(eslint@8.57.0)(typescript@5.4.2) + '@typescript-eslint/parser': + specifier: ^7.3.1 + version: 7.4.0(eslint@8.57.0)(typescript@5.4.2) + '@vitejs/plugin-react-swc': + specifier: ^3.6.0 + version: 3.6.0(vite@5.2.6(@types/node@20.11.30)(terser@5.31.0)) + audit-ci: + specifier: ^6.6.1 + version: 6.6.1 + autoprefixer: + specifier: ^10.4.18 + version: 10.4.18(postcss@8.4.38) + csv-parse: + specifier: ^5.5.5 + version: 5.5.5 + eslint: + specifier: ^8.57.0 + version: 8.57.0 + eslint-config-prettier: + specifier: ^9.1.0 + version: 9.1.0(eslint@8.57.0) + eslint-plugin-import: + specifier: ^2.29.1 + version: 2.29.1(@typescript-eslint/parser@7.4.0(eslint@8.57.0)(typescript@5.4.2))(eslint@8.57.0) + eslint-plugin-n: + specifier: ^17.0.0 + version: 17.3.1(eslint@8.57.0) + eslint-plugin-prettier: + specifier: ^5.1.3 + version: 5.1.3(eslint-config-prettier@9.1.0(eslint@8.57.0))(eslint@8.57.0)(prettier@3.2.5) + eslint-plugin-promise: + specifier: ^6.1.1 + version: 6.1.1(eslint@8.57.0) + eslint-plugin-react: + specifier: ^7.34.1 + version: 7.34.1(eslint@8.57.0) + eslint-plugin-react-hooks: + specifier: ^4.6.0 + version: 4.6.0(eslint@8.57.0) + execa: + specifier: ^8.0.1 + version: 8.0.1 + husky: + specifier: ^9.0.11 + version: 9.0.11 + identity-obj-proxy: + specifier: ^3.0.0 + version: 3.0.0 + jest: + specifier: ^29.7.0 + version: 29.7.0(@types/node@20.11.30)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.4.8)(@types/node@20.11.30)(typescript@5.4.2)) + jest-environment-jsdom: + specifier: ^29.7.0 + version: 29.7.0 + license-compliance: + specifier: ^3.0.0 + version: 3.0.0(typescript@5.4.2) + lint-staged: + specifier: ^15.2.2 + version: 15.2.2 + msw: + specifier: ^2.0.0 + version: 2.2.14(typescript@5.4.2) + node-fetch: + specifier: ^3.3.2 + version: 3.3.2 + prettier: + specifier: 3.2.5 + version: 3.2.5 + prettier-plugin-sort-imports: + specifier: ^1.8.4 + version: 1.8.5(typescript@5.4.2) + ts-jest: + specifier: ^29.1.2 + version: 29.1.2(@babel/core@7.24.3)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.24.3))(jest@29.7.0(@types/node@20.11.30)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.4.8)(@types/node@20.11.30)(typescript@5.4.2)))(typescript@5.4.2) + ts-node: + specifier: ^10.9.2 + version: 10.9.2(@swc/core@1.4.8)(@types/node@20.11.30)(typescript@5.4.2) + tsc-files: + specifier: ^1.1.4 + version: 1.1.4(typescript@5.4.2) + undici: + specifier: ^6.15.0 + version: 6.15.0 + web-streams-polyfill: + specifier: ^4.0.0 + version: 4.0.0 packages: - /@aashutoshrathi/word-wrap@1.2.6: - resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} - engines: {node: '>=0.10.0'} - dev: true + '@aashutoshrathi/word-wrap@1.2.6': + resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} + engines: {node: '>=0.10.0'} + + '@adobe/css-tools@4.3.3': + resolution: {integrity: sha512-rE0Pygv0sEZ4vBWHlAgJLGDU7Pm8xoO6p3wsEceb7GYAjScrOHpEo8KK/eVkAcnSM+slAEtXjA2JpdjLp4fJQQ==} + + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + + '@apideck/better-ajv-errors@0.3.6': + resolution: {integrity: sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==} + engines: {node: '>=10'} + peerDependencies: + ajv: '>=8' + + '@babel/code-frame@7.24.2': + resolution: {integrity: sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.24.1': + resolution: {integrity: sha512-Pc65opHDliVpRHuKfzI+gSA4zcgr65O4cl64fFJIWEEh8JoHIHh0Oez1Eo8Arz8zq/JhgKodQaxEwUPRtZylVA==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.24.4': + resolution: {integrity: sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.24.3': + resolution: {integrity: sha512-5FcvN1JHw2sHJChotgx8Ek0lyuh4kCKelgMTTqhYJJtloNvUfpAFMeNQUtdlIaktwrSV9LtCdqwk48wL2wBacQ==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.24.5': + resolution: {integrity: sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.24.1': + resolution: {integrity: sha512-DfCRfZsBcrPEHUfuBMgbJ1Ut01Y/itOs+hY2nFLgqsqXd52/iSiVq5TITtUasIUgm+IIKdY2/1I7auiQOEeC9A==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.24.5': + resolution: {integrity: sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-annotate-as-pure@7.22.5': + resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-builder-binary-assignment-operator-visitor@7.22.15': + resolution: {integrity: sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.23.6': + resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-create-class-features-plugin@7.24.5': + resolution: {integrity: sha512-uRc4Cv8UQWnE4NXlYTIIdM7wfFkOqlFztcC/gVXDKohKoVB3OyonfelUBaJzSwpBntZ2KYGF/9S7asCHsXwW6g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-create-regexp-features-plugin@7.22.15': + resolution: {integrity: sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-define-polyfill-provider@0.6.2': + resolution: {integrity: sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + '@babel/helper-environment-visitor@7.22.20': + resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-function-name@7.23.0': + resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-hoist-variables@7.22.5': + resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-member-expression-to-functions@7.24.5': + resolution: {integrity: sha512-4owRteeihKWKamtqg4JmWSsEZU445xpFRXPEwp44HbgbxdWlUV1b4Agg4lkA806Lil5XM/e+FJyS0vj5T6vmcA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.24.3': + resolution: {integrity: sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.23.3': + resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-module-transforms@7.24.5': + resolution: {integrity: sha512-9GxeY8c2d2mdQUP1Dye0ks3VDyIMS98kt/llQ2nUId8IsWqTF0l1LkSX0/uP7l7MCDrzXS009Hyhe2gzTiGW8A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-optimise-call-expression@7.22.5': + resolution: {integrity: sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-plugin-utils@7.24.0': + resolution: {integrity: sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==} + engines: {node: '>=6.9.0'} + + '@babel/helper-plugin-utils@7.24.5': + resolution: {integrity: sha512-xjNLDopRzW2o6ba0gKbkZq5YWEBaK3PCyTOY1K2P/O07LGMhMqlMXPxwN4S5/RhWuCobT8z0jrlKGlYmeR1OhQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-remap-async-to-generator@7.22.20': + resolution: {integrity: sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-replace-supers@7.24.1': + resolution: {integrity: sha512-QCR1UqC9BzG5vZl8BMicmZ28RuUBnHhAMddD8yHFHDRH9lLTZ9uUPehX8ctVPT8l0TKblJidqcgUUKGVrePleQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-simple-access@7.22.5': + resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} + engines: {node: '>=6.9.0'} + + '@babel/helper-simple-access@7.24.5': + resolution: {integrity: sha512-uH3Hmf5q5n7n8mz7arjUlDOCbttY/DW4DYhE6FUsjKJ/oYC1kQQUvwEQWxRwUpX9qQKRXeqLwWxrqilMrf32sQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-skip-transparent-expression-wrappers@7.22.5': + resolution: {integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==} + engines: {node: '>=6.9.0'} + + '@babel/helper-split-export-declaration@7.22.6': + resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} + engines: {node: '>=6.9.0'} + + '@babel/helper-split-export-declaration@7.24.5': + resolution: {integrity: sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.24.1': + resolution: {integrity: sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.22.20': + resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.24.5': + resolution: {integrity: sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.23.5': + resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-wrap-function@7.24.5': + resolution: {integrity: sha512-/xxzuNvgRl4/HLNKvnFwdhdgN3cpLxgLROeLDl83Yx0AJ1SGvq1ak0OszTOjDfiB8Vx03eJbeDWh9r+jCCWttw==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.24.1': + resolution: {integrity: sha512-BpU09QqEe6ZCHuIHFphEFgvNSrubve1FtyMton26ekZ85gRGi6LrTF7zArARp2YvyFxloeiRmtSCq5sjh1WqIg==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.24.5': + resolution: {integrity: sha512-CiQmBMMpMQHwM5m01YnrM6imUG1ebgYJ+fAIW4FZe6m4qHTPaRHti+R8cggAwkdz4oXhtO4/K9JWlh+8hIfR2Q==} + engines: {node: '>=6.9.0'} + + '@babel/highlight@7.24.2': + resolution: {integrity: sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.24.1': + resolution: {integrity: sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/parser@7.24.5': + resolution: {integrity: sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.24.5': + resolution: {integrity: sha512-LdXRi1wEMTrHVR4Zc9F8OewC3vdm5h4QB6L71zy6StmYeqGi1b3ttIO8UC+BfZKcH9jdr4aI249rBkm+3+YvHw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.24.1': + resolution: {integrity: sha512-y4HqEnkelJIOQGd+3g1bTeKsA5c6qM7eOn7VggGVbBc0y8MLSKHacwcIE2PplNlQSj0PqS9rrXL/nkPVK+kUNg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.24.1': + resolution: {integrity: sha512-Hj791Ii4ci8HqnaKHAlLNs+zaLXb0EzSDhiAWp5VNlyvCNymYfacs64pxTxbH1znW/NcArSmwpmG9IKE/TUVVQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.13.0 + + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.24.1': + resolution: {integrity: sha512-m9m/fXsXLiHfwdgydIFnpk+7jlVbnvlK5B2EKiPdLUb6WX654ZaaEWJUjk8TftRbZpK0XibovlLWX4KIZhV6jw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2': + resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-async-generators@7.8.4': + resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-bigint@7.8.3': + resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-class-properties@7.12.13': + resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-class-static-block@7.14.5': + resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-dynamic-import@7.8.3': + resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-export-namespace-from@7.8.3': + resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-assertions@7.24.1': + resolution: {integrity: sha512-IuwnI5XnuF189t91XbxmXeCDz3qs6iDRO7GJ++wcfgeXNs/8FmIlKcpDSXNVyuLQxlwvskmI3Ct73wUODkJBlQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-attributes@7.24.1': + resolution: {integrity: sha512-zhQTMH0X2nVLnb04tz+s7AMuasX8U0FnpE+nHTOhSOINjWMnopoZTxtIKsd45n4GQ/HIZLyfIpoul8e2m0DnRA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-meta@7.10.4': + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-json-strings@7.8.3': + resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-jsx@7.24.1': + resolution: {integrity: sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-logical-assignment-operators@7.10.4': + resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3': + resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-numeric-separator@7.10.4': + resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-object-rest-spread@7.8.3': + resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-optional-catch-binding@7.8.3': + resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-optional-chaining@7.8.3': + resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-private-property-in-object@7.14.5': + resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-top-level-await@7.14.5': + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-typescript@7.24.1': + resolution: {integrity: sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-unicode-sets-regex@7.18.6': + resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-arrow-functions@7.24.1': + resolution: {integrity: sha512-ngT/3NkRhsaep9ck9uj2Xhv9+xB1zShY3tM3g6om4xxCELwCDN4g4Aq5dRn48+0hasAql7s2hdBOysCfNpr4fw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-async-generator-functions@7.24.3': + resolution: {integrity: sha512-Qe26CMYVjpQxJ8zxM1340JFNjZaF+ISWpr1Kt/jGo+ZTUzKkfw/pphEWbRCb+lmSM6k/TOgfYLvmbHkUQ0asIg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-async-to-generator@7.24.1': + resolution: {integrity: sha512-AawPptitRXp1y0n4ilKcGbRYWfbbzFWz2NqNu7dacYDtFtz0CMjG64b3LQsb3KIgnf4/obcUL78hfaOS7iCUfw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-block-scoped-functions@7.24.1': + resolution: {integrity: sha512-TWWC18OShZutrv9C6mye1xwtam+uNi2bnTOCBUd5sZxyHOiWbU6ztSROofIMrK84uweEZC219POICK/sTYwfgg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-block-scoping@7.24.5': + resolution: {integrity: sha512-sMfBc3OxghjC95BkYrYocHL3NaOplrcaunblzwXhGmlPwpmfsxr4vK+mBBt49r+S240vahmv+kUxkeKgs+haCw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-class-properties@7.24.1': + resolution: {integrity: sha512-OMLCXi0NqvJfORTaPQBwqLXHhb93wkBKZ4aNwMl6WtehO7ar+cmp+89iPEQPqxAnxsOKTaMcs3POz3rKayJ72g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-class-static-block@7.24.4': + resolution: {integrity: sha512-B8q7Pz870Hz/q9UgP8InNpY01CSLDSCyqX7zcRuv3FcPl87A2G17lASroHWaCtbdIcbYzOZ7kWmXFKbijMSmFg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.12.0 + + '@babel/plugin-transform-classes@7.24.5': + resolution: {integrity: sha512-gWkLP25DFj2dwe9Ck8uwMOpko4YsqyfZJrOmqqcegeDYEbp7rmn4U6UQZNj08UF6MaX39XenSpKRCvpDRBtZ7Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-computed-properties@7.24.1': + resolution: {integrity: sha512-5pJGVIUfJpOS+pAqBQd+QMaTD2vCL/HcePooON6pDpHgRp4gNRmzyHTPIkXntwKsq3ayUFVfJaIKPw2pOkOcTw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-destructuring@7.24.5': + resolution: {integrity: sha512-SZuuLyfxvsm+Ah57I/i1HVjveBENYK9ue8MJ7qkc7ndoNjqquJiElzA7f5yaAXjyW2hKojosOTAQQRX50bPSVg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-dotall-regex@7.24.1': + resolution: {integrity: sha512-p7uUxgSoZwZ2lPNMzUkqCts3xlp8n+o05ikjy7gbtFJSt9gdU88jAmtfmOxHM14noQXBxfgzf2yRWECiNVhTCw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-duplicate-keys@7.24.1': + resolution: {integrity: sha512-msyzuUnvsjsaSaocV6L7ErfNsa5nDWL1XKNnDePLgmz+WdU4w/J8+AxBMrWfi9m4IxfL5sZQKUPQKDQeeAT6lA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-dynamic-import@7.24.1': + resolution: {integrity: sha512-av2gdSTyXcJVdI+8aFZsCAtR29xJt0S5tas+Ef8NvBNmD1a+N/3ecMLeMBgfcK+xzsjdLDT6oHt+DFPyeqUbDA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-exponentiation-operator@7.24.1': + resolution: {integrity: sha512-U1yX13dVBSwS23DEAqU+Z/PkwE9/m7QQy8Y9/+Tdb8UWYaGNDYwTLi19wqIAiROr8sXVum9A/rtiH5H0boUcTw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-export-namespace-from@7.24.1': + resolution: {integrity: sha512-Ft38m/KFOyzKw2UaJFkWG9QnHPG/Q/2SkOrRk4pNBPg5IPZ+dOxcmkK5IyuBcxiNPyyYowPGUReyBvrvZs7IlQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-for-of@7.24.1': + resolution: {integrity: sha512-OxBdcnF04bpdQdR3i4giHZNZQn7cm8RQKcSwA17wAAqEELo1ZOwp5FFgeptWUQXFyT9kwHo10aqqauYkRZPCAg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-function-name@7.24.1': + resolution: {integrity: sha512-BXmDZpPlh7jwicKArQASrj8n22/w6iymRnvHYYd2zO30DbE277JO20/7yXJT3QxDPtiQiOxQBbZH4TpivNXIxA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-json-strings@7.24.1': + resolution: {integrity: sha512-U7RMFmRvoasscrIFy5xA4gIp8iWnWubnKkKuUGJjsuOH7GfbMkB+XZzeslx2kLdEGdOJDamEmCqOks6e8nv8DQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-literals@7.24.1': + resolution: {integrity: sha512-zn9pwz8U7nCqOYIiBaOxoQOtYmMODXTJnkxG4AtX8fPmnCRYWBOHD0qcpwS9e2VDSp1zNJYpdnFMIKb8jmwu6g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-logical-assignment-operators@7.24.1': + resolution: {integrity: sha512-OhN6J4Bpz+hIBqItTeWJujDOfNP+unqv/NJgyhlpSqgBTPm37KkMmZV6SYcOj+pnDbdcl1qRGV/ZiIjX9Iy34w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-member-expression-literals@7.24.1': + resolution: {integrity: sha512-4ojai0KysTWXzHseJKa1XPNXKRbuUrhkOPY4rEGeR+7ChlJVKxFa3H3Bz+7tWaGKgJAXUWKOGmltN+u9B3+CVg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-amd@7.24.1': + resolution: {integrity: sha512-lAxNHi4HVtjnHd5Rxg3D5t99Xm6H7b04hUS7EHIXcUl2EV4yl1gWdqZrNzXnSrHveL9qMdbODlLF55mvgjAfaQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-commonjs@7.24.1': + resolution: {integrity: sha512-szog8fFTUxBfw0b98gEWPaEqF42ZUD/T3bkynW/wtgx2p/XCP55WEsb+VosKceRSd6njipdZvNogqdtI4Q0chw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-systemjs@7.24.1': + resolution: {integrity: sha512-mqQ3Zh9vFO1Tpmlt8QPnbwGHzNz3lpNEMxQb1kAemn/erstyqw1r9KeOlOfo3y6xAnFEcOv2tSyrXfmMk+/YZA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-umd@7.24.1': + resolution: {integrity: sha512-tuA3lpPj+5ITfcCluy6nWonSL7RvaG0AOTeAuvXqEKS34lnLzXpDb0dcP6K8jD0zWZFNDVly90AGFJPnm4fOYg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-named-capturing-groups-regex@7.22.5': + resolution: {integrity: sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-new-target@7.24.1': + resolution: {integrity: sha512-/rurytBM34hYy0HKZQyA0nHbQgQNFm4Q/BOc9Hflxi2X3twRof7NaE5W46j4kQitm7SvACVRXsa6N/tSZxvPug==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-nullish-coalescing-operator@7.24.1': + resolution: {integrity: sha512-iQ+caew8wRrhCikO5DrUYx0mrmdhkaELgFa+7baMcVuhxIkN7oxt06CZ51D65ugIb1UWRQ8oQe+HXAVM6qHFjw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-numeric-separator@7.24.1': + resolution: {integrity: sha512-7GAsGlK4cNL2OExJH1DzmDeKnRv/LXq0eLUSvudrehVA5Rgg4bIrqEUW29FbKMBRT0ztSqisv7kjP+XIC4ZMNw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-object-rest-spread@7.24.5': + resolution: {integrity: sha512-7EauQHszLGM3ay7a161tTQH7fj+3vVM/gThlz5HpFtnygTxjrlvoeq7MPVA1Vy9Q555OB8SnAOsMkLShNkkrHA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-object-super@7.24.1': + resolution: {integrity: sha512-oKJqR3TeI5hSLRxudMjFQ9re9fBVUU0GICqM3J1mi8MqlhVr6hC/ZN4ttAyMuQR6EZZIY6h/exe5swqGNNIkWQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-optional-catch-binding@7.24.1': + resolution: {integrity: sha512-oBTH7oURV4Y+3EUrf6cWn1OHio3qG/PVwO5J03iSJmBg6m2EhKjkAu/xuaXaYwWW9miYtvbWv4LNf0AmR43LUA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-optional-chaining@7.24.5': + resolution: {integrity: sha512-xWCkmwKT+ihmA6l7SSTpk8e4qQl/274iNbSKRRS8mpqFR32ksy36+a+LWY8OXCCEefF8WFlnOHVsaDI2231wBg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-parameters@7.24.5': + resolution: {integrity: sha512-9Co00MqZ2aoky+4j2jhofErthm6QVLKbpQrvz20c3CH9KQCLHyNB+t2ya4/UrRpQGR+Wrwjg9foopoeSdnHOkA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-private-methods@7.24.1': + resolution: {integrity: sha512-tGvisebwBO5em4PaYNqt4fkw56K2VALsAbAakY0FjTYqJp7gfdrgr7YX76Or8/cpik0W6+tj3rZ0uHU9Oil4tw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-private-property-in-object@7.24.5': + resolution: {integrity: sha512-JM4MHZqnWR04jPMujQDTBVRnqxpLLpx2tkn7iPn+Hmsc0Gnb79yvRWOkvqFOx3Z7P7VxiRIR22c4eGSNj87OBQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-property-literals@7.24.1': + resolution: {integrity: sha512-LetvD7CrHmEx0G442gOomRr66d7q8HzzGGr4PMHGr+5YIm6++Yke+jxj246rpvsbyhJwCLxcTn6zW1P1BSenqA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-regenerator@7.24.1': + resolution: {integrity: sha512-sJwZBCzIBE4t+5Q4IGLaaun5ExVMRY0lYwos/jNecjMrVCygCdph3IKv0tkP5Fc87e/1+bebAmEAGBfnRD+cnw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-reserved-words@7.24.1': + resolution: {integrity: sha512-JAclqStUfIwKN15HrsQADFgeZt+wexNQ0uLhuqvqAUFoqPMjEcFCYZBhq0LUdz6dZK/mD+rErhW71fbx8RYElg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-shorthand-properties@7.24.1': + resolution: {integrity: sha512-LyjVB1nsJ6gTTUKRjRWx9C1s9hE7dLfP/knKdrfeH9UPtAGjYGgxIbFfx7xyLIEWs7Xe1Gnf8EWiUqfjLhInZA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-spread@7.24.1': + resolution: {integrity: sha512-KjmcIM+fxgY+KxPVbjelJC6hrH1CgtPmTvdXAfn3/a9CnWGSTY7nH4zm5+cjmWJybdcPSsD0++QssDsjcpe47g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-sticky-regex@7.24.1': + resolution: {integrity: sha512-9v0f1bRXgPVcPrngOQvLXeGNNVLc8UjMVfebo9ka0WF3/7+aVUHmaJVT3sa0XCzEFioPfPHZiOcYG9qOsH63cw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-template-literals@7.24.1': + resolution: {integrity: sha512-WRkhROsNzriarqECASCNu/nojeXCDTE/F2HmRgOzi7NGvyfYGq1NEjKBK3ckLfRgGc6/lPAqP0vDOSw3YtG34g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-typeof-symbol@7.24.5': + resolution: {integrity: sha512-UTGnhYVZtTAjdwOTzT+sCyXmTn8AhaxOS/MjG9REclZ6ULHWF9KoCZur0HSGU7hk8PdBFKKbYe6+gqdXWz84Jg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-escapes@7.24.1': + resolution: {integrity: sha512-RlkVIcWT4TLI96zM660S877E7beKlQw7Ig+wqkKBiWfj0zH5Q4h50q6er4wzZKRNSYpfo6ILJ+hrJAGSX2qcNw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-property-regex@7.24.1': + resolution: {integrity: sha512-Ss4VvlfYV5huWApFsF8/Sq0oXnGO+jB+rijFEFugTd3cwSObUSnUi88djgR5528Csl0uKlrI331kRqe56Ov2Ng==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-regex@7.24.1': + resolution: {integrity: sha512-2A/94wgZgxfTsiLaQ2E36XAOdcZmGAaEEgVmxQWwZXWkGhvoHbaqXcKnU8zny4ycpu3vNqg0L/PcCiYtHtA13g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-sets-regex@7.24.1': + resolution: {integrity: sha512-fqj4WuzzS+ukpgerpAoOnMfQXwUHFxXUZUE84oL2Kao2N8uSlvcpnAidKASgsNgzZHBsHWvcm8s9FPWUhAb8fA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/preset-env@7.24.5': + resolution: {integrity: sha512-UGK2ifKtcC8i5AI4cH+sbLLuLc2ktYSFJgBAXorKAsHUZmrQ1q6aQ6i3BvU24wWs2AAKqQB6kq3N9V9Gw1HiMQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/preset-modules@0.1.6-no-external-plugins': + resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} + peerDependencies: + '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 + + '@babel/regjsgen@0.8.0': + resolution: {integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==} + + '@babel/runtime@7.24.1': + resolution: {integrity: sha512-+BIznRzyqBf+2wCTxcKE3wDjfGeCoVE61KSHGpkzqrLi8qxqFwBeUFyId2cxkTmm55fzDGnm0+yCxaxygrLUnQ==} + engines: {node: '>=6.9.0'} + + '@babel/runtime@7.24.5': + resolution: {integrity: sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g==} + engines: {node: '>=6.9.0'} + + '@babel/template@7.24.0': + resolution: {integrity: sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.24.1': + resolution: {integrity: sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.24.5': + resolution: {integrity: sha512-7aaBLeDQ4zYcUFDUD41lJc1fG8+5IU9DaNSJAgal866FGvmD5EbWQgnEC6kO1gGLsX0esNkfnJSndbTXA3r7UA==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.24.0': + resolution: {integrity: sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.24.5': + resolution: {integrity: sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ==} + engines: {node: '>=6.9.0'} + + '@bcoe/v8-coverage@0.2.3': + resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + + '@bundled-es-modules/cookie@2.0.0': + resolution: {integrity: sha512-Or6YHg/kamKHpxULAdSqhGqnWFneIXu1NKvvfBBzKGwpVsYuFIQ5aBPHDnnoR3ghW1nvSkALd+EF9iMtY7Vjxw==} + + '@bundled-es-modules/statuses@1.0.1': + resolution: {integrity: sha512-yn7BklA5acgcBr+7w064fGV+SGIFySjCKpqjcWgBAIfrAkY+4GQTJJHQMeT3V/sgz23VTEVV8TtOmkvJAhFVfg==} + + '@colors/colors@1.6.0': + resolution: {integrity: sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==} + engines: {node: '>=0.1.90'} + + '@cspotcode/source-map-support@0.8.1': + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} + + '@dabh/diagnostics@2.0.3': + resolution: {integrity: sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==} + + '@dotenvx/dotenvx@0.27.0': + resolution: {integrity: sha512-zB01t8/4HxERp2qqz3CHniBUm6LtWK/8U6snewLY1zxeletpBhDKo5rgHslOoKPeRVWKLshSvHYNTEEXVlzFRQ==} + hasBin: true + + '@emotion/babel-plugin@11.11.0': + resolution: {integrity: sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==} + + '@emotion/cache@11.11.0': + resolution: {integrity: sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==} + + '@emotion/hash@0.9.1': + resolution: {integrity: sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==} + + '@emotion/is-prop-valid@1.2.2': + resolution: {integrity: sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==} + + '@emotion/memoize@0.8.1': + resolution: {integrity: sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==} + + '@emotion/react@11.11.4': + resolution: {integrity: sha512-t8AjMlF0gHpvvxk5mAtCqR4vmxiGHCeJBaQO6gncUSdklELOgtwjerNY2yuJNfwnc6vi16U/+uMF+afIawJ9iw==} + peerDependencies: + '@types/react': '*' + react: '>=16.8.0' + peerDependenciesMeta: + '@types/react': + optional: true + + '@emotion/serialize@1.1.3': + resolution: {integrity: sha512-iD4D6QVZFDhcbH0RAG1uVu1CwVLMWUkCvAqqlewO/rxf8+87yIBAlt4+AxMiiKPLs5hFc0owNk/sLLAOROw3cA==} + + '@emotion/serialize@1.1.4': + resolution: {integrity: sha512-RIN04MBT8g+FnDwgvIUi8czvr1LU1alUMI05LekWB5DGyTm8cCBMCRpq3GqaiyEDRptEXOyXnvZ58GZYu4kBxQ==} + + '@emotion/sheet@1.2.2': + resolution: {integrity: sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==} + + '@emotion/styled@11.11.5': + resolution: {integrity: sha512-/ZjjnaNKvuMPxcIiUkf/9SHoG4Q196DRl1w82hQ3WCsjo1IUR8uaGWrC6a87CrYAW0Kb/pK7hk8BnLgLRi9KoQ==} + peerDependencies: + '@emotion/react': ^11.0.0-rc.0 + '@types/react': '*' + react: '>=16.8.0' + peerDependenciesMeta: + '@types/react': + optional: true + + '@emotion/unitless@0.8.1': + resolution: {integrity: sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==} + + '@emotion/use-insertion-effect-with-fallbacks@1.0.1': + resolution: {integrity: sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==} + peerDependencies: + react: '>=16.8.0' + + '@emotion/utils@1.2.1': + resolution: {integrity: sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==} + + '@emotion/weak-memoize@0.3.1': + resolution: {integrity: sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==} + + '@esbuild/aix-ppc64@0.20.2': + resolution: {integrity: sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.20.2': + resolution: {integrity: sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.20.2': + resolution: {integrity: sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.20.2': + resolution: {integrity: sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.20.2': + resolution: {integrity: sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.20.2': + resolution: {integrity: sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.20.2': + resolution: {integrity: sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.20.2': + resolution: {integrity: sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.20.2': + resolution: {integrity: sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.20.2': + resolution: {integrity: sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.20.2': + resolution: {integrity: sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.20.2': + resolution: {integrity: sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.20.2': + resolution: {integrity: sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.20.2': + resolution: {integrity: sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.20.2': + resolution: {integrity: sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.20.2': + resolution: {integrity: sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.20.2': + resolution: {integrity: sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-x64@0.20.2': + resolution: {integrity: sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-x64@0.20.2': + resolution: {integrity: sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.20.2': + resolution: {integrity: sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.20.2': + resolution: {integrity: sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.20.2': + resolution: {integrity: sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.20.2': + resolution: {integrity: sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@eslint-community/eslint-utils@4.4.0': + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.10.0': + resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/eslintrc@2.1.4': + resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@eslint/js@8.57.0': + resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@fastify/busboy@2.1.1': + resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} + engines: {node: '>=14'} + + '@floating-ui/core@1.6.0': + resolution: {integrity: sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==} + + '@floating-ui/dom@1.6.3': + resolution: {integrity: sha512-RnDthu3mzPlQ31Ss/BTwQ1zjzIhr3lk1gZB1OC56h/1vEtaXkESrOqL5fQVMfXpwGtRwX+YsZBdyHtJMQnkArw==} + + '@floating-ui/react-dom@2.0.8': + resolution: {integrity: sha512-HOdqOt3R3OGeTKidaLvJKcgg75S6tibQ3Tif4eyd91QnIJWr0NLvoXFpJA/j8HqkFSL68GDca9AuyWEHlhyClw==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@floating-ui/utils@0.2.1': + resolution: {integrity: sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==} + + '@fontsource/roboto@5.0.12': + resolution: {integrity: sha512-x0o17jvgoSSbS9OZnUX2+xJmVRvVCfeaYJjkS7w62iN7CuJWtMf5vJj8LqgC7ibqIkitOHVW+XssRjgrcHn62g==} + + '@hapi/hoek@9.3.0': + resolution: {integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==} + + '@hapi/topo@5.1.0': + resolution: {integrity: sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==} + + '@hookform/resolvers@3.3.4': + resolution: {integrity: sha512-o5cgpGOuJYrd+iMKvkttOclgwRW86EsWJZZRC23prf0uU2i48Htq4PuT73AVb9ionFyZrwYEITuOFGF+BydEtQ==} + peerDependencies: + react-hook-form: ^7.0.0 + + '@humanwhocodes/config-array@0.11.14': + resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} + engines: {node: '>=10.10.0'} + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/object-schema@2.0.2': + resolution: {integrity: sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==} + + '@inquirer/checkbox@1.5.2': + resolution: {integrity: sha512-CifrkgQjDkUkWexmgYYNyB5603HhTHI91vLFeQXh6qrTKiCMVASol01Rs1cv6LP/A2WccZSRlJKZhbaBIs/9ZA==} + engines: {node: '>=14.18.0'} + + '@inquirer/confirm@2.0.17': + resolution: {integrity: sha512-EqzhGryzmGpy2aJf6LxJVhndxYmFs+m8cxXzf8nejb1DE3sabf6mUgBcp4J0jAUEiAcYzqmkqRr7LPFh/WdnXA==} + engines: {node: '>=14.18.0'} + + '@inquirer/confirm@3.1.6': + resolution: {integrity: sha512-Mj4TU29g6Uy+37UtpA8UpEOI2icBfpCwSW1QDtfx60wRhUy90s/kHPif2OXSSvuwDQT1lhAYRWUfkNf9Tecxvg==} + engines: {node: '>=18'} + + '@inquirer/core@6.0.0': + resolution: {integrity: sha512-fKi63Khkisgda3ohnskNf5uZJj+zXOaBvOllHsOkdsXRA/ubQLJQrZchFFi57NKbZzkTunXiBMdvWOv71alonw==} + engines: {node: '>=14.18.0'} + + '@inquirer/core@8.1.0': + resolution: {integrity: sha512-kfx0SU9nWgGe1f03ao/uXc85SFH1v2w3vQVH7QDGjKxdtJz+7vPitFtG++BTyJMYyYgH8MpXigutcXJeiQwVRw==} + engines: {node: '>=18'} + + '@inquirer/editor@1.2.15': + resolution: {integrity: sha512-gQ77Ls09x5vKLVNMH9q/7xvYPT6sIs5f7URksw+a2iJZ0j48tVS6crLqm2ugG33tgXHIwiEqkytY60Zyh5GkJQ==} + engines: {node: '>=14.18.0'} + + '@inquirer/expand@1.1.16': + resolution: {integrity: sha512-TGLU9egcuo+s7PxphKUCnJnpCIVY32/EwPCLLuu+gTvYiD8hZgx8Z2niNQD36sa6xcfpdLY6xXDBiL/+g1r2XQ==} + engines: {node: '>=14.18.0'} + + '@inquirer/figures@1.0.1': + resolution: {integrity: sha512-mtup3wVKia3ZwULPHcbs4Mor8Voi+iIXEWD7wCNbIO6lYR62oPCTQyrddi5OMYVXHzeCSoneZwJuS8sBvlEwDw==} + engines: {node: '>=18'} + + '@inquirer/input@1.2.16': + resolution: {integrity: sha512-Ou0LaSWvj1ni+egnyQ+NBtfM1885UwhRCMtsRt2bBO47DoC1dwtCa+ZUNgrxlnCHHF0IXsbQHYtIIjFGAavI4g==} + engines: {node: '>=14.18.0'} + + '@inquirer/password@1.1.16': + resolution: {integrity: sha512-aZYZVHLUXZ2gbBot+i+zOJrks1WaiI95lvZCn1sKfcw6MtSSlYC8uDX8sTzQvAsQ8epHoP84UNvAIT0KVGOGqw==} + engines: {node: '>=14.18.0'} + + '@inquirer/prompts@3.3.2': + resolution: {integrity: sha512-k52mOMRvTUejrqyF1h8Z07chC+sbaoaUYzzr1KrJXyj7yaX7Nrh0a9vktv8TuocRwIJOQMaj5oZEmkspEcJFYQ==} + engines: {node: '>=14.18.0'} + + '@inquirer/rawlist@1.2.16': + resolution: {integrity: sha512-pZ6TRg2qMwZAOZAV6TvghCtkr53dGnK29GMNQ3vMZXSNguvGqtOVc4j/h1T8kqGJFagjyfBZhUPGwNS55O5qPQ==} + engines: {node: '>=14.18.0'} + + '@inquirer/select@1.3.3': + resolution: {integrity: sha512-RzlRISXWqIKEf83FDC9ZtJ3JvuK1l7aGpretf41BCWYrvla2wU8W8MTRNMiPrPJ+1SIqrRC1nZdZ60hD9hRXLg==} + engines: {node: '>=14.18.0'} + + '@inquirer/type@1.2.1': + resolution: {integrity: sha512-xwMfkPAxeo8Ji/IxfUSqzRi0/+F2GIqJmpc5/thelgMGsjNZcjDDRBO9TLXT1s/hdx/mK5QbVIvgoLIFgXhTMQ==} + engines: {node: '>=18'} + + '@inquirer/type@1.3.1': + resolution: {integrity: sha512-Pe3PFccjPVJV1vtlfVvm9OnlbxqdnP5QcscFEFEnK5quChf1ufZtM0r8mR5ToWHMxZOh0s8o/qp9ANGRTo/DAw==} + engines: {node: '>=18'} + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@istanbuljs/load-nyc-config@1.1.0': + resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} + engines: {node: '>=8'} + + '@istanbuljs/schema@0.1.3': + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} + + '@jest/console@29.7.0': + resolution: {integrity: sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/core@29.7.0': + resolution: {integrity: sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + '@jest/environment@29.7.0': + resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/expect-utils@29.7.0': + resolution: {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/expect@29.7.0': + resolution: {integrity: sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/fake-timers@29.7.0': + resolution: {integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/globals@29.7.0': + resolution: {integrity: sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/reporters@29.7.0': + resolution: {integrity: sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + '@jest/schemas@29.6.3': + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/source-map@29.6.3': + resolution: {integrity: sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/test-result@29.7.0': + resolution: {integrity: sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/test-sequencer@29.7.0': + resolution: {integrity: sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/transform@29.7.0': + resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/types@29.6.3': + resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jridgewell/gen-mapping@0.3.5': + resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} + engines: {node: '>=6.0.0'} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + + '@jridgewell/source-map@0.3.6': + resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} + + '@jridgewell/sourcemap-codec@1.4.15': + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + + '@jridgewell/trace-mapping@0.3.9': + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + + '@mswjs/cookies@1.1.0': + resolution: {integrity: sha512-0ZcCVQxifZmhwNBoQIrystCb+2sWBY2Zw8lpfJBPCHGCA/HWqehITeCRVIv4VMy8MPlaHo2w2pTHFV2pFfqKPw==} + engines: {node: '>=18'} + + '@mswjs/interceptors@0.26.15': + resolution: {integrity: sha512-HM47Lu1YFmnYHKMBynFfjCp0U/yRskHj/8QEJW0CBEPOlw8Gkmjfll+S9b8M7V5CNDw2/ciRxjjnWeaCiblSIQ==} + engines: {node: '>=18'} + + '@mui/base@5.0.0-beta.40': + resolution: {integrity: sha512-I/lGHztkCzvwlXpjD2+SNmvNQvB4227xBXhISPjEaJUXGImOQ9f3D2Yj/T3KasSI/h0MLWy74X0J6clhPmsRbQ==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@types/react': ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + '@mui/core-downloads-tracker@5.15.14': + resolution: {integrity: sha512-on75VMd0XqZfaQW+9pGjSNiqW+ghc5E2ZSLRBXwcXl/C4YzjfyjrLPhrEpKnR9Uym9KXBvxrhoHfPcczYHweyA==} + + '@mui/icons-material@5.15.14': + resolution: {integrity: sha512-vj/51k7MdFmt+XVw94sl30SCvGx6+wJLsNYjZRgxhS6y3UtnWnypMOsm3Kmg8TN+P0dqwsjy4/fX7B1HufJIhw==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@mui/material': ^5.0.0 + '@types/react': ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + '@mui/material@5.15.14': + resolution: {integrity: sha512-kEbRw6fASdQ1SQ7LVdWR5OlWV3y7Y54ZxkLzd6LV5tmz+NpO3MJKZXSfgR0LHMP7meKsPiMm4AuzV0pXDpk/BQ==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@emotion/react': ^11.5.0 + '@emotion/styled': ^11.3.0 + '@types/react': ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@emotion/react': + optional: true + '@emotion/styled': + optional: true + '@types/react': + optional: true + + '@mui/private-theming@5.15.14': + resolution: {integrity: sha512-UH0EiZckOWcxiXLX3Jbb0K7rC8mxTr9L9l6QhOZxYc4r8FHUkefltV9VDGLrzCaWh30SQiJvAEd7djX3XXY6Xw==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@types/react': ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + '@mui/styled-engine@5.15.14': + resolution: {integrity: sha512-RILkuVD8gY6PvjZjqnWhz8fu68dVkqhM5+jYWfB5yhlSQKg+2rHkmEwm75XIeAqI3qwOndK6zELK5H6Zxn4NHw==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@emotion/react': ^11.4.1 + '@emotion/styled': ^11.3.0 + react: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@emotion/react': + optional: true + '@emotion/styled': + optional: true + + '@mui/system@5.15.14': + resolution: {integrity: sha512-auXLXzUaCSSOLqJXmsAaq7P96VPRXg2Rrz6OHNV7lr+kB8lobUF+/N84Vd9C4G/wvCXYPs5TYuuGBRhcGbiBGg==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@emotion/react': ^11.5.0 + '@emotion/styled': ^11.3.0 + '@types/react': ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@emotion/react': + optional: true + '@emotion/styled': + optional: true + '@types/react': + optional: true + + '@mui/types@7.2.14': + resolution: {integrity: sha512-MZsBZ4q4HfzBsywtXgM1Ksj6HDThtiwmOKUXH1pKYISI9gAVXCNHNpo7TlGoGrBaYWZTdNoirIN7JsQcQUjmQQ==} + peerDependencies: + '@types/react': ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + '@mui/utils@5.15.14': + resolution: {integrity: sha512-0lF/7Hh/ezDv5X7Pry6enMsbYyGKjADzvHyo3Qrc/SSlTsQ1VkbDMbH0m2t3OR5iIVLwMoxwM7yGd+6FCMtTFA==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@types/react': ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + '@mui/x-date-pickers@7.0.0': + resolution: {integrity: sha512-/9mp4O2WMixHOso63DBoZVfJVYGrzOHF5voheV2tYQ4XqDdTKp2AdWS3oh8PGwrsvCzqkvb3quzTqhKoEsJUwA==} + engines: {node: '>=14.0.0'} + peerDependencies: + '@emotion/react': ^11.9.0 + '@emotion/styled': ^11.8.1 + '@mui/material': ^5.15.14 + date-fns: ^2.25.0 || ^3.2.0 + date-fns-jalali: ^2.13.0-0 + dayjs: ^1.10.7 + luxon: ^3.0.2 + moment: ^2.29.4 + moment-hijri: ^2.1.2 + moment-jalaali: ^0.7.4 || ^0.8.0 || ^0.9.0 || ^0.10.0 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@emotion/react': + optional: true + '@emotion/styled': + optional: true + date-fns: + optional: true + date-fns-jalali: + optional: true + dayjs: + optional: true + luxon: + optional: true + moment: + optional: true + moment-hijri: + optional: true + moment-jalaali: + optional: true + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@open-draft/deferred-promise@2.2.0': + resolution: {integrity: sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==} + + '@open-draft/logger@0.3.0': + resolution: {integrity: sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==} + + '@open-draft/until@2.1.0': + resolution: {integrity: sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@pkgr/core@0.1.1': + resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + + '@playwright/test@1.42.1': + resolution: {integrity: sha512-Gq9rmS54mjBL/7/MvBaNOBwbfnh7beHvS6oS4srqXFcQHpQCV1+c8JXWE8VLPyRDhgS3H8x8A7hztqI9VnwrAQ==} + engines: {node: '>=16'} + hasBin: true + + '@popperjs/core@2.11.8': + resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} + + '@reduxjs/toolkit@2.2.2': + resolution: {integrity: sha512-454GZrEx3G6QSYwIx9ROaso1HR6sTH8qyZBe3KEsdWVGU3ayV8jYCwdaEJV3vl9V6+pi3GRl+7Xl7AeDna6qwQ==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18 + react-redux: ^7.2.1 || ^8.1.3 || ^9.0.0 + peerDependenciesMeta: + react: + optional: true + react-redux: + optional: true + + '@remix-run/router@1.15.3': + resolution: {integrity: sha512-Oy8rmScVrVxWZVOpEF57ovlnhpZ8CCPlnIIumVcV9nFdiSIrus99+Lw78ekXyGvVDlIsFJbSfmSovJUhCWYV3w==} + engines: {node: '>=14.0.0'} + + '@rollup/plugin-babel@5.3.1': + resolution: {integrity: sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==} + engines: {node: '>= 10.0.0'} + peerDependencies: + '@babel/core': ^7.0.0 + '@types/babel__core': ^7.1.9 + rollup: ^1.20.0||^2.0.0 + peerDependenciesMeta: + '@types/babel__core': + optional: true + + '@rollup/plugin-node-resolve@15.2.3': + resolution: {integrity: sha512-j/lym8nf5E21LwBT4Df1VD6hRO2L2iwUeUmP7litikRsVp1H6NWx20NEp0Y7su+7XGc476GnXXc4kFeZNGmaSQ==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.78.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/plugin-replace@2.4.2': + resolution: {integrity: sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==} + peerDependencies: + rollup: ^1.20.0 || ^2.0.0 + + '@rollup/plugin-terser@0.4.4': + resolution: {integrity: sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/pluginutils@3.1.0': + resolution: {integrity: sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==} + engines: {node: '>= 8.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0 + + '@rollup/pluginutils@5.1.0': + resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/rollup-android-arm-eabi@4.14.0': + resolution: {integrity: sha512-jwXtxYbRt1V+CdQSy6Z+uZti7JF5irRKF8hlKfEnF/xJpcNGuuiZMBvuoYM+x9sr9iWGnzrlM0+9hvQ1kgkf1w==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.14.0': + resolution: {integrity: sha512-fI9nduZhCccjzlsA/OuAwtFGWocxA4gqXGTLvOyiF8d+8o0fZUeSztixkYjcGq1fGZY3Tkq4yRvHPFxU+jdZ9Q==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.14.0': + resolution: {integrity: sha512-BcnSPRM76/cD2gQC+rQNGBN6GStBs2pl/FpweW8JYuz5J/IEa0Fr4AtrPv766DB/6b2MZ/AfSIOSGw3nEIP8SA==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.14.0': + resolution: {integrity: sha512-LDyFB9GRolGN7XI6955aFeI3wCdCUszFWumWU0deHA8VpR3nWRrjG6GtGjBrQxQKFevnUTHKCfPR4IvrW3kCgQ==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-linux-arm-gnueabihf@4.14.0': + resolution: {integrity: sha512-ygrGVhQP47mRh0AAD0zl6QqCbNsf0eTo+vgwkY6LunBcg0f2Jv365GXlDUECIyoXp1kKwL5WW6rsO429DBY/bA==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.14.0': + resolution: {integrity: sha512-x+uJ6MAYRlHGe9wi4HQjxpaKHPM3d3JjqqCkeC5gpnnI6OWovLdXTpfa8trjxPLnWKyBsSi5kne+146GAxFt4A==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.14.0': + resolution: {integrity: sha512-nrRw8ZTQKg6+Lttwqo6a2VxR9tOroa2m91XbdQ2sUUzHoedXlsyvY1fN4xWdqz8PKmf4orDwejxXHjh7YBGUCA==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-powerpc64le-gnu@4.14.0': + resolution: {integrity: sha512-xV0d5jDb4aFu84XKr+lcUJ9y3qpIWhttO3Qev97z8DKLXR62LC3cXT/bMZXrjLF9X+P5oSmJTzAhqwUbY96PnA==} + cpu: [ppc64le] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.14.0': + resolution: {integrity: sha512-SDDhBQwZX6LPRoPYjAZWyL27LbcBo7WdBFWJi5PI9RPCzU8ijzkQn7tt8NXiXRiFMJCVpkuMkBf4OxSxVMizAw==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.14.0': + resolution: {integrity: sha512-RxB/qez8zIDshNJDufYlTT0ZTVut5eCpAZ3bdXDU9yTxBzui3KhbGjROK2OYTTor7alM7XBhssgoO3CZ0XD3qA==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.14.0': + resolution: {integrity: sha512-C6y6z2eCNCfhZxT9u+jAM2Fup89ZjiG5pIzZIDycs1IwESviLxwkQcFRGLjnDrP+PT+v5i4YFvlcfAs+LnreXg==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.14.0': + resolution: {integrity: sha512-i0QwbHYfnOMYsBEyjxcwGu5SMIi9sImDVjDg087hpzXqhBSosxkE7gyIYFHgfFl4mr7RrXksIBZ4DoLoP4FhJg==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-win32-arm64-msvc@4.14.0': + resolution: {integrity: sha512-Fq52EYb0riNHLBTAcL0cun+rRwyZ10S9vKzhGKKgeD+XbwunszSY0rVMco5KbOsTlwovP2rTOkiII/fQ4ih/zQ==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.14.0': + resolution: {integrity: sha512-e/PBHxPdJ00O9p5Ui43+vixSgVf4NlLsmV6QneGERJ3lnjIua/kim6PRFe3iDueT1rQcgSkYP8ZBBXa/h4iPvw==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.14.0': + resolution: {integrity: sha512-aGg7iToJjdklmxlUlJh/PaPNa4PmqHfyRMLunbL3eaMO0gp656+q1zOKkpJ/CVe9CryJv6tAN1HDoR8cNGzkag==} + cpu: [x64] + os: [win32] + + '@sideway/address@4.1.5': + resolution: {integrity: sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==} + + '@sideway/formula@3.0.1': + resolution: {integrity: sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==} + + '@sideway/pinpoint@2.0.0': + resolution: {integrity: sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==} + + '@sinclair/typebox@0.27.8': + resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + + '@sindresorhus/is@4.6.0': + resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} + engines: {node: '>=10'} + + '@sinonjs/commons@3.0.1': + resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} + + '@sinonjs/fake-timers@10.3.0': + resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} + + '@surma/rollup-plugin-off-main-thread@2.2.3': + resolution: {integrity: sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==} + + '@swc/core-darwin-arm64@1.4.8': + resolution: {integrity: sha512-hhQCffRTgzpTIbngSnC30vV6IJVTI9FFBF954WEsshsecVoCGFiMwazBbrkLG+RwXENTrMhgeREEFh6R3KRgKQ==} + engines: {node: '>=10'} + cpu: [arm64] + os: [darwin] + + '@swc/core-darwin-x64@1.4.8': + resolution: {integrity: sha512-P3ZBw8Jr8rKhY/J8d+6WqWriqngGTgHwtFeJ8MIakQJTbdYbFgXSZxcvDiERg3psbGeFXaUaPI0GO6BXv9k/OQ==} + engines: {node: '>=10'} + cpu: [x64] + os: [darwin] + + '@swc/core-linux-arm-gnueabihf@1.4.8': + resolution: {integrity: sha512-PP9JIJt19bUWhAGcQW6qMwTjZOcMyzkvZa0/LWSlDm0ORYVLmDXUoeQbGD3e0Zju9UiZxyulnpjEN0ZihJgPTA==} + engines: {node: '>=10'} + cpu: [arm] + os: [linux] + + '@swc/core-linux-arm64-gnu@1.4.8': + resolution: {integrity: sha512-HvEWnwKHkoVUr5iftWirTApFJ13hGzhAY2CMw4lz9lur2m+zhPviRRED0FCI6T95Knpv7+8eUOr98Z7ctrG6DQ==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + + '@swc/core-linux-arm64-musl@1.4.8': + resolution: {integrity: sha512-kY8+qa7k/dEeBq9p0Hrta18QnJPpsiJvDQSLNaTIFpdM3aEM9zbkshWz8gaX5VVGUEALowCBUWqmzO4VaqM+2w==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + + '@swc/core-linux-x64-gnu@1.4.8': + resolution: {integrity: sha512-0WWyIw432wpO/zeGblwq4f2YWam4pn8Z/Ig4KzHMgthR/KmiLU3f0Z7eo45eVmq5vcU7Os1zi/Zb65OOt09q/w==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + + '@swc/core-linux-x64-musl@1.4.8': + resolution: {integrity: sha512-p4yxvVS05rBNCrBaSTa20KK88vOwtg8ifTW7ec/yoab0bD5EwzzB8KbDmLLxE6uziFa0sdjF0dfRDwSZPex37Q==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + + '@swc/core-win32-arm64-msvc@1.4.8': + resolution: {integrity: sha512-jKuXihxAaqUnbFfvPxtmxjdJfs87F1GdBf33il+VUmSyWCP4BE6vW+/ReDAe8sRNsKyrZ3UH1vI5q1n64csBUA==} + engines: {node: '>=10'} + cpu: [arm64] + os: [win32] + + '@swc/core-win32-ia32-msvc@1.4.8': + resolution: {integrity: sha512-O0wT4AGHrX8aBeH6c2ADMHgagAJc5Kf6W48U5moyYDAkkVnKvtSc4kGhjWhe1Yl0sI0cpYh2In2FxvYsb44eWw==} + engines: {node: '>=10'} + cpu: [ia32] + os: [win32] + + '@swc/core-win32-x64-msvc@1.4.8': + resolution: {integrity: sha512-C2AYc3A2o+ECciqsJWRgIpp83Vk5EaRzHe7ed/xOWzVd0MsWR+fweEsyOjlmzHfpUxJSi46Ak3/BIZJlhZbXbg==} + engines: {node: '>=10'} + cpu: [x64] + os: [win32] + + '@swc/core@1.4.8': + resolution: {integrity: sha512-uY2RSJcFPgNOEg12RQZL197LZX+MunGiKxsbxmh22VfVxrOYGRvh4mPANFlrD1yb38CgmW1wI6YgIi8LkIwmWg==} + engines: {node: '>=10'} + peerDependencies: + '@swc/helpers': ^0.5.0 + peerDependenciesMeta: + '@swc/helpers': + optional: true + + '@swc/counter@0.1.3': + resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} + + '@swc/types@0.1.6': + resolution: {integrity: sha512-/JLo/l2JsT/LRd80C3HfbmVpxOAJ11FO2RCEslFrgzLltoP9j8XIbsyDcfCt2WWyX+CM96rBoNM+IToAkFOugg==} + + '@szmarczak/http-timer@4.0.6': + resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} + engines: {node: '>=10'} + + '@testing-library/dom@10.1.0': + resolution: {integrity: sha512-wdsYKy5zupPyLCW2Je5DLHSxSfbIp6h80WoHOQc+RPtmPGA52O9x5MJEkv92Sjonpq+poOAtUKhh1kBGAXBrNA==} + engines: {node: '>=18'} + + '@testing-library/dom@9.3.4': + resolution: {integrity: sha512-FlS4ZWlp97iiNWig0Muq8p+3rVDjRiYE+YKGbAqXOu9nwJFFOdL00kFpz42M+4huzYi86vAK1sOOfyOG45muIQ==} + engines: {node: '>=14'} + + '@testing-library/jest-dom@6.4.2': + resolution: {integrity: sha512-CzqH0AFymEMG48CpzXFriYYkOjk6ZGPCLMhW9e9jg3KMCn5OfJecF8GtGW7yGfR/IgCe3SX8BSwjdzI6BBbZLw==} + engines: {node: '>=14', npm: '>=6', yarn: '>=1'} + peerDependencies: + '@jest/globals': '>= 28' + '@types/bun': latest + '@types/jest': '>= 28' + jest: '>= 28' + vitest: '>= 0.32' + peerDependenciesMeta: + '@jest/globals': + optional: true + '@types/bun': + optional: true + '@types/jest': + optional: true + jest: + optional: true + vitest: + optional: true + + '@testing-library/react@14.2.2': + resolution: {integrity: sha512-SOUuM2ysCvjUWBXTNfQ/ztmnKDmqaiPV3SvoIuyxMUca45rbSWWAT/qB8CUs/JQ/ux/8JFs9DNdFQ3f6jH3crA==} + engines: {node: '>=14'} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + + '@testing-library/user-event@14.5.2': + resolution: {integrity: sha512-YAh82Wh4TIrxYLmfGcixwD18oIjyC1pFQC2Y01F2lzV2HTMiYrI0nze0FD0ocB//CKS/7jIUgae+adPqxK5yCQ==} + engines: {node: '>=12', npm: '>=6'} + peerDependencies: + '@testing-library/dom': '>=7.21.4' + + '@tootallnate/once@2.0.0': + resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} + engines: {node: '>= 10'} + + '@tsconfig/node10@1.0.9': + resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} + + '@tsconfig/node12@1.0.11': + resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + + '@tsconfig/node14@1.0.3': + resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + + '@tsconfig/node16@1.0.4': + resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + + '@types/aria-query@5.0.4': + resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} + + '@types/babel__core@7.20.5': + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + + '@types/babel__generator@7.6.8': + resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} + + '@types/babel__template@7.4.4': + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + + '@types/babel__traverse@7.20.5': + resolution: {integrity: sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==} + + '@types/cacheable-request@6.0.3': + resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==} + + '@types/cookie@0.6.0': + resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} + + '@types/estree@0.0.39': + resolution: {integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==} + + '@types/estree@1.0.5': + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + + '@types/graceful-fs@4.1.9': + resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} + + '@types/hoist-non-react-statics@3.3.5': + resolution: {integrity: sha512-SbcrWzkKBw2cdwRTwQAswfpB9g9LJWfjtUeW/jvNwbhC8cpmmNYVePa+ncbUe0rGTQ7G3Ff6mYUN2VMfLVr+Sg==} + + '@types/http-cache-semantics@4.0.4': + resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} + + '@types/istanbul-lib-coverage@2.0.6': + resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} + + '@types/istanbul-lib-report@3.0.3': + resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} + + '@types/istanbul-reports@3.0.4': + resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} + + '@types/jest@29.5.12': + resolution: {integrity: sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==} + + '@types/jsdom@20.0.1': + resolution: {integrity: sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/json5@0.0.29': + resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + + '@types/keyv@3.1.4': + resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} + + '@types/lodash.camelcase@4.3.9': + resolution: {integrity: sha512-ys9/hGBfsKxzmFI8hckII40V0ASQ83UM2pxfQRghHAwekhH4/jWtjz/3/9YDy7ZpUd/H0k2STSqmPR28dnj7Zg==} + + '@types/lodash@4.17.0': + resolution: {integrity: sha512-t7dhREVv6dbNj0q17X12j7yDG4bD/DHYX7o5/DbDxobP0HnGPgpRz2Ej77aL7TZT3DSw13fqUTj8J4mMnqa7WA==} + + '@types/mute-stream@0.0.4': + resolution: {integrity: sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow==} + + '@types/node-fetch@2.6.11': + resolution: {integrity: sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==} + + '@types/node@20.11.30': + resolution: {integrity: sha512-dHM6ZxwlmuZaRmUPfv1p+KrdD1Dci04FbdEm/9wEMouFqxYoFl5aMkt0VMAUtYRQDyYvD41WJLukhq/ha3YuTw==} + + '@types/node@20.12.7': + resolution: {integrity: sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==} + + '@types/parse-json@4.0.2': + resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} + + '@types/prop-types@15.7.11': + resolution: {integrity: sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==} + + '@types/react-dom@18.2.22': + resolution: {integrity: sha512-fHkBXPeNtfvri6gdsMYyW+dW7RXFo6Ad09nLFK0VQWR7yGLai/Cyvyj696gbwYvBnhGtevUG9cET0pmUbMtoPQ==} + + '@types/react-redux@7.1.33': + resolution: {integrity: sha512-NF8m5AjWCkert+fosDsN3hAlHzpjSiXlVy9EgQEmLoBhaNXbmyeGs/aj5dQzKuF+/q+S7JQagorGDW8pJ28Hmg==} + + '@types/react-transition-group@4.4.10': + resolution: {integrity: sha512-hT/+s0VQs2ojCX823m60m5f0sL5idt9SO6Tj6Dg+rdphGPIeJbJ6CxvBYkgkGKrYeDjvIpKTR38UzmtHJOGW3Q==} + + '@types/react@18.2.67': + resolution: {integrity: sha512-vkIE2vTIMHQ/xL0rgmuoECBCkZFZeHr49HeWSc24AptMbNRo7pwSBvj73rlJJs9fGKj0koS+V7kQB1jHS0uCgw==} + + '@types/resolve@1.20.2': + resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} + + '@types/responselike@1.0.3': + resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} + + '@types/scheduler@0.16.8': + resolution: {integrity: sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==} + + '@types/semver@7.5.8': + resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} + + '@types/stack-utils@2.0.3': + resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} + + '@types/statuses@2.0.5': + resolution: {integrity: sha512-jmIUGWrAiwu3dZpxntxieC+1n/5c3mjrImkmOSQ2NC5uP6cYO4aAZDdSmRcI5C1oiTmqlZGHC+/NmJrKogbP5A==} + + '@types/tough-cookie@4.0.5': + resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==} + + '@types/triple-beam@1.3.5': + resolution: {integrity: sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==} + + '@types/trusted-types@2.0.7': + resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} + + '@types/use-sync-external-store@0.0.3': + resolution: {integrity: sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA==} + + '@types/wrap-ansi@3.0.0': + resolution: {integrity: sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g==} + + '@types/yargs-parser@21.0.3': + resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} + + '@types/yargs@17.0.32': + resolution: {integrity: sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==} + + '@typescript-eslint/eslint-plugin@7.4.0': + resolution: {integrity: sha512-yHMQ/oFaM7HZdVrVm/M2WHaNPgyuJH4WelkSVEWSSsir34kxW2kDJCxlXRhhGWEsMN0WAW/vLpKfKVcm8k+MPw==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + '@typescript-eslint/parser': ^7.0.0 + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/parser@7.4.0': + resolution: {integrity: sha512-ZvKHxHLusweEUVwrGRXXUVzFgnWhigo4JurEj0dGF1tbcGh6buL+ejDdjxOQxv6ytcY1uhun1p2sm8iWStlgLQ==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/scope-manager@7.4.0': + resolution: {integrity: sha512-68VqENG5HK27ypafqLVs8qO+RkNc7TezCduYrx8YJpXq2QGZ30vmNZGJJJC48+MVn4G2dCV8m5ZTVnzRexTVtw==} + engines: {node: ^18.18.0 || >=20.0.0} + + '@typescript-eslint/type-utils@7.4.0': + resolution: {integrity: sha512-247ETeHgr9WTRMqHbbQdzwzhuyaJ8dPTuyuUEMANqzMRB1rj/9qFIuIXK7l0FX9i9FXbHeBQl/4uz6mYuCE7Aw==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/types@7.4.0': + resolution: {integrity: sha512-mjQopsbffzJskos5B4HmbsadSJQWaRK0UxqQ7GuNA9Ga4bEKeiO6b2DnB6cM6bpc8lemaPseh0H9B/wyg+J7rw==} + engines: {node: ^18.18.0 || >=20.0.0} + + '@typescript-eslint/typescript-estree@7.4.0': + resolution: {integrity: sha512-A99j5AYoME/UBQ1ucEbbMEmGkN7SE0BvZFreSnTd1luq7yulcHdyGamZKizU7canpGDWGJ+Q6ZA9SyQobipePg==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/utils@7.4.0': + resolution: {integrity: sha512-NQt9QLM4Tt8qrlBVY9lkMYzfYtNz8/6qwZg8pI3cMGlPnj6mOpRxxAm7BMJN9K0AiY+1BwJ5lVC650YJqYOuNg==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + + '@typescript-eslint/visitor-keys@7.4.0': + resolution: {integrity: sha512-0zkC7YM0iX5Y41homUUeW1CHtZR01K3ybjM1l6QczoMuay0XKtrb93kv95AxUGwdjGr64nNqnOCwmEl616N8CA==} + engines: {node: ^18.18.0 || >=20.0.0} + + '@ungap/structured-clone@1.2.0': + resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + + '@vitejs/plugin-react-swc@3.6.0': + resolution: {integrity: sha512-XFRbsGgpGxGzEV5i5+vRiro1bwcIaZDIdBRP16qwm+jP68ue/S8FJTBEgOeojtVDYrbSua3XFp71kC8VJE6v+g==} + peerDependencies: + vite: ^4 || ^5 + + JSONStream@1.3.5: + resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} + hasBin: true + + abab@2.0.6: + resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} + deprecated: Use your platform's native atob() and btoa() methods instead + + acorn-globals@7.0.1: + resolution: {integrity: sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==} + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn-walk@8.3.2: + resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} + engines: {node: '>=0.4.0'} + + acorn@8.11.3: + resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} + engines: {node: '>=0.4.0'} + hasBin: true + + agent-base@6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + + ajv-formats@2.1.1: + resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ajv@8.12.0: + resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} + + ajv@8.13.0: + resolution: {integrity: sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==} + + ansi-align@3.0.1: + resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} + + ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + + ansi-escapes@6.2.0: + resolution: {integrity: sha512-kzRaCqXnpzWs+3z5ABPQiVke+iq0KXkHo8xiWV4RPTi5Yli0l97BEQuhXV1s7+aSU/fu1kUuxgS4MsQ0fRuygw==} + engines: {node: '>=14.16'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + + ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + arch@2.2.0: + resolution: {integrity: sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==} + + arg@4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + + argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + aria-query@5.1.3: + resolution: {integrity: sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==} + + aria-query@5.3.0: + resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} + + array-buffer-byte-length@1.0.1: + resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} + engines: {node: '>= 0.4'} + + array-find-index@1.0.2: + resolution: {integrity: sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==} + engines: {node: '>=0.10.0'} + + array-includes@3.1.7: + resolution: {integrity: sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==} + engines: {node: '>= 0.4'} + + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + array.prototype.findlast@1.2.5: + resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} + engines: {node: '>= 0.4'} + + array.prototype.findlastindex@1.2.5: + resolution: {integrity: sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==} + engines: {node: '>= 0.4'} + + array.prototype.flat@1.3.2: + resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} + engines: {node: '>= 0.4'} + + array.prototype.flatmap@1.3.2: + resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} + engines: {node: '>= 0.4'} + + array.prototype.toreversed@1.1.2: + resolution: {integrity: sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==} + + array.prototype.tosorted@1.1.3: + resolution: {integrity: sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg==} + + arraybuffer.prototype.slice@1.0.3: + resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} + engines: {node: '>= 0.4'} + + async@3.2.5: + resolution: {integrity: sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + at-least-node@1.0.0: + resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} + engines: {node: '>= 4.0.0'} + + atomically@1.7.0: + resolution: {integrity: sha512-Xcz9l0z7y9yQ9rdDaxlmaI4uJHf/T8g9hOEzJcsEqX2SjCj4J20uK7+ldkDHMbpJDK76wF7xEIgxc/vSlsfw5w==} + engines: {node: '>=10.12.0'} + + audit-ci@6.6.1: + resolution: {integrity: sha512-zqZEoYfEC4QwX5yBkDNa0h7YhZC63HWtKtP19BVq+RS0dxRBInfmHogxe4VUeOzoADQjuTLZUI7zp3Pjyl+a5g==} + engines: {node: '>=12.9.0'} + hasBin: true + + autoprefixer@10.4.18: + resolution: {integrity: sha512-1DKbDfsr6KUElM6wg+0zRNkB/Q7WcKYAaK+pzXn+Xqmszm/5Xa9coeNdtP88Vi+dPzZnMjhge8GIV49ZQkDa+g==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + + available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + + axios@1.6.8: + resolution: {integrity: sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==} + + babel-jest@29.7.0: + resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@babel/core': ^7.8.0 + + babel-plugin-istanbul@6.1.1: + resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} + engines: {node: '>=8'} + + babel-plugin-jest-hoist@29.6.3: + resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + babel-plugin-macros@3.1.0: + resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} + engines: {node: '>=10', npm: '>=6'} + + babel-plugin-polyfill-corejs2@0.4.11: + resolution: {integrity: sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + babel-plugin-polyfill-corejs3@0.10.4: + resolution: {integrity: sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + babel-plugin-polyfill-regenerator@0.6.2: + resolution: {integrity: sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + babel-preset-current-node-syntax@1.0.1: + resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} + peerDependencies: + '@babel/core': ^7.0.0 + + babel-preset-jest@29.6.3: + resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@babel/core': ^7.0.0 + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + + boxen@5.1.2: + resolution: {integrity: sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==} + engines: {node: '>=10'} + + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + + browserslist@4.23.0: + resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + bs-logger@0.2.6: + resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} + engines: {node: '>= 6'} + + bser@2.1.1: + resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + + builtin-modules@3.3.0: + resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} + engines: {node: '>=6'} + + cacheable-lookup@5.0.4: + resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==} + engines: {node: '>=10.6.0'} + + cacheable-request@7.0.4: + resolution: {integrity: sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==} + engines: {node: '>=8'} + + call-bind@1.0.7: + resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} + engines: {node: '>= 0.4'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + + camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + + caniuse-lite@1.0.30001599: + resolution: {integrity: sha512-LRAQHZ4yT1+f9LemSMeqdMpMxZcc4RMWdj4tiFe3G8tNkWK+E58g+/tzotb5cU6TbcVJLr4fySiAW7XmxQvZQA==} + + chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + + chalk@3.0.0: + resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==} + engines: {node: '>=8'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + chalk@5.3.0: + resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + + char-regex@1.0.2: + resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} + engines: {node: '>=10'} + + chardet@0.7.0: + resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + + ci-info@2.0.0: + resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==} + + ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} + + cjs-module-lexer@1.2.3: + resolution: {integrity: sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==} + + cli-boxes@2.2.1: + resolution: {integrity: sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==} + engines: {node: '>=6'} + + cli-cursor@3.1.0: + resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} + engines: {node: '>=8'} + + cli-cursor@4.0.0: + resolution: {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + cli-spinners@2.9.2: + resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} + engines: {node: '>=6'} + + cli-truncate@4.0.0: + resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==} + engines: {node: '>=18'} + + cli-width@4.1.0: + resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} + engines: {node: '>= 12'} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + clone-response@1.0.3: + resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} + + clone@1.0.4: + resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} + engines: {node: '>=0.8'} + + clsx@2.1.0: + resolution: {integrity: sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==} + engines: {node: '>=6'} + + co@4.6.0: + resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} + engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + + collect-v8-coverage@1.0.2: + resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} + + color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + color-string@1.9.1: + resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + + color@3.2.1: + resolution: {integrity: sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==} + + colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + + colorspace@1.1.4: + resolution: {integrity: sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + commander@11.1.0: + resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} + engines: {node: '>=16'} + + commander@12.0.0: + resolution: {integrity: sha512-MwVNWlYjDTtOjX5PiD7o5pK0UrFU/OYgcJfjjK4RaHZETNtjJqrZa9Y9ds88+A+f+d5lv+561eZ+yCKoS3gbAA==} + engines: {node: '>=18'} + + commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + common-tags@1.8.2: + resolution: {integrity: sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==} + engines: {node: '>=4.0.0'} + + concat-map@0.0.1: + resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=} + + conf@10.2.0: + resolution: {integrity: sha512-8fLl9F04EJqjSqH+QjITQfJF8BrOVaYr1jewVgSRAEWePfxT0sku4w2hrGQ60BC/TNLGQ2pgxNlTbWQmMPFvXg==} + engines: {node: '>=12'} + + configstore@5.0.1: + resolution: {integrity: sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==} + engines: {node: '>=8'} + + convert-source-map@1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + cookie@0.5.0: + resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} + engines: {node: '>= 0.6'} + + core-js-compat@3.37.0: + resolution: {integrity: sha512-vYq4L+T8aS5UuFg4UwDhc7YNRWVeVZwltad9C/jV3R2LgVOpS9BDr7l/WL6BN0dbV3k1XejPTHqqEzJgsa0frA==} + + cosmiconfig@7.1.0: + resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} + engines: {node: '>=10'} + + cosmiconfig@9.0.0: + resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + + create-jest@29.7.0: + resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + + create-require@1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + + cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + + crypto-random-string@2.0.0: + resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==} + engines: {node: '>=8'} + + css.escape@1.5.1: + resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==} + + cssom@0.3.8: + resolution: {integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==} + + cssom@0.5.0: + resolution: {integrity: sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==} + + cssstyle@2.3.0: + resolution: {integrity: sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==} + engines: {node: '>=8'} + + csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + + csv-parse@5.5.5: + resolution: {integrity: sha512-erCk7tyU3yLWAhk6wvKxnyPtftuy/6Ak622gOO7BCJ05+TYffnPCJF905wmOQm+BpkX54OdAl8pveJwUdpnCXQ==} + + cuint@0.2.2: + resolution: {integrity: sha512-d4ZVpCW31eWwCMe1YT3ur7mUDnTXbgwyzaL320DrcRT45rfjYxkt5QWLrmOJ+/UEAI2+fQgKe/fCjR8l4TpRgw==} + + data-uri-to-buffer@4.0.1: + resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} + engines: {node: '>= 12'} + + data-urls@3.0.2: + resolution: {integrity: sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==} + engines: {node: '>=12'} + + data-view-buffer@1.0.1: + resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} + engines: {node: '>= 0.4'} + + data-view-byte-length@1.0.1: + resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} + engines: {node: '>= 0.4'} + + data-view-byte-offset@1.0.0: + resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} + engines: {node: '>= 0.4'} + + dayjs@1.11.10: + resolution: {integrity: sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==} + + debounce-fn@4.0.0: + resolution: {integrity: sha512-8pYCQiL9Xdcg0UPSD3d+0KMlOjp+KGU5EPwYddgzQ7DATsg4fuUDjQtsYLmWjnk2obnNHgV3vE2Y4jejSOJVBQ==} + engines: {node: '>=10'} + + debug@3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decimal.js@10.4.3: + resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} + + decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + + dedent@1.5.1: + resolution: {integrity: sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==} + peerDependencies: + babel-plugin-macros: ^3.1.0 + peerDependenciesMeta: + babel-plugin-macros: + optional: true + + deep-equal@2.2.3: + resolution: {integrity: sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==} + engines: {node: '>= 0.4'} + + deep-extend@0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + + defaults@1.0.4: + resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + + defer-to-connect@2.0.1: + resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} + engines: {node: '>=10'} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-lazy-prop@2.0.0: + resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} + engines: {node: '>=8'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + + detect-newline@3.1.0: + resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} + engines: {node: '>=8'} + + diff-sequences@29.6.3: + resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + diff@4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} + + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + + doctrine@2.1.0: + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} + engines: {node: '>=0.10.0'} + + doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + + dom-accessibility-api@0.5.16: + resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} + + dom-accessibility-api@0.6.3: + resolution: {integrity: sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==} + + dom-helpers@5.2.1: + resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==} + + domexception@4.0.0: + resolution: {integrity: sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==} + engines: {node: '>=12'} + deprecated: Use your platform's native DOMException instead + + dot-prop@5.3.0: + resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} + engines: {node: '>=8'} + + dot-prop@6.0.1: + resolution: {integrity: sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==} + engines: {node: '>=10'} + + dotenv-expand@11.0.6: + resolution: {integrity: sha512-8NHi73otpWsZGBSZwwknTXS5pqMOrk9+Ssrna8xCaxkzEpU9OTf9R5ArQGVw03//Zmk9MOwLPng9WwndvpAJ5g==} + engines: {node: '>=12'} + + dotenv@16.4.5: + resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} + engines: {node: '>=12'} + + duplexer@0.1.2: + resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + ejs@3.1.10: + resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} + engines: {node: '>=0.10.0'} + hasBin: true + + electron-to-chromium@1.4.711: + resolution: {integrity: sha512-hRg81qzvUEibX2lDxnFlVCHACa+LtrCPIsWAxo161LDYIB3jauf57RGsMZV9mvGwE98yGH06icj3zBEoOkxd/w==} + + emittery@0.13.1: + resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} + engines: {node: '>=12'} + + emoji-regex@10.3.0: + resolution: {integrity: sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + enabled@2.0.0: + resolution: {integrity: sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==} + + end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + + enhanced-resolve@5.16.0: + resolution: {integrity: sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA==} + engines: {node: '>=10.13.0'} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + + error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + + es-abstract@1.22.5: + resolution: {integrity: sha512-oW69R+4q2wG+Hc3KZePPZxOiisRIqfKBVo/HLx94QcJeWGU/8sZhCvc829rd1kS366vlJbzBfXf9yWwf0+Ko7w==} + engines: {node: '>= 0.4'} + + es-abstract@1.23.2: + resolution: {integrity: sha512-60s3Xv2T2p1ICykc7c+DNDPLDMm9t4QxCOUU0K9JxiLjM3C1zB9YVdN7tjxrFd4+AkZ8CdX1ovUga4P2+1e+/w==} + engines: {node: '>= 0.4'} + + es-define-property@1.0.0: + resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-get-iterator@1.1.3: + resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==} + + es-iterator-helpers@1.0.18: + resolution: {integrity: sha512-scxAJaewsahbqTYrGKJihhViaM6DDZDDoucfvzNbK0pOren1g/daDQ3IAhzn+1G14rBG7w+i5N+qul60++zlKA==} + engines: {node: '>= 0.4'} + + es-object-atoms@1.0.0: + resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.0.3: + resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} + engines: {node: '>= 0.4'} + + es-shim-unscopables@1.0.2: + resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} + + es-to-primitive@1.2.1: + resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} + engines: {node: '>= 0.4'} + + esbuild@0.20.2: + resolution: {integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==} + engines: {node: '>=12'} + hasBin: true + + escalade@3.1.2: + resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} + engines: {node: '>=6'} + + escape-goat@2.1.1: + resolution: {integrity: sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==} + engines: {node: '>=8'} + + escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + escape-string-regexp@2.0.0: + resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} + engines: {node: '>=8'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + escodegen@2.1.0: + resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} + engines: {node: '>=6.0'} + hasBin: true + + eslint-compat-utils@0.1.2: + resolution: {integrity: sha512-Jia4JDldWnFNIru1Ehx1H5s9/yxiRHY/TimCuUc0jNexew3cF1gI6CYZil1ociakfWO3rRqFjl1mskBblB3RYg==} + engines: {node: '>=12'} + peerDependencies: + eslint: '>=6.0.0' + + eslint-config-prettier@9.1.0: + resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + + eslint-import-resolver-node@0.3.9: + resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} + + eslint-module-utils@2.8.1: + resolution: {integrity: sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint: + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true + + eslint-plugin-es-x@7.5.0: + resolution: {integrity: sha512-ODswlDSO0HJDzXU0XvgZ3lF3lS3XAZEossh15Q2UHjwrJggWeBoKqqEsLTZLXl+dh5eOAozG0zRcYtuE35oTuQ==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + eslint: '>=8' + + eslint-plugin-import@2.29.1: + resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + + eslint-plugin-n@17.3.1: + resolution: {integrity: sha512-25+HTtKe1F8U/M4ERmdzbz/xkm/gaY0OYC8Fcv1z/WvpLJ8Xfh9LzJ13JV5uj4QyCUD8kOPJrNjn/3y+tc57Vw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: '>=8.23.0' + + eslint-plugin-prettier@5.1.3: + resolution: {integrity: sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + '@types/eslint': '>=8.0.0' + eslint: '>=8.0.0' + eslint-config-prettier: '*' + prettier: '>=3.0.0' + peerDependenciesMeta: + '@types/eslint': + optional: true + eslint-config-prettier: + optional: true + + eslint-plugin-promise@6.1.1: + resolution: {integrity: sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + + eslint-plugin-react-hooks@4.6.0: + resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==} + engines: {node: '>=10'} + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 + + eslint-plugin-react@7.34.1: + resolution: {integrity: sha512-N97CxlouPT1AHt8Jn0mhhN2RrADlUAsk1/atcT2KyA/l9Q/E6ll7OIGwNumFmWfZ9skV3XXccYS19h80rHtgkw==} + engines: {node: '>=4'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + + eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint@8.57.0: + resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + + espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + esquery@1.5.0: + resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + estree-walker@1.0.1: + resolution: {integrity: sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==} + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + event-stream@4.0.1: + resolution: {integrity: sha512-qACXdu/9VHPBzcyhdOWR5/IahhGMf0roTeZJfzz077GwylcDd90yOHLouhmv7GJ5XzPi6ekaQWd8AvPP2nOvpA==} + + eventemitter3@5.0.1: + resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + + execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + + execa@8.0.1: + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} + engines: {node: '>=16.17'} + + exit@0.1.2: + resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} + engines: {node: '>= 0.8.0'} + + expect@29.7.0: + resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + external-editor@3.1.0: + resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} + engines: {node: '>=4'} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-diff@1.3.0: + resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} + + fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fastq@1.17.1: + resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + + fb-watchman@2.0.2: + resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} + + fecha@4.2.3: + resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==} + + fetch-blob@3.2.0: + resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} + engines: {node: ^12.20 || >= 14.13} + + figures@3.2.0: + resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} + engines: {node: '>=8'} + + file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + + filelist@1.0.4: + resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} + + fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + + find-root@1.1.0: + resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} + + find-up@3.0.0: + resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} + engines: {node: '>=6'} + + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} + + flatted@3.3.1: + resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} + + fn.name@1.1.0: + resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==} + + follow-redirects@1.15.6: + resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + for-each@0.3.3: + resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + + foreground-child@3.1.1: + resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} + engines: {node: '>=14'} + + form-data@4.0.0: + resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + engines: {node: '>= 6'} + + formdata-polyfill@4.0.10: + resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} + engines: {node: '>=12.20.0'} + + fraction.js@4.3.7: + resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} + + from@0.1.7: + resolution: {integrity: sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==} + + fs-extra@9.1.0: + resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} + engines: {node: '>=10'} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + function.prototype.name@1.1.6: + resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} + engines: {node: '>= 0.4'} + + functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-east-asian-width@1.2.0: + resolution: {integrity: sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==} + engines: {node: '>=18'} + + get-intrinsic@1.2.4: + resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} + engines: {node: '>= 0.4'} + + get-own-enumerable-property-symbols@3.0.2: + resolution: {integrity: sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==} + + get-package-type@0.1.0: + resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} + engines: {node: '>=8.0.0'} + + get-stream@5.2.0: + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} + engines: {node: '>=8'} + + get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + + get-stream@8.0.1: + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + engines: {node: '>=16'} + + get-symbol-description@1.0.2: + resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} + engines: {node: '>= 0.4'} + + get-tsconfig@4.7.3: + resolution: {integrity: sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg==} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob@10.3.10: + resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + + global-dirs@3.0.1: + resolution: {integrity: sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==} + engines: {node: '>=10'} + + globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + + globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} + + globals@15.0.0: + resolution: {integrity: sha512-m/C/yR4mjO6pXDTm9/R/SpYTAIyaUB4EOzcaaMEl7mds7Mshct9GfejiJNQGjHHbdMPey13Kpu4TMbYi9ex1pw==} + engines: {node: '>=18'} + + globalthis@1.0.3: + resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} + engines: {node: '>= 0.4'} + + globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + + gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + + got@11.8.6: + resolution: {integrity: sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==} + engines: {node: '>=10.19.0'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + + graphql@16.8.1: + resolution: {integrity: sha512-59LZHPdGZVh695Ud9lRzPBVTtlX9ZCV150Er2W43ro37wVof0ctenSaskPPjN7lVTIN8mSZt8PHUNKZuNQUuxw==} + engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} + + harmony-reflect@1.6.2: + resolution: {integrity: sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==} + + has-bigints@1.0.2: + resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + + has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-proto@1.0.3: + resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} + engines: {node: '>= 0.4'} + + has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + has-yarn@2.1.0: + resolution: {integrity: sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==} + engines: {node: '>=8'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + headers-polyfill@4.0.3: + resolution: {integrity: sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ==} + + hoist-non-react-statics@3.3.2: + resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} + + html-encoding-sniffer@3.0.0: + resolution: {integrity: sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==} + engines: {node: '>=12'} + + html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + + http-cache-semantics@4.1.1: + resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} + + http-proxy-agent@5.0.0: + resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} + engines: {node: '>= 6'} + + http2-wrapper@1.0.3: + resolution: {integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==} + engines: {node: '>=10.19.0'} + + https-proxy-agent@5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} + + human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + + human-signals@5.0.0: + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} + engines: {node: '>=16.17.0'} + + husky@9.0.11: + resolution: {integrity: sha512-AB6lFlbwwyIqMdHYhwPe+kjOC3Oc5P3nThEoW/AaO2BX3vJDjWPFxYLxokUZOo6RNX20He3AaT8sESs9NJcmEw==} + engines: {node: '>=18'} + hasBin: true + + iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + + idb@7.1.1: + resolution: {integrity: sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==} + + identity-obj-proxy@3.0.0: + resolution: {integrity: sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA==} + engines: {node: '>=4'} + + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + ignore@5.3.1: + resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} + engines: {node: '>= 4'} + + immer@10.0.4: + resolution: {integrity: sha512-cuBuGK40P/sk5IzWa9QPUaAdvPHjkk1c+xYsd9oZw+YQQEV+10G0P5uMpGctZZKnyQ+ibRO08bD25nWLmYi2pw==} + + import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + + import-lazy@2.1.0: + resolution: {integrity: sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A==} + engines: {node: '>=4'} + + import-local@3.1.0: + resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==} + engines: {node: '>=8'} + hasBin: true + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + + ini@2.0.0: + resolution: {integrity: sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==} + engines: {node: '>=10'} + + internal-slot@1.0.7: + resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} + engines: {node: '>= 0.4'} + + is-arguments@1.1.1: + resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} + engines: {node: '>= 0.4'} + + is-array-buffer@3.0.4: + resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} + engines: {node: '>= 0.4'} + + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + is-arrayish@0.3.2: + resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} + + is-async-function@2.0.0: + resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==} + engines: {node: '>= 0.4'} + + is-bigint@1.0.4: + resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + + is-boolean-object@1.1.2: + resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} + engines: {node: '>= 0.4'} + + is-builtin-module@3.2.1: + resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} + engines: {node: '>=6'} + + is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + + is-ci@2.0.0: + resolution: {integrity: sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==} + hasBin: true + + is-core-module@2.13.1: + resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + + is-data-view@1.0.1: + resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} + engines: {node: '>= 0.4'} + + is-date-object@1.0.5: + resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} + engines: {node: '>= 0.4'} + + is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-finalizationregistry@1.0.2: + resolution: {integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-fullwidth-code-point@4.0.0: + resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} + engines: {node: '>=12'} + + is-fullwidth-code-point@5.0.0: + resolution: {integrity: sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==} + engines: {node: '>=18'} + + is-generator-fn@2.1.0: + resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} + engines: {node: '>=6'} + + is-generator-function@1.0.10: + resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} + engines: {node: '>= 0.4'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-installed-globally@0.4.0: + resolution: {integrity: sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==} + engines: {node: '>=10'} + + is-interactive@1.0.0: + resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} + engines: {node: '>=8'} + + is-map@2.0.3: + resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} + engines: {node: '>= 0.4'} + + is-module@1.0.0: + resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} + + is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + engines: {node: '>= 0.4'} + + is-node-process@1.2.0: + resolution: {integrity: sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==} + + is-npm@5.0.0: + resolution: {integrity: sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==} + engines: {node: '>=10'} + + is-number-object@1.0.7: + resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} + engines: {node: '>= 0.4'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-obj@1.0.1: + resolution: {integrity: sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==} + engines: {node: '>=0.10.0'} + + is-obj@2.0.0: + resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} + engines: {node: '>=8'} + + is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + + is-potential-custom-element-name@1.0.1: + resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} + + is-regex@1.1.4: + resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} + engines: {node: '>= 0.4'} + + is-regexp@1.0.0: + resolution: {integrity: sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==} + engines: {node: '>=0.10.0'} + + is-set@2.0.3: + resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} + engines: {node: '>= 0.4'} + + is-shared-array-buffer@1.0.3: + resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} + engines: {node: '>= 0.4'} + + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + is-string@1.0.7: + resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} + engines: {node: '>= 0.4'} + + is-symbol@1.0.4: + resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} + engines: {node: '>= 0.4'} + + is-typed-array@1.1.13: + resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} + engines: {node: '>= 0.4'} + + is-typedarray@1.0.0: + resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} + + is-unicode-supported@0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + engines: {node: '>=10'} + + is-weakmap@2.0.2: + resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} + engines: {node: '>= 0.4'} + + is-weakref@1.0.2: + resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + + is-weakset@2.0.3: + resolution: {integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==} + engines: {node: '>= 0.4'} + + is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + + is-yarn-global@0.3.0: + resolution: {integrity: sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==} + + isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + isexe@3.1.1: + resolution: {integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==} + engines: {node: '>=16'} + + istanbul-lib-coverage@3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} + engines: {node: '>=8'} + + istanbul-lib-instrument@5.2.1: + resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} + engines: {node: '>=8'} + + istanbul-lib-instrument@6.0.2: + resolution: {integrity: sha512-1WUsZ9R1lA0HtBSohTkm39WTPlNKSJ5iFk7UwqXkBLoHQT+hfqPsfsTDVuZdKGaBwn7din9bS7SsnoAr943hvw==} + engines: {node: '>=10'} + + istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} + + istanbul-lib-source-maps@4.0.1: + resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} + engines: {node: '>=10'} + + istanbul-reports@3.1.7: + resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} + engines: {node: '>=8'} + + iterator.prototype@1.1.2: + resolution: {integrity: sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==} + + jackspeak@2.3.6: + resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} + engines: {node: '>=14'} + + jake@10.8.7: + resolution: {integrity: sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==} + engines: {node: '>=10'} + hasBin: true + + jest-changed-files@29.7.0: + resolution: {integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-circus@29.7.0: + resolution: {integrity: sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-cli@29.7.0: + resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + jest-config@29.7.0: + resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@types/node': '*' + ts-node: '>=9.0.0' + peerDependenciesMeta: + '@types/node': + optional: true + ts-node: + optional: true + + jest-diff@29.7.0: + resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-docblock@29.7.0: + resolution: {integrity: sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-each@29.7.0: + resolution: {integrity: sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-environment-jsdom@29.7.0: + resolution: {integrity: sha512-k9iQbsf9OyOfdzWH8HDmrRT0gSIcX+FLNW7IQq94tFX0gynPwqDTW0Ho6iMVNjGz/nb+l/vW3dWM2bbLLpkbXA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + canvas: ^2.5.0 + peerDependenciesMeta: + canvas: + optional: true + + jest-environment-node@29.7.0: + resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-get-type@29.6.3: + resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-haste-map@29.7.0: + resolution: {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-leak-detector@29.7.0: + resolution: {integrity: sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-matcher-utils@29.7.0: + resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-message-util@29.7.0: + resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-mock@29.7.0: + resolution: {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-pnp-resolver@1.2.3: + resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} + engines: {node: '>=6'} + peerDependencies: + jest-resolve: '*' + peerDependenciesMeta: + jest-resolve: + optional: true + + jest-regex-util@29.6.3: + resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-resolve-dependencies@29.7.0: + resolution: {integrity: sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-resolve@29.7.0: + resolution: {integrity: sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-runner@29.7.0: + resolution: {integrity: sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-runtime@29.7.0: + resolution: {integrity: sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-snapshot@29.7.0: + resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-util@29.7.0: + resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-validate@29.7.0: + resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-watcher@29.7.0: + resolution: {integrity: sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-worker@29.7.0: + resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest@29.7.0: + resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + jju@1.4.0: + resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} + + joi@17.12.3: + resolution: {integrity: sha512-2RRziagf555owrm9IRVtdKynOBeITiDpuZqIpgwqXShPncPKNiRQoiGsl/T8SQdq+8ugRzH2LqY67irr2y/d+g==} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + jsdom@20.0.3: + resolution: {integrity: sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==} + engines: {node: '>=14'} + peerDependencies: + canvas: ^2.5.0 + peerDependenciesMeta: + canvas: + optional: true + + jsesc@0.5.0: + resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} + hasBin: true + + jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + json-schema-typed@7.0.3: + resolution: {integrity: sha512-7DE8mpG+/fVw+dTpjbxnx47TaMnDfOI1jwft9g1VybltZCduyRQPJPvc+zzKY9WPHxhPWczyFuYa6I8Mw4iU5A==} + + json-schema@0.4.0: + resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + json5@1.0.2: + resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} + hasBin: true + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + + jsonparse@1.3.1: + resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} + engines: {'0': node >= 0.2.0} + + jsonpointer@5.0.1: + resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==} + engines: {node: '>=0.10.0'} + + jsx-ast-utils@3.3.5: + resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} + engines: {node: '>=4.0'} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + + kuler@2.0.0: + resolution: {integrity: sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==} + + leven@3.1.0: + resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} + engines: {node: '>=6'} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + license-compliance@3.0.0: + resolution: {integrity: sha512-0kXEr7JSdP+jPSTSEnAiyGvpOoFnkiVXqmTFhXx22+tCay7shTN1mVM7Z+p2F3YNeIhx0tmADglrp5ddWGyHnQ==} + engines: {node: '>=18.20.1'} + hasBin: true + + lilconfig@3.0.0: + resolution: {integrity: sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==} + engines: {node: '>=14'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + lint-staged@15.2.2: + resolution: {integrity: sha512-TiTt93OPh1OZOsb5B7k96A/ATl2AjIZo+vnzFZ6oHK5FuTk63ByDtxGQpHm+kFETjEWqgkF95M8FRXKR/LEBcw==} + engines: {node: '>=18.12.0'} + hasBin: true + + listr2@8.0.1: + resolution: {integrity: sha512-ovJXBXkKGfq+CwmKTjluEqFi3p4h8xvkxGQQAQan22YCgef4KZ1mKGjzfGh6PL6AW5Csw0QiQPNuQyH+6Xk3hA==} + engines: {node: '>=18.0.0'} + + locate-path@3.0.0: + resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} + engines: {node: '>=6'} + + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash.camelcase@4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + + lodash.debounce@4.0.8: + resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + + lodash.memoize@4.1.2: + resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash.sortby@4.7.0: + resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + log-symbols@4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} + + log-update@6.0.0: + resolution: {integrity: sha512-niTvB4gqvtof056rRIrTZvjNYE4rCUzO6X/X+kYjd7WFxXeJ0NwEFnRxX6ehkvv3jTwrXnNdtAak5XYZuIyPFw==} + engines: {node: '>=18'} + + logform@2.6.0: + resolution: {integrity: sha512-1ulHeNPp6k/LD8H91o7VYFBng5i1BDE7HoKxVbZiGFidS1Rj65qcywLxX+pVfAPoQJEjRdvKcusKwOupHCVOVQ==} + engines: {node: '>= 12.0.0'} + + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + + lowercase-keys@2.0.0: + resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} + engines: {node: '>=8'} + + lru-cache@10.2.0: + resolution: {integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==} + engines: {node: 14 || >=16.14} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + + lz-string@1.5.0: + resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} + hasBin: true + + magic-string@0.25.9: + resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} + + make-dir@3.1.0: + resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} + engines: {node: '>=8'} + + make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} + + make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + + makeerror@1.0.12: + resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} + + map-stream@0.0.7: + resolution: {integrity: sha512-C0X0KQmGm3N2ftbTGBhSyuydQ+vV1LC3f3zPvT3RXHXNZrvfPZcoXp/N5DOa8vedX/rTMm2CjTtivFg2STJMRQ==} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + mimic-fn@3.1.0: + resolution: {integrity: sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==} + engines: {node: '>=8'} + + mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + + mimic-response@1.0.1: + resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} + engines: {node: '>=4'} + + mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + + min-indent@1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + + minimatch@9.0.3: + resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} + engines: {node: '>=16 || 14 >=14.17'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minipass@7.0.4: + resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} + engines: {node: '>=16 || 14 >=14.17'} + + ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + msw@2.2.14: + resolution: {integrity: sha512-64i8rNCa1xzDK8ZYsTrVMli05D687jty8+Th+PU5VTbJ2/4P7fkQFVyDQ6ZFT5FrNR8z2BHhbY47fKNvfHrumA==} + engines: {node: '>=18'} + hasBin: true + peerDependencies: + typescript: '>= 4.7.x' + peerDependenciesMeta: + typescript: + optional: true + + mute-stream@1.0.0: + resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + node-domexception@1.0.0: + resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} + engines: {node: '>=10.5.0'} + + node-fetch@3.3.2: + resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + node-int64@0.4.0: + resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} + + node-releases@2.0.14: + resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + normalize-range@0.1.2: + resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} + engines: {node: '>=0.10.0'} + + normalize-url@6.1.0: + resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} + engines: {node: '>=10'} + + npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + + npm-run-path@5.3.0: + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + nwsapi@2.2.7: + resolution: {integrity: sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-inspect@1.13.1: + resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} + + object-is@1.1.6: + resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} + engines: {node: '>= 0.4'} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + object-treeify@1.1.33: + resolution: {integrity: sha512-EFVjAYfzWqWsBMRHPMAXLCDIJnpMhdWAqR7xG6M6a2cs6PMFpl/+Z20w9zDW4vkxOFfddegBKq9Rehd0bxWE7A==} + engines: {node: '>= 10'} + + object.assign@4.1.5: + resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} + engines: {node: '>= 0.4'} + + object.entries@1.1.8: + resolution: {integrity: sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==} + engines: {node: '>= 0.4'} + + object.fromentries@2.0.8: + resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} + engines: {node: '>= 0.4'} + + object.groupby@1.0.3: + resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} + engines: {node: '>= 0.4'} + + object.hasown@1.1.3: + resolution: {integrity: sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==} + + object.values@1.2.0: + resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==} + engines: {node: '>= 0.4'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + one-time@1.0.0: + resolution: {integrity: sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==} + + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + + onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + + open@8.4.2: + resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} + engines: {node: '>=12'} + + optionator@0.9.3: + resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} + engines: {node: '>= 0.8.0'} + + ora@5.4.1: + resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} + engines: {node: '>=10'} + + os-tmpdir@1.0.2: + resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} + engines: {node: '>=0.10.0'} + + outvariant@1.4.2: + resolution: {integrity: sha512-Ou3dJ6bA/UJ5GVHxah4LnqDwZRwAmWxrG3wtrHrbGnP4RnLCtA64A4F+ae7Y8ww660JaddSoArUR5HjipWSHAQ==} + + p-cancelable@2.1.1: + resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==} + engines: {node: '>=8'} + + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@3.0.0: + resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} + engines: {node: '>=6'} + + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + package-json@7.0.0: + resolution: {integrity: sha512-CHJqc94AA8YfSLHGQT3DbvSIuE12NLFekpM4n7LRrAd3dOJtA911+4xe9q6nC3/jcKraq7nNS9VxgtT0KC+diA==} + engines: {node: '>=12'} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + + parse5@7.1.2: + resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} + + path-exists@3.0.0: + resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} + engines: {node: '>=4'} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-scurry@1.10.1: + resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} + engines: {node: '>=16 || 14 >=14.17'} + + path-to-regexp@6.2.1: + resolution: {integrity: sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + pause-stream@0.0.11: + resolution: {integrity: sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==} + + picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + pidtree@0.6.0: + resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} + engines: {node: '>=0.10'} + hasBin: true + + pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} + + pkg-dir@4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} + + pkg-up@3.1.0: + resolution: {integrity: sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==} + engines: {node: '>=8'} + + playwright-core@1.42.1: + resolution: {integrity: sha512-mxz6zclokgrke9p1vtdy/COWBH+eOZgYUVVU34C73M+4j4HLlQJHtfcqiqqxpP0o8HhMkflvfbquLX5dg6wlfA==} + engines: {node: '>=16'} + hasBin: true + + playwright@1.42.1: + resolution: {integrity: sha512-PgwB03s2DZBcNRoW+1w9E+VkLBxweib6KTXM0M3tkiT4jVxKSi6PmVJ591J+0u10LUrgxB7dLRbiJqO5s2QPMg==} + engines: {node: '>=16'} + hasBin: true + + possible-typed-array-names@1.0.0: + resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} + engines: {node: '>= 0.4'} + + postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + + postcss@8.4.38: + resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} + engines: {node: ^10 || ^12 || >=14} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + prettier-linter-helpers@1.0.0: + resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} + engines: {node: '>=6.0.0'} + + prettier-plugin-sort-imports@1.8.5: + resolution: {integrity: sha512-PkizzuO2S8h3kJeWHytnMZXqvv/fD6g+en/dhv4y5QjoiMm1wq3FWzFiFT7c/BilX95l0ZIqJTlMsXYs8z/WQQ==} + peerDependencies: + typescript: '>4.0.0' + + prettier@3.2.5: + resolution: {integrity: sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==} + engines: {node: '>=14'} + hasBin: true + + pretty-bytes@5.6.0: + resolution: {integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==} + engines: {node: '>=6'} + + pretty-bytes@6.1.1: + resolution: {integrity: sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==} + engines: {node: ^14.13.1 || >=16.0.0} + + pretty-format@27.5.1: + resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + + pretty-format@29.7.0: + resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + + prop-types@15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + + property-expr@2.0.6: + resolution: {integrity: sha512-SVtmxhRE/CGkn3eZY1T6pC8Nln6Fr/lu1mKSgRud0eC73whjGfoAogbn78LkD8aFL0zz3bAFerKSnOl7NlErBA==} + + proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + + psl@1.9.0: + resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} + + pump@3.0.0: + resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + pupa@2.1.1: + resolution: {integrity: sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==} + engines: {node: '>=8'} + + pure-rand@6.0.4: + resolution: {integrity: sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA==} + + querystringify@2.2.0: + resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + quick-lru@5.1.1: + resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} + engines: {node: '>=10'} + + randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + + rc@1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true + + react-dom@18.2.0: + resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} + peerDependencies: + react: ^18.2.0 + + react-error-boundary@4.0.13: + resolution: {integrity: sha512-b6PwbdSv8XeOSYvjt8LpgpKrZ0yGdtZokYwkwV2wlcZbxgopHX/hgPl5VgpnoVOWd868n1hktM8Qm4b+02MiLQ==} + peerDependencies: + react: '>=16.13.1' + + react-hook-form@7.51.3: + resolution: {integrity: sha512-cvJ/wbHdhYx8aviSWh28w9ImjmVsb5Y05n1+FW786vEZQJV5STNM0pW6ujS+oiBecb0ARBxJFyAnXj9+GHXACQ==} + engines: {node: '>=12.22.0'} + peerDependencies: + react: ^16.8.0 || ^17 || ^18 + + react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + + react-is@17.0.2: + resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + + react-is@18.2.0: + resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} + + react-redux@9.1.0: + resolution: {integrity: sha512-6qoDzIO+gbrza8h3hjMA9aq4nwVFCKFtY2iLxCtVT38Swyy2C/dJCGBXHeHLtx6qlg/8qzc2MrhOeduf5K32wQ==} + peerDependencies: + '@types/react': ^18.2.25 + react: ^18.0 + react-native: '>=0.69' + redux: ^5.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + react-native: + optional: true + redux: + optional: true + + react-router-dom@6.22.3: + resolution: {integrity: sha512-7ZILI7HjcE+p31oQvwbokjk6OA/bnFxrhJ19n82Ex9Ph8fNAq+Hm/7KchpMGlTgWhUxRHMMCut+vEtNpWpowKw==} + engines: {node: '>=14.0.0'} + peerDependencies: + react: '>=16.8' + react-dom: '>=16.8' + + react-router@6.22.3: + resolution: {integrity: sha512-dr2eb3Mj5zK2YISHK++foM9w4eBnO23eKnZEDs7c880P6oKbrjz/Svg9+nxqtHQK+oMW4OtjZca0RqPglXxguQ==} + engines: {node: '>=14.0.0'} + peerDependencies: + react: '>=16.8' + + react-transition-group@4.4.5: + resolution: {integrity: sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==} + peerDependencies: + react: '>=16.6.0' + react-dom: '>=16.6.0' + + react@18.2.0: + resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} + engines: {node: '>=0.10.0'} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readline-transform@1.0.0: + resolution: {integrity: sha512-7KA6+N9IGat52d83dvxnApAWN+MtVb1MiVuMR/cf1O4kYsJG+g/Aav0AHcHKsb6StinayfPLne0+fMX2sOzAKg==} + engines: {node: '>=6'} + + redent@3.0.0: + resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} + engines: {node: '>=8'} + + redux-thunk@3.1.0: + resolution: {integrity: sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw==} + peerDependencies: + redux: ^5.0.0 + + redux@4.2.1: + resolution: {integrity: sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==} + + redux@5.0.1: + resolution: {integrity: sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==} + + reflect.getprototypeof@1.0.6: + resolution: {integrity: sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==} + engines: {node: '>= 0.4'} + + regenerate-unicode-properties@10.1.1: + resolution: {integrity: sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==} + engines: {node: '>=4'} + + regenerate@1.4.2: + resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} + + regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + + regenerator-transform@0.15.2: + resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} + + regexp.prototype.flags@1.5.2: + resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} + engines: {node: '>= 0.4'} + + regexpu-core@5.3.2: + resolution: {integrity: sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==} + engines: {node: '>=4'} + + registry-auth-token@4.2.2: + resolution: {integrity: sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg==} + engines: {node: '>=6.0.0'} + + registry-url@5.1.0: + resolution: {integrity: sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==} + engines: {node: '>=8'} + + regjsparser@0.9.1: + resolution: {integrity: sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==} + hasBin: true + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + requires-port@1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + + reselect@5.1.0: + resolution: {integrity: sha512-aw7jcGLDpSgNDyWBQLv2cedml85qd95/iszJjN988zX1t7AVRJi19d9kto5+W7oCfQ94gyo40dVbT6g2k4/kXg==} + + resolve-alpn@1.2.1: + resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} + + resolve-cwd@3.0.0: + resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} + engines: {node: '>=8'} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + + resolve.exports@2.0.2: + resolution: {integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==} + engines: {node: '>=10'} + + resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true + + resolve@2.0.0-next.5: + resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} + hasBin: true + + responselike@2.0.1: + resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==} + + restore-cursor@3.1.0: + resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} + engines: {node: '>=8'} + + restore-cursor@4.0.0: + resolution: {integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rfdc@1.3.1: + resolution: {integrity: sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==} + + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true + + rollup@2.79.1: + resolution: {integrity: sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==} + engines: {node: '>=10.0.0'} + hasBin: true + + rollup@4.14.0: + resolution: {integrity: sha512-Qe7w62TyawbDzB4yt32R0+AbIo6m1/sqO7UPzFS8Z/ksL5mrfhA0v4CavfdmFav3D+ub4QeAgsGEe84DoWe/nQ==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + run-async@3.0.0: + resolution: {integrity: sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==} + engines: {node: '>=0.12.0'} + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + safe-array-concat@1.1.2: + resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} + engines: {node: '>=0.4'} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safe-regex-test@1.0.3: + resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} + engines: {node: '>= 0.4'} + + safe-stable-stringify@2.4.3: + resolution: {integrity: sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==} + engines: {node: '>=10'} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + saxes@6.0.0: + resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} + engines: {node: '>=v12.22.7'} + + scheduler@0.23.0: + resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} + + semver-diff@3.1.1: + resolution: {integrity: sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==} + engines: {node: '>=8'} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.6.0: + resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} + engines: {node: '>=10'} + hasBin: true + + serialize-javascript@6.0.2: + resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + side-channel@1.0.6: + resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} + engines: {node: '>= 0.4'} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + simple-swizzle@0.2.2: + resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} + + sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + slice-ansi@5.0.0: + resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} + engines: {node: '>=12'} + + slice-ansi@7.1.0: + resolution: {integrity: sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==} + engines: {node: '>=18'} + + smob@1.5.0: + resolution: {integrity: sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==} + + source-map-js@1.2.0: + resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} + engines: {node: '>=0.10.0'} + + source-map-support@0.5.13: + resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} + + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + + source-map@0.5.7: + resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} + engines: {node: '>=0.10.0'} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + source-map@0.8.0-beta.0: + resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} + engines: {node: '>= 8'} + + sourcemap-codec@1.4.8: + resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} + deprecated: Please use @jridgewell/sourcemap-codec instead + + spdx-compare@1.0.0: + resolution: {integrity: sha512-C1mDZOX0hnu0ep9dfmuoi03+eOdDoz2yvK79RxbcrVEG1NO1Ph35yW102DHWKN4pk80nwCgeMmSY5L25VE4D9A==} + + spdx-exceptions@2.5.0: + resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} + + spdx-expression-parse@3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + + spdx-expression-parse@4.0.0: + resolution: {integrity: sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==} + + spdx-license-ids@3.0.17: + resolution: {integrity: sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==} + + spdx-ranges@2.1.1: + resolution: {integrity: sha512-mcdpQFV7UDAgLpXEE/jOMqvK4LBoO0uTQg0uvXUewmEFhpiZx5yJSZITHB8w1ZahKdhfZqP5GPEOKLyEq5p8XA==} + + spdx-satisfies@5.0.1: + resolution: {integrity: sha512-Nwor6W6gzFp8XX4neaKQ7ChV4wmpSh2sSDemMFSzHxpTw460jxFYeOn+jq4ybnSSw/5sc3pjka9MQPouksQNpw==} + + split@1.0.1: + resolution: {integrity: sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==} + + sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + + stack-trace@0.0.10: + resolution: {integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==} + + stack-utils@2.0.6: + resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} + engines: {node: '>=10'} + + statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + + stop-iteration-iterator@1.0.0: + resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==} + engines: {node: '>= 0.4'} + + stream-combiner@0.2.2: + resolution: {integrity: sha512-6yHMqgLYDzQDcAkL+tjJDC5nSNuNIx0vZtRZeiPh7Saef7VHX9H5Ijn9l2VIol2zaNYlYEX6KyuT/237A58qEQ==} + + strict-event-emitter@0.5.1: + resolution: {integrity: sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==} + + string-argv@0.3.2: + resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} + engines: {node: '>=0.6.19'} + + string-length@4.0.2: + resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} + engines: {node: '>=10'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + string-width@7.1.0: + resolution: {integrity: sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==} + engines: {node: '>=18'} + + string.prototype.matchall@4.0.11: + resolution: {integrity: sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==} + engines: {node: '>= 0.4'} + + string.prototype.trim@1.2.9: + resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} + engines: {node: '>= 0.4'} + + string.prototype.trimend@1.0.8: + resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} + + string.prototype.trimstart@1.0.7: + resolution: {integrity: sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + stringify-object@3.3.0: + resolution: {integrity: sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==} + engines: {node: '>=4'} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + + strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + + strip-bom@4.0.0: + resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} + engines: {node: '>=8'} + + strip-comments@2.0.1: + resolution: {integrity: sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==} + engines: {node: '>=10'} + + strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + + strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + + strip-indent@3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} + + strip-json-comments@2.0.1: + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + engines: {node: '>=0.10.0'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + stylis@4.2.0: + resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==} + + supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + symbol-tree@3.2.4: + resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + + synckit@0.8.8: + resolution: {integrity: sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==} + engines: {node: ^14.18.0 || >=16.0.0} + + tapable@2.2.1: + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + engines: {node: '>=6'} + + temp-dir@2.0.0: + resolution: {integrity: sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==} + engines: {node: '>=8'} + + tempy@0.6.0: + resolution: {integrity: sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==} + engines: {node: '>=10'} + + terser@5.31.0: + resolution: {integrity: sha512-Q1JFAoUKE5IMfI4Z/lkE/E6+SwgzO+x4tq4v1AyBLRj8VSYvRO6A/rQrPg1yud4g0En9EKI1TvFRF2tQFcoUkg==} + engines: {node: '>=10'} + hasBin: true + + test-exclude@6.0.0: + resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} + engines: {node: '>=8'} + + text-hex@1.0.0: + resolution: {integrity: sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==} + + text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + + through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + + tiny-case@1.0.3: + resolution: {integrity: sha512-Eet/eeMhkO6TX8mnUteS9zgPbUMQa4I6Kkp5ORiBD5476/m+PIRiumP5tmh5ioJpH7k51Kehawy2UDfsnxxY8Q==} + + tmp@0.0.33: + resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} + engines: {node: '>=0.6.0'} + + tmpl@1.0.5: + resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} + + to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + toposort@2.0.2: + resolution: {integrity: sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg==} + + tough-cookie@4.1.3: + resolution: {integrity: sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==} + engines: {node: '>=6'} + + tr46@1.0.1: + resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} + + tr46@3.0.0: + resolution: {integrity: sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==} + engines: {node: '>=12'} + + triple-beam@1.4.1: + resolution: {integrity: sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==} + engines: {node: '>= 14.0.0'} + + ts-api-utils@1.3.0: + resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} + engines: {node: '>=16'} + peerDependencies: + typescript: '>=4.2.0' + + ts-jest@29.1.2: + resolution: {integrity: sha512-br6GJoH/WUX4pu7FbZXuWGKGNDuU7b8Uj77g/Sp7puZV6EXzuByl6JrECvm0MzVzSTkSHWTihsXt+5XYER5b+g==} + engines: {node: ^16.10.0 || ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@babel/core': '>=7.0.0-beta.0 <8' + '@jest/types': ^29.0.0 + babel-jest: ^29.0.0 + esbuild: '*' + jest: ^29.0.0 + typescript: '>=4.3 <6' + peerDependenciesMeta: + '@babel/core': + optional: true + '@jest/types': + optional: true + babel-jest: + optional: true + esbuild: + optional: true + + ts-node@10.9.2: + resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + + tsc-files@1.1.4: + resolution: {integrity: sha512-RePsRsOLru3BPpnf237y1Xe1oCGta8rmSYzM76kYo5tLGsv5R2r3s64yapYorGTPuuLyfS9NVbh9ydzmvNie2w==} + hasBin: true + peerDependencies: + typescript: '>=3' + + tsconfig-paths@3.15.0: + resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} + + tslib@2.6.2: + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + + type-fest@0.16.0: + resolution: {integrity: sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==} + engines: {node: '>=10'} + + type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + + type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + + type-fest@2.19.0: + resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} + engines: {node: '>=12.20'} + + type-fest@3.13.1: + resolution: {integrity: sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==} + engines: {node: '>=14.16'} + + type-fest@4.18.0: + resolution: {integrity: sha512-+dbmiyliDY/2TTcjCS7NpI9yV2iEFlUDk5TKnsbkN7ZoRu5s7bT+zvYtNFhFXC2oLwURGT2frACAZvbbyNBI+w==} + engines: {node: '>=16'} + + typed-array-buffer@1.0.2: + resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} + engines: {node: '>= 0.4'} + + typed-array-byte-length@1.0.1: + resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} + engines: {node: '>= 0.4'} + + typed-array-byte-offset@1.0.2: + resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} + engines: {node: '>= 0.4'} + + typed-array-length@1.0.5: + resolution: {integrity: sha512-yMi0PlwuznKHxKmcpoOdeLwxBoVPkqZxd7q2FgMkmD3bNwvF5VW0+UlUQ1k1vmktTu4Yu13Q0RIxEP8+B+wloA==} + engines: {node: '>= 0.4'} + + typedarray-to-buffer@3.1.5: + resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} + + typescript@5.4.2: + resolution: {integrity: sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==} + engines: {node: '>=14.17'} + hasBin: true + + unbox-primitive@1.0.2: + resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + + undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + + undici@5.28.4: + resolution: {integrity: sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==} + engines: {node: '>=14.0'} + + undici@6.15.0: + resolution: {integrity: sha512-VviMt2tlMg1BvQ0FKXxrz1eJuyrcISrL2sPfBf7ZskX/FCEc/7LeThQaoygsMJpNqrATWQIsRVx+1Dpe4jaYuQ==} + engines: {node: '>=18.17'} + + unicode-canonical-property-names-ecmascript@2.0.0: + resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==} + engines: {node: '>=4'} + + unicode-match-property-ecmascript@2.0.0: + resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} + engines: {node: '>=4'} + + unicode-match-property-value-ecmascript@2.1.0: + resolution: {integrity: sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==} + engines: {node: '>=4'} + + unicode-property-aliases-ecmascript@2.1.0: + resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} + engines: {node: '>=4'} + + unique-string@2.0.0: + resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==} + engines: {node: '>=8'} + + universalify@0.2.0: + resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} + engines: {node: '>= 4.0.0'} + + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + upath@1.2.0: + resolution: {integrity: sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==} + engines: {node: '>=4'} + + update-browserslist-db@1.0.13: + resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + url-parse@1.5.10: + resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + + use-sync-external-store@1.2.0: + resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + v8-compile-cache-lib@3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + + v8-to-istanbul@9.2.0: + resolution: {integrity: sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==} + engines: {node: '>=10.12.0'} + + vite-plugin-pwa@0.19.5: + resolution: {integrity: sha512-3xJEc2Gmq6SBf730UAV1N2/MqOm+MiyvaLToSTglg+pH9b9qm666yPVxrBBlcOhGoJJWjJpu+Z9tROKek2CODg==} + engines: {node: '>=16.0.0'} + peerDependencies: + '@vite-pwa/assets-generator': ^0.2.4 + vite: ^3.1.0 || ^4.0.0 || ^5.0.0 + workbox-build: ^7.0.0 + workbox-window: ^7.0.0 + peerDependenciesMeta: + '@vite-pwa/assets-generator': + optional: true + + vite@5.2.6: + resolution: {integrity: sha512-FPtnxFlSIKYjZ2eosBQamz4CbyrTizbZ3hnGJlh/wMtCrlp1Hah6AzBLjGI5I2urTfNnpovpHdrL6YRuBOPnCA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + + w3c-xmlserializer@4.0.0: + resolution: {integrity: sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==} + engines: {node: '>=14'} + + walker@1.0.8: + resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} + + wcwidth@1.0.1: + resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + + web-streams-polyfill@3.3.3: + resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} + engines: {node: '>= 8'} + + web-streams-polyfill@4.0.0: + resolution: {integrity: sha512-0zJXHRAYEjM2tUfZ2DiSOHAa2aw1tisnnhU3ufD57R8iefL+DcdJyRBRyJpG+NUimDgbTI/lH+gAE1PAvV3Cgw==} + engines: {node: '>= 8'} + + webidl-conversions@4.0.2: + resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} + + webidl-conversions@7.0.0: + resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} + engines: {node: '>=12'} + + whatwg-encoding@2.0.0: + resolution: {integrity: sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==} + engines: {node: '>=12'} - /@adobe/css-tools@4.3.3: - resolution: {integrity: sha512-rE0Pygv0sEZ4vBWHlAgJLGDU7Pm8xoO6p3wsEceb7GYAjScrOHpEo8KK/eVkAcnSM+slAEtXjA2JpdjLp4fJQQ==} - dev: true + whatwg-mimetype@3.0.0: + resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==} + engines: {node: '>=12'} - /@ampproject/remapping@2.3.0: - resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} - engines: {node: '>=6.0.0'} + whatwg-url@11.0.0: + resolution: {integrity: sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==} + engines: {node: '>=12'} + + whatwg-url@7.1.0: + resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} + + which-boxed-primitive@1.0.2: + resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + + which-builtin-type@1.1.3: + resolution: {integrity: sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==} + engines: {node: '>= 0.4'} + + which-collection@1.0.2: + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} + engines: {node: '>= 0.4'} + + which-typed-array@1.1.15: + resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} + engines: {node: '>= 0.4'} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + which@4.0.0: + resolution: {integrity: sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==} + engines: {node: ^16.13.0 || >=18.0.0} + hasBin: true + + widest-line@3.1.0: + resolution: {integrity: sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==} + engines: {node: '>=8'} + + winston-transport@4.7.0: + resolution: {integrity: sha512-ajBj65K5I7denzer2IYW6+2bNIVqLGDHqDw3Ow8Ohh+vdW+rv4MZ6eiDvHoKhfJFZ2auyN8byXieDDJ96ViONg==} + engines: {node: '>= 12.0.0'} + + winston@3.12.0: + resolution: {integrity: sha512-OwbxKaOlESDi01mC9rkM0dQqQt2I8DAUMRLZ/HpbwvDXm85IryEHgoogy5fziQy38PntgZsLlhAYHz//UPHZ5w==} + engines: {node: '>= 12.0.0'} + + workbox-background-sync@7.1.0: + resolution: {integrity: sha512-rMbgrzueVWDFcEq1610YyDW71z0oAXLfdRHRQcKw4SGihkfOK0JUEvqWHFwA6rJ+6TClnMIn7KQI5PNN1XQXwQ==} + + workbox-broadcast-update@7.1.0: + resolution: {integrity: sha512-O36hIfhjej/c5ar95pO67k1GQw0/bw5tKP7CERNgK+JdxBANQhDmIuOXZTNvwb2IHBx9hj2kxvcDyRIh5nzOgQ==} + + workbox-build@7.1.0: + resolution: {integrity: sha512-F6R94XAxjB2j4ETMkP1EXKfjECOtDmyvt0vz3BzgWJMI68TNSXIVNkgatwUKBlPGOfy9n2F/4voYRNAhEvPJNg==} + engines: {node: '>=16.0.0'} + + workbox-cacheable-response@7.1.0: + resolution: {integrity: sha512-iwsLBll8Hvua3xCuBB9h92+/e0wdsmSVgR2ZlvcfjepZWwhd3osumQB3x9o7flj+FehtWM2VHbZn8UJeBXXo6Q==} + + workbox-core@7.1.0: + resolution: {integrity: sha512-5KB4KOY8rtL31nEF7BfvU7FMzKT4B5TkbYa2tzkS+Peqj0gayMT9SytSFtNzlrvMaWgv6y/yvP9C0IbpFjV30Q==} + + workbox-expiration@7.1.0: + resolution: {integrity: sha512-m5DcMY+A63rJlPTbbBNtpJ20i3enkyOtSgYfv/l8h+D6YbbNiA0zKEkCUaMsdDlxggla1oOfRkyqTvl5Ni5KQQ==} + + workbox-google-analytics@7.1.0: + resolution: {integrity: sha512-FvE53kBQHfVTcZyczeBVRexhh7JTkyQ8HAvbVY6mXd2n2A7Oyz/9fIwnY406ZcDhvE4NFfKGjW56N4gBiqkrew==} + + workbox-navigation-preload@7.1.0: + resolution: {integrity: sha512-4wyAbo0vNI/X0uWNJhCMKxnPanNyhybsReMGN9QUpaePLTiDpKxPqFxl4oUmBNddPwIXug01eTSLVIFXimRG/A==} + + workbox-precaching@7.1.0: + resolution: {integrity: sha512-LyxzQts+UEpgtmfnolo0hHdNjoB7EoRWcF7EDslt+lQGd0lW4iTvvSe3v5JiIckQSB5KTW5xiCqjFviRKPj1zA==} + + workbox-range-requests@7.1.0: + resolution: {integrity: sha512-m7+O4EHolNs5yb/79CrnwPR/g/PRzMFYEdo01LqwixVnc/sbzNSvKz0d04OE3aMRel1CwAAZQheRsqGDwATgPQ==} + + workbox-recipes@7.1.0: + resolution: {integrity: sha512-NRrk4ycFN9BHXJB6WrKiRX3W3w75YNrNrzSX9cEZgFB5ubeGoO8s/SDmOYVrFYp9HMw6sh1Pm3eAY/1gVS8YLg==} + + workbox-routing@7.1.0: + resolution: {integrity: sha512-oOYk+kLriUY2QyHkIilxUlVcFqwduLJB7oRZIENbqPGeBP/3TWHYNNdmGNhz1dvKuw7aqvJ7CQxn27/jprlTdg==} + + workbox-strategies@7.1.0: + resolution: {integrity: sha512-/UracPiGhUNehGjRm/tLUQ+9PtWmCbRufWtV0tNrALuf+HZ4F7cmObSEK+E4/Bx1p8Syx2tM+pkIrvtyetdlew==} + + workbox-streams@7.1.0: + resolution: {integrity: sha512-WyHAVxRXBMfysM8ORwiZnI98wvGWTVAq/lOyBjf00pXFvG0mNaVz4Ji+u+fKa/mf1i2SnTfikoYKto4ihHeS6w==} + + workbox-sw@7.1.0: + resolution: {integrity: sha512-Hml/9+/njUXBglv3dtZ9WBKHI235AQJyLBV1G7EFmh4/mUdSQuXui80RtjDeVRrXnm/6QWgRUEHG3/YBVbxtsA==} + + workbox-window@7.1.0: + resolution: {integrity: sha512-ZHeROyqR+AS5UPzholQRDttLFqGMwP0Np8MKWAdyxsDETxq3qOAyXvqessc3GniohG6e0mAqSQyKOHmT8zPF7g==} + + wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + wrap-ansi@9.0.0: + resolution: {integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==} + engines: {node: '>=18'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + write-file-atomic@3.0.3: + resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} + + write-file-atomic@4.0.2: + resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + + ws@8.16.0: + resolution: {integrity: sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + xdg-basedir@4.0.0: + resolution: {integrity: sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==} + engines: {node: '>=8'} + + xml-name-validator@4.0.0: + resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} + engines: {node: '>=12'} + + xmlbuilder@15.1.1: + resolution: {integrity: sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==} + engines: {node: '>=8.0'} + + xmlchars@2.2.0: + resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + + xxhashjs@0.2.2: + resolution: {integrity: sha512-AkTuIuVTET12tpsVIQo+ZU6f/qDmKuRUcjaqR+OIvm+aCBsZ95i7UVY5WJ9TMsSaZ0DA2WxoZ4acu0sPH+OKAw==} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + yaml@1.10.2: + resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} + engines: {node: '>= 6'} + + yaml@2.3.4: + resolution: {integrity: sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==} + engines: {node: '>= 14'} + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + yn@3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + yup@1.4.0: + resolution: {integrity: sha512-wPbgkJRCqIf+OHyiTBQoJiP5PFuAXaWiJK6AmYkzQAh5/c2K9hzSApBZG5wV9KoKSePF7sAxmNSvh/13YHkFDg==} + +snapshots: + + '@aashutoshrathi/word-wrap@1.2.6': {} + + '@adobe/css-tools@4.3.3': {} + + '@ampproject/remapping@2.3.0': dependencies: '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 - /@apideck/better-ajv-errors@0.3.6(ajv@8.13.0): - resolution: {integrity: sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==} - engines: {node: '>=10'} - peerDependencies: - ajv: '>=8' + '@apideck/better-ajv-errors@0.3.6(ajv@8.13.0)': dependencies: ajv: 8.13.0 json-schema: 0.4.0 jsonpointer: 5.0.1 leven: 3.1.0 - dev: false - /@babel/code-frame@7.24.2: - resolution: {integrity: sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==} - engines: {node: '>=6.9.0'} + '@babel/code-frame@7.24.2': dependencies: '@babel/highlight': 7.24.2 picocolors: 1.0.0 - /@babel/compat-data@7.24.1: - resolution: {integrity: sha512-Pc65opHDliVpRHuKfzI+gSA4zcgr65O4cl64fFJIWEEh8JoHIHh0Oez1Eo8Arz8zq/JhgKodQaxEwUPRtZylVA==} - engines: {node: '>=6.9.0'} + '@babel/compat-data@7.24.1': {} - /@babel/compat-data@7.24.4: - resolution: {integrity: sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==} - engines: {node: '>=6.9.0'} - dev: false + '@babel/compat-data@7.24.4': {} - /@babel/core@7.24.3: - resolution: {integrity: sha512-5FcvN1JHw2sHJChotgx8Ek0lyuh4kCKelgMTTqhYJJtloNvUfpAFMeNQUtdlIaktwrSV9LtCdqwk48wL2wBacQ==} - engines: {node: '>=6.9.0'} + '@babel/core@7.24.3': dependencies: '@ampproject/remapping': 2.3.0 '@babel/code-frame': 7.24.2 @@ -264,11 +5304,8 @@ packages: semver: 6.3.1 transitivePeerDependencies: - supports-color - dev: true - /@babel/core@7.24.5: - resolution: {integrity: sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA==} - engines: {node: '>=6.9.0'} + '@babel/core@7.24.5': dependencies: '@ampproject/remapping': 2.3.0 '@babel/code-frame': 7.24.2 @@ -287,45 +5324,30 @@ packages: semver: 6.3.1 transitivePeerDependencies: - supports-color - dev: false - /@babel/generator@7.24.1: - resolution: {integrity: sha512-DfCRfZsBcrPEHUfuBMgbJ1Ut01Y/itOs+hY2nFLgqsqXd52/iSiVq5TITtUasIUgm+IIKdY2/1I7auiQOEeC9A==} - engines: {node: '>=6.9.0'} + '@babel/generator@7.24.1': dependencies: '@babel/types': 7.24.0 '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 jsesc: 2.5.2 - dev: true - /@babel/generator@7.24.5: - resolution: {integrity: sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA==} - engines: {node: '>=6.9.0'} + '@babel/generator@7.24.5': dependencies: '@babel/types': 7.24.5 '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 jsesc: 2.5.2 - dev: false - /@babel/helper-annotate-as-pure@7.22.5: - resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} - engines: {node: '>=6.9.0'} + '@babel/helper-annotate-as-pure@7.22.5': dependencies: '@babel/types': 7.24.5 - dev: false - /@babel/helper-builder-binary-assignment-operator-visitor@7.22.15: - resolution: {integrity: sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==} - engines: {node: '>=6.9.0'} + '@babel/helper-builder-binary-assignment-operator-visitor@7.22.15': dependencies: '@babel/types': 7.24.5 - dev: false - /@babel/helper-compilation-targets@7.23.6: - resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==} - engines: {node: '>=6.9.0'} + '@babel/helper-compilation-targets@7.23.6': dependencies: '@babel/compat-data': 7.24.1 '@babel/helper-validator-option': 7.23.5 @@ -333,11 +5355,7 @@ packages: lru-cache: 5.1.1 semver: 6.3.1 - /@babel/helper-create-class-features-plugin@7.24.5(@babel/core@7.24.5): - resolution: {integrity: sha512-uRc4Cv8UQWnE4NXlYTIIdM7wfFkOqlFztcC/gVXDKohKoVB3OyonfelUBaJzSwpBntZ2KYGF/9S7asCHsXwW6g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 + '@babel/helper-create-class-features-plugin@7.24.5(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-annotate-as-pure': 7.22.5 @@ -349,24 +5367,15 @@ packages: '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 '@babel/helper-split-export-declaration': 7.24.5 semver: 6.3.1 - dev: false - /@babel/helper-create-regexp-features-plugin@7.22.15(@babel/core@7.24.5): - resolution: {integrity: sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 + '@babel/helper-create-regexp-features-plugin@7.22.15(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-annotate-as-pure': 7.22.5 regexpu-core: 5.3.2 semver: 6.3.1 - dev: false - /@babel/helper-define-polyfill-provider@0.6.2(@babel/core@7.24.5): - resolution: {integrity: sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + '@babel/helper-define-polyfill-provider@0.6.2(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-compilation-targets': 7.23.6 @@ -376,43 +5385,27 @@ packages: resolve: 1.22.8 transitivePeerDependencies: - supports-color - dev: false - /@babel/helper-environment-visitor@7.22.20: - resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} - engines: {node: '>=6.9.0'} + '@babel/helper-environment-visitor@7.22.20': {} - /@babel/helper-function-name@7.23.0: - resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} - engines: {node: '>=6.9.0'} + '@babel/helper-function-name@7.23.0': dependencies: '@babel/template': 7.24.0 '@babel/types': 7.24.0 - /@babel/helper-hoist-variables@7.22.5: - resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} - engines: {node: '>=6.9.0'} + '@babel/helper-hoist-variables@7.22.5': dependencies: '@babel/types': 7.24.0 - /@babel/helper-member-expression-to-functions@7.24.5: - resolution: {integrity: sha512-4owRteeihKWKamtqg4JmWSsEZU445xpFRXPEwp44HbgbxdWlUV1b4Agg4lkA806Lil5XM/e+FJyS0vj5T6vmcA==} - engines: {node: '>=6.9.0'} + '@babel/helper-member-expression-to-functions@7.24.5': dependencies: '@babel/types': 7.24.5 - dev: false - /@babel/helper-module-imports@7.24.3: - resolution: {integrity: sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==} - engines: {node: '>=6.9.0'} + '@babel/helper-module-imports@7.24.3': dependencies: '@babel/types': 7.24.5 - /@babel/helper-module-transforms@7.23.3(@babel/core@7.24.3): - resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 + '@babel/helper-module-transforms@7.23.3(@babel/core@7.24.3)': dependencies: '@babel/core': 7.24.3 '@babel/helper-environment-visitor': 7.22.20 @@ -420,13 +5413,8 @@ packages: '@babel/helper-simple-access': 7.22.5 '@babel/helper-split-export-declaration': 7.22.6 '@babel/helper-validator-identifier': 7.22.20 - dev: true - /@babel/helper-module-transforms@7.24.5(@babel/core@7.24.5): - resolution: {integrity: sha512-9GxeY8c2d2mdQUP1Dye0ks3VDyIMS98kt/llQ2nUId8IsWqTF0l1LkSX0/uP7l7MCDrzXS009Hyhe2gzTiGW8A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 + '@babel/helper-module-transforms@7.24.5(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-environment-visitor': 7.22.20 @@ -434,588 +5422,327 @@ packages: '@babel/helper-simple-access': 7.24.5 '@babel/helper-split-export-declaration': 7.24.5 '@babel/helper-validator-identifier': 7.24.5 - dev: false - /@babel/helper-optimise-call-expression@7.22.5: - resolution: {integrity: sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==} - engines: {node: '>=6.9.0'} + '@babel/helper-optimise-call-expression@7.22.5': dependencies: '@babel/types': 7.24.5 - dev: false - /@babel/helper-plugin-utils@7.24.0: - resolution: {integrity: sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==} - engines: {node: '>=6.9.0'} + '@babel/helper-plugin-utils@7.24.0': {} - /@babel/helper-plugin-utils@7.24.5: - resolution: {integrity: sha512-xjNLDopRzW2o6ba0gKbkZq5YWEBaK3PCyTOY1K2P/O07LGMhMqlMXPxwN4S5/RhWuCobT8z0jrlKGlYmeR1OhQ==} - engines: {node: '>=6.9.0'} - dev: false + '@babel/helper-plugin-utils@7.24.5': {} - /@babel/helper-remap-async-to-generator@7.22.20(@babel/core@7.24.5): - resolution: {integrity: sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 + '@babel/helper-remap-async-to-generator@7.22.20(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-annotate-as-pure': 7.22.5 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-wrap-function': 7.24.5 - dev: false - /@babel/helper-replace-supers@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-QCR1UqC9BzG5vZl8BMicmZ28RuUBnHhAMddD8yHFHDRH9lLTZ9uUPehX8ctVPT8l0TKblJidqcgUUKGVrePleQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 + '@babel/helper-replace-supers@7.24.1(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-member-expression-to-functions': 7.24.5 '@babel/helper-optimise-call-expression': 7.22.5 - dev: false - /@babel/helper-simple-access@7.22.5: - resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} - engines: {node: '>=6.9.0'} + '@babel/helper-simple-access@7.22.5': dependencies: '@babel/types': 7.24.0 - dev: true - /@babel/helper-simple-access@7.24.5: - resolution: {integrity: sha512-uH3Hmf5q5n7n8mz7arjUlDOCbttY/DW4DYhE6FUsjKJ/oYC1kQQUvwEQWxRwUpX9qQKRXeqLwWxrqilMrf32sQ==} - engines: {node: '>=6.9.0'} + '@babel/helper-simple-access@7.24.5': dependencies: '@babel/types': 7.24.5 - dev: false - /@babel/helper-skip-transparent-expression-wrappers@7.22.5: - resolution: {integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==} - engines: {node: '>=6.9.0'} + '@babel/helper-skip-transparent-expression-wrappers@7.22.5': dependencies: '@babel/types': 7.24.5 - dev: false - /@babel/helper-split-export-declaration@7.22.6: - resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} - engines: {node: '>=6.9.0'} + '@babel/helper-split-export-declaration@7.22.6': dependencies: '@babel/types': 7.24.0 - dev: true - /@babel/helper-split-export-declaration@7.24.5: - resolution: {integrity: sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q==} - engines: {node: '>=6.9.0'} + '@babel/helper-split-export-declaration@7.24.5': dependencies: '@babel/types': 7.24.5 - dev: false - /@babel/helper-string-parser@7.24.1: - resolution: {integrity: sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==} - engines: {node: '>=6.9.0'} + '@babel/helper-string-parser@7.24.1': {} - /@babel/helper-validator-identifier@7.22.20: - resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} - engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@7.22.20': {} - /@babel/helper-validator-identifier@7.24.5: - resolution: {integrity: sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA==} - engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@7.24.5': {} - /@babel/helper-validator-option@7.23.5: - resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} - engines: {node: '>=6.9.0'} + '@babel/helper-validator-option@7.23.5': {} - /@babel/helper-wrap-function@7.24.5: - resolution: {integrity: sha512-/xxzuNvgRl4/HLNKvnFwdhdgN3cpLxgLROeLDl83Yx0AJ1SGvq1ak0OszTOjDfiB8Vx03eJbeDWh9r+jCCWttw==} - engines: {node: '>=6.9.0'} + '@babel/helper-wrap-function@7.24.5': dependencies: '@babel/helper-function-name': 7.23.0 '@babel/template': 7.24.0 '@babel/types': 7.24.5 - dev: false - /@babel/helpers@7.24.1: - resolution: {integrity: sha512-BpU09QqEe6ZCHuIHFphEFgvNSrubve1FtyMton26ekZ85gRGi6LrTF7zArARp2YvyFxloeiRmtSCq5sjh1WqIg==} - engines: {node: '>=6.9.0'} + '@babel/helpers@7.24.1': dependencies: '@babel/template': 7.24.0 '@babel/traverse': 7.24.1 '@babel/types': 7.24.0 transitivePeerDependencies: - supports-color - dev: true - /@babel/helpers@7.24.5: - resolution: {integrity: sha512-CiQmBMMpMQHwM5m01YnrM6imUG1ebgYJ+fAIW4FZe6m4qHTPaRHti+R8cggAwkdz4oXhtO4/K9JWlh+8hIfR2Q==} - engines: {node: '>=6.9.0'} + '@babel/helpers@7.24.5': dependencies: '@babel/template': 7.24.0 '@babel/traverse': 7.24.5 '@babel/types': 7.24.5 transitivePeerDependencies: - supports-color - dev: false - /@babel/highlight@7.24.2: - resolution: {integrity: sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==} - engines: {node: '>=6.9.0'} + '@babel/highlight@7.24.2': dependencies: '@babel/helper-validator-identifier': 7.22.20 chalk: 2.4.2 js-tokens: 4.0.0 picocolors: 1.0.0 - /@babel/parser@7.24.1: - resolution: {integrity: sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg==} - engines: {node: '>=6.0.0'} - hasBin: true + '@babel/parser@7.24.1': dependencies: '@babel/types': 7.24.0 - /@babel/parser@7.24.5: - resolution: {integrity: sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==} - engines: {node: '>=6.0.0'} - hasBin: true + '@babel/parser@7.24.5': dependencies: '@babel/types': 7.24.5 - dev: false - /@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.24.5(@babel/core@7.24.5): - resolution: {integrity: sha512-LdXRi1wEMTrHVR4Zc9F8OewC3vdm5h4QB6L71zy6StmYeqGi1b3ttIO8UC+BfZKcH9jdr4aI249rBkm+3+YvHw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.24.5(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-plugin-utils': 7.24.5 - dev: false - /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-y4HqEnkelJIOQGd+3g1bTeKsA5c6qM7eOn7VggGVbBc0y8MLSKHacwcIE2PplNlQSj0PqS9rrXL/nkPVK+kUNg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.24.1(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.24.5 - dev: false - /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-Hj791Ii4ci8HqnaKHAlLNs+zaLXb0EzSDhiAWp5VNlyvCNymYfacs64pxTxbH1znW/NcArSmwpmG9IKE/TUVVQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.13.0 + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.24.1(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.24.5 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 '@babel/plugin-transform-optional-chaining': 7.24.5(@babel/core@7.24.5) - dev: false - /@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-m9m/fXsXLiHfwdgydIFnpk+7jlVbnvlK5B2EKiPdLUb6WX654ZaaEWJUjk8TftRbZpK0XibovlLWX4KIZhV6jw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.24.1(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-plugin-utils': 7.24.5 - dev: false - /@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.24.5): - resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 - dev: false - /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.24.3): - resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.24.3)': dependencies: '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 - dev: true - /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.24.5): - resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.24.0 - dev: false - /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.24.3): - resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.24.3)': dependencies: '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 - dev: true - /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.24.3): - resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.24.3)': dependencies: '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 - dev: true - /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.24.5): - resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.24.0 - dev: false - /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.24.5): - resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.24.5 - dev: false - /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.24.5): - resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.24.5 - dev: false - /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.24.5): - resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.24.5 - dev: false - /@babel/plugin-syntax-import-assertions@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-IuwnI5XnuF189t91XbxmXeCDz3qs6iDRO7GJ++wcfgeXNs/8FmIlKcpDSXNVyuLQxlwvskmI3Ct73wUODkJBlQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-import-assertions@7.24.1(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.24.5 - dev: false - /@babel/plugin-syntax-import-attributes@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-zhQTMH0X2nVLnb04tz+s7AMuasX8U0FnpE+nHTOhSOINjWMnopoZTxtIKsd45n4GQ/HIZLyfIpoul8e2m0DnRA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-import-attributes@7.24.1(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.24.5 - dev: false - /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.24.3): - resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.24.3)': dependencies: '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 - dev: true - /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.24.5): - resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.24.0 - dev: false - /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.24.3): - resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.24.3)': dependencies: '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 - dev: true - /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.24.5): - resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.24.0 - dev: false - /@babel/plugin-syntax-jsx@7.24.1(@babel/core@7.24.3): - resolution: {integrity: sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-jsx@7.24.1(@babel/core@7.24.3)': dependencies: '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 - dev: true - /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.24.3): - resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.24.3)': dependencies: '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 - dev: true - /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.24.5): - resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.24.0 - dev: false - /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.24.3): - resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.24.3)': dependencies: '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 - dev: true - /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.24.5): - resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.24.0 - dev: false - /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.24.3): - resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.24.3)': dependencies: '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 - dev: true - /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.24.5): - resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.24.0 - dev: false - /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.24.3): - resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.24.3)': dependencies: '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 - dev: true - /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.24.5): - resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.24.0 - dev: false - /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.24.3): - resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.24.3)': dependencies: '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 - dev: true - /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.24.5): - resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.24.0 - dev: false - /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.24.3): - resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.24.3)': dependencies: '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 - dev: true - /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.24.5): - resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.24.0 - dev: false - /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.24.5): - resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.24.5 - dev: false - /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.24.3): - resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.24.3)': dependencies: '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 - dev: true - /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.24.5): - resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.24.0 - dev: false - /@babel/plugin-syntax-typescript@7.24.1(@babel/core@7.24.3): - resolution: {integrity: sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-typescript@7.24.1(@babel/core@7.24.3)': dependencies: '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 - dev: true - /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.24.5): - resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 + '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.5) '@babel/helper-plugin-utils': 7.24.5 - dev: false - /@babel/plugin-transform-arrow-functions@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-ngT/3NkRhsaep9ck9uj2Xhv9+xB1zShY3tM3g6om4xxCELwCDN4g4Aq5dRn48+0hasAql7s2hdBOysCfNpr4fw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-arrow-functions@7.24.1(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.24.5 - dev: false - /@babel/plugin-transform-async-generator-functions@7.24.3(@babel/core@7.24.5): - resolution: {integrity: sha512-Qe26CMYVjpQxJ8zxM1340JFNjZaF+ISWpr1Kt/jGo+ZTUzKkfw/pphEWbRCb+lmSM6k/TOgfYLvmbHkUQ0asIg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-async-generator-functions@7.24.3(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-plugin-utils': 7.24.5 '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.24.5) '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.5) - dev: false - /@babel/plugin-transform-async-to-generator@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-AawPptitRXp1y0n4ilKcGbRYWfbbzFWz2NqNu7dacYDtFtz0CMjG64b3LQsb3KIgnf4/obcUL78hfaOS7iCUfw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-async-to-generator@7.24.1(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-module-imports': 7.24.3 '@babel/helper-plugin-utils': 7.24.5 '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.24.5) - dev: false - /@babel/plugin-transform-block-scoped-functions@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-TWWC18OShZutrv9C6mye1xwtam+uNi2bnTOCBUd5sZxyHOiWbU6ztSROofIMrK84uweEZC219POICK/sTYwfgg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-block-scoped-functions@7.24.1(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.24.5 - dev: false - /@babel/plugin-transform-block-scoping@7.24.5(@babel/core@7.24.5): - resolution: {integrity: sha512-sMfBc3OxghjC95BkYrYocHL3NaOplrcaunblzwXhGmlPwpmfsxr4vK+mBBt49r+S240vahmv+kUxkeKgs+haCw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-block-scoping@7.24.5(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.24.5 - dev: false - /@babel/plugin-transform-class-properties@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-OMLCXi0NqvJfORTaPQBwqLXHhb93wkBKZ4aNwMl6WtehO7ar+cmp+89iPEQPqxAnxsOKTaMcs3POz3rKayJ72g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-class-properties@7.24.1(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-create-class-features-plugin': 7.24.5(@babel/core@7.24.5) '@babel/helper-plugin-utils': 7.24.5 - dev: false - /@babel/plugin-transform-class-static-block@7.24.4(@babel/core@7.24.5): - resolution: {integrity: sha512-B8q7Pz870Hz/q9UgP8InNpY01CSLDSCyqX7zcRuv3FcPl87A2G17lASroHWaCtbdIcbYzOZ7kWmXFKbijMSmFg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.12.0 + '@babel/plugin-transform-class-static-block@7.24.4(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-create-class-features-plugin': 7.24.5(@babel/core@7.24.5) '@babel/helper-plugin-utils': 7.24.5 '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.24.5) - dev: false - /@babel/plugin-transform-classes@7.24.5(@babel/core@7.24.5): - resolution: {integrity: sha512-gWkLP25DFj2dwe9Ck8uwMOpko4YsqyfZJrOmqqcegeDYEbp7rmn4U6UQZNj08UF6MaX39XenSpKRCvpDRBtZ7Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-classes@7.24.5(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-annotate-as-pure': 7.22.5 @@ -1026,449 +5753,244 @@ packages: '@babel/helper-replace-supers': 7.24.1(@babel/core@7.24.5) '@babel/helper-split-export-declaration': 7.24.5 globals: 11.12.0 - dev: false - /@babel/plugin-transform-computed-properties@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-5pJGVIUfJpOS+pAqBQd+QMaTD2vCL/HcePooON6pDpHgRp4gNRmzyHTPIkXntwKsq3ayUFVfJaIKPw2pOkOcTw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-computed-properties@7.24.1(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.24.5 '@babel/template': 7.24.0 - dev: false - /@babel/plugin-transform-destructuring@7.24.5(@babel/core@7.24.5): - resolution: {integrity: sha512-SZuuLyfxvsm+Ah57I/i1HVjveBENYK9ue8MJ7qkc7ndoNjqquJiElzA7f5yaAXjyW2hKojosOTAQQRX50bPSVg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-destructuring@7.24.5(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.24.5 - dev: false - /@babel/plugin-transform-dotall-regex@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-p7uUxgSoZwZ2lPNMzUkqCts3xlp8n+o05ikjy7gbtFJSt9gdU88jAmtfmOxHM14noQXBxfgzf2yRWECiNVhTCw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-dotall-regex@7.24.1(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.5) '@babel/helper-plugin-utils': 7.24.5 - dev: false - /@babel/plugin-transform-duplicate-keys@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-msyzuUnvsjsaSaocV6L7ErfNsa5nDWL1XKNnDePLgmz+WdU4w/J8+AxBMrWfi9m4IxfL5sZQKUPQKDQeeAT6lA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-duplicate-keys@7.24.1(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.24.5 - dev: false - /@babel/plugin-transform-dynamic-import@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-av2gdSTyXcJVdI+8aFZsCAtR29xJt0S5tas+Ef8NvBNmD1a+N/3ecMLeMBgfcK+xzsjdLDT6oHt+DFPyeqUbDA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-dynamic-import@7.24.1(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.24.5 '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.24.5) - dev: false - /@babel/plugin-transform-exponentiation-operator@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-U1yX13dVBSwS23DEAqU+Z/PkwE9/m7QQy8Y9/+Tdb8UWYaGNDYwTLi19wqIAiROr8sXVum9A/rtiH5H0boUcTw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-exponentiation-operator@7.24.1(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-builder-binary-assignment-operator-visitor': 7.22.15 '@babel/helper-plugin-utils': 7.24.5 - dev: false - /@babel/plugin-transform-export-namespace-from@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-Ft38m/KFOyzKw2UaJFkWG9QnHPG/Q/2SkOrRk4pNBPg5IPZ+dOxcmkK5IyuBcxiNPyyYowPGUReyBvrvZs7IlQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-export-namespace-from@7.24.1(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.24.5 '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.24.5) - dev: false - /@babel/plugin-transform-for-of@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-OxBdcnF04bpdQdR3i4giHZNZQn7cm8RQKcSwA17wAAqEELo1ZOwp5FFgeptWUQXFyT9kwHo10aqqauYkRZPCAg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-for-of@7.24.1(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.24.5 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - dev: false - /@babel/plugin-transform-function-name@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-BXmDZpPlh7jwicKArQASrj8n22/w6iymRnvHYYd2zO30DbE277JO20/7yXJT3QxDPtiQiOxQBbZH4TpivNXIxA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-function-name@7.24.1(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-compilation-targets': 7.23.6 '@babel/helper-function-name': 7.23.0 '@babel/helper-plugin-utils': 7.24.5 - dev: false - /@babel/plugin-transform-json-strings@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-U7RMFmRvoasscrIFy5xA4gIp8iWnWubnKkKuUGJjsuOH7GfbMkB+XZzeslx2kLdEGdOJDamEmCqOks6e8nv8DQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-json-strings@7.24.1(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.24.5 '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.5) - dev: false - /@babel/plugin-transform-literals@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-zn9pwz8U7nCqOYIiBaOxoQOtYmMODXTJnkxG4AtX8fPmnCRYWBOHD0qcpwS9e2VDSp1zNJYpdnFMIKb8jmwu6g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-literals@7.24.1(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.24.5 - dev: false - /@babel/plugin-transform-logical-assignment-operators@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-OhN6J4Bpz+hIBqItTeWJujDOfNP+unqv/NJgyhlpSqgBTPm37KkMmZV6SYcOj+pnDbdcl1qRGV/ZiIjX9Iy34w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-logical-assignment-operators@7.24.1(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.24.5 '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.5) - dev: false - /@babel/plugin-transform-member-expression-literals@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-4ojai0KysTWXzHseJKa1XPNXKRbuUrhkOPY4rEGeR+7ChlJVKxFa3H3Bz+7tWaGKgJAXUWKOGmltN+u9B3+CVg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-member-expression-literals@7.24.1(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.24.5 - dev: false - /@babel/plugin-transform-modules-amd@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-lAxNHi4HVtjnHd5Rxg3D5t99Xm6H7b04hUS7EHIXcUl2EV4yl1gWdqZrNzXnSrHveL9qMdbODlLF55mvgjAfaQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-modules-amd@7.24.1(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-module-transforms': 7.24.5(@babel/core@7.24.5) '@babel/helper-plugin-utils': 7.24.5 - dev: false - /@babel/plugin-transform-modules-commonjs@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-szog8fFTUxBfw0b98gEWPaEqF42ZUD/T3bkynW/wtgx2p/XCP55WEsb+VosKceRSd6njipdZvNogqdtI4Q0chw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-modules-commonjs@7.24.1(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-module-transforms': 7.24.5(@babel/core@7.24.5) '@babel/helper-plugin-utils': 7.24.5 '@babel/helper-simple-access': 7.24.5 - dev: false - /@babel/plugin-transform-modules-systemjs@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-mqQ3Zh9vFO1Tpmlt8QPnbwGHzNz3lpNEMxQb1kAemn/erstyqw1r9KeOlOfo3y6xAnFEcOv2tSyrXfmMk+/YZA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-modules-systemjs@7.24.1(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-hoist-variables': 7.22.5 '@babel/helper-module-transforms': 7.24.5(@babel/core@7.24.5) '@babel/helper-plugin-utils': 7.24.5 '@babel/helper-validator-identifier': 7.24.5 - dev: false - /@babel/plugin-transform-modules-umd@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-tuA3lpPj+5ITfcCluy6nWonSL7RvaG0AOTeAuvXqEKS34lnLzXpDb0dcP6K8jD0zWZFNDVly90AGFJPnm4fOYg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-modules-umd@7.24.1(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-module-transforms': 7.24.5(@babel/core@7.24.5) '@babel/helper-plugin-utils': 7.24.5 - dev: false - /@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.24.5): - resolution: {integrity: sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 + '@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.5) '@babel/helper-plugin-utils': 7.24.5 - dev: false - /@babel/plugin-transform-new-target@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-/rurytBM34hYy0HKZQyA0nHbQgQNFm4Q/BOc9Hflxi2X3twRof7NaE5W46j4kQitm7SvACVRXsa6N/tSZxvPug==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-new-target@7.24.1(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.24.5 - dev: false - /@babel/plugin-transform-nullish-coalescing-operator@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-iQ+caew8wRrhCikO5DrUYx0mrmdhkaELgFa+7baMcVuhxIkN7oxt06CZ51D65ugIb1UWRQ8oQe+HXAVM6qHFjw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-nullish-coalescing-operator@7.24.1(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.24.5 '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.5) - dev: false - /@babel/plugin-transform-numeric-separator@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-7GAsGlK4cNL2OExJH1DzmDeKnRv/LXq0eLUSvudrehVA5Rgg4bIrqEUW29FbKMBRT0ztSqisv7kjP+XIC4ZMNw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-numeric-separator@7.24.1(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.24.5 '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.5) - dev: false - /@babel/plugin-transform-object-rest-spread@7.24.5(@babel/core@7.24.5): - resolution: {integrity: sha512-7EauQHszLGM3ay7a161tTQH7fj+3vVM/gThlz5HpFtnygTxjrlvoeq7MPVA1Vy9Q555OB8SnAOsMkLShNkkrHA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-object-rest-spread@7.24.5(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-compilation-targets': 7.23.6 '@babel/helper-plugin-utils': 7.24.5 '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.5) '@babel/plugin-transform-parameters': 7.24.5(@babel/core@7.24.5) - dev: false - /@babel/plugin-transform-object-super@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-oKJqR3TeI5hSLRxudMjFQ9re9fBVUU0GICqM3J1mi8MqlhVr6hC/ZN4ttAyMuQR6EZZIY6h/exe5swqGNNIkWQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-object-super@7.24.1(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.24.5 '@babel/helper-replace-supers': 7.24.1(@babel/core@7.24.5) - dev: false - /@babel/plugin-transform-optional-catch-binding@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-oBTH7oURV4Y+3EUrf6cWn1OHio3qG/PVwO5J03iSJmBg6m2EhKjkAu/xuaXaYwWW9miYtvbWv4LNf0AmR43LUA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-optional-catch-binding@7.24.1(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.24.5 '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.5) - dev: false - /@babel/plugin-transform-optional-chaining@7.24.5(@babel/core@7.24.5): - resolution: {integrity: sha512-xWCkmwKT+ihmA6l7SSTpk8e4qQl/274iNbSKRRS8mpqFR32ksy36+a+LWY8OXCCEefF8WFlnOHVsaDI2231wBg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-optional-chaining@7.24.5(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.24.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.5) - dev: false - - /@babel/plugin-transform-parameters@7.24.5(@babel/core@7.24.5): - resolution: {integrity: sha512-9Co00MqZ2aoky+4j2jhofErthm6QVLKbpQrvz20c3CH9KQCLHyNB+t2ya4/UrRpQGR+Wrwjg9foopoeSdnHOkA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.5) + + '@babel/plugin-transform-parameters@7.24.5(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.24.5 - dev: false - /@babel/plugin-transform-private-methods@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-tGvisebwBO5em4PaYNqt4fkw56K2VALsAbAakY0FjTYqJp7gfdrgr7YX76Or8/cpik0W6+tj3rZ0uHU9Oil4tw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-private-methods@7.24.1(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-create-class-features-plugin': 7.24.5(@babel/core@7.24.5) '@babel/helper-plugin-utils': 7.24.5 - dev: false - /@babel/plugin-transform-private-property-in-object@7.24.5(@babel/core@7.24.5): - resolution: {integrity: sha512-JM4MHZqnWR04jPMujQDTBVRnqxpLLpx2tkn7iPn+Hmsc0Gnb79yvRWOkvqFOx3Z7P7VxiRIR22c4eGSNj87OBQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-private-property-in-object@7.24.5(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-annotate-as-pure': 7.22.5 '@babel/helper-create-class-features-plugin': 7.24.5(@babel/core@7.24.5) '@babel/helper-plugin-utils': 7.24.5 '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.24.5) - dev: false - /@babel/plugin-transform-property-literals@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-LetvD7CrHmEx0G442gOomRr66d7q8HzzGGr4PMHGr+5YIm6++Yke+jxj246rpvsbyhJwCLxcTn6zW1P1BSenqA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-property-literals@7.24.1(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.24.5 - dev: false - /@babel/plugin-transform-regenerator@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-sJwZBCzIBE4t+5Q4IGLaaun5ExVMRY0lYwos/jNecjMrVCygCdph3IKv0tkP5Fc87e/1+bebAmEAGBfnRD+cnw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-regenerator@7.24.1(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.24.5 regenerator-transform: 0.15.2 - dev: false - /@babel/plugin-transform-reserved-words@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-JAclqStUfIwKN15HrsQADFgeZt+wexNQ0uLhuqvqAUFoqPMjEcFCYZBhq0LUdz6dZK/mD+rErhW71fbx8RYElg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-reserved-words@7.24.1(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.24.5 - dev: false - /@babel/plugin-transform-shorthand-properties@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-LyjVB1nsJ6gTTUKRjRWx9C1s9hE7dLfP/knKdrfeH9UPtAGjYGgxIbFfx7xyLIEWs7Xe1Gnf8EWiUqfjLhInZA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-shorthand-properties@7.24.1(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.24.5 - dev: false - /@babel/plugin-transform-spread@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-KjmcIM+fxgY+KxPVbjelJC6hrH1CgtPmTvdXAfn3/a9CnWGSTY7nH4zm5+cjmWJybdcPSsD0++QssDsjcpe47g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-spread@7.24.1(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.24.5 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - dev: false - /@babel/plugin-transform-sticky-regex@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-9v0f1bRXgPVcPrngOQvLXeGNNVLc8UjMVfebo9ka0WF3/7+aVUHmaJVT3sa0XCzEFioPfPHZiOcYG9qOsH63cw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-sticky-regex@7.24.1(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.24.5 - dev: false - /@babel/plugin-transform-template-literals@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-WRkhROsNzriarqECASCNu/nojeXCDTE/F2HmRgOzi7NGvyfYGq1NEjKBK3ckLfRgGc6/lPAqP0vDOSw3YtG34g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-template-literals@7.24.1(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.24.5 - dev: false - /@babel/plugin-transform-typeof-symbol@7.24.5(@babel/core@7.24.5): - resolution: {integrity: sha512-UTGnhYVZtTAjdwOTzT+sCyXmTn8AhaxOS/MjG9REclZ6ULHWF9KoCZur0HSGU7hk8PdBFKKbYe6+gqdXWz84Jg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-typeof-symbol@7.24.5(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.24.5 - dev: false - /@babel/plugin-transform-unicode-escapes@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-RlkVIcWT4TLI96zM660S877E7beKlQw7Ig+wqkKBiWfj0zH5Q4h50q6er4wzZKRNSYpfo6ILJ+hrJAGSX2qcNw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-unicode-escapes@7.24.1(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.24.5 - dev: false - /@babel/plugin-transform-unicode-property-regex@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-Ss4VvlfYV5huWApFsF8/Sq0oXnGO+jB+rijFEFugTd3cwSObUSnUi88djgR5528Csl0uKlrI331kRqe56Ov2Ng==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-unicode-property-regex@7.24.1(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.5) '@babel/helper-plugin-utils': 7.24.5 - dev: false - /@babel/plugin-transform-unicode-regex@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-2A/94wgZgxfTsiLaQ2E36XAOdcZmGAaEEgVmxQWwZXWkGhvoHbaqXcKnU8zny4ycpu3vNqg0L/PcCiYtHtA13g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-unicode-regex@7.24.1(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.5) '@babel/helper-plugin-utils': 7.24.5 - dev: false - /@babel/plugin-transform-unicode-sets-regex@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-fqj4WuzzS+ukpgerpAoOnMfQXwUHFxXUZUE84oL2Kao2N8uSlvcpnAidKASgsNgzZHBsHWvcm8s9FPWUhAb8fA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 + '@babel/plugin-transform-unicode-sets-regex@7.24.1(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.5) '@babel/helper-plugin-utils': 7.24.5 - dev: false - /@babel/preset-env@7.24.5(@babel/core@7.24.5): - resolution: {integrity: sha512-UGK2ifKtcC8i5AI4cH+sbLLuLc2ktYSFJgBAXorKAsHUZmrQ1q6aQ6i3BvU24wWs2AAKqQB6kq3N9V9Gw1HiMQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/preset-env@7.24.5(@babel/core@7.24.5)': dependencies: '@babel/compat-data': 7.24.4 '@babel/core': 7.24.5 @@ -1554,46 +6076,31 @@ packages: semver: 6.3.1 transitivePeerDependencies: - supports-color - dev: false - /@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.24.5): - resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} - peerDependencies: - '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 + '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.24.5 '@babel/types': 7.24.5 esutils: 2.0.3 - dev: false - /@babel/regjsgen@0.8.0: - resolution: {integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==} - dev: false + '@babel/regjsgen@0.8.0': {} - /@babel/runtime@7.24.1: - resolution: {integrity: sha512-+BIznRzyqBf+2wCTxcKE3wDjfGeCoVE61KSHGpkzqrLi8qxqFwBeUFyId2cxkTmm55fzDGnm0+yCxaxygrLUnQ==} - engines: {node: '>=6.9.0'} + '@babel/runtime@7.24.1': dependencies: regenerator-runtime: 0.14.1 - /@babel/runtime@7.24.5: - resolution: {integrity: sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g==} - engines: {node: '>=6.9.0'} + '@babel/runtime@7.24.5': dependencies: regenerator-runtime: 0.14.1 - /@babel/template@7.24.0: - resolution: {integrity: sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==} - engines: {node: '>=6.9.0'} + '@babel/template@7.24.0': dependencies: '@babel/code-frame': 7.24.2 '@babel/parser': 7.24.1 '@babel/types': 7.24.0 - /@babel/traverse@7.24.1: - resolution: {integrity: sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==} - engines: {node: '>=6.9.0'} + '@babel/traverse@7.24.1': dependencies: '@babel/code-frame': 7.24.2 '@babel/generator': 7.24.1 @@ -1607,11 +6114,8 @@ packages: globals: 11.12.0 transitivePeerDependencies: - supports-color - dev: true - /@babel/traverse@7.24.5: - resolution: {integrity: sha512-7aaBLeDQ4zYcUFDUD41lJc1fG8+5IU9DaNSJAgal866FGvmD5EbWQgnEC6kO1gGLsX0esNkfnJSndbTXA3r7UA==} - engines: {node: '>=6.9.0'} + '@babel/traverse@7.24.5': dependencies: '@babel/code-frame': 7.24.2 '@babel/generator': 7.24.5 @@ -1625,51 +6129,42 @@ packages: globals: 11.12.0 transitivePeerDependencies: - supports-color - dev: false - /@babel/types@7.24.0: - resolution: {integrity: sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==} - engines: {node: '>=6.9.0'} + '@babel/types@7.24.0': dependencies: '@babel/helper-string-parser': 7.24.1 '@babel/helper-validator-identifier': 7.22.20 to-fast-properties: 2.0.0 - /@babel/types@7.24.5: - resolution: {integrity: sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ==} - engines: {node: '>=6.9.0'} + '@babel/types@7.24.5': dependencies: '@babel/helper-string-parser': 7.24.1 '@babel/helper-validator-identifier': 7.24.5 to-fast-properties: 2.0.0 - /@bcoe/v8-coverage@0.2.3: - resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} - dev: true + '@bcoe/v8-coverage@0.2.3': {} - /@colors/colors@1.6.0: - resolution: {integrity: sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==} - engines: {node: '>=0.1.90'} - dev: true + '@bundled-es-modules/cookie@2.0.0': + dependencies: + cookie: 0.5.0 - /@cspotcode/source-map-support@0.8.1: - resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} - engines: {node: '>=12'} + '@bundled-es-modules/statuses@1.0.1': + dependencies: + statuses: 2.0.1 + + '@colors/colors@1.6.0': {} + + '@cspotcode/source-map-support@0.8.1': dependencies: '@jridgewell/trace-mapping': 0.3.9 - dev: true - /@dabh/diagnostics@2.0.3: - resolution: {integrity: sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==} + '@dabh/diagnostics@2.0.3': dependencies: colorspace: 1.1.4 enabled: 2.0.0 kuler: 2.0.0 - dev: true - /@dotenvx/dotenvx@0.27.0: - resolution: {integrity: sha512-zB01t8/4HxERp2qqz3CHniBUm6LtWK/8U6snewLY1zxeletpBhDKo5rgHslOoKPeRVWKLshSvHYNTEEXVlzFRQ==} - hasBin: true + '@dotenvx/dotenvx@0.27.0': dependencies: '@inquirer/prompts': 3.3.2 arch: 2.2.0 @@ -1703,10 +6198,8 @@ packages: winston: 3.12.0 xdg-basedir: 4.0.0 xxhashjs: 0.2.2 - dev: true - /@emotion/babel-plugin@11.11.0: - resolution: {integrity: sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==} + '@emotion/babel-plugin@11.11.0': dependencies: '@babel/helper-module-imports': 7.24.3 '@babel/runtime': 7.24.5 @@ -1719,40 +6212,24 @@ packages: find-root: 1.1.0 source-map: 0.5.7 stylis: 4.2.0 - dev: false - /@emotion/cache@11.11.0: - resolution: {integrity: sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==} + '@emotion/cache@11.11.0': dependencies: '@emotion/memoize': 0.8.1 '@emotion/sheet': 1.2.2 '@emotion/utils': 1.2.1 '@emotion/weak-memoize': 0.3.1 stylis: 4.2.0 - dev: false - /@emotion/hash@0.9.1: - resolution: {integrity: sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==} - dev: false + '@emotion/hash@0.9.1': {} - /@emotion/is-prop-valid@1.2.2: - resolution: {integrity: sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==} + '@emotion/is-prop-valid@1.2.2': dependencies: '@emotion/memoize': 0.8.1 - dev: false - /@emotion/memoize@0.8.1: - resolution: {integrity: sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==} - dev: false + '@emotion/memoize@0.8.1': {} - /@emotion/react@11.11.4(@types/react@18.2.67)(react@18.2.0): - resolution: {integrity: sha512-t8AjMlF0gHpvvxk5mAtCqR4vmxiGHCeJBaQO6gncUSdklELOgtwjerNY2yuJNfwnc6vi16U/+uMF+afIawJ9iw==} - peerDependencies: - '@types/react': '*' - react: '>=16.8.0' - peerDependenciesMeta: - '@types/react': - optional: true + '@emotion/react@11.11.4(@types/react@18.2.67)(react@18.2.0)': dependencies: '@babel/runtime': 7.24.1 '@emotion/babel-plugin': 11.11.0 @@ -1761,44 +6238,30 @@ packages: '@emotion/use-insertion-effect-with-fallbacks': 1.0.1(react@18.2.0) '@emotion/utils': 1.2.1 '@emotion/weak-memoize': 0.3.1 - '@types/react': 18.2.67 hoist-non-react-statics: 3.3.2 react: 18.2.0 - dev: false + optionalDependencies: + '@types/react': 18.2.67 - /@emotion/serialize@1.1.3: - resolution: {integrity: sha512-iD4D6QVZFDhcbH0RAG1uVu1CwVLMWUkCvAqqlewO/rxf8+87yIBAlt4+AxMiiKPLs5hFc0owNk/sLLAOROw3cA==} + '@emotion/serialize@1.1.3': dependencies: '@emotion/hash': 0.9.1 '@emotion/memoize': 0.8.1 '@emotion/unitless': 0.8.1 '@emotion/utils': 1.2.1 csstype: 3.1.3 - dev: false - /@emotion/serialize@1.1.4: - resolution: {integrity: sha512-RIN04MBT8g+FnDwgvIUi8czvr1LU1alUMI05LekWB5DGyTm8cCBMCRpq3GqaiyEDRptEXOyXnvZ58GZYu4kBxQ==} + '@emotion/serialize@1.1.4': dependencies: '@emotion/hash': 0.9.1 '@emotion/memoize': 0.8.1 '@emotion/unitless': 0.8.1 '@emotion/utils': 1.2.1 csstype: 3.1.3 - dev: false - /@emotion/sheet@1.2.2: - resolution: {integrity: sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==} - dev: false + '@emotion/sheet@1.2.2': {} - /@emotion/styled@11.11.5(@emotion/react@11.11.4)(@types/react@18.2.67)(react@18.2.0): - resolution: {integrity: sha512-/ZjjnaNKvuMPxcIiUkf/9SHoG4Q196DRl1w82hQ3WCsjo1IUR8uaGWrC6a87CrYAW0Kb/pK7hk8BnLgLRi9KoQ==} - peerDependencies: - '@emotion/react': ^11.0.0-rc.0 - '@types/react': '*' - react: '>=16.8.0' - peerDependenciesMeta: - '@types/react': - optional: true + '@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.67)(react@18.2.0))(@types/react@18.2.67)(react@18.2.0)': dependencies: '@babel/runtime': 7.24.5 '@emotion/babel-plugin': 11.11.0 @@ -1807,232 +6270,97 @@ packages: '@emotion/serialize': 1.1.4 '@emotion/use-insertion-effect-with-fallbacks': 1.0.1(react@18.2.0) '@emotion/utils': 1.2.1 - '@types/react': 18.2.67 react: 18.2.0 - dev: false + optionalDependencies: + '@types/react': 18.2.67 - /@emotion/unitless@0.8.1: - resolution: {integrity: sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==} - dev: false + '@emotion/unitless@0.8.1': {} - /@emotion/use-insertion-effect-with-fallbacks@1.0.1(react@18.2.0): - resolution: {integrity: sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==} - peerDependencies: - react: '>=16.8.0' + '@emotion/use-insertion-effect-with-fallbacks@1.0.1(react@18.2.0)': dependencies: react: 18.2.0 - dev: false - /@emotion/utils@1.2.1: - resolution: {integrity: sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==} - dev: false + '@emotion/utils@1.2.1': {} - /@emotion/weak-memoize@0.3.1: - resolution: {integrity: sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==} - dev: false + '@emotion/weak-memoize@0.3.1': {} - /@esbuild/aix-ppc64@0.20.2: - resolution: {integrity: sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [aix] - requiresBuild: true + '@esbuild/aix-ppc64@0.20.2': optional: true - /@esbuild/android-arm64@0.20.2: - resolution: {integrity: sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - requiresBuild: true + '@esbuild/android-arm64@0.20.2': optional: true - /@esbuild/android-arm@0.20.2: - resolution: {integrity: sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - requiresBuild: true + '@esbuild/android-arm@0.20.2': optional: true - /@esbuild/android-x64@0.20.2: - resolution: {integrity: sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - requiresBuild: true + '@esbuild/android-x64@0.20.2': optional: true - /@esbuild/darwin-arm64@0.20.2: - resolution: {integrity: sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - requiresBuild: true + '@esbuild/darwin-arm64@0.20.2': optional: true - /@esbuild/darwin-x64@0.20.2: - resolution: {integrity: sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - requiresBuild: true + '@esbuild/darwin-x64@0.20.2': optional: true - /@esbuild/freebsd-arm64@0.20.2: - resolution: {integrity: sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - requiresBuild: true + '@esbuild/freebsd-arm64@0.20.2': optional: true - /@esbuild/freebsd-x64@0.20.2: - resolution: {integrity: sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - requiresBuild: true + '@esbuild/freebsd-x64@0.20.2': optional: true - /@esbuild/linux-arm64@0.20.2: - resolution: {integrity: sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - requiresBuild: true + '@esbuild/linux-arm64@0.20.2': optional: true - /@esbuild/linux-arm@0.20.2: - resolution: {integrity: sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - requiresBuild: true + '@esbuild/linux-arm@0.20.2': optional: true - /@esbuild/linux-ia32@0.20.2: - resolution: {integrity: sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - requiresBuild: true + '@esbuild/linux-ia32@0.20.2': optional: true - /@esbuild/linux-loong64@0.20.2: - resolution: {integrity: sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - requiresBuild: true + '@esbuild/linux-loong64@0.20.2': optional: true - /@esbuild/linux-mips64el@0.20.2: - resolution: {integrity: sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - requiresBuild: true + '@esbuild/linux-mips64el@0.20.2': optional: true - /@esbuild/linux-ppc64@0.20.2: - resolution: {integrity: sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - requiresBuild: true + '@esbuild/linux-ppc64@0.20.2': optional: true - /@esbuild/linux-riscv64@0.20.2: - resolution: {integrity: sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - requiresBuild: true + '@esbuild/linux-riscv64@0.20.2': optional: true - /@esbuild/linux-s390x@0.20.2: - resolution: {integrity: sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - requiresBuild: true + '@esbuild/linux-s390x@0.20.2': optional: true - /@esbuild/linux-x64@0.20.2: - resolution: {integrity: sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - requiresBuild: true + '@esbuild/linux-x64@0.20.2': optional: true - /@esbuild/netbsd-x64@0.20.2: - resolution: {integrity: sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - requiresBuild: true + '@esbuild/netbsd-x64@0.20.2': optional: true - /@esbuild/openbsd-x64@0.20.2: - resolution: {integrity: sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - requiresBuild: true + '@esbuild/openbsd-x64@0.20.2': optional: true - /@esbuild/sunos-x64@0.20.2: - resolution: {integrity: sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - requiresBuild: true + '@esbuild/sunos-x64@0.20.2': optional: true - /@esbuild/win32-arm64@0.20.2: - resolution: {integrity: sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - requiresBuild: true + '@esbuild/win32-arm64@0.20.2': optional: true - /@esbuild/win32-ia32@0.20.2: - resolution: {integrity: sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - requiresBuild: true + '@esbuild/win32-ia32@0.20.2': optional: true - /@esbuild/win32-x64@0.20.2: - resolution: {integrity: sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - requiresBuild: true + '@esbuild/win32-x64@0.20.2': optional: true - /@eslint-community/eslint-utils@4.4.0(eslint@8.57.0): - resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + '@eslint-community/eslint-utils@4.4.0(eslint@8.57.0)': dependencies: eslint: 8.57.0 eslint-visitor-keys: 3.4.3 - dev: true - /@eslint-community/regexpp@4.10.0: - resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - dev: true + '@eslint-community/regexpp@4.10.0': {} - /@eslint/eslintrc@2.1.4: - resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@eslint/eslintrc@2.1.4': dependencies: ajv: 6.12.6 debug: 4.3.4 @@ -2045,111 +6373,72 @@ packages: strip-json-comments: 3.1.1 transitivePeerDependencies: - supports-color - dev: true - /@eslint/js@8.57.0: - resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true + '@eslint/js@8.57.0': {} - /@fastify/busboy@2.1.1: - resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} - engines: {node: '>=14'} - dev: true + '@fastify/busboy@2.1.1': {} - /@floating-ui/core@1.6.0: - resolution: {integrity: sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==} + '@floating-ui/core@1.6.0': dependencies: '@floating-ui/utils': 0.2.1 - dev: false - /@floating-ui/dom@1.6.3: - resolution: {integrity: sha512-RnDthu3mzPlQ31Ss/BTwQ1zjzIhr3lk1gZB1OC56h/1vEtaXkESrOqL5fQVMfXpwGtRwX+YsZBdyHtJMQnkArw==} + '@floating-ui/dom@1.6.3': dependencies: '@floating-ui/core': 1.6.0 '@floating-ui/utils': 0.2.1 - dev: false - /@floating-ui/react-dom@2.0.8(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-HOdqOt3R3OGeTKidaLvJKcgg75S6tibQ3Tif4eyd91QnIJWr0NLvoXFpJA/j8HqkFSL68GDca9AuyWEHlhyClw==} - peerDependencies: - react: '>=16.8.0' - react-dom: '>=16.8.0' + '@floating-ui/react-dom@2.0.8(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@floating-ui/dom': 1.6.3 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - dev: false - /@floating-ui/utils@0.2.1: - resolution: {integrity: sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==} - dev: false + '@floating-ui/utils@0.2.1': {} - /@fontsource/roboto@5.0.12: - resolution: {integrity: sha512-x0o17jvgoSSbS9OZnUX2+xJmVRvVCfeaYJjkS7w62iN7CuJWtMf5vJj8LqgC7ibqIkitOHVW+XssRjgrcHn62g==} - dev: false + '@fontsource/roboto@5.0.12': {} - /@hapi/hoek@9.3.0: - resolution: {integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==} - dev: true + '@hapi/hoek@9.3.0': {} - /@hapi/topo@5.1.0: - resolution: {integrity: sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==} + '@hapi/topo@5.1.0': dependencies: '@hapi/hoek': 9.3.0 - dev: true - /@hookform/resolvers@3.3.4(react-hook-form@7.51.3): - resolution: {integrity: sha512-o5cgpGOuJYrd+iMKvkttOclgwRW86EsWJZZRC23prf0uU2i48Htq4PuT73AVb9ionFyZrwYEITuOFGF+BydEtQ==} - peerDependencies: - react-hook-form: ^7.0.0 + '@hookform/resolvers@3.3.4(react-hook-form@7.51.3(react@18.2.0))': dependencies: react-hook-form: 7.51.3(react@18.2.0) - dev: false - /@humanwhocodes/config-array@0.11.14: - resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} - engines: {node: '>=10.10.0'} + '@humanwhocodes/config-array@0.11.14': dependencies: '@humanwhocodes/object-schema': 2.0.2 debug: 4.3.4 minimatch: 3.1.2 transitivePeerDependencies: - supports-color - dev: true - /@humanwhocodes/module-importer@1.0.1: - resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} - engines: {node: '>=12.22'} - dev: true + '@humanwhocodes/module-importer@1.0.1': {} - /@humanwhocodes/object-schema@2.0.2: - resolution: {integrity: sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==} - dev: true + '@humanwhocodes/object-schema@2.0.2': {} - /@inquirer/checkbox@1.5.2: - resolution: {integrity: sha512-CifrkgQjDkUkWexmgYYNyB5603HhTHI91vLFeQXh6qrTKiCMVASol01Rs1cv6LP/A2WccZSRlJKZhbaBIs/9ZA==} - engines: {node: '>=14.18.0'} + '@inquirer/checkbox@1.5.2': dependencies: '@inquirer/core': 6.0.0 '@inquirer/type': 1.2.1 ansi-escapes: 4.3.2 chalk: 4.1.2 figures: 3.2.0 - dev: true - /@inquirer/confirm@2.0.17: - resolution: {integrity: sha512-EqzhGryzmGpy2aJf6LxJVhndxYmFs+m8cxXzf8nejb1DE3sabf6mUgBcp4J0jAUEiAcYzqmkqRr7LPFh/WdnXA==} - engines: {node: '>=14.18.0'} + '@inquirer/confirm@2.0.17': dependencies: '@inquirer/core': 6.0.0 '@inquirer/type': 1.2.1 chalk: 4.1.2 - dev: true - /@inquirer/core@6.0.0: - resolution: {integrity: sha512-fKi63Khkisgda3ohnskNf5uZJj+zXOaBvOllHsOkdsXRA/ubQLJQrZchFFi57NKbZzkTunXiBMdvWOv71alonw==} - engines: {node: '>=14.18.0'} + '@inquirer/confirm@3.1.6': + dependencies: + '@inquirer/core': 8.1.0 + '@inquirer/type': 1.3.1 + + '@inquirer/core@6.0.0': dependencies: '@inquirer/type': 1.2.1 '@types/mute-stream': 0.0.4 @@ -2165,50 +6454,53 @@ packages: signal-exit: 4.1.0 strip-ansi: 6.0.1 wrap-ansi: 6.2.0 - dev: true - /@inquirer/editor@1.2.15: - resolution: {integrity: sha512-gQ77Ls09x5vKLVNMH9q/7xvYPT6sIs5f7URksw+a2iJZ0j48tVS6crLqm2ugG33tgXHIwiEqkytY60Zyh5GkJQ==} - engines: {node: '>=14.18.0'} + '@inquirer/core@8.1.0': + dependencies: + '@inquirer/figures': 1.0.1 + '@inquirer/type': 1.3.1 + '@types/mute-stream': 0.0.4 + '@types/node': 20.12.7 + '@types/wrap-ansi': 3.0.0 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + cli-spinners: 2.9.2 + cli-width: 4.1.0 + mute-stream: 1.0.0 + signal-exit: 4.1.0 + strip-ansi: 6.0.1 + wrap-ansi: 6.2.0 + + '@inquirer/editor@1.2.15': dependencies: '@inquirer/core': 6.0.0 '@inquirer/type': 1.2.1 chalk: 4.1.2 external-editor: 3.1.0 - dev: true - /@inquirer/expand@1.1.16: - resolution: {integrity: sha512-TGLU9egcuo+s7PxphKUCnJnpCIVY32/EwPCLLuu+gTvYiD8hZgx8Z2niNQD36sa6xcfpdLY6xXDBiL/+g1r2XQ==} - engines: {node: '>=14.18.0'} + '@inquirer/expand@1.1.16': dependencies: '@inquirer/core': 6.0.0 '@inquirer/type': 1.2.1 chalk: 4.1.2 figures: 3.2.0 - dev: true - /@inquirer/input@1.2.16: - resolution: {integrity: sha512-Ou0LaSWvj1ni+egnyQ+NBtfM1885UwhRCMtsRt2bBO47DoC1dwtCa+ZUNgrxlnCHHF0IXsbQHYtIIjFGAavI4g==} - engines: {node: '>=14.18.0'} + '@inquirer/figures@1.0.1': {} + + '@inquirer/input@1.2.16': dependencies: '@inquirer/core': 6.0.0 '@inquirer/type': 1.2.1 chalk: 4.1.2 - dev: true - /@inquirer/password@1.1.16: - resolution: {integrity: sha512-aZYZVHLUXZ2gbBot+i+zOJrks1WaiI95lvZCn1sKfcw6MtSSlYC8uDX8sTzQvAsQ8epHoP84UNvAIT0KVGOGqw==} - engines: {node: '>=14.18.0'} + '@inquirer/password@1.1.16': dependencies: '@inquirer/core': 6.0.0 '@inquirer/type': 1.2.1 ansi-escapes: 4.3.2 chalk: 4.1.2 - dev: true - /@inquirer/prompts@3.3.2: - resolution: {integrity: sha512-k52mOMRvTUejrqyF1h8Z07chC+sbaoaUYzzr1KrJXyj7yaX7Nrh0a9vktv8TuocRwIJOQMaj5oZEmkspEcJFYQ==} - engines: {node: '>=14.18.0'} + '@inquirer/prompts@3.3.2': dependencies: '@inquirer/checkbox': 1.5.2 '@inquirer/confirm': 2.0.17 @@ -2219,64 +6511,45 @@ packages: '@inquirer/password': 1.1.16 '@inquirer/rawlist': 1.2.16 '@inquirer/select': 1.3.3 - dev: true - /@inquirer/rawlist@1.2.16: - resolution: {integrity: sha512-pZ6TRg2qMwZAOZAV6TvghCtkr53dGnK29GMNQ3vMZXSNguvGqtOVc4j/h1T8kqGJFagjyfBZhUPGwNS55O5qPQ==} - engines: {node: '>=14.18.0'} + '@inquirer/rawlist@1.2.16': dependencies: '@inquirer/core': 6.0.0 '@inquirer/type': 1.2.1 chalk: 4.1.2 - dev: true - /@inquirer/select@1.3.3: - resolution: {integrity: sha512-RzlRISXWqIKEf83FDC9ZtJ3JvuK1l7aGpretf41BCWYrvla2wU8W8MTRNMiPrPJ+1SIqrRC1nZdZ60hD9hRXLg==} - engines: {node: '>=14.18.0'} + '@inquirer/select@1.3.3': dependencies: '@inquirer/core': 6.0.0 '@inquirer/type': 1.2.1 ansi-escapes: 4.3.2 chalk: 4.1.2 figures: 3.2.0 - dev: true - /@inquirer/type@1.2.1: - resolution: {integrity: sha512-xwMfkPAxeo8Ji/IxfUSqzRi0/+F2GIqJmpc5/thelgMGsjNZcjDDRBO9TLXT1s/hdx/mK5QbVIvgoLIFgXhTMQ==} - engines: {node: '>=18'} - dev: true + '@inquirer/type@1.2.1': {} - /@isaacs/cliui@8.0.2: - resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} - engines: {node: '>=12'} + '@inquirer/type@1.3.1': {} + + '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 - string-width-cjs: /string-width@4.2.3 + string-width-cjs: string-width@4.2.3 strip-ansi: 7.1.0 - strip-ansi-cjs: /strip-ansi@6.0.1 + strip-ansi-cjs: strip-ansi@6.0.1 wrap-ansi: 8.1.0 - wrap-ansi-cjs: /wrap-ansi@7.0.0 - dev: true + wrap-ansi-cjs: wrap-ansi@7.0.0 - /@istanbuljs/load-nyc-config@1.1.0: - resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} - engines: {node: '>=8'} + '@istanbuljs/load-nyc-config@1.1.0': dependencies: camelcase: 5.3.1 find-up: 4.1.0 get-package-type: 0.1.0 js-yaml: 3.14.1 resolve-from: 5.0.0 - dev: true - /@istanbuljs/schema@0.1.3: - resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} - engines: {node: '>=8'} - dev: true + '@istanbuljs/schema@0.1.3': {} - /@jest/console@29.7.0: - resolution: {integrity: sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/console@29.7.0': dependencies: '@jest/types': 29.6.3 '@types/node': 20.11.30 @@ -2284,16 +6557,8 @@ packages: jest-message-util: 29.7.0 jest-util: 29.7.0 slash: 3.0.0 - dev: true - /@jest/core@29.7.0(ts-node@10.9.2): - resolution: {integrity: sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true + '@jest/core@29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.4.8)(@types/node@20.11.30)(typescript@5.4.2))': dependencies: '@jest/console': 29.7.0 '@jest/reporters': 29.7.0 @@ -2307,7 +6572,7 @@ packages: exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@20.11.30)(ts-node@10.9.2) + jest-config: 29.7.0(@types/node@20.11.30)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.4.8)(@types/node@20.11.30)(typescript@5.4.2)) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -2327,38 +6592,26 @@ packages: - babel-plugin-macros - supports-color - ts-node - dev: true - /@jest/environment@29.7.0: - resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/environment@29.7.0': dependencies: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 '@types/node': 20.11.30 jest-mock: 29.7.0 - dev: true - /@jest/expect-utils@29.7.0: - resolution: {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/expect-utils@29.7.0': dependencies: jest-get-type: 29.6.3 - dev: true - /@jest/expect@29.7.0: - resolution: {integrity: sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/expect@29.7.0': dependencies: expect: 29.7.0 jest-snapshot: 29.7.0 transitivePeerDependencies: - supports-color - dev: true - /@jest/fake-timers@29.7.0: - resolution: {integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/fake-timers@29.7.0': dependencies: '@jest/types': 29.6.3 '@sinonjs/fake-timers': 10.3.0 @@ -2366,11 +6619,8 @@ packages: jest-message-util: 29.7.0 jest-mock: 29.7.0 jest-util: 29.7.0 - dev: true - /@jest/globals@29.7.0: - resolution: {integrity: sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/globals@29.7.0': dependencies: '@jest/environment': 29.7.0 '@jest/expect': 29.7.0 @@ -2378,16 +6628,8 @@ packages: jest-mock: 29.7.0 transitivePeerDependencies: - supports-color - dev: true - /@jest/reporters@29.7.0: - resolution: {integrity: sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true + '@jest/reporters@29.7.0': dependencies: '@bcoe/v8-coverage': 0.2.3 '@jest/console': 29.7.0 @@ -2415,47 +6657,32 @@ packages: v8-to-istanbul: 9.2.0 transitivePeerDependencies: - supports-color - dev: true - /@jest/schemas@29.6.3: - resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/schemas@29.6.3': dependencies: '@sinclair/typebox': 0.27.8 - dev: true - /@jest/source-map@29.6.3: - resolution: {integrity: sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/source-map@29.6.3': dependencies: '@jridgewell/trace-mapping': 0.3.25 callsites: 3.1.0 graceful-fs: 4.2.11 - dev: true - /@jest/test-result@29.7.0: - resolution: {integrity: sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/test-result@29.7.0': dependencies: '@jest/console': 29.7.0 '@jest/types': 29.6.3 '@types/istanbul-lib-coverage': 2.0.6 collect-v8-coverage: 1.0.2 - dev: true - /@jest/test-sequencer@29.7.0: - resolution: {integrity: sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/test-sequencer@29.7.0': dependencies: '@jest/test-result': 29.7.0 graceful-fs: 4.2.11 jest-haste-map: 29.7.0 slash: 3.0.0 - dev: true - /@jest/transform@29.7.0: - resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/transform@29.7.0': dependencies: '@babel/core': 7.24.3 '@jest/types': 29.6.3 @@ -2474,11 +6701,8 @@ packages: write-file-atomic: 4.0.2 transitivePeerDependencies: - supports-color - dev: true - /@jest/types@29.6.3: - resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/types@29.6.3': dependencies: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.6 @@ -2486,141 +6710,77 @@ packages: '@types/node': 20.11.30 '@types/yargs': 17.0.32 chalk: 4.1.2 - dev: true - /@jridgewell/gen-mapping@0.3.5: - resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} - engines: {node: '>=6.0.0'} + '@jridgewell/gen-mapping@0.3.5': dependencies: '@jridgewell/set-array': 1.2.1 '@jridgewell/sourcemap-codec': 1.4.15 '@jridgewell/trace-mapping': 0.3.25 - /@jridgewell/resolve-uri@3.1.2: - resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} - engines: {node: '>=6.0.0'} + '@jridgewell/resolve-uri@3.1.2': {} - /@jridgewell/set-array@1.2.1: - resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} - engines: {node: '>=6.0.0'} + '@jridgewell/set-array@1.2.1': {} - /@jridgewell/source-map@0.3.6: - resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} + '@jridgewell/source-map@0.3.6': dependencies: '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 - dev: false - /@jridgewell/sourcemap-codec@1.4.15: - resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + '@jridgewell/sourcemap-codec@1.4.15': {} - /@jridgewell/trace-mapping@0.3.25: - resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + '@jridgewell/trace-mapping@0.3.25': dependencies: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.4.15 - /@jridgewell/trace-mapping@0.3.9: - resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + '@jridgewell/trace-mapping@0.3.9': dependencies: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.4.15 - dev: true - /@mswjs/cookies@0.2.2: - resolution: {integrity: sha512-mlN83YSrcFgk7Dm1Mys40DLssI1KdJji2CMKN8eOlBqsTADYzj2+jWzsANsUTFbxDMWPD5e9bfA1RGqBpS3O1g==} - engines: {node: '>=14'} - dependencies: - '@types/set-cookie-parser': 2.4.7 - set-cookie-parser: 2.6.0 - dev: true + '@mswjs/cookies@1.1.0': {} - /@mswjs/interceptors@0.17.10: - resolution: {integrity: sha512-N8x7eSLGcmUFNWZRxT1vsHvypzIRgQYdG0rJey/rZCy6zT/30qDt8Joj7FxzGNLSwXbeZqJOMqDurp7ra4hgbw==} - engines: {node: '>=14'} + '@mswjs/interceptors@0.26.15': dependencies: - '@open-draft/until': 1.0.3 - '@types/debug': 4.1.12 - '@xmldom/xmldom': 0.8.10 - debug: 4.3.4 - headers-polyfill: 3.2.5 + '@open-draft/deferred-promise': 2.2.0 + '@open-draft/logger': 0.3.0 + '@open-draft/until': 2.1.0 + is-node-process: 1.2.0 outvariant: 1.4.2 - strict-event-emitter: 0.2.8 - web-encoding: 1.1.5 - transitivePeerDependencies: - - supports-color - dev: true + strict-event-emitter: 0.5.1 - /@mui/base@5.0.0-beta.40(@types/react@18.2.67)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-I/lGHztkCzvwlXpjD2+SNmvNQvB4227xBXhISPjEaJUXGImOQ9f3D2Yj/T3KasSI/h0MLWy74X0J6clhPmsRbQ==} - engines: {node: '>=12.0.0'} - peerDependencies: - '@types/react': ^17.0.0 || ^18.0.0 - react: ^17.0.0 || ^18.0.0 - react-dom: ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true + '@mui/base@5.0.0-beta.40(@types/react@18.2.67)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@babel/runtime': 7.24.1 - '@floating-ui/react-dom': 2.0.8(react-dom@18.2.0)(react@18.2.0) + '@floating-ui/react-dom': 2.0.8(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@mui/types': 7.2.14(@types/react@18.2.67) '@mui/utils': 5.15.14(@types/react@18.2.67)(react@18.2.0) '@popperjs/core': 2.11.8 - '@types/react': 18.2.67 clsx: 2.1.0 prop-types: 15.8.1 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - dev: false + optionalDependencies: + '@types/react': 18.2.67 - /@mui/core-downloads-tracker@5.15.14: - resolution: {integrity: sha512-on75VMd0XqZfaQW+9pGjSNiqW+ghc5E2ZSLRBXwcXl/C4YzjfyjrLPhrEpKnR9Uym9KXBvxrhoHfPcczYHweyA==} - dev: false + '@mui/core-downloads-tracker@5.15.14': {} - /@mui/icons-material@5.15.14(@mui/material@5.15.14)(@types/react@18.2.67)(react@18.2.0): - resolution: {integrity: sha512-vj/51k7MdFmt+XVw94sl30SCvGx6+wJLsNYjZRgxhS6y3UtnWnypMOsm3Kmg8TN+P0dqwsjy4/fX7B1HufJIhw==} - engines: {node: '>=12.0.0'} - peerDependencies: - '@mui/material': ^5.0.0 - '@types/react': ^17.0.0 || ^18.0.0 - react: ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true + '@mui/icons-material@5.15.14(@mui/material@5.15.14(@emotion/react@11.11.4(@types/react@18.2.67)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.67)(react@18.2.0))(@types/react@18.2.67)(react@18.2.0))(@types/react@18.2.67)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@types/react@18.2.67)(react@18.2.0)': dependencies: '@babel/runtime': 7.24.1 - '@mui/material': 5.15.14(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.2.67)(react-dom@18.2.0)(react@18.2.0) - '@types/react': 18.2.67 + '@mui/material': 5.15.14(@emotion/react@11.11.4(@types/react@18.2.67)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.67)(react@18.2.0))(@types/react@18.2.67)(react@18.2.0))(@types/react@18.2.67)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react: 18.2.0 - dev: false + optionalDependencies: + '@types/react': 18.2.67 - /@mui/material@5.15.14(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.2.67)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-kEbRw6fASdQ1SQ7LVdWR5OlWV3y7Y54ZxkLzd6LV5tmz+NpO3MJKZXSfgR0LHMP7meKsPiMm4AuzV0pXDpk/BQ==} - engines: {node: '>=12.0.0'} - peerDependencies: - '@emotion/react': ^11.5.0 - '@emotion/styled': ^11.3.0 - '@types/react': ^17.0.0 || ^18.0.0 - react: ^17.0.0 || ^18.0.0 - react-dom: ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@emotion/react': - optional: true - '@emotion/styled': - optional: true - '@types/react': - optional: true + '@mui/material@5.15.14(@emotion/react@11.11.4(@types/react@18.2.67)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.67)(react@18.2.0))(@types/react@18.2.67)(react@18.2.0))(@types/react@18.2.67)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@babel/runtime': 7.24.1 - '@emotion/react': 11.11.4(@types/react@18.2.67)(react@18.2.0) - '@emotion/styled': 11.11.5(@emotion/react@11.11.4)(@types/react@18.2.67)(react@18.2.0) - '@mui/base': 5.0.0-beta.40(@types/react@18.2.67)(react-dom@18.2.0)(react@18.2.0) + '@mui/base': 5.0.0-beta.40(@types/react@18.2.67)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@mui/core-downloads-tracker': 5.15.14 - '@mui/system': 5.15.14(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.2.67)(react@18.2.0) + '@mui/system': 5.15.14(@emotion/react@11.11.4(@types/react@18.2.67)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.67)(react@18.2.0))(@types/react@18.2.67)(react@18.2.0))(@types/react@18.2.67)(react@18.2.0) '@mui/types': 7.2.14(@types/react@18.2.67) '@mui/utils': 5.15.14(@types/react@18.2.67)(react@18.2.0) - '@types/react': 18.2.67 '@types/react-transition-group': 4.4.10 clsx: 2.1.0 csstype: 3.1.3 @@ -2628,256 +6788,136 @@ packages: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) react-is: 18.2.0 - react-transition-group: 4.4.5(react-dom@18.2.0)(react@18.2.0) - dev: false + react-transition-group: 4.4.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + optionalDependencies: + '@emotion/react': 11.11.4(@types/react@18.2.67)(react@18.2.0) + '@emotion/styled': 11.11.5(@emotion/react@11.11.4(@types/react@18.2.67)(react@18.2.0))(@types/react@18.2.67)(react@18.2.0) + '@types/react': 18.2.67 - /@mui/private-theming@5.15.14(@types/react@18.2.67)(react@18.2.0): - resolution: {integrity: sha512-UH0EiZckOWcxiXLX3Jbb0K7rC8mxTr9L9l6QhOZxYc4r8FHUkefltV9VDGLrzCaWh30SQiJvAEd7djX3XXY6Xw==} - engines: {node: '>=12.0.0'} - peerDependencies: - '@types/react': ^17.0.0 || ^18.0.0 - react: ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true + '@mui/private-theming@5.15.14(@types/react@18.2.67)(react@18.2.0)': dependencies: '@babel/runtime': 7.24.1 '@mui/utils': 5.15.14(@types/react@18.2.67)(react@18.2.0) - '@types/react': 18.2.67 prop-types: 15.8.1 react: 18.2.0 - dev: false + optionalDependencies: + '@types/react': 18.2.67 - /@mui/styled-engine@5.15.14(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(react@18.2.0): - resolution: {integrity: sha512-RILkuVD8gY6PvjZjqnWhz8fu68dVkqhM5+jYWfB5yhlSQKg+2rHkmEwm75XIeAqI3qwOndK6zELK5H6Zxn4NHw==} - engines: {node: '>=12.0.0'} - peerDependencies: - '@emotion/react': ^11.4.1 - '@emotion/styled': ^11.3.0 - react: ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@emotion/react': - optional: true - '@emotion/styled': - optional: true + '@mui/styled-engine@5.15.14(@emotion/react@11.11.4(@types/react@18.2.67)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.67)(react@18.2.0))(@types/react@18.2.67)(react@18.2.0))(react@18.2.0)': dependencies: '@babel/runtime': 7.24.1 '@emotion/cache': 11.11.0 - '@emotion/react': 11.11.4(@types/react@18.2.67)(react@18.2.0) - '@emotion/styled': 11.11.5(@emotion/react@11.11.4)(@types/react@18.2.67)(react@18.2.0) csstype: 3.1.3 prop-types: 15.8.1 react: 18.2.0 - dev: false + optionalDependencies: + '@emotion/react': 11.11.4(@types/react@18.2.67)(react@18.2.0) + '@emotion/styled': 11.11.5(@emotion/react@11.11.4(@types/react@18.2.67)(react@18.2.0))(@types/react@18.2.67)(react@18.2.0) - /@mui/system@5.15.14(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.2.67)(react@18.2.0): - resolution: {integrity: sha512-auXLXzUaCSSOLqJXmsAaq7P96VPRXg2Rrz6OHNV7lr+kB8lobUF+/N84Vd9C4G/wvCXYPs5TYuuGBRhcGbiBGg==} - engines: {node: '>=12.0.0'} - peerDependencies: - '@emotion/react': ^11.5.0 - '@emotion/styled': ^11.3.0 - '@types/react': ^17.0.0 || ^18.0.0 - react: ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@emotion/react': - optional: true - '@emotion/styled': - optional: true - '@types/react': - optional: true + '@mui/system@5.15.14(@emotion/react@11.11.4(@types/react@18.2.67)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.67)(react@18.2.0))(@types/react@18.2.67)(react@18.2.0))(@types/react@18.2.67)(react@18.2.0)': dependencies: '@babel/runtime': 7.24.1 - '@emotion/react': 11.11.4(@types/react@18.2.67)(react@18.2.0) - '@emotion/styled': 11.11.5(@emotion/react@11.11.4)(@types/react@18.2.67)(react@18.2.0) '@mui/private-theming': 5.15.14(@types/react@18.2.67)(react@18.2.0) - '@mui/styled-engine': 5.15.14(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(react@18.2.0) + '@mui/styled-engine': 5.15.14(@emotion/react@11.11.4(@types/react@18.2.67)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.67)(react@18.2.0))(@types/react@18.2.67)(react@18.2.0))(react@18.2.0) '@mui/types': 7.2.14(@types/react@18.2.67) '@mui/utils': 5.15.14(@types/react@18.2.67)(react@18.2.0) - '@types/react': 18.2.67 clsx: 2.1.0 csstype: 3.1.3 prop-types: 15.8.1 react: 18.2.0 - dev: false + optionalDependencies: + '@emotion/react': 11.11.4(@types/react@18.2.67)(react@18.2.0) + '@emotion/styled': 11.11.5(@emotion/react@11.11.4(@types/react@18.2.67)(react@18.2.0))(@types/react@18.2.67)(react@18.2.0) + '@types/react': 18.2.67 - /@mui/types@7.2.14(@types/react@18.2.67): - resolution: {integrity: sha512-MZsBZ4q4HfzBsywtXgM1Ksj6HDThtiwmOKUXH1pKYISI9gAVXCNHNpo7TlGoGrBaYWZTdNoirIN7JsQcQUjmQQ==} - peerDependencies: - '@types/react': ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - dependencies: + '@mui/types@7.2.14(@types/react@18.2.67)': + optionalDependencies: '@types/react': 18.2.67 - dev: false - /@mui/utils@5.15.14(@types/react@18.2.67)(react@18.2.0): - resolution: {integrity: sha512-0lF/7Hh/ezDv5X7Pry6enMsbYyGKjADzvHyo3Qrc/SSlTsQ1VkbDMbH0m2t3OR5iIVLwMoxwM7yGd+6FCMtTFA==} - engines: {node: '>=12.0.0'} - peerDependencies: - '@types/react': ^17.0.0 || ^18.0.0 - react: ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true + '@mui/utils@5.15.14(@types/react@18.2.67)(react@18.2.0)': dependencies: '@babel/runtime': 7.24.1 '@types/prop-types': 15.7.11 - '@types/react': 18.2.67 prop-types: 15.8.1 react: 18.2.0 react-is: 18.2.0 - dev: false + optionalDependencies: + '@types/react': 18.2.67 - /@mui/x-date-pickers@7.0.0(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@mui/material@5.15.14)(@types/react@18.2.67)(dayjs@1.11.10)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-/9mp4O2WMixHOso63DBoZVfJVYGrzOHF5voheV2tYQ4XqDdTKp2AdWS3oh8PGwrsvCzqkvb3quzTqhKoEsJUwA==} - engines: {node: '>=14.0.0'} - peerDependencies: - '@emotion/react': ^11.9.0 - '@emotion/styled': ^11.8.1 - '@mui/material': ^5.15.14 - date-fns: ^2.25.0 || ^3.2.0 - date-fns-jalali: ^2.13.0-0 - dayjs: ^1.10.7 - luxon: ^3.0.2 - moment: ^2.29.4 - moment-hijri: ^2.1.2 - moment-jalaali: ^0.7.4 || ^0.8.0 || ^0.9.0 || ^0.10.0 - react: ^17.0.0 || ^18.0.0 - react-dom: ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@emotion/react': - optional: true - '@emotion/styled': - optional: true - date-fns: - optional: true - date-fns-jalali: - optional: true - dayjs: - optional: true - luxon: - optional: true - moment: - optional: true - moment-hijri: - optional: true - moment-jalaali: - optional: true + '@mui/x-date-pickers@7.0.0(@emotion/react@11.11.4(@types/react@18.2.67)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.67)(react@18.2.0))(@types/react@18.2.67)(react@18.2.0))(@mui/material@5.15.14(@emotion/react@11.11.4(@types/react@18.2.67)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.67)(react@18.2.0))(@types/react@18.2.67)(react@18.2.0))(@types/react@18.2.67)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@types/react@18.2.67)(dayjs@1.11.10)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@babel/runtime': 7.24.1 - '@emotion/react': 11.11.4(@types/react@18.2.67)(react@18.2.0) - '@emotion/styled': 11.11.5(@emotion/react@11.11.4)(@types/react@18.2.67)(react@18.2.0) - '@mui/base': 5.0.0-beta.40(@types/react@18.2.67)(react-dom@18.2.0)(react@18.2.0) - '@mui/material': 5.15.14(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.2.67)(react-dom@18.2.0)(react@18.2.0) - '@mui/system': 5.15.14(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.2.67)(react@18.2.0) + '@mui/base': 5.0.0-beta.40(@types/react@18.2.67)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@mui/material': 5.15.14(@emotion/react@11.11.4(@types/react@18.2.67)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.67)(react@18.2.0))(@types/react@18.2.67)(react@18.2.0))(@types/react@18.2.67)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@mui/system': 5.15.14(@emotion/react@11.11.4(@types/react@18.2.67)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.67)(react@18.2.0))(@types/react@18.2.67)(react@18.2.0))(@types/react@18.2.67)(react@18.2.0) '@mui/utils': 5.15.14(@types/react@18.2.67)(react@18.2.0) '@types/react-transition-group': 4.4.10 clsx: 2.1.0 - dayjs: 1.11.10 prop-types: 15.8.1 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - react-transition-group: 4.4.5(react-dom@18.2.0)(react@18.2.0) + react-transition-group: 4.4.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + optionalDependencies: + '@emotion/react': 11.11.4(@types/react@18.2.67)(react@18.2.0) + '@emotion/styled': 11.11.5(@emotion/react@11.11.4(@types/react@18.2.67)(react@18.2.0))(@types/react@18.2.67)(react@18.2.0) + dayjs: 1.11.10 transitivePeerDependencies: - '@types/react' - dev: false - /@nodelib/fs.scandir@2.1.5: - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 run-parallel: 1.2.0 - /@nodelib/fs.stat@2.0.5: - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} + '@nodelib/fs.stat@2.0.5': {} - /@nodelib/fs.walk@1.2.8: - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} + '@nodelib/fs.walk@1.2.8': dependencies: '@nodelib/fs.scandir': 2.1.5 fastq: 1.17.1 - /@open-draft/until@1.0.3: - resolution: {integrity: sha512-Aq58f5HiWdyDlFffbbSjAlv596h/cOnt2DO1w3DOC7OJ5EHs0hd/nycJfiu9RJbT6Yk6F1knnRRXNSpxoIVZ9Q==} - dev: true + '@open-draft/deferred-promise@2.2.0': {} - /@pkgjs/parseargs@0.11.0: - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} - engines: {node: '>=14'} - requiresBuild: true - dev: true - optional: true + '@open-draft/logger@0.3.0': + dependencies: + is-node-process: 1.2.0 + outvariant: 1.4.2 - /@pkgr/core@0.1.1: - resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} - engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - dev: true + '@open-draft/until@2.1.0': {} + + '@pkgjs/parseargs@0.11.0': + optional: true - /@playwright/test@1.42.1: - resolution: {integrity: sha512-Gq9rmS54mjBL/7/MvBaNOBwbfnh7beHvS6oS4srqXFcQHpQCV1+c8JXWE8VLPyRDhgS3H8x8A7hztqI9VnwrAQ==} - engines: {node: '>=16'} - hasBin: true + '@pkgr/core@0.1.1': {} + + '@playwright/test@1.42.1': dependencies: playwright: 1.42.1 - dev: true - /@popperjs/core@2.11.8: - resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} - dev: false + '@popperjs/core@2.11.8': {} - /@reduxjs/toolkit@2.2.2(react-redux@9.1.0)(react@18.2.0): - resolution: {integrity: sha512-454GZrEx3G6QSYwIx9ROaso1HR6sTH8qyZBe3KEsdWVGU3ayV8jYCwdaEJV3vl9V6+pi3GRl+7Xl7AeDna6qwQ==} - peerDependencies: - react: ^16.9.0 || ^17.0.0 || ^18 - react-redux: ^7.2.1 || ^8.1.3 || ^9.0.0 - peerDependenciesMeta: - react: - optional: true - react-redux: - optional: true + '@reduxjs/toolkit@2.2.2(react-redux@9.1.0(@types/react@18.2.67)(react@18.2.0)(redux@5.0.1))(react@18.2.0)': dependencies: immer: 10.0.4 - react: 18.2.0 - react-redux: 9.1.0(@types/react@18.2.67)(react@18.2.0)(redux@5.0.1) redux: 5.0.1 redux-thunk: 3.1.0(redux@5.0.1) reselect: 5.1.0 - dev: false + optionalDependencies: + react: 18.2.0 + react-redux: 9.1.0(@types/react@18.2.67)(react@18.2.0)(redux@5.0.1) - /@remix-run/router@1.15.3: - resolution: {integrity: sha512-Oy8rmScVrVxWZVOpEF57ovlnhpZ8CCPlnIIumVcV9nFdiSIrus99+Lw78ekXyGvVDlIsFJbSfmSovJUhCWYV3w==} - engines: {node: '>=14.0.0'} - dev: false + '@remix-run/router@1.15.3': {} - /@rollup/plugin-babel@5.3.1(@babel/core@7.24.5)(rollup@2.79.1): - resolution: {integrity: sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==} - engines: {node: '>= 10.0.0'} - peerDependencies: - '@babel/core': ^7.0.0 - '@types/babel__core': ^7.1.9 - rollup: ^1.20.0||^2.0.0 - peerDependenciesMeta: - '@types/babel__core': - optional: true + '@rollup/plugin-babel@5.3.1(@babel/core@7.24.5)(@types/babel__core@7.20.5)(rollup@2.79.1)': dependencies: '@babel/core': 7.24.5 '@babel/helper-module-imports': 7.24.3 '@rollup/pluginutils': 3.1.0(rollup@2.79.1) rollup: 2.79.1 - dev: false + optionalDependencies: + '@types/babel__core': 7.20.5 - /@rollup/plugin-node-resolve@15.2.3(rollup@2.79.1): - resolution: {integrity: sha512-j/lym8nf5E21LwBT4Df1VD6hRO2L2iwUeUmP7litikRsVp1H6NWx20NEp0Y7su+7XGc476GnXXc4kFeZNGmaSQ==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^2.78.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - rollup: - optional: true + '@rollup/plugin-node-resolve@15.2.3(rollup@2.79.1)': dependencies: '@rollup/pluginutils': 5.1.0(rollup@2.79.1) '@types/resolve': 1.20.2 @@ -2885,309 +6925,141 @@ packages: is-builtin-module: 3.2.1 is-module: 1.0.0 resolve: 1.22.8 + optionalDependencies: rollup: 2.79.1 - dev: false - /@rollup/plugin-replace@2.4.2(rollup@2.79.1): - resolution: {integrity: sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==} - peerDependencies: - rollup: ^1.20.0 || ^2.0.0 + '@rollup/plugin-replace@2.4.2(rollup@2.79.1)': dependencies: '@rollup/pluginutils': 3.1.0(rollup@2.79.1) magic-string: 0.25.9 rollup: 2.79.1 - dev: false - /@rollup/plugin-terser@0.4.4(rollup@2.79.1): - resolution: {integrity: sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^2.0.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - rollup: - optional: true + '@rollup/plugin-terser@0.4.4(rollup@2.79.1)': dependencies: - rollup: 2.79.1 serialize-javascript: 6.0.2 smob: 1.5.0 terser: 5.31.0 - dev: false + optionalDependencies: + rollup: 2.79.1 - /@rollup/pluginutils@3.1.0(rollup@2.79.1): - resolution: {integrity: sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==} - engines: {node: '>= 8.0.0'} - peerDependencies: - rollup: ^1.20.0||^2.0.0 + '@rollup/pluginutils@3.1.0(rollup@2.79.1)': dependencies: '@types/estree': 0.0.39 estree-walker: 1.0.1 picomatch: 2.3.1 rollup: 2.79.1 - dev: false - /@rollup/pluginutils@5.1.0(rollup@2.79.1): - resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - rollup: - optional: true + '@rollup/pluginutils@5.1.0(rollup@2.79.1)': dependencies: '@types/estree': 1.0.5 estree-walker: 2.0.2 picomatch: 2.3.1 + optionalDependencies: rollup: 2.79.1 - dev: false - /@rollup/rollup-android-arm-eabi@4.14.0: - resolution: {integrity: sha512-jwXtxYbRt1V+CdQSy6Z+uZti7JF5irRKF8hlKfEnF/xJpcNGuuiZMBvuoYM+x9sr9iWGnzrlM0+9hvQ1kgkf1w==} - cpu: [arm] - os: [android] - requiresBuild: true + '@rollup/rollup-android-arm-eabi@4.14.0': optional: true - /@rollup/rollup-android-arm64@4.14.0: - resolution: {integrity: sha512-fI9nduZhCccjzlsA/OuAwtFGWocxA4gqXGTLvOyiF8d+8o0fZUeSztixkYjcGq1fGZY3Tkq4yRvHPFxU+jdZ9Q==} - cpu: [arm64] - os: [android] - requiresBuild: true + '@rollup/rollup-android-arm64@4.14.0': optional: true - /@rollup/rollup-darwin-arm64@4.14.0: - resolution: {integrity: sha512-BcnSPRM76/cD2gQC+rQNGBN6GStBs2pl/FpweW8JYuz5J/IEa0Fr4AtrPv766DB/6b2MZ/AfSIOSGw3nEIP8SA==} - cpu: [arm64] - os: [darwin] - requiresBuild: true + '@rollup/rollup-darwin-arm64@4.14.0': optional: true - /@rollup/rollup-darwin-x64@4.14.0: - resolution: {integrity: sha512-LDyFB9GRolGN7XI6955aFeI3wCdCUszFWumWU0deHA8VpR3nWRrjG6GtGjBrQxQKFevnUTHKCfPR4IvrW3kCgQ==} - cpu: [x64] - os: [darwin] - requiresBuild: true + '@rollup/rollup-darwin-x64@4.14.0': optional: true - /@rollup/rollup-linux-arm-gnueabihf@4.14.0: - resolution: {integrity: sha512-ygrGVhQP47mRh0AAD0zl6QqCbNsf0eTo+vgwkY6LunBcg0f2Jv365GXlDUECIyoXp1kKwL5WW6rsO429DBY/bA==} - cpu: [arm] - os: [linux] - requiresBuild: true + '@rollup/rollup-linux-arm-gnueabihf@4.14.0': optional: true - /@rollup/rollup-linux-arm64-gnu@4.14.0: - resolution: {integrity: sha512-x+uJ6MAYRlHGe9wi4HQjxpaKHPM3d3JjqqCkeC5gpnnI6OWovLdXTpfa8trjxPLnWKyBsSi5kne+146GAxFt4A==} - cpu: [arm64] - os: [linux] - requiresBuild: true + '@rollup/rollup-linux-arm64-gnu@4.14.0': optional: true - /@rollup/rollup-linux-arm64-musl@4.14.0: - resolution: {integrity: sha512-nrRw8ZTQKg6+Lttwqo6a2VxR9tOroa2m91XbdQ2sUUzHoedXlsyvY1fN4xWdqz8PKmf4orDwejxXHjh7YBGUCA==} - cpu: [arm64] - os: [linux] - requiresBuild: true + '@rollup/rollup-linux-arm64-musl@4.14.0': optional: true - /@rollup/rollup-linux-powerpc64le-gnu@4.14.0: - resolution: {integrity: sha512-xV0d5jDb4aFu84XKr+lcUJ9y3qpIWhttO3Qev97z8DKLXR62LC3cXT/bMZXrjLF9X+P5oSmJTzAhqwUbY96PnA==} - cpu: [ppc64le] - os: [linux] - requiresBuild: true + '@rollup/rollup-linux-powerpc64le-gnu@4.14.0': optional: true - /@rollup/rollup-linux-riscv64-gnu@4.14.0: - resolution: {integrity: sha512-SDDhBQwZX6LPRoPYjAZWyL27LbcBo7WdBFWJi5PI9RPCzU8ijzkQn7tt8NXiXRiFMJCVpkuMkBf4OxSxVMizAw==} - cpu: [riscv64] - os: [linux] - requiresBuild: true + '@rollup/rollup-linux-riscv64-gnu@4.14.0': optional: true - /@rollup/rollup-linux-s390x-gnu@4.14.0: - resolution: {integrity: sha512-RxB/qez8zIDshNJDufYlTT0ZTVut5eCpAZ3bdXDU9yTxBzui3KhbGjROK2OYTTor7alM7XBhssgoO3CZ0XD3qA==} - cpu: [s390x] - os: [linux] - requiresBuild: true + '@rollup/rollup-linux-s390x-gnu@4.14.0': optional: true - /@rollup/rollup-linux-x64-gnu@4.14.0: - resolution: {integrity: sha512-C6y6z2eCNCfhZxT9u+jAM2Fup89ZjiG5pIzZIDycs1IwESviLxwkQcFRGLjnDrP+PT+v5i4YFvlcfAs+LnreXg==} - cpu: [x64] - os: [linux] - requiresBuild: true + '@rollup/rollup-linux-x64-gnu@4.14.0': optional: true - /@rollup/rollup-linux-x64-musl@4.14.0: - resolution: {integrity: sha512-i0QwbHYfnOMYsBEyjxcwGu5SMIi9sImDVjDg087hpzXqhBSosxkE7gyIYFHgfFl4mr7RrXksIBZ4DoLoP4FhJg==} - cpu: [x64] - os: [linux] - requiresBuild: true + '@rollup/rollup-linux-x64-musl@4.14.0': optional: true - /@rollup/rollup-win32-arm64-msvc@4.14.0: - resolution: {integrity: sha512-Fq52EYb0riNHLBTAcL0cun+rRwyZ10S9vKzhGKKgeD+XbwunszSY0rVMco5KbOsTlwovP2rTOkiII/fQ4ih/zQ==} - cpu: [arm64] - os: [win32] - requiresBuild: true + '@rollup/rollup-win32-arm64-msvc@4.14.0': optional: true - /@rollup/rollup-win32-ia32-msvc@4.14.0: - resolution: {integrity: sha512-e/PBHxPdJ00O9p5Ui43+vixSgVf4NlLsmV6QneGERJ3lnjIua/kim6PRFe3iDueT1rQcgSkYP8ZBBXa/h4iPvw==} - cpu: [ia32] - os: [win32] - requiresBuild: true + '@rollup/rollup-win32-ia32-msvc@4.14.0': optional: true - /@rollup/rollup-win32-x64-msvc@4.14.0: - resolution: {integrity: sha512-aGg7iToJjdklmxlUlJh/PaPNa4PmqHfyRMLunbL3eaMO0gp656+q1zOKkpJ/CVe9CryJv6tAN1HDoR8cNGzkag==} - cpu: [x64] - os: [win32] - requiresBuild: true + '@rollup/rollup-win32-x64-msvc@4.14.0': optional: true - /@sideway/address@4.1.5: - resolution: {integrity: sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==} + '@sideway/address@4.1.5': dependencies: '@hapi/hoek': 9.3.0 - dev: true - /@sideway/formula@3.0.1: - resolution: {integrity: sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==} - dev: true + '@sideway/formula@3.0.1': {} - /@sideway/pinpoint@2.0.0: - resolution: {integrity: sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==} - dev: true + '@sideway/pinpoint@2.0.0': {} - /@sinclair/typebox@0.27.8: - resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} - dev: true + '@sinclair/typebox@0.27.8': {} - /@sindresorhus/is@4.6.0: - resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} - engines: {node: '>=10'} - dev: true + '@sindresorhus/is@4.6.0': {} - /@sinonjs/commons@3.0.1: - resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} + '@sinonjs/commons@3.0.1': dependencies: type-detect: 4.0.8 - dev: true - /@sinonjs/fake-timers@10.3.0: - resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} + '@sinonjs/fake-timers@10.3.0': dependencies: '@sinonjs/commons': 3.0.1 - dev: true - /@surma/rollup-plugin-off-main-thread@2.2.3: - resolution: {integrity: sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==} + '@surma/rollup-plugin-off-main-thread@2.2.3': dependencies: ejs: 3.1.10 json5: 2.2.3 magic-string: 0.25.9 string.prototype.matchall: 4.0.11 - dev: false - /@swc/core-darwin-arm64@1.4.8: - resolution: {integrity: sha512-hhQCffRTgzpTIbngSnC30vV6IJVTI9FFBF954WEsshsecVoCGFiMwazBbrkLG+RwXENTrMhgeREEFh6R3KRgKQ==} - engines: {node: '>=10'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true + '@swc/core-darwin-arm64@1.4.8': optional: true - /@swc/core-darwin-x64@1.4.8: - resolution: {integrity: sha512-P3ZBw8Jr8rKhY/J8d+6WqWriqngGTgHwtFeJ8MIakQJTbdYbFgXSZxcvDiERg3psbGeFXaUaPI0GO6BXv9k/OQ==} - engines: {node: '>=10'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true + '@swc/core-darwin-x64@1.4.8': optional: true - /@swc/core-linux-arm-gnueabihf@1.4.8: - resolution: {integrity: sha512-PP9JIJt19bUWhAGcQW6qMwTjZOcMyzkvZa0/LWSlDm0ORYVLmDXUoeQbGD3e0Zju9UiZxyulnpjEN0ZihJgPTA==} - engines: {node: '>=10'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true + '@swc/core-linux-arm-gnueabihf@1.4.8': optional: true - /@swc/core-linux-arm64-gnu@1.4.8: - resolution: {integrity: sha512-HvEWnwKHkoVUr5iftWirTApFJ13hGzhAY2CMw4lz9lur2m+zhPviRRED0FCI6T95Knpv7+8eUOr98Z7ctrG6DQ==} - engines: {node: '>=10'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true + '@swc/core-linux-arm64-gnu@1.4.8': optional: true - /@swc/core-linux-arm64-musl@1.4.8: - resolution: {integrity: sha512-kY8+qa7k/dEeBq9p0Hrta18QnJPpsiJvDQSLNaTIFpdM3aEM9zbkshWz8gaX5VVGUEALowCBUWqmzO4VaqM+2w==} - engines: {node: '>=10'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true + '@swc/core-linux-arm64-musl@1.4.8': optional: true - /@swc/core-linux-x64-gnu@1.4.8: - resolution: {integrity: sha512-0WWyIw432wpO/zeGblwq4f2YWam4pn8Z/Ig4KzHMgthR/KmiLU3f0Z7eo45eVmq5vcU7Os1zi/Zb65OOt09q/w==} - engines: {node: '>=10'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true + '@swc/core-linux-x64-gnu@1.4.8': optional: true - /@swc/core-linux-x64-musl@1.4.8: - resolution: {integrity: sha512-p4yxvVS05rBNCrBaSTa20KK88vOwtg8ifTW7ec/yoab0bD5EwzzB8KbDmLLxE6uziFa0sdjF0dfRDwSZPex37Q==} - engines: {node: '>=10'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true + '@swc/core-linux-x64-musl@1.4.8': optional: true - /@swc/core-win32-arm64-msvc@1.4.8: - resolution: {integrity: sha512-jKuXihxAaqUnbFfvPxtmxjdJfs87F1GdBf33il+VUmSyWCP4BE6vW+/ReDAe8sRNsKyrZ3UH1vI5q1n64csBUA==} - engines: {node: '>=10'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true + '@swc/core-win32-arm64-msvc@1.4.8': optional: true - /@swc/core-win32-ia32-msvc@1.4.8: - resolution: {integrity: sha512-O0wT4AGHrX8aBeH6c2ADMHgagAJc5Kf6W48U5moyYDAkkVnKvtSc4kGhjWhe1Yl0sI0cpYh2In2FxvYsb44eWw==} - engines: {node: '>=10'} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true + '@swc/core-win32-ia32-msvc@1.4.8': optional: true - /@swc/core-win32-x64-msvc@1.4.8: - resolution: {integrity: sha512-C2AYc3A2o+ECciqsJWRgIpp83Vk5EaRzHe7ed/xOWzVd0MsWR+fweEsyOjlmzHfpUxJSi46Ak3/BIZJlhZbXbg==} - engines: {node: '>=10'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true + '@swc/core-win32-x64-msvc@1.4.8': optional: true - /@swc/core@1.4.8: - resolution: {integrity: sha512-uY2RSJcFPgNOEg12RQZL197LZX+MunGiKxsbxmh22VfVxrOYGRvh4mPANFlrD1yb38CgmW1wI6YgIi8LkIwmWg==} - engines: {node: '>=10'} - requiresBuild: true - peerDependencies: - '@swc/helpers': ^0.5.0 - peerDependenciesMeta: - '@swc/helpers': - optional: true + '@swc/core@1.4.8': dependencies: '@swc/counter': 0.1.3 '@swc/types': 0.1.6 @@ -3202,28 +7074,18 @@ packages: '@swc/core-win32-arm64-msvc': 1.4.8 '@swc/core-win32-ia32-msvc': 1.4.8 '@swc/core-win32-x64-msvc': 1.4.8 - dev: true - /@swc/counter@0.1.3: - resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} - dev: true + '@swc/counter@0.1.3': {} - /@swc/types@0.1.6: - resolution: {integrity: sha512-/JLo/l2JsT/LRd80C3HfbmVpxOAJ11FO2RCEslFrgzLltoP9j8XIbsyDcfCt2WWyX+CM96rBoNM+IToAkFOugg==} + '@swc/types@0.1.6': dependencies: '@swc/counter': 0.1.3 - dev: true - /@szmarczak/http-timer@4.0.6: - resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} - engines: {node: '>=10'} + '@szmarczak/http-timer@4.0.6': dependencies: defer-to-connect: 2.0.1 - dev: true - /@testing-library/dom@10.1.0: - resolution: {integrity: sha512-wdsYKy5zupPyLCW2Je5DLHSxSfbIp6h80WoHOQc+RPtmPGA52O9x5MJEkv92Sjonpq+poOAtUKhh1kBGAXBrNA==} - engines: {node: '>=18'} + '@testing-library/dom@10.1.0': dependencies: '@babel/code-frame': 7.24.2 '@babel/runtime': 7.24.5 @@ -3233,11 +7095,8 @@ packages: dom-accessibility-api: 0.5.16 lz-string: 1.5.0 pretty-format: 27.5.1 - dev: true - /@testing-library/dom@9.3.4: - resolution: {integrity: sha512-FlS4ZWlp97iiNWig0Muq8p+3rVDjRiYE+YKGbAqXOu9nwJFFOdL00kFpz42M+4huzYi86vAK1sOOfyOG45muIQ==} - engines: {node: '>=14'} + '@testing-library/dom@9.3.4': dependencies: '@babel/code-frame': 7.24.2 '@babel/runtime': 7.24.1 @@ -3247,344 +7106,199 @@ packages: dom-accessibility-api: 0.5.16 lz-string: 1.5.0 pretty-format: 27.5.1 - dev: true - /@testing-library/jest-dom@6.4.2(@types/jest@29.5.12)(jest@29.7.0): - resolution: {integrity: sha512-CzqH0AFymEMG48CpzXFriYYkOjk6ZGPCLMhW9e9jg3KMCn5OfJecF8GtGW7yGfR/IgCe3SX8BSwjdzI6BBbZLw==} - engines: {node: '>=14', npm: '>=6', yarn: '>=1'} - peerDependencies: - '@jest/globals': '>= 28' - '@types/bun': latest - '@types/jest': '>= 28' - jest: '>= 28' - vitest: '>= 0.32' - peerDependenciesMeta: - '@jest/globals': - optional: true - '@types/bun': - optional: true - '@types/jest': - optional: true - jest: - optional: true - vitest: - optional: true + '@testing-library/jest-dom@6.4.2(@jest/globals@29.7.0)(@types/jest@29.5.12)(jest@29.7.0(@types/node@20.11.30)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.4.8)(@types/node@20.11.30)(typescript@5.4.2)))': dependencies: '@adobe/css-tools': 4.3.3 '@babel/runtime': 7.24.1 - '@types/jest': 29.5.12 aria-query: 5.3.0 chalk: 3.0.0 css.escape: 1.5.1 dom-accessibility-api: 0.6.3 - jest: 29.7.0(@types/node@20.11.30)(ts-node@10.9.2) lodash: 4.17.21 redent: 3.0.0 - dev: true + optionalDependencies: + '@jest/globals': 29.7.0 + '@types/jest': 29.5.12 + jest: 29.7.0(@types/node@20.11.30)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.4.8)(@types/node@20.11.30)(typescript@5.4.2)) - /@testing-library/react@14.2.2(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-SOUuM2ysCvjUWBXTNfQ/ztmnKDmqaiPV3SvoIuyxMUca45rbSWWAT/qB8CUs/JQ/ux/8JFs9DNdFQ3f6jH3crA==} - engines: {node: '>=14'} - peerDependencies: - react: ^18.0.0 - react-dom: ^18.0.0 + '@testing-library/react@14.2.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@babel/runtime': 7.24.1 '@testing-library/dom': 9.3.4 '@types/react-dom': 18.2.22 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - dev: true - /@testing-library/user-event@14.5.2(@testing-library/dom@10.1.0): - resolution: {integrity: sha512-YAh82Wh4TIrxYLmfGcixwD18oIjyC1pFQC2Y01F2lzV2HTMiYrI0nze0FD0ocB//CKS/7jIUgae+adPqxK5yCQ==} - engines: {node: '>=12', npm: '>=6'} - peerDependencies: - '@testing-library/dom': '>=7.21.4' + '@testing-library/user-event@14.5.2(@testing-library/dom@10.1.0)': dependencies: '@testing-library/dom': 10.1.0 - dev: true - /@tootallnate/once@2.0.0: - resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} - engines: {node: '>= 10'} - dev: true + '@tootallnate/once@2.0.0': {} - /@tsconfig/node10@1.0.9: - resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} - dev: true + '@tsconfig/node10@1.0.9': {} - /@tsconfig/node12@1.0.11: - resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} - dev: true + '@tsconfig/node12@1.0.11': {} - /@tsconfig/node14@1.0.3: - resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} - dev: true + '@tsconfig/node14@1.0.3': {} - /@tsconfig/node16@1.0.4: - resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} - dev: true + '@tsconfig/node16@1.0.4': {} - /@types/aria-query@5.0.4: - resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} - dev: true + '@types/aria-query@5.0.4': {} - /@types/babel__core@7.20.5: - resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + '@types/babel__core@7.20.5': dependencies: '@babel/parser': 7.24.1 '@babel/types': 7.24.0 '@types/babel__generator': 7.6.8 '@types/babel__template': 7.4.4 '@types/babel__traverse': 7.20.5 - dev: true - /@types/babel__generator@7.6.8: - resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} + '@types/babel__generator@7.6.8': dependencies: '@babel/types': 7.24.0 - dev: true - /@types/babel__template@7.4.4: - resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + '@types/babel__template@7.4.4': dependencies: '@babel/parser': 7.24.1 '@babel/types': 7.24.0 - dev: true - /@types/babel__traverse@7.20.5: - resolution: {integrity: sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==} + '@types/babel__traverse@7.20.5': dependencies: '@babel/types': 7.24.0 - dev: true - /@types/cacheable-request@6.0.3: - resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==} + '@types/cacheable-request@6.0.3': dependencies: '@types/http-cache-semantics': 4.0.4 '@types/keyv': 3.1.4 '@types/node': 20.11.30 '@types/responselike': 1.0.3 - dev: true - /@types/cookie@0.4.1: - resolution: {integrity: sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==} - dev: true - - /@types/debug@4.1.12: - resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} - dependencies: - '@types/ms': 0.7.34 - dev: true + '@types/cookie@0.6.0': {} - /@types/estree@0.0.39: - resolution: {integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==} - dev: false + '@types/estree@0.0.39': {} - /@types/estree@1.0.5: - resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + '@types/estree@1.0.5': {} - /@types/graceful-fs@4.1.9: - resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} + '@types/graceful-fs@4.1.9': dependencies: '@types/node': 20.11.30 - dev: true - /@types/hoist-non-react-statics@3.3.5: - resolution: {integrity: sha512-SbcrWzkKBw2cdwRTwQAswfpB9g9LJWfjtUeW/jvNwbhC8cpmmNYVePa+ncbUe0rGTQ7G3Ff6mYUN2VMfLVr+Sg==} + '@types/hoist-non-react-statics@3.3.5': dependencies: '@types/react': 18.2.67 hoist-non-react-statics: 3.3.2 - dev: true - /@types/http-cache-semantics@4.0.4: - resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} - dev: true + '@types/http-cache-semantics@4.0.4': {} - /@types/istanbul-lib-coverage@2.0.6: - resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} - dev: true + '@types/istanbul-lib-coverage@2.0.6': {} - /@types/istanbul-lib-report@3.0.3: - resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} + '@types/istanbul-lib-report@3.0.3': dependencies: '@types/istanbul-lib-coverage': 2.0.6 - dev: true - /@types/istanbul-reports@3.0.4: - resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} + '@types/istanbul-reports@3.0.4': dependencies: '@types/istanbul-lib-report': 3.0.3 - dev: true - /@types/jest@29.5.12: - resolution: {integrity: sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==} + '@types/jest@29.5.12': dependencies: expect: 29.7.0 pretty-format: 29.7.0 - dev: true - - /@types/js-levenshtein@1.1.3: - resolution: {integrity: sha512-jd+Q+sD20Qfu9e2aEXogiO3vpOC1PYJOUdyN9gvs4Qrvkg4wF43L5OhqrPeokdv8TL0/mXoYfpkcoGZMNN2pkQ==} - dev: true - /@types/jsdom@20.0.1: - resolution: {integrity: sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==} + '@types/jsdom@20.0.1': dependencies: '@types/node': 20.11.30 '@types/tough-cookie': 4.0.5 parse5: 7.1.2 - dev: true - /@types/json-schema@7.0.15: - resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - dev: true + '@types/json-schema@7.0.15': {} - /@types/json5@0.0.29: - resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - dev: true + '@types/json5@0.0.29': {} - /@types/keyv@3.1.4: - resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} + '@types/keyv@3.1.4': dependencies: '@types/node': 20.11.30 - dev: true - /@types/lodash.camelcase@4.3.9: - resolution: {integrity: sha512-ys9/hGBfsKxzmFI8hckII40V0ASQ83UM2pxfQRghHAwekhH4/jWtjz/3/9YDy7ZpUd/H0k2STSqmPR28dnj7Zg==} + '@types/lodash.camelcase@4.3.9': dependencies: '@types/lodash': 4.17.0 - dev: true - - /@types/lodash@4.17.0: - resolution: {integrity: sha512-t7dhREVv6dbNj0q17X12j7yDG4bD/DHYX7o5/DbDxobP0HnGPgpRz2Ej77aL7TZT3DSw13fqUTj8J4mMnqa7WA==} - dev: true - /@types/ms@0.7.34: - resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} - dev: true + '@types/lodash@4.17.0': {} - /@types/mute-stream@0.0.4: - resolution: {integrity: sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow==} + '@types/mute-stream@0.0.4': dependencies: - '@types/node': 20.11.30 - dev: true + '@types/node': 20.12.7 - /@types/node-fetch@2.6.11: - resolution: {integrity: sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==} + '@types/node-fetch@2.6.11': dependencies: '@types/node': 20.11.30 form-data: 4.0.0 - dev: true - /@types/node@20.11.30: - resolution: {integrity: sha512-dHM6ZxwlmuZaRmUPfv1p+KrdD1Dci04FbdEm/9wEMouFqxYoFl5aMkt0VMAUtYRQDyYvD41WJLukhq/ha3YuTw==} + '@types/node@20.11.30': dependencies: undici-types: 5.26.5 - /@types/parse-json@4.0.2: - resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} - dev: false + '@types/node@20.12.7': + dependencies: + undici-types: 5.26.5 - /@types/prop-types@15.7.11: - resolution: {integrity: sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==} + '@types/parse-json@4.0.2': {} - /@types/react-dom@18.2.22: - resolution: {integrity: sha512-fHkBXPeNtfvri6gdsMYyW+dW7RXFo6Ad09nLFK0VQWR7yGLai/Cyvyj696gbwYvBnhGtevUG9cET0pmUbMtoPQ==} + '@types/prop-types@15.7.11': {} + + '@types/react-dom@18.2.22': dependencies: '@types/react': 18.2.67 - dev: true - /@types/react-redux@7.1.33: - resolution: {integrity: sha512-NF8m5AjWCkert+fosDsN3hAlHzpjSiXlVy9EgQEmLoBhaNXbmyeGs/aj5dQzKuF+/q+S7JQagorGDW8pJ28Hmg==} + '@types/react-redux@7.1.33': dependencies: '@types/hoist-non-react-statics': 3.3.5 '@types/react': 18.2.67 hoist-non-react-statics: 3.3.2 redux: 4.2.1 - dev: true - /@types/react-transition-group@4.4.10: - resolution: {integrity: sha512-hT/+s0VQs2ojCX823m60m5f0sL5idt9SO6Tj6Dg+rdphGPIeJbJ6CxvBYkgkGKrYeDjvIpKTR38UzmtHJOGW3Q==} + '@types/react-transition-group@4.4.10': dependencies: '@types/react': 18.2.67 - dev: false - /@types/react@18.2.67: - resolution: {integrity: sha512-vkIE2vTIMHQ/xL0rgmuoECBCkZFZeHr49HeWSc24AptMbNRo7pwSBvj73rlJJs9fGKj0koS+V7kQB1jHS0uCgw==} + '@types/react@18.2.67': dependencies: '@types/prop-types': 15.7.11 '@types/scheduler': 0.16.8 csstype: 3.1.3 - /@types/resolve@1.20.2: - resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} - dev: false + '@types/resolve@1.20.2': {} - /@types/responselike@1.0.3: - resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} + '@types/responselike@1.0.3': dependencies: '@types/node': 20.11.30 - dev: true - /@types/scheduler@0.16.8: - resolution: {integrity: sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==} + '@types/scheduler@0.16.8': {} - /@types/semver@7.5.8: - resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} - dev: true + '@types/semver@7.5.8': {} - /@types/set-cookie-parser@2.4.7: - resolution: {integrity: sha512-+ge/loa0oTozxip6zmhRIk8Z/boU51wl9Q6QdLZcokIGMzY5lFXYy/x7Htj2HTC6/KZP1hUbZ1ekx8DYXICvWg==} - dependencies: - '@types/node': 20.11.30 - dev: true + '@types/stack-utils@2.0.3': {} - /@types/stack-utils@2.0.3: - resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} - dev: true + '@types/statuses@2.0.5': {} - /@types/tough-cookie@4.0.5: - resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==} - dev: true + '@types/tough-cookie@4.0.5': {} - /@types/triple-beam@1.3.5: - resolution: {integrity: sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==} - dev: true + '@types/triple-beam@1.3.5': {} - /@types/trusted-types@2.0.7: - resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} - dev: false + '@types/trusted-types@2.0.7': {} - /@types/use-sync-external-store@0.0.3: - resolution: {integrity: sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA==} - dev: false + '@types/use-sync-external-store@0.0.3': {} - /@types/wrap-ansi@3.0.0: - resolution: {integrity: sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g==} - dev: true + '@types/wrap-ansi@3.0.0': {} - /@types/yargs-parser@21.0.3: - resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} - dev: true + '@types/yargs-parser@21.0.3': {} - /@types/yargs@17.0.32: - resolution: {integrity: sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==} + '@types/yargs@17.0.32': dependencies: '@types/yargs-parser': 21.0.3 - dev: true - /@typescript-eslint/eslint-plugin@7.4.0(@typescript-eslint/parser@7.4.0)(eslint@8.57.0)(typescript@5.4.2): - resolution: {integrity: sha512-yHMQ/oFaM7HZdVrVm/M2WHaNPgyuJH4WelkSVEWSSsir34kxW2kDJCxlXRhhGWEsMN0WAW/vLpKfKVcm8k+MPw==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - '@typescript-eslint/parser': ^7.0.0 - eslint: ^8.56.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@typescript-eslint/eslint-plugin@7.4.0(@typescript-eslint/parser@7.4.0(eslint@8.57.0)(typescript@5.4.2))(eslint@8.57.0)(typescript@5.4.2)': dependencies: '@eslint-community/regexpp': 4.10.0 '@typescript-eslint/parser': 7.4.0(eslint@8.57.0)(typescript@5.4.2) @@ -3599,20 +7313,12 @@ packages: natural-compare: 1.4.0 semver: 7.6.0 ts-api-utils: 1.3.0(typescript@5.4.2) + optionalDependencies: typescript: 5.4.2 transitivePeerDependencies: - supports-color - dev: true - /@typescript-eslint/parser@7.4.0(eslint@8.57.0)(typescript@5.4.2): - resolution: {integrity: sha512-ZvKHxHLusweEUVwrGRXXUVzFgnWhigo4JurEj0dGF1tbcGh6buL+ejDdjxOQxv6ytcY1uhun1p2sm8iWStlgLQ==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - eslint: ^8.56.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@typescript-eslint/parser@7.4.0(eslint@8.57.0)(typescript@5.4.2)': dependencies: '@typescript-eslint/scope-manager': 7.4.0 '@typescript-eslint/types': 7.4.0 @@ -3620,52 +7326,31 @@ packages: '@typescript-eslint/visitor-keys': 7.4.0 debug: 4.3.4 eslint: 8.57.0 + optionalDependencies: typescript: 5.4.2 transitivePeerDependencies: - supports-color - dev: true - /@typescript-eslint/scope-manager@7.4.0: - resolution: {integrity: sha512-68VqENG5HK27ypafqLVs8qO+RkNc7TezCduYrx8YJpXq2QGZ30vmNZGJJJC48+MVn4G2dCV8m5ZTVnzRexTVtw==} - engines: {node: ^18.18.0 || >=20.0.0} + '@typescript-eslint/scope-manager@7.4.0': dependencies: '@typescript-eslint/types': 7.4.0 '@typescript-eslint/visitor-keys': 7.4.0 - dev: true - /@typescript-eslint/type-utils@7.4.0(eslint@8.57.0)(typescript@5.4.2): - resolution: {integrity: sha512-247ETeHgr9WTRMqHbbQdzwzhuyaJ8dPTuyuUEMANqzMRB1rj/9qFIuIXK7l0FX9i9FXbHeBQl/4uz6mYuCE7Aw==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - eslint: ^8.56.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@typescript-eslint/type-utils@7.4.0(eslint@8.57.0)(typescript@5.4.2)': dependencies: '@typescript-eslint/typescript-estree': 7.4.0(typescript@5.4.2) '@typescript-eslint/utils': 7.4.0(eslint@8.57.0)(typescript@5.4.2) debug: 4.3.4 eslint: 8.57.0 ts-api-utils: 1.3.0(typescript@5.4.2) + optionalDependencies: typescript: 5.4.2 transitivePeerDependencies: - supports-color - dev: true - /@typescript-eslint/types@7.4.0: - resolution: {integrity: sha512-mjQopsbffzJskos5B4HmbsadSJQWaRK0UxqQ7GuNA9Ga4bEKeiO6b2DnB6cM6bpc8lemaPseh0H9B/wyg+J7rw==} - engines: {node: ^18.18.0 || >=20.0.0} - dev: true + '@typescript-eslint/types@7.4.0': {} - /@typescript-eslint/typescript-estree@7.4.0(typescript@5.4.2): - resolution: {integrity: sha512-A99j5AYoME/UBQ1ucEbbMEmGkN7SE0BvZFreSnTd1luq7yulcHdyGamZKizU7canpGDWGJ+Q6ZA9SyQobipePg==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@typescript-eslint/typescript-estree@7.4.0(typescript@5.4.2)': dependencies: '@typescript-eslint/types': 7.4.0 '@typescript-eslint/visitor-keys': 7.4.0 @@ -3675,16 +7360,12 @@ packages: minimatch: 9.0.3 semver: 7.6.0 ts-api-utils: 1.3.0(typescript@5.4.2) + optionalDependencies: typescript: 5.4.2 transitivePeerDependencies: - supports-color - dev: true - /@typescript-eslint/utils@7.4.0(eslint@8.57.0)(typescript@5.4.2): - resolution: {integrity: sha512-NQt9QLM4Tt8qrlBVY9lkMYzfYtNz8/6qwZg8pI3cMGlPnj6mOpRxxAm7BMJN9K0AiY+1BwJ5lVC650YJqYOuNg==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - eslint: ^8.56.0 + '@typescript-eslint/utils@7.4.0(eslint@8.57.0)(typescript@5.4.2)': dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) '@types/json-schema': 7.0.15 @@ -3697,248 +7378,141 @@ packages: transitivePeerDependencies: - supports-color - typescript - dev: true - /@typescript-eslint/visitor-keys@7.4.0: - resolution: {integrity: sha512-0zkC7YM0iX5Y41homUUeW1CHtZR01K3ybjM1l6QczoMuay0XKtrb93kv95AxUGwdjGr64nNqnOCwmEl616N8CA==} - engines: {node: ^18.18.0 || >=20.0.0} + '@typescript-eslint/visitor-keys@7.4.0': dependencies: '@typescript-eslint/types': 7.4.0 eslint-visitor-keys: 3.4.3 - dev: true - /@ungap/structured-clone@1.2.0: - resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} - dev: true + '@ungap/structured-clone@1.2.0': {} - /@vitejs/plugin-react-swc@3.6.0(vite@5.2.6): - resolution: {integrity: sha512-XFRbsGgpGxGzEV5i5+vRiro1bwcIaZDIdBRP16qwm+jP68ue/S8FJTBEgOeojtVDYrbSua3XFp71kC8VJE6v+g==} - peerDependencies: - vite: ^4 || ^5 + '@vitejs/plugin-react-swc@3.6.0(vite@5.2.6(@types/node@20.11.30)(terser@5.31.0))': dependencies: '@swc/core': 1.4.8 - vite: 5.2.6(@types/node@20.11.30) + vite: 5.2.6(@types/node@20.11.30)(terser@5.31.0) transitivePeerDependencies: - '@swc/helpers' - dev: true - - /@xmldom/xmldom@0.8.10: - resolution: {integrity: sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==} - engines: {node: '>=10.0.0'} - dev: true - /@zxing/text-encoding@0.9.0: - resolution: {integrity: sha512-U/4aVJ2mxI0aDNI8Uq0wEhMgY+u4CNtEb0om3+y3+niDAsoTCOB33UF0sxpzqzdqXLqmvc+vZyAt4O8pPdfkwA==} - requiresBuild: true - dev: true - optional: true - - /JSONStream@1.3.5: - resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} - hasBin: true + JSONStream@1.3.5: dependencies: jsonparse: 1.3.1 through: 2.3.8 - dev: true - /abab@2.0.6: - resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} - deprecated: Use your platform's native atob() and btoa() methods instead - dev: true + abab@2.0.6: {} - /acorn-globals@7.0.1: - resolution: {integrity: sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==} + acorn-globals@7.0.1: dependencies: acorn: 8.11.3 acorn-walk: 8.3.2 - dev: true - /acorn-jsx@5.3.2(acorn@8.11.3): - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + acorn-jsx@5.3.2(acorn@8.11.3): dependencies: acorn: 8.11.3 - dev: true - /acorn-walk@8.3.2: - resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} - engines: {node: '>=0.4.0'} - dev: true + acorn-walk@8.3.2: {} - /acorn@8.11.3: - resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} - engines: {node: '>=0.4.0'} - hasBin: true + acorn@8.11.3: {} - /agent-base@6.0.2: - resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} - engines: {node: '>= 6.0.0'} + agent-base@6.0.2: dependencies: debug: 4.3.4 transitivePeerDependencies: - supports-color - dev: true - /ajv-formats@2.1.1(ajv@8.12.0): - resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} - peerDependencies: - ajv: ^8.0.0 - peerDependenciesMeta: - ajv: - optional: true - dependencies: + ajv-formats@2.1.1(ajv@8.12.0): + optionalDependencies: ajv: 8.12.0 - dev: true - /ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + ajv@6.12.6: dependencies: fast-deep-equal: 3.1.3 fast-json-stable-stringify: 2.1.0 json-schema-traverse: 0.4.1 uri-js: 4.4.1 - dev: true - /ajv@8.12.0: - resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} + ajv@8.12.0: dependencies: fast-deep-equal: 3.1.3 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 uri-js: 4.4.1 - dev: true - /ajv@8.13.0: - resolution: {integrity: sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==} + ajv@8.13.0: dependencies: fast-deep-equal: 3.1.3 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 uri-js: 4.4.1 - dev: false - /ansi-align@3.0.1: - resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} + ansi-align@3.0.1: dependencies: string-width: 4.2.3 - dev: true - /ansi-escapes@4.3.2: - resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} - engines: {node: '>=8'} + ansi-escapes@4.3.2: dependencies: type-fest: 0.21.3 - dev: true - /ansi-escapes@6.2.0: - resolution: {integrity: sha512-kzRaCqXnpzWs+3z5ABPQiVke+iq0KXkHo8xiWV4RPTi5Yli0l97BEQuhXV1s7+aSU/fu1kUuxgS4MsQ0fRuygw==} - engines: {node: '>=14.16'} + ansi-escapes@6.2.0: dependencies: type-fest: 3.13.1 - dev: true - /ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - dev: true + ansi-regex@5.0.1: {} - /ansi-regex@6.0.1: - resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} - engines: {node: '>=12'} - dev: true + ansi-regex@6.0.1: {} - /ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} + ansi-styles@3.2.1: dependencies: color-convert: 1.9.3 - /ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} + ansi-styles@4.3.0: dependencies: color-convert: 2.0.1 - /ansi-styles@5.2.0: - resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} - engines: {node: '>=10'} - dev: true + ansi-styles@5.2.0: {} - /ansi-styles@6.2.1: - resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} - engines: {node: '>=12'} - dev: true + ansi-styles@6.2.1: {} - /anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} + anymatch@3.1.3: dependencies: normalize-path: 3.0.0 picomatch: 2.3.1 - dev: true - /arch@2.2.0: - resolution: {integrity: sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==} - dev: true + arch@2.2.0: {} - /arg@4.1.3: - resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} - dev: true + arg@4.1.3: {} - /argparse@1.0.10: - resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + argparse@1.0.10: dependencies: sprintf-js: 1.0.3 - dev: true - /argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - dev: true + argparse@2.0.1: {} - /aria-query@5.1.3: - resolution: {integrity: sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==} + aria-query@5.1.3: dependencies: deep-equal: 2.2.3 - dev: true - /aria-query@5.3.0: - resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} + aria-query@5.3.0: dependencies: dequal: 2.0.3 - dev: true - /array-buffer-byte-length@1.0.1: - resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} - engines: {node: '>= 0.4'} + array-buffer-byte-length@1.0.1: dependencies: call-bind: 1.0.7 is-array-buffer: 3.0.4 - /array-find-index@1.0.2: - resolution: {integrity: sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==} - engines: {node: '>=0.10.0'} - dev: true + array-find-index@1.0.2: {} - /array-includes@3.1.7: - resolution: {integrity: sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==} - engines: {node: '>= 0.4'} + array-includes@3.1.7: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.22.5 get-intrinsic: 1.2.4 is-string: 1.0.7 - dev: true - /array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} - dev: true + array-union@2.1.0: {} - /array.prototype.findlast@1.2.5: - resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} - engines: {node: '>= 0.4'} + array.prototype.findlast@1.2.5: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 @@ -3946,11 +7520,8 @@ packages: es-errors: 1.3.0 es-object-atoms: 1.0.0 es-shim-unscopables: 1.0.2 - dev: true - /array.prototype.findlastindex@1.2.5: - resolution: {integrity: sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==} - engines: {node: '>= 0.4'} + array.prototype.findlastindex@1.2.5: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 @@ -3958,50 +7529,37 @@ packages: es-errors: 1.3.0 es-object-atoms: 1.0.0 es-shim-unscopables: 1.0.2 - dev: true - /array.prototype.flat@1.3.2: - resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} - engines: {node: '>= 0.4'} + array.prototype.flat@1.3.2: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.22.5 es-shim-unscopables: 1.0.2 - dev: true - /array.prototype.flatmap@1.3.2: - resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} - engines: {node: '>= 0.4'} + array.prototype.flatmap@1.3.2: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.22.5 es-shim-unscopables: 1.0.2 - dev: true - /array.prototype.toreversed@1.1.2: - resolution: {integrity: sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==} + array.prototype.toreversed@1.1.2: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.22.5 es-shim-unscopables: 1.0.2 - dev: true - /array.prototype.tosorted@1.1.3: - resolution: {integrity: sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg==} + array.prototype.tosorted@1.1.3: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.22.5 es-errors: 1.3.0 es-shim-unscopables: 1.0.2 - dev: true - /arraybuffer.prototype.slice@1.0.3: - resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} - engines: {node: '>= 0.4'} + arraybuffer.prototype.slice@1.0.3: dependencies: array-buffer-byte-length: 1.0.1 call-bind: 1.0.7 @@ -4012,26 +7570,15 @@ packages: is-array-buffer: 3.0.4 is-shared-array-buffer: 1.0.3 - /async@3.2.5: - resolution: {integrity: sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==} + async@3.2.5: {} - /asynckit@0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + asynckit@0.4.0: {} - /at-least-node@1.0.0: - resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} - engines: {node: '>= 4.0.0'} - dev: false + at-least-node@1.0.0: {} - /atomically@1.7.0: - resolution: {integrity: sha512-Xcz9l0z7y9yQ9rdDaxlmaI4uJHf/T8g9hOEzJcsEqX2SjCj4J20uK7+ldkDHMbpJDK76wF7xEIgxc/vSlsfw5w==} - engines: {node: '>=10.12.0'} - dev: true + atomically@1.7.0: {} - /audit-ci@6.6.1: - resolution: {integrity: sha512-zqZEoYfEC4QwX5yBkDNa0h7YhZC63HWtKtP19BVq+RS0dxRBInfmHogxe4VUeOzoADQjuTLZUI7zp3Pjyl+a5g==} - engines: {node: '>=12.9.0'} - hasBin: true + audit-ci@6.6.1: dependencies: JSONStream: 1.3.5 cross-spawn: 7.0.3 @@ -4041,14 +7588,8 @@ packages: readline-transform: 1.0.0 semver: 7.6.0 yargs: 17.7.2 - dev: true - /autoprefixer@10.4.18(postcss@8.4.38): - resolution: {integrity: sha512-1DKbDfsr6KUElM6wg+0zRNkB/Q7WcKYAaK+pzXn+Xqmszm/5Xa9coeNdtP88Vi+dPzZnMjhge8GIV49ZQkDa+g==} - engines: {node: ^10 || ^12 || >=14} - hasBin: true - peerDependencies: - postcss: ^8.1.0 + autoprefixer@10.4.18(postcss@8.4.38): dependencies: browserslist: 4.23.0 caniuse-lite: 1.0.30001599 @@ -4057,29 +7598,20 @@ packages: picocolors: 1.0.0 postcss: 8.4.38 postcss-value-parser: 4.2.0 - dev: true - /available-typed-arrays@1.0.7: - resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} - engines: {node: '>= 0.4'} + available-typed-arrays@1.0.7: dependencies: possible-typed-array-names: 1.0.0 - /axios@1.6.8: - resolution: {integrity: sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==} + axios@1.6.8: dependencies: follow-redirects: 1.15.6 form-data: 4.0.0 proxy-from-env: 1.1.0 transitivePeerDependencies: - debug - dev: false - /babel-jest@29.7.0(@babel/core@7.24.3): - resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - '@babel/core': ^7.8.0 + babel-jest@29.7.0(@babel/core@7.24.3): dependencies: '@babel/core': 7.24.3 '@jest/transform': 29.7.0 @@ -4091,11 +7623,8 @@ packages: slash: 3.0.0 transitivePeerDependencies: - supports-color - dev: true - /babel-plugin-istanbul@6.1.1: - resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} - engines: {node: '>=8'} + babel-plugin-istanbul@6.1.1: dependencies: '@babel/helper-plugin-utils': 7.24.0 '@istanbuljs/load-nyc-config': 1.1.0 @@ -4104,31 +7633,21 @@ packages: test-exclude: 6.0.0 transitivePeerDependencies: - supports-color - dev: true - /babel-plugin-jest-hoist@29.6.3: - resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + babel-plugin-jest-hoist@29.6.3: dependencies: '@babel/template': 7.24.0 '@babel/types': 7.24.0 '@types/babel__core': 7.20.5 '@types/babel__traverse': 7.20.5 - dev: true - /babel-plugin-macros@3.1.0: - resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} - engines: {node: '>=10', npm: '>=6'} + babel-plugin-macros@3.1.0: dependencies: '@babel/runtime': 7.24.5 cosmiconfig: 7.1.0 resolve: 1.22.8 - dev: false - /babel-plugin-polyfill-corejs2@0.4.11(@babel/core@7.24.5): - resolution: {integrity: sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + babel-plugin-polyfill-corejs2@0.4.11(@babel/core@7.24.5): dependencies: '@babel/compat-data': 7.24.4 '@babel/core': 7.24.5 @@ -4136,35 +7655,23 @@ packages: semver: 6.3.1 transitivePeerDependencies: - supports-color - dev: false - /babel-plugin-polyfill-corejs3@0.10.4(@babel/core@7.24.5): - resolution: {integrity: sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + babel-plugin-polyfill-corejs3@0.10.4(@babel/core@7.24.5): dependencies: '@babel/core': 7.24.5 '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.24.5) core-js-compat: 3.37.0 transitivePeerDependencies: - supports-color - dev: false - /babel-plugin-polyfill-regenerator@0.6.2(@babel/core@7.24.5): - resolution: {integrity: sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + babel-plugin-polyfill-regenerator@0.6.2(@babel/core@7.24.5): dependencies: '@babel/core': 7.24.5 '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.24.5) transitivePeerDependencies: - supports-color - dev: false - /babel-preset-current-node-syntax@1.0.1(@babel/core@7.24.3): - resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} - peerDependencies: - '@babel/core': ^7.0.0 + babel-preset-current-node-syntax@1.0.1(@babel/core@7.24.3): dependencies: '@babel/core': 7.24.3 '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.3) @@ -4179,42 +7686,24 @@ packages: '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.3) '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.3) '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.24.3) - dev: true - /babel-preset-jest@29.6.3(@babel/core@7.24.3): - resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - '@babel/core': ^7.0.0 + babel-preset-jest@29.6.3(@babel/core@7.24.3): dependencies: '@babel/core': 7.24.3 babel-plugin-jest-hoist: 29.6.3 babel-preset-current-node-syntax: 1.0.1(@babel/core@7.24.3) - dev: true - /balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - /base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - dev: true + balanced-match@1.0.2: {} - /binary-extensions@2.3.0: - resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} - engines: {node: '>=8'} - dev: true + base64-js@1.5.1: {} - /bl@4.1.0: - resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + bl@4.1.0: dependencies: buffer: 5.7.1 inherits: 2.0.4 readable-stream: 3.6.2 - dev: true - /boxen@5.1.2: - resolution: {integrity: sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==} - engines: {node: '>=10'} + boxen@5.1.2: dependencies: ansi-align: 3.0.1 camelcase: 6.3.0 @@ -4224,71 +7713,47 @@ packages: type-fest: 0.20.2 widest-line: 3.1.0 wrap-ansi: 7.0.0 - dev: true - /brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + brace-expansion@1.1.11: dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 - /brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + brace-expansion@2.0.1: dependencies: balanced-match: 1.0.2 - /braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} - engines: {node: '>=8'} + braces@3.0.2: dependencies: fill-range: 7.0.1 - /browserslist@4.23.0: - resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true + browserslist@4.23.0: dependencies: caniuse-lite: 1.0.30001599 electron-to-chromium: 1.4.711 node-releases: 2.0.14 update-browserslist-db: 1.0.13(browserslist@4.23.0) - /bs-logger@0.2.6: - resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} - engines: {node: '>= 6'} + bs-logger@0.2.6: dependencies: fast-json-stable-stringify: 2.1.0 - dev: true - /bser@2.1.1: - resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} + bser@2.1.1: dependencies: node-int64: 0.4.0 - dev: true - /buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + buffer-from@1.1.2: {} - /buffer@5.7.1: - resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + buffer@5.7.1: dependencies: base64-js: 1.5.1 ieee754: 1.2.1 - dev: true - /builtin-modules@3.3.0: - resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} - engines: {node: '>=6'} - dev: false + builtin-modules@3.3.0: {} - /cacheable-lookup@5.0.4: - resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==} - engines: {node: '>=10.6.0'} - dev: true + cacheable-lookup@5.0.4: {} - /cacheable-request@7.0.4: - resolution: {integrity: sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==} - engines: {node: '>=8'} + cacheable-request@7.0.4: dependencies: clone-response: 1.0.3 get-stream: 5.2.0 @@ -4297,11 +7762,8 @@ packages: lowercase-keys: 2.0.0 normalize-url: 6.1.0 responselike: 2.0.1 - dev: true - /call-bind@1.0.7: - resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} - engines: {node: '>= 0.4'} + call-bind@1.0.7: dependencies: es-define-property: 1.0.0 es-errors: 1.3.0 @@ -4309,237 +7771,123 @@ packages: get-intrinsic: 1.2.4 set-function-length: 1.2.2 - /callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} + callsites@3.1.0: {} - /camelcase@5.3.1: - resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} - engines: {node: '>=6'} - dev: true + camelcase@5.3.1: {} - /camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} - dev: true + camelcase@6.3.0: {} - /caniuse-lite@1.0.30001599: - resolution: {integrity: sha512-LRAQHZ4yT1+f9LemSMeqdMpMxZcc4RMWdj4tiFe3G8tNkWK+E58g+/tzotb5cU6TbcVJLr4fySiAW7XmxQvZQA==} + caniuse-lite@1.0.30001599: {} - /chalk@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} + chalk@2.4.2: dependencies: ansi-styles: 3.2.1 escape-string-regexp: 1.0.5 supports-color: 5.5.0 - /chalk@3.0.0: - resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==} - engines: {node: '>=8'} + chalk@3.0.0: dependencies: ansi-styles: 4.3.0 supports-color: 7.2.0 - dev: true - /chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} + chalk@4.1.2: dependencies: ansi-styles: 4.3.0 supports-color: 7.2.0 - /chalk@5.3.0: - resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - dev: true - - /char-regex@1.0.2: - resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} - engines: {node: '>=10'} - dev: true + chalk@5.3.0: {} - /chardet@0.7.0: - resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} - dev: true + char-regex@1.0.2: {} - /chokidar@3.6.0: - resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} - engines: {node: '>= 8.10.0'} - dependencies: - anymatch: 3.1.3 - braces: 3.0.2 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - dev: true + chardet@0.7.0: {} - /ci-info@2.0.0: - resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==} - dev: true + ci-info@2.0.0: {} - /ci-info@3.9.0: - resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} - engines: {node: '>=8'} - dev: true + ci-info@3.9.0: {} - /cjs-module-lexer@1.2.3: - resolution: {integrity: sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==} - dev: true + cjs-module-lexer@1.2.3: {} - /cli-boxes@2.2.1: - resolution: {integrity: sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==} - engines: {node: '>=6'} - dev: true + cli-boxes@2.2.1: {} - /cli-cursor@3.1.0: - resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} - engines: {node: '>=8'} + cli-cursor@3.1.0: dependencies: restore-cursor: 3.1.0 - dev: true - /cli-cursor@4.0.0: - resolution: {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + cli-cursor@4.0.0: dependencies: restore-cursor: 4.0.0 - dev: true - /cli-spinners@2.9.2: - resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} - engines: {node: '>=6'} - dev: true + cli-spinners@2.9.2: {} - /cli-truncate@4.0.0: - resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==} - engines: {node: '>=18'} + cli-truncate@4.0.0: dependencies: slice-ansi: 5.0.0 string-width: 7.1.0 - dev: true - /cli-width@3.0.0: - resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} - engines: {node: '>= 10'} - dev: true - - /cli-width@4.1.0: - resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} - engines: {node: '>= 12'} - dev: true + cli-width@4.1.0: {} - /cliui@8.0.1: - resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} - engines: {node: '>=12'} + cliui@8.0.1: dependencies: string-width: 4.2.3 strip-ansi: 6.0.1 wrap-ansi: 7.0.0 - dev: true - /clone-response@1.0.3: - resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} + clone-response@1.0.3: dependencies: mimic-response: 1.0.1 - dev: true - - /clone@1.0.4: - resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} - engines: {node: '>=0.8'} - dev: true - /clsx@2.1.0: - resolution: {integrity: sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==} - engines: {node: '>=6'} - dev: false + clone@1.0.4: {} - /co@4.6.0: - resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} - engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} - dev: true + clsx@2.1.0: {} - /collect-v8-coverage@1.0.2: - resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} - dev: true + co@4.6.0: {} - /color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + collect-v8-coverage@1.0.2: {} + + color-convert@1.9.3: dependencies: color-name: 1.1.3 - /color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} + color-convert@2.0.1: dependencies: color-name: 1.1.4 - /color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + color-name@1.1.3: {} - /color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + color-name@1.1.4: {} - /color-string@1.9.1: - resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + color-string@1.9.1: dependencies: color-name: 1.1.4 simple-swizzle: 0.2.2 - dev: true - /color@3.2.1: - resolution: {integrity: sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==} + color@3.2.1: dependencies: color-convert: 1.9.3 color-string: 1.9.1 - dev: true - /colorette@2.0.20: - resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} - dev: true + colorette@2.0.20: {} - /colorspace@1.1.4: - resolution: {integrity: sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==} + colorspace@1.1.4: dependencies: color: 3.2.1 text-hex: 1.0.0 - dev: true - /combined-stream@1.0.8: - resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} - engines: {node: '>= 0.8'} + combined-stream@1.0.8: dependencies: delayed-stream: 1.0.0 - /commander@11.1.0: - resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} - engines: {node: '>=16'} - dev: true + commander@11.1.0: {} - /commander@12.0.0: - resolution: {integrity: sha512-MwVNWlYjDTtOjX5PiD7o5pK0UrFU/OYgcJfjjK4RaHZETNtjJqrZa9Y9ds88+A+f+d5lv+561eZ+yCKoS3gbAA==} - engines: {node: '>=18'} - dev: true + commander@12.0.0: {} - /commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - dev: false + commander@2.20.3: {} - /common-tags@1.8.2: - resolution: {integrity: sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==} - engines: {node: '>=4.0.0'} - dev: false + common-tags@1.8.2: {} - /concat-map@0.0.1: - resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=} + concat-map@0.0.1: {} - /conf@10.2.0: - resolution: {integrity: sha512-8fLl9F04EJqjSqH+QjITQfJF8BrOVaYr1jewVgSRAEWePfxT0sku4w2hrGQ60BC/TNLGQ2pgxNlTbWQmMPFvXg==} - engines: {node: '>=12'} + conf@10.2.0: dependencies: ajv: 8.12.0 ajv-formats: 2.1.1(ajv@8.12.0) @@ -4551,11 +7899,8 @@ packages: onetime: 5.1.2 pkg-up: 3.1.0 semver: 7.6.0 - dev: true - /configstore@5.0.1: - resolution: {integrity: sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==} - engines: {node: '>=8'} + configstore@5.0.1: dependencies: dot-prop: 5.3.0 graceful-fs: 4.2.11 @@ -4563,63 +7908,41 @@ packages: unique-string: 2.0.0 write-file-atomic: 3.0.3 xdg-basedir: 4.0.0 - dev: true - /convert-source-map@1.9.0: - resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} - dev: false + convert-source-map@1.9.0: {} - /convert-source-map@2.0.0: - resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + convert-source-map@2.0.0: {} - /cookie@0.4.2: - resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==} - engines: {node: '>= 0.6'} - dev: true + cookie@0.5.0: {} - /core-js-compat@3.37.0: - resolution: {integrity: sha512-vYq4L+T8aS5UuFg4UwDhc7YNRWVeVZwltad9C/jV3R2LgVOpS9BDr7l/WL6BN0dbV3k1XejPTHqqEzJgsa0frA==} + core-js-compat@3.37.0: dependencies: browserslist: 4.23.0 - dev: false - /cosmiconfig@7.1.0: - resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} - engines: {node: '>=10'} + cosmiconfig@7.1.0: dependencies: '@types/parse-json': 4.0.2 import-fresh: 3.3.0 parse-json: 5.2.0 path-type: 4.0.0 yaml: 1.10.2 - dev: false - /cosmiconfig@9.0.0(typescript@5.4.2): - resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} - engines: {node: '>=14'} - peerDependencies: - typescript: '>=4.9.5' - peerDependenciesMeta: - typescript: - optional: true + cosmiconfig@9.0.0(typescript@5.4.2): dependencies: env-paths: 2.2.1 import-fresh: 3.3.0 js-yaml: 4.1.0 parse-json: 5.2.0 + optionalDependencies: typescript: 5.4.2 - dev: true - /create-jest@29.7.0(@types/node@20.11.30)(ts-node@10.9.2): - resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true + create-jest@29.7.0(@types/node@20.11.30)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.4.8)(@types/node@20.11.30)(typescript@5.4.2)): dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@20.11.30)(ts-node@10.9.2) + jest-config: 29.7.0(@types/node@20.11.30)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.4.8)(@types/node@20.11.30)(typescript@5.4.2)) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -4627,149 +7950,84 @@ packages: - babel-plugin-macros - supports-color - ts-node - dev: true - /create-require@1.1.1: - resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} - dev: true + create-require@1.1.1: {} - /cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} - engines: {node: '>= 8'} + cross-spawn@7.0.3: dependencies: path-key: 3.1.1 shebang-command: 2.0.0 which: 2.0.2 - dev: true - /crypto-random-string@2.0.0: - resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==} - engines: {node: '>=8'} + crypto-random-string@2.0.0: {} - /css.escape@1.5.1: - resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==} - dev: true + css.escape@1.5.1: {} - /cssom@0.3.8: - resolution: {integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==} - dev: true + cssom@0.3.8: {} - /cssom@0.5.0: - resolution: {integrity: sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==} - dev: true + cssom@0.5.0: {} - /cssstyle@2.3.0: - resolution: {integrity: sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==} - engines: {node: '>=8'} + cssstyle@2.3.0: dependencies: cssom: 0.3.8 - dev: true - /csstype@3.1.3: - resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + csstype@3.1.3: {} - /csv-parse@5.5.5: - resolution: {integrity: sha512-erCk7tyU3yLWAhk6wvKxnyPtftuy/6Ak622gOO7BCJ05+TYffnPCJF905wmOQm+BpkX54OdAl8pveJwUdpnCXQ==} - dev: true + csv-parse@5.5.5: {} - /cuint@0.2.2: - resolution: {integrity: sha512-d4ZVpCW31eWwCMe1YT3ur7mUDnTXbgwyzaL320DrcRT45rfjYxkt5QWLrmOJ+/UEAI2+fQgKe/fCjR8l4TpRgw==} - dev: true + cuint@0.2.2: {} - /data-uri-to-buffer@4.0.1: - resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} - engines: {node: '>= 12'} - dev: true + data-uri-to-buffer@4.0.1: {} - /data-urls@3.0.2: - resolution: {integrity: sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==} - engines: {node: '>=12'} + data-urls@3.0.2: dependencies: abab: 2.0.6 whatwg-mimetype: 3.0.0 whatwg-url: 11.0.0 - dev: true - /data-view-buffer@1.0.1: - resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} - engines: {node: '>= 0.4'} + data-view-buffer@1.0.1: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 is-data-view: 1.0.1 - /data-view-byte-length@1.0.1: - resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} - engines: {node: '>= 0.4'} + data-view-byte-length@1.0.1: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 is-data-view: 1.0.1 - /data-view-byte-offset@1.0.0: - resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} - engines: {node: '>= 0.4'} + data-view-byte-offset@1.0.0: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 is-data-view: 1.0.1 - /dayjs@1.11.10: - resolution: {integrity: sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==} - dev: false + dayjs@1.11.10: {} - /debounce-fn@4.0.0: - resolution: {integrity: sha512-8pYCQiL9Xdcg0UPSD3d+0KMlOjp+KGU5EPwYddgzQ7DATsg4fuUDjQtsYLmWjnk2obnNHgV3vE2Y4jejSOJVBQ==} - engines: {node: '>=10'} + debounce-fn@4.0.0: dependencies: mimic-fn: 3.1.0 - dev: true - /debug@3.2.7: - resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true + debug@3.2.7: dependencies: ms: 2.1.3 - dev: true - /debug@4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true + debug@4.3.4: dependencies: ms: 2.1.2 - /decimal.js@10.4.3: - resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} - dev: true + decimal.js@10.4.3: {} - /decompress-response@6.0.0: - resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} - engines: {node: '>=10'} + decompress-response@6.0.0: dependencies: mimic-response: 3.1.0 - dev: true - /dedent@1.5.1: - resolution: {integrity: sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==} - peerDependencies: - babel-plugin-macros: ^3.1.0 - peerDependenciesMeta: - babel-plugin-macros: - optional: true - dev: true + dedent@1.5.1(babel-plugin-macros@3.1.0): + optionalDependencies: + babel-plugin-macros: 3.1.0 - /deep-equal@2.2.3: - resolution: {integrity: sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==} - engines: {node: '>= 0.4'} + deep-equal@2.2.3: dependencies: array-buffer-byte-length: 1.0.1 call-bind: 1.0.7 @@ -4789,219 +8047,120 @@ packages: which-boxed-primitive: 1.0.2 which-collection: 1.0.2 which-typed-array: 1.1.15 - dev: true - /deep-extend@0.6.0: - resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} - engines: {node: '>=4.0.0'} - dev: true + deep-extend@0.6.0: {} - /deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - dev: true + deep-is@0.1.4: {} - /deepmerge@4.3.1: - resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} - engines: {node: '>=0.10.0'} + deepmerge@4.3.1: {} - /defaults@1.0.4: - resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + defaults@1.0.4: dependencies: clone: 1.0.4 - dev: true - /defer-to-connect@2.0.1: - resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} - engines: {node: '>=10'} - dev: true + defer-to-connect@2.0.1: {} - /define-data-property@1.1.4: - resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} - engines: {node: '>= 0.4'} + define-data-property@1.1.4: dependencies: es-define-property: 1.0.0 es-errors: 1.3.0 gopd: 1.0.1 - /define-lazy-prop@2.0.0: - resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} - engines: {node: '>=8'} - dev: true + define-lazy-prop@2.0.0: {} - /define-properties@1.2.1: - resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} - engines: {node: '>= 0.4'} + define-properties@1.2.1: dependencies: define-data-property: 1.1.4 has-property-descriptors: 1.0.2 object-keys: 1.1.1 - /delayed-stream@1.0.0: - resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} - engines: {node: '>=0.4.0'} + delayed-stream@1.0.0: {} - /dequal@2.0.3: - resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} - engines: {node: '>=6'} - dev: true + dequal@2.0.3: {} - /detect-newline@3.1.0: - resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} - engines: {node: '>=8'} - dev: true + detect-newline@3.1.0: {} - /diff-sequences@29.6.3: - resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dev: true + diff-sequences@29.6.3: {} - /diff@4.0.2: - resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} - engines: {node: '>=0.3.1'} - dev: true + diff@4.0.2: {} - /dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} + dir-glob@3.0.1: dependencies: path-type: 4.0.0 - dev: true - /doctrine@2.1.0: - resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} - engines: {node: '>=0.10.0'} + doctrine@2.1.0: dependencies: esutils: 2.0.3 - dev: true - /doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} + doctrine@3.0.0: dependencies: esutils: 2.0.3 - dev: true - /dom-accessibility-api@0.5.16: - resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} - dev: true + dom-accessibility-api@0.5.16: {} - /dom-accessibility-api@0.6.3: - resolution: {integrity: sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==} - dev: true + dom-accessibility-api@0.6.3: {} - /dom-helpers@5.2.1: - resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==} + dom-helpers@5.2.1: dependencies: '@babel/runtime': 7.24.1 csstype: 3.1.3 - dev: false - /domexception@4.0.0: - resolution: {integrity: sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==} - engines: {node: '>=12'} - deprecated: Use your platform's native DOMException instead + domexception@4.0.0: dependencies: webidl-conversions: 7.0.0 - dev: true - /dot-prop@5.3.0: - resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} - engines: {node: '>=8'} + dot-prop@5.3.0: dependencies: is-obj: 2.0.0 - dev: true - /dot-prop@6.0.1: - resolution: {integrity: sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==} - engines: {node: '>=10'} + dot-prop@6.0.1: dependencies: is-obj: 2.0.0 - dev: true - /dotenv-expand@11.0.6: - resolution: {integrity: sha512-8NHi73otpWsZGBSZwwknTXS5pqMOrk9+Ssrna8xCaxkzEpU9OTf9R5ArQGVw03//Zmk9MOwLPng9WwndvpAJ5g==} - engines: {node: '>=12'} + dotenv-expand@11.0.6: dependencies: dotenv: 16.4.5 - dev: true - /dotenv@16.4.5: - resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} - engines: {node: '>=12'} - dev: true + dotenv@16.4.5: {} - /duplexer@0.1.2: - resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} - dev: true + duplexer@0.1.2: {} - /eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - dev: true + eastasianwidth@0.2.0: {} - /ejs@3.1.10: - resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} - engines: {node: '>=0.10.0'} - hasBin: true + ejs@3.1.10: dependencies: jake: 10.8.7 - dev: false - /electron-to-chromium@1.4.711: - resolution: {integrity: sha512-hRg81qzvUEibX2lDxnFlVCHACa+LtrCPIsWAxo161LDYIB3jauf57RGsMZV9mvGwE98yGH06icj3zBEoOkxd/w==} + electron-to-chromium@1.4.711: {} - /emittery@0.13.1: - resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} - engines: {node: '>=12'} - dev: true + emittery@0.13.1: {} - /emoji-regex@10.3.0: - resolution: {integrity: sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==} - dev: true + emoji-regex@10.3.0: {} - /emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - dev: true + emoji-regex@8.0.0: {} - /emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - dev: true + emoji-regex@9.2.2: {} - /enabled@2.0.0: - resolution: {integrity: sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==} - dev: true + enabled@2.0.0: {} - /end-of-stream@1.4.4: - resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + end-of-stream@1.4.4: dependencies: once: 1.4.0 - dev: true - /enhanced-resolve@5.16.0: - resolution: {integrity: sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA==} - engines: {node: '>=10.13.0'} + enhanced-resolve@5.16.0: dependencies: graceful-fs: 4.2.11 tapable: 2.2.1 - dev: true - /entities@4.5.0: - resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} - engines: {node: '>=0.12'} - dev: true + entities@4.5.0: {} - /env-paths@2.2.1: - resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} - engines: {node: '>=6'} - dev: true + env-paths@2.2.1: {} - /error-ex@1.3.2: - resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + error-ex@1.3.2: dependencies: is-arrayish: 0.2.1 - /es-abstract@1.22.5: - resolution: {integrity: sha512-oW69R+4q2wG+Hc3KZePPZxOiisRIqfKBVo/HLx94QcJeWGU/8sZhCvc829rd1kS366vlJbzBfXf9yWwf0+Ko7w==} - engines: {node: '>= 0.4'} + es-abstract@1.22.5: dependencies: array-buffer-byte-length: 1.0.1 arraybuffer.prototype.slice: 1.0.3 @@ -5045,9 +8204,7 @@ packages: unbox-primitive: 1.0.2 which-typed-array: 1.1.15 - /es-abstract@1.23.2: - resolution: {integrity: sha512-60s3Xv2T2p1ICykc7c+DNDPLDMm9t4QxCOUU0K9JxiLjM3C1zB9YVdN7tjxrFd4+AkZ8CdX1ovUga4P2+1e+/w==} - engines: {node: '>= 0.4'} + es-abstract@1.23.2: dependencies: array-buffer-byte-length: 1.0.1 arraybuffer.prototype.slice: 1.0.3 @@ -5096,18 +8253,13 @@ packages: unbox-primitive: 1.0.2 which-typed-array: 1.1.15 - /es-define-property@1.0.0: - resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} - engines: {node: '>= 0.4'} + es-define-property@1.0.0: dependencies: get-intrinsic: 1.2.4 - /es-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} - engines: {node: '>= 0.4'} + es-errors@1.3.0: {} - /es-get-iterator@1.1.3: - resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==} + es-get-iterator@1.1.3: dependencies: call-bind: 1.0.7 get-intrinsic: 1.2.4 @@ -5118,11 +8270,8 @@ packages: is-string: 1.0.7 isarray: 2.0.5 stop-iteration-iterator: 1.0.0 - dev: true - /es-iterator-helpers@1.0.18: - resolution: {integrity: sha512-scxAJaewsahbqTYrGKJihhViaM6DDZDDoucfvzNbK0pOren1g/daDQ3IAhzn+1G14rBG7w+i5N+qul60++zlKA==} - engines: {node: '>= 0.4'} + es-iterator-helpers@1.0.18: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 @@ -5138,41 +8287,28 @@ packages: internal-slot: 1.0.7 iterator.prototype: 1.1.2 safe-array-concat: 1.1.2 - dev: true - /es-object-atoms@1.0.0: - resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} - engines: {node: '>= 0.4'} + es-object-atoms@1.0.0: dependencies: es-errors: 1.3.0 - /es-set-tostringtag@2.0.3: - resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} - engines: {node: '>= 0.4'} + es-set-tostringtag@2.0.3: dependencies: get-intrinsic: 1.2.4 has-tostringtag: 1.0.2 hasown: 2.0.2 - /es-shim-unscopables@1.0.2: - resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} + es-shim-unscopables@1.0.2: dependencies: hasown: 2.0.2 - dev: true - /es-to-primitive@1.2.1: - resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} - engines: {node: '>= 0.4'} + es-to-primitive@1.2.1: dependencies: is-callable: 1.2.7 is-date-object: 1.0.5 is-symbol: 1.0.4 - /esbuild@0.20.2: - resolution: {integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true + esbuild@0.20.2: optionalDependencies: '@esbuild/aix-ppc64': 0.20.2 '@esbuild/android-arm': 0.20.2 @@ -5198,120 +8334,59 @@ packages: '@esbuild/win32-ia32': 0.20.2 '@esbuild/win32-x64': 0.20.2 - /escalade@3.1.2: - resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} - engines: {node: '>=6'} + escalade@3.1.2: {} - /escape-goat@2.1.1: - resolution: {integrity: sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==} - engines: {node: '>=8'} - dev: true + escape-goat@2.1.1: {} - /escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} + escape-string-regexp@1.0.5: {} - /escape-string-regexp@2.0.0: - resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} - engines: {node: '>=8'} - dev: true + escape-string-regexp@2.0.0: {} - /escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} + escape-string-regexp@4.0.0: {} - /escodegen@2.1.0: - resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} - engines: {node: '>=6.0'} - hasBin: true + escodegen@2.1.0: dependencies: esprima: 4.0.1 estraverse: 5.3.0 esutils: 2.0.3 optionalDependencies: source-map: 0.6.1 - dev: true - /eslint-compat-utils@0.1.2(eslint@8.57.0): - resolution: {integrity: sha512-Jia4JDldWnFNIru1Ehx1H5s9/yxiRHY/TimCuUc0jNexew3cF1gI6CYZil1ociakfWO3rRqFjl1mskBblB3RYg==} - engines: {node: '>=12'} - peerDependencies: - eslint: '>=6.0.0' + eslint-compat-utils@0.1.2(eslint@8.57.0): dependencies: eslint: 8.57.0 - dev: true - /eslint-config-prettier@9.1.0(eslint@8.57.0): - resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} - hasBin: true - peerDependencies: - eslint: '>=7.0.0' + eslint-config-prettier@9.1.0(eslint@8.57.0): dependencies: eslint: 8.57.0 - dev: true - /eslint-import-resolver-node@0.3.9: - resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} + eslint-import-resolver-node@0.3.9: dependencies: debug: 3.2.7 is-core-module: 2.13.1 resolve: 1.22.8 transitivePeerDependencies: - supports-color - dev: true - /eslint-module-utils@2.8.1(@typescript-eslint/parser@7.4.0)(eslint-import-resolver-node@0.3.9)(eslint@8.57.0): - resolution: {integrity: sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: '*' - eslint-import-resolver-node: '*' - eslint-import-resolver-typescript: '*' - eslint-import-resolver-webpack: '*' - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - eslint: - optional: true - eslint-import-resolver-node: - optional: true - eslint-import-resolver-typescript: - optional: true - eslint-import-resolver-webpack: - optional: true + eslint-module-utils@2.8.1(@typescript-eslint/parser@7.4.0(eslint@8.57.0)(typescript@5.4.2))(eslint-import-resolver-node@0.3.9)(eslint@8.57.0): dependencies: - '@typescript-eslint/parser': 7.4.0(eslint@8.57.0)(typescript@5.4.2) debug: 3.2.7 + optionalDependencies: + '@typescript-eslint/parser': 7.4.0(eslint@8.57.0)(typescript@5.4.2) eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: - supports-color - dev: true - /eslint-plugin-es-x@7.5.0(eslint@8.57.0): - resolution: {integrity: sha512-ODswlDSO0HJDzXU0XvgZ3lF3lS3XAZEossh15Q2UHjwrJggWeBoKqqEsLTZLXl+dh5eOAozG0zRcYtuE35oTuQ==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - eslint: '>=8' + eslint-plugin-es-x@7.5.0(eslint@8.57.0): dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) '@eslint-community/regexpp': 4.10.0 eslint: 8.57.0 eslint-compat-utils: 0.1.2(eslint@8.57.0) - dev: true - /eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.4.0)(eslint@8.57.0): - resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true + eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.4.0(eslint@8.57.0)(typescript@5.4.2))(eslint@8.57.0): dependencies: - '@typescript-eslint/parser': 7.4.0(eslint@8.57.0)(typescript@5.4.2) array-includes: 3.1.7 array.prototype.findlastindex: 1.2.5 array.prototype.flat: 1.3.2 @@ -5320,7 +8395,7 @@ packages: doctrine: 2.1.0 eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.4.0)(eslint-import-resolver-node@0.3.9)(eslint@8.57.0) + eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.4.0(eslint@8.57.0)(typescript@5.4.2))(eslint-import-resolver-node@0.3.9)(eslint@8.57.0) hasown: 2.0.2 is-core-module: 2.13.1 is-glob: 4.0.3 @@ -5330,17 +8405,14 @@ packages: object.values: 1.2.0 semver: 6.3.1 tsconfig-paths: 3.15.0 + optionalDependencies: + '@typescript-eslint/parser': 7.4.0(eslint@8.57.0)(typescript@5.4.2) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - dev: true - /eslint-plugin-n@17.3.1(eslint@8.57.0): - resolution: {integrity: sha512-25+HTtKe1F8U/M4ERmdzbz/xkm/gaY0OYC8Fcv1z/WvpLJ8Xfh9LzJ13JV5uj4QyCUD8kOPJrNjn/3y+tc57Vw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: '>=8.23.0' + eslint-plugin-n@17.3.1(eslint@8.57.0): dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) enhanced-resolve: 5.16.0 @@ -5351,52 +8423,25 @@ packages: ignore: 5.3.1 minimatch: 9.0.3 semver: 7.6.0 - dev: true - /eslint-plugin-prettier@5.1.3(eslint-config-prettier@9.1.0)(eslint@8.57.0)(prettier@3.2.5): - resolution: {integrity: sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - '@types/eslint': '>=8.0.0' - eslint: '>=8.0.0' - eslint-config-prettier: '*' - prettier: '>=3.0.0' - peerDependenciesMeta: - '@types/eslint': - optional: true - eslint-config-prettier: - optional: true + eslint-plugin-prettier@5.1.3(eslint-config-prettier@9.1.0(eslint@8.57.0))(eslint@8.57.0)(prettier@3.2.5): dependencies: eslint: 8.57.0 - eslint-config-prettier: 9.1.0(eslint@8.57.0) prettier: 3.2.5 prettier-linter-helpers: 1.0.0 synckit: 0.8.8 - dev: true + optionalDependencies: + eslint-config-prettier: 9.1.0(eslint@8.57.0) - /eslint-plugin-promise@6.1.1(eslint@8.57.0): - resolution: {integrity: sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 + eslint-plugin-promise@6.1.1(eslint@8.57.0): dependencies: eslint: 8.57.0 - dev: true - /eslint-plugin-react-hooks@4.6.0(eslint@8.57.0): - resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==} - engines: {node: '>=10'} - peerDependencies: - eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 + eslint-plugin-react-hooks@4.6.0(eslint@8.57.0): dependencies: eslint: 8.57.0 - dev: true - /eslint-plugin-react@7.34.1(eslint@8.57.0): - resolution: {integrity: sha512-N97CxlouPT1AHt8Jn0mhhN2RrADlUAsk1/atcT2KyA/l9Q/E6ll7OIGwNumFmWfZ9skV3XXccYS19h80rHtgkw==} - engines: {node: '>=4'} - peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + eslint-plugin-react@7.34.1(eslint@8.57.0): dependencies: array-includes: 3.1.7 array.prototype.findlast: 1.2.5 @@ -5417,25 +8462,15 @@ packages: resolve: 2.0.0-next.5 semver: 6.3.1 string.prototype.matchall: 4.0.11 - dev: true - /eslint-scope@7.2.2: - resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + eslint-scope@7.2.2: dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 - dev: true - /eslint-visitor-keys@3.4.3: - resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true + eslint-visitor-keys@3.4.3: {} - /eslint@8.57.0: - resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - hasBin: true + eslint@8.57.0: dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) '@eslint-community/regexpp': 4.10.0 @@ -5477,56 +8512,32 @@ packages: text-table: 0.2.0 transitivePeerDependencies: - supports-color - dev: true - /espree@9.6.1: - resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + espree@9.6.1: dependencies: acorn: 8.11.3 acorn-jsx: 5.3.2(acorn@8.11.3) eslint-visitor-keys: 3.4.3 - dev: true - /esprima@4.0.1: - resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} - engines: {node: '>=4'} - hasBin: true - dev: true + esprima@4.0.1: {} - /esquery@1.5.0: - resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} - engines: {node: '>=0.10'} + esquery@1.5.0: dependencies: estraverse: 5.3.0 - dev: true - /esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} + esrecurse@4.3.0: dependencies: estraverse: 5.3.0 - dev: true - /estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} - dev: true + estraverse@5.3.0: {} - /estree-walker@1.0.1: - resolution: {integrity: sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==} - dev: false + estree-walker@1.0.1: {} - /estree-walker@2.0.2: - resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} - dev: false + estree-walker@2.0.2: {} - /esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} + esutils@2.0.3: {} - /event-stream@4.0.1: - resolution: {integrity: sha512-qACXdu/9VHPBzcyhdOWR5/IahhGMf0roTeZJfzz077GwylcDd90yOHLouhmv7GJ5XzPi6ekaQWd8AvPP2nOvpA==} + event-stream@4.0.1: dependencies: duplexer: 0.1.2 from: 0.1.7 @@ -5535,20 +8546,10 @@ packages: split: 1.0.1 stream-combiner: 0.2.2 through: 2.3.8 - dev: true - - /eventemitter3@5.0.1: - resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} - dev: true - /events@3.3.0: - resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} - engines: {node: '>=0.8.x'} - dev: true + eventemitter3@5.0.1: {} - /execa@5.1.1: - resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} - engines: {node: '>=10'} + execa@5.1.1: dependencies: cross-spawn: 7.0.3 get-stream: 6.0.1 @@ -5559,11 +8560,8 @@ packages: onetime: 5.1.2 signal-exit: 3.0.7 strip-final-newline: 2.0.0 - dev: true - /execa@8.0.1: - resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} - engines: {node: '>=16.17'} + execa@8.0.1: dependencies: cross-spawn: 7.0.3 get-stream: 8.0.1 @@ -5574,43 +8572,28 @@ packages: onetime: 6.0.0 signal-exit: 4.1.0 strip-final-newline: 3.0.0 - dev: true - /exit@0.1.2: - resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} - engines: {node: '>= 0.8.0'} - dev: true + exit@0.1.2: {} - /expect@29.7.0: - resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + expect@29.7.0: dependencies: '@jest/expect-utils': 29.7.0 jest-get-type: 29.6.3 jest-matcher-utils: 29.7.0 jest-message-util: 29.7.0 jest-util: 29.7.0 - dev: true - /external-editor@3.1.0: - resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} - engines: {node: '>=4'} + external-editor@3.1.0: dependencies: chardet: 0.7.0 iconv-lite: 0.4.24 tmp: 0.0.33 - dev: true - /fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + fast-deep-equal@3.1.3: {} - /fast-diff@1.3.0: - resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} - dev: true + fast-diff@1.3.0: {} - /fast-glob@3.3.2: - resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} - engines: {node: '>=8.6.0'} + fast-glob@3.3.2: dependencies: '@nodelib/fs.stat': 2.0.5 '@nodelib/fs.walk': 1.2.8 @@ -5618,212 +8601,125 @@ packages: merge2: 1.4.1 micromatch: 4.0.5 - /fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + fast-json-stable-stringify@2.1.0: {} - /fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - dev: true + fast-levenshtein@2.0.6: {} - /fastq@1.17.1: - resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + fastq@1.17.1: dependencies: reusify: 1.0.4 - /fb-watchman@2.0.2: - resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} + fb-watchman@2.0.2: dependencies: bser: 2.1.1 - dev: true - /fecha@4.2.3: - resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==} - dev: true + fecha@4.2.3: {} - /fetch-blob@3.2.0: - resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} - engines: {node: ^12.20 || >= 14.13} + fetch-blob@3.2.0: dependencies: node-domexception: 1.0.0 web-streams-polyfill: 3.3.3 - dev: true - /figures@3.2.0: - resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} - engines: {node: '>=8'} + figures@3.2.0: dependencies: escape-string-regexp: 1.0.5 - dev: true - /file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} + file-entry-cache@6.0.1: dependencies: flat-cache: 3.2.0 - dev: true - /filelist@1.0.4: - resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} + filelist@1.0.4: dependencies: minimatch: 5.1.6 - dev: false - /fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} - engines: {node: '>=8'} + fill-range@7.0.1: dependencies: to-regex-range: 5.0.1 - /find-root@1.1.0: - resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} - dev: false + find-root@1.1.0: {} - /find-up@3.0.0: - resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} - engines: {node: '>=6'} + find-up@3.0.0: dependencies: locate-path: 3.0.0 - dev: true - /find-up@4.1.0: - resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} - engines: {node: '>=8'} + find-up@4.1.0: dependencies: locate-path: 5.0.0 path-exists: 4.0.0 - dev: true - /find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} + find-up@5.0.0: dependencies: locate-path: 6.0.0 path-exists: 4.0.0 - dev: true - /flat-cache@3.2.0: - resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} - engines: {node: ^10.12.0 || >=12.0.0} + flat-cache@3.2.0: dependencies: flatted: 3.3.1 keyv: 4.5.4 rimraf: 3.0.2 - dev: true - /flatted@3.3.1: - resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} - dev: true + flatted@3.3.1: {} - /fn.name@1.1.0: - resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==} - dev: true + fn.name@1.1.0: {} - /follow-redirects@1.15.6: - resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} - engines: {node: '>=4.0'} - peerDependencies: - debug: '*' - peerDependenciesMeta: - debug: - optional: true - dev: false + follow-redirects@1.15.6: {} - /for-each@0.3.3: - resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + for-each@0.3.3: dependencies: is-callable: 1.2.7 - /foreground-child@3.1.1: - resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} - engines: {node: '>=14'} + foreground-child@3.1.1: dependencies: cross-spawn: 7.0.3 signal-exit: 4.1.0 - dev: true - /form-data@4.0.0: - resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} - engines: {node: '>= 6'} + form-data@4.0.0: dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 mime-types: 2.1.35 - /formdata-polyfill@4.0.10: - resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} - engines: {node: '>=12.20.0'} + formdata-polyfill@4.0.10: dependencies: fetch-blob: 3.2.0 - dev: true - /fraction.js@4.3.7: - resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} - dev: true + fraction.js@4.3.7: {} - /from@0.1.7: - resolution: {integrity: sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==} - dev: true + from@0.1.7: {} - /fs-extra@9.1.0: - resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} - engines: {node: '>=10'} + fs-extra@9.1.0: dependencies: at-least-node: 1.0.0 graceful-fs: 4.2.11 jsonfile: 6.1.0 universalify: 2.0.1 - dev: false - /fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + fs.realpath@1.0.0: {} - /fsevents@2.3.2: - resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - requiresBuild: true - dev: true + fsevents@2.3.2: optional: true - /fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - requiresBuild: true + fsevents@2.3.3: optional: true - /function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + function-bind@1.1.2: {} - /function.prototype.name@1.1.6: - resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} - engines: {node: '>= 0.4'} + function.prototype.name@1.1.6: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.22.5 functions-have-names: 1.2.3 - /functions-have-names@1.2.3: - resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + functions-have-names@1.2.3: {} - /gensync@1.0.0-beta.2: - resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} - engines: {node: '>=6.9.0'} + gensync@1.0.0-beta.2: {} - /get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - dev: true + get-caller-file@2.0.5: {} - /get-east-asian-width@1.2.0: - resolution: {integrity: sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==} - engines: {node: '>=18'} - dev: true + get-east-asian-width@1.2.0: {} - /get-intrinsic@1.2.4: - resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} - engines: {node: '>= 0.4'} + get-intrinsic@1.2.4: dependencies: es-errors: 1.3.0 function-bind: 1.1.2 @@ -5831,73 +8727,45 @@ packages: has-symbols: 1.0.3 hasown: 2.0.2 - /get-own-enumerable-property-symbols@3.0.2: - resolution: {integrity: sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==} - dev: false + get-own-enumerable-property-symbols@3.0.2: {} - /get-package-type@0.1.0: - resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} - engines: {node: '>=8.0.0'} - dev: true + get-package-type@0.1.0: {} - /get-stream@5.2.0: - resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} - engines: {node: '>=8'} + get-stream@5.2.0: dependencies: pump: 3.0.0 - dev: true - /get-stream@6.0.1: - resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} - engines: {node: '>=10'} - dev: true + get-stream@6.0.1: {} - /get-stream@8.0.1: - resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} - engines: {node: '>=16'} - dev: true + get-stream@8.0.1: {} - /get-symbol-description@1.0.2: - resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} - engines: {node: '>= 0.4'} + get-symbol-description@1.0.2: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 get-intrinsic: 1.2.4 - /get-tsconfig@4.7.3: - resolution: {integrity: sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg==} + get-tsconfig@4.7.3: dependencies: resolve-pkg-maps: 1.0.0 - dev: true - /glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} + glob-parent@5.1.2: dependencies: is-glob: 4.0.3 - /glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} + glob-parent@6.0.2: dependencies: is-glob: 4.0.3 - dev: true - /glob@10.3.10: - resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} - engines: {node: '>=16 || 14 >=14.17'} - hasBin: true + glob@10.3.10: dependencies: foreground-child: 3.1.1 jackspeak: 2.3.6 minimatch: 9.0.3 minipass: 7.0.4 path-scurry: 1.10.1 - dev: true - /glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + glob@7.2.3: dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 @@ -5906,38 +8774,23 @@ packages: once: 1.4.0 path-is-absolute: 1.0.1 - /global-dirs@3.0.1: - resolution: {integrity: sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==} - engines: {node: '>=10'} + global-dirs@3.0.1: dependencies: ini: 2.0.0 - dev: true - /globals@11.12.0: - resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} - engines: {node: '>=4'} + globals@11.12.0: {} - /globals@13.24.0: - resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} - engines: {node: '>=8'} + globals@13.24.0: dependencies: type-fest: 0.20.2 - dev: true - /globals@15.0.0: - resolution: {integrity: sha512-m/C/yR4mjO6pXDTm9/R/SpYTAIyaUB4EOzcaaMEl7mds7Mshct9GfejiJNQGjHHbdMPey13Kpu4TMbYi9ex1pw==} - engines: {node: '>=18'} - dev: true + globals@15.0.0: {} - /globalthis@1.0.3: - resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} - engines: {node: '>= 0.4'} + globalthis@1.0.3: dependencies: define-properties: 1.2.1 - /globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} + globby@11.1.0: dependencies: array-union: 2.1.0 dir-glob: 3.0.1 @@ -5945,16 +8798,12 @@ packages: ignore: 5.3.1 merge2: 1.4.1 slash: 3.0.0 - dev: true - /gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + gopd@1.0.1: dependencies: get-intrinsic: 1.2.4 - /got@11.8.6: - resolution: {integrity: sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==} - engines: {node: '>=10.19.0'} + got@11.8.6: dependencies: '@sindresorhus/is': 4.6.0 '@szmarczak/http-timer': 4.0.6 @@ -5967,556 +8816,297 @@ packages: lowercase-keys: 2.0.0 p-cancelable: 2.1.1 responselike: 2.0.1 - dev: true - /graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + graceful-fs@4.2.11: {} - /graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - dev: true + graphemer@1.4.0: {} - /graphql@16.8.1: - resolution: {integrity: sha512-59LZHPdGZVh695Ud9lRzPBVTtlX9ZCV150Er2W43ro37wVof0ctenSaskPPjN7lVTIN8mSZt8PHUNKZuNQUuxw==} - engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} - dev: true + graphql@16.8.1: {} - /harmony-reflect@1.6.2: - resolution: {integrity: sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==} - dev: true + harmony-reflect@1.6.2: {} - /has-bigints@1.0.2: - resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + has-bigints@1.0.2: {} - /has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} + has-flag@3.0.0: {} - /has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} + has-flag@4.0.0: {} - /has-property-descriptors@1.0.2: - resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + has-property-descriptors@1.0.2: dependencies: es-define-property: 1.0.0 - /has-proto@1.0.3: - resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} - engines: {node: '>= 0.4'} + has-proto@1.0.3: {} - /has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} - engines: {node: '>= 0.4'} + has-symbols@1.0.3: {} - /has-tostringtag@1.0.2: - resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} - engines: {node: '>= 0.4'} + has-tostringtag@1.0.2: dependencies: has-symbols: 1.0.3 - /has-yarn@2.1.0: - resolution: {integrity: sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==} - engines: {node: '>=8'} - dev: true + has-yarn@2.1.0: {} - /hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} - engines: {node: '>= 0.4'} + hasown@2.0.2: dependencies: function-bind: 1.1.2 - /headers-polyfill@3.2.5: - resolution: {integrity: sha512-tUCGvt191vNSQgttSyJoibR+VO+I6+iCHIUdhzEMJKE+EAL8BwCN7fUOZlY4ofOelNHsK+gEjxB/B+9N3EWtdA==} - dev: true + headers-polyfill@4.0.3: {} - /hoist-non-react-statics@3.3.2: - resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} + hoist-non-react-statics@3.3.2: dependencies: react-is: 16.13.1 - /html-encoding-sniffer@3.0.0: - resolution: {integrity: sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==} - engines: {node: '>=12'} + html-encoding-sniffer@3.0.0: dependencies: whatwg-encoding: 2.0.0 - dev: true - /html-escaper@2.0.2: - resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} - dev: true + html-escaper@2.0.2: {} - /http-cache-semantics@4.1.1: - resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} - dev: true + http-cache-semantics@4.1.1: {} - /http-proxy-agent@5.0.0: - resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} - engines: {node: '>= 6'} + http-proxy-agent@5.0.0: dependencies: '@tootallnate/once': 2.0.0 agent-base: 6.0.2 debug: 4.3.4 transitivePeerDependencies: - supports-color - dev: true - /http2-wrapper@1.0.3: - resolution: {integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==} - engines: {node: '>=10.19.0'} + http2-wrapper@1.0.3: dependencies: quick-lru: 5.1.1 resolve-alpn: 1.2.1 - dev: true - /https-proxy-agent@5.0.1: - resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} - engines: {node: '>= 6'} + https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 debug: 4.3.4 transitivePeerDependencies: - supports-color - dev: true - /human-signals@2.1.0: - resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} - engines: {node: '>=10.17.0'} - dev: true + human-signals@2.1.0: {} - /human-signals@5.0.0: - resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} - engines: {node: '>=16.17.0'} - dev: true + human-signals@5.0.0: {} - /husky@9.0.11: - resolution: {integrity: sha512-AB6lFlbwwyIqMdHYhwPe+kjOC3Oc5P3nThEoW/AaO2BX3vJDjWPFxYLxokUZOo6RNX20He3AaT8sESs9NJcmEw==} - engines: {node: '>=18'} - hasBin: true - dev: true + husky@9.0.11: {} - /iconv-lite@0.4.24: - resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} - engines: {node: '>=0.10.0'} + iconv-lite@0.4.24: dependencies: safer-buffer: 2.1.2 - dev: true - /iconv-lite@0.6.3: - resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} - engines: {node: '>=0.10.0'} + iconv-lite@0.6.3: dependencies: safer-buffer: 2.1.2 - dev: true - /idb@7.1.1: - resolution: {integrity: sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==} - dev: false + idb@7.1.1: {} - /identity-obj-proxy@3.0.0: - resolution: {integrity: sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA==} - engines: {node: '>=4'} + identity-obj-proxy@3.0.0: dependencies: harmony-reflect: 1.6.2 - dev: true - /ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - dev: true + ieee754@1.2.1: {} - /ignore@5.3.1: - resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} - engines: {node: '>= 4'} - dev: true + ignore@5.3.1: {} - /immer@10.0.4: - resolution: {integrity: sha512-cuBuGK40P/sk5IzWa9QPUaAdvPHjkk1c+xYsd9oZw+YQQEV+10G0P5uMpGctZZKnyQ+ibRO08bD25nWLmYi2pw==} - dev: false + immer@10.0.4: {} - /import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} - engines: {node: '>=6'} + import-fresh@3.3.0: dependencies: parent-module: 1.0.1 resolve-from: 4.0.0 - /import-lazy@2.1.0: - resolution: {integrity: sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A==} - engines: {node: '>=4'} - dev: true + import-lazy@2.1.0: {} - /import-local@3.1.0: - resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==} - engines: {node: '>=8'} - hasBin: true + import-local@3.1.0: dependencies: pkg-dir: 4.2.0 resolve-cwd: 3.0.0 - dev: true - /imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} - dev: true + imurmurhash@0.1.4: {} - /indent-string@4.0.0: - resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} - engines: {node: '>=8'} - dev: true + indent-string@4.0.0: {} - /inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + inflight@1.0.6: dependencies: once: 1.4.0 wrappy: 1.0.2 - /inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - /ini@1.3.8: - resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} - dev: true + inherits@2.0.4: {} - /ini@2.0.0: - resolution: {integrity: sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==} - engines: {node: '>=10'} - dev: true + ini@1.3.8: {} - /inquirer@8.2.6: - resolution: {integrity: sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==} - engines: {node: '>=12.0.0'} - dependencies: - ansi-escapes: 4.3.2 - chalk: 4.1.2 - cli-cursor: 3.1.0 - cli-width: 3.0.0 - external-editor: 3.1.0 - figures: 3.2.0 - lodash: 4.17.21 - mute-stream: 0.0.8 - ora: 5.4.1 - run-async: 2.4.1 - rxjs: 7.8.1 - string-width: 4.2.3 - strip-ansi: 6.0.1 - through: 2.3.8 - wrap-ansi: 6.2.0 - dev: true + ini@2.0.0: {} - /internal-slot@1.0.7: - resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} - engines: {node: '>= 0.4'} + internal-slot@1.0.7: dependencies: es-errors: 1.3.0 hasown: 2.0.2 side-channel: 1.0.6 - /is-arguments@1.1.1: - resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} - engines: {node: '>= 0.4'} + is-arguments@1.1.1: dependencies: call-bind: 1.0.7 has-tostringtag: 1.0.2 - dev: true - /is-array-buffer@3.0.4: - resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} - engines: {node: '>= 0.4'} + is-array-buffer@3.0.4: dependencies: call-bind: 1.0.7 get-intrinsic: 1.2.4 - /is-arrayish@0.2.1: - resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + is-arrayish@0.2.1: {} - /is-arrayish@0.3.2: - resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} - dev: true + is-arrayish@0.3.2: {} - /is-async-function@2.0.0: - resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==} - engines: {node: '>= 0.4'} + is-async-function@2.0.0: dependencies: has-tostringtag: 1.0.2 - dev: true - /is-bigint@1.0.4: - resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + is-bigint@1.0.4: dependencies: has-bigints: 1.0.2 - /is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - dependencies: - binary-extensions: 2.3.0 - dev: true - - /is-boolean-object@1.1.2: - resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} - engines: {node: '>= 0.4'} + is-boolean-object@1.1.2: dependencies: call-bind: 1.0.7 has-tostringtag: 1.0.2 - /is-builtin-module@3.2.1: - resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} - engines: {node: '>=6'} + is-builtin-module@3.2.1: dependencies: builtin-modules: 3.3.0 - dev: false - /is-callable@1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} + is-callable@1.2.7: {} - /is-ci@2.0.0: - resolution: {integrity: sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==} - hasBin: true + is-ci@2.0.0: dependencies: ci-info: 2.0.0 - dev: true - /is-core-module@2.13.1: - resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + is-core-module@2.13.1: dependencies: hasown: 2.0.2 - /is-data-view@1.0.1: - resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} - engines: {node: '>= 0.4'} + is-data-view@1.0.1: dependencies: is-typed-array: 1.1.13 - /is-date-object@1.0.5: - resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} - engines: {node: '>= 0.4'} + is-date-object@1.0.5: dependencies: has-tostringtag: 1.0.2 - /is-docker@2.2.1: - resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} - engines: {node: '>=8'} - hasBin: true - dev: true + is-docker@2.2.1: {} - /is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} + is-extglob@2.1.1: {} - /is-finalizationregistry@1.0.2: - resolution: {integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==} + is-finalizationregistry@1.0.2: dependencies: call-bind: 1.0.7 - dev: true - /is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - dev: true + is-fullwidth-code-point@3.0.0: {} - /is-fullwidth-code-point@4.0.0: - resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} - engines: {node: '>=12'} - dev: true + is-fullwidth-code-point@4.0.0: {} - /is-fullwidth-code-point@5.0.0: - resolution: {integrity: sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==} - engines: {node: '>=18'} + is-fullwidth-code-point@5.0.0: dependencies: get-east-asian-width: 1.2.0 - dev: true - /is-generator-fn@2.1.0: - resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} - engines: {node: '>=6'} - dev: true + is-generator-fn@2.1.0: {} - /is-generator-function@1.0.10: - resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} - engines: {node: '>= 0.4'} + is-generator-function@1.0.10: dependencies: has-tostringtag: 1.0.2 - dev: true - /is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} + is-glob@4.0.3: dependencies: is-extglob: 2.1.1 - /is-installed-globally@0.4.0: - resolution: {integrity: sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==} - engines: {node: '>=10'} + is-installed-globally@0.4.0: dependencies: global-dirs: 3.0.1 is-path-inside: 3.0.3 - dev: true - /is-interactive@1.0.0: - resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} - engines: {node: '>=8'} - dev: true + is-interactive@1.0.0: {} - /is-map@2.0.3: - resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} - engines: {node: '>= 0.4'} - dev: true + is-map@2.0.3: {} - /is-module@1.0.0: - resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} - dev: false + is-module@1.0.0: {} - /is-negative-zero@2.0.3: - resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} - engines: {node: '>= 0.4'} + is-negative-zero@2.0.3: {} - /is-node-process@1.2.0: - resolution: {integrity: sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==} - dev: true + is-node-process@1.2.0: {} - /is-npm@5.0.0: - resolution: {integrity: sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==} - engines: {node: '>=10'} - dev: true + is-npm@5.0.0: {} - /is-number-object@1.0.7: - resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} - engines: {node: '>= 0.4'} + is-number-object@1.0.7: dependencies: has-tostringtag: 1.0.2 - /is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} + is-number@7.0.0: {} - /is-obj@1.0.1: - resolution: {integrity: sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==} - engines: {node: '>=0.10.0'} - dev: false + is-obj@1.0.1: {} - /is-obj@2.0.0: - resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} - engines: {node: '>=8'} - dev: true + is-obj@2.0.0: {} - /is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} - dev: true + is-path-inside@3.0.3: {} - /is-potential-custom-element-name@1.0.1: - resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} - dev: true + is-potential-custom-element-name@1.0.1: {} - /is-regex@1.1.4: - resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} - engines: {node: '>= 0.4'} + is-regex@1.1.4: dependencies: call-bind: 1.0.7 has-tostringtag: 1.0.2 - /is-regexp@1.0.0: - resolution: {integrity: sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==} - engines: {node: '>=0.10.0'} - dev: false + is-regexp@1.0.0: {} - /is-set@2.0.3: - resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} - engines: {node: '>= 0.4'} - dev: true + is-set@2.0.3: {} - /is-shared-array-buffer@1.0.3: - resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} - engines: {node: '>= 0.4'} + is-shared-array-buffer@1.0.3: dependencies: call-bind: 1.0.7 - /is-stream@2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} + is-stream@2.0.1: {} - /is-stream@3.0.0: - resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true + is-stream@3.0.0: {} - /is-string@1.0.7: - resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} - engines: {node: '>= 0.4'} + is-string@1.0.7: dependencies: has-tostringtag: 1.0.2 - /is-symbol@1.0.4: - resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} - engines: {node: '>= 0.4'} + is-symbol@1.0.4: dependencies: has-symbols: 1.0.3 - /is-typed-array@1.1.13: - resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} - engines: {node: '>= 0.4'} + is-typed-array@1.1.13: dependencies: which-typed-array: 1.1.15 - /is-typedarray@1.0.0: - resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} - dev: true + is-typedarray@1.0.0: {} - /is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} - dev: true + is-unicode-supported@0.1.0: {} - /is-weakmap@2.0.2: - resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} - engines: {node: '>= 0.4'} - dev: true + is-weakmap@2.0.2: {} - /is-weakref@1.0.2: - resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + is-weakref@1.0.2: dependencies: call-bind: 1.0.7 - /is-weakset@2.0.3: - resolution: {integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==} - engines: {node: '>= 0.4'} + is-weakset@2.0.3: dependencies: call-bind: 1.0.7 get-intrinsic: 1.2.4 - dev: true - /is-wsl@2.2.0: - resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} - engines: {node: '>=8'} + is-wsl@2.2.0: dependencies: is-docker: 2.2.1 - dev: true - /is-yarn-global@0.3.0: - resolution: {integrity: sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==} - dev: true + is-yarn-global@0.3.0: {} - /isarray@2.0.5: - resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + isarray@2.0.5: {} - /isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - dev: true + isexe@2.0.0: {} - /isexe@3.1.1: - resolution: {integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==} - engines: {node: '>=16'} - dev: true + isexe@3.1.1: {} - /istanbul-lib-coverage@3.2.2: - resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} - engines: {node: '>=8'} - dev: true + istanbul-lib-coverage@3.2.2: {} - /istanbul-lib-instrument@5.2.1: - resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} - engines: {node: '>=8'} + istanbul-lib-instrument@5.2.1: dependencies: '@babel/core': 7.24.3 '@babel/parser': 7.24.1 @@ -6525,11 +9115,8 @@ packages: semver: 6.3.1 transitivePeerDependencies: - supports-color - dev: true - /istanbul-lib-instrument@6.0.2: - resolution: {integrity: sha512-1WUsZ9R1lA0HtBSohTkm39WTPlNKSJ5iFk7UwqXkBLoHQT+hfqPsfsTDVuZdKGaBwn7din9bS7SsnoAr943hvw==} - engines: {node: '>=10'} + istanbul-lib-instrument@6.0.2: dependencies: '@babel/core': 7.24.3 '@babel/parser': 7.24.1 @@ -6538,78 +9125,54 @@ packages: semver: 7.6.0 transitivePeerDependencies: - supports-color - dev: true - /istanbul-lib-report@3.0.1: - resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} - engines: {node: '>=10'} + istanbul-lib-report@3.0.1: dependencies: istanbul-lib-coverage: 3.2.2 make-dir: 4.0.0 supports-color: 7.2.0 - dev: true - /istanbul-lib-source-maps@4.0.1: - resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} - engines: {node: '>=10'} + istanbul-lib-source-maps@4.0.1: dependencies: debug: 4.3.4 istanbul-lib-coverage: 3.2.2 source-map: 0.6.1 transitivePeerDependencies: - supports-color - dev: true - /istanbul-reports@3.1.7: - resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} - engines: {node: '>=8'} + istanbul-reports@3.1.7: dependencies: html-escaper: 2.0.2 istanbul-lib-report: 3.0.1 - dev: true - /iterator.prototype@1.1.2: - resolution: {integrity: sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==} + iterator.prototype@1.1.2: dependencies: define-properties: 1.2.1 get-intrinsic: 1.2.4 has-symbols: 1.0.3 reflect.getprototypeof: 1.0.6 set-function-name: 2.0.2 - dev: true - /jackspeak@2.3.6: - resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} - engines: {node: '>=14'} + jackspeak@2.3.6: dependencies: '@isaacs/cliui': 8.0.2 optionalDependencies: '@pkgjs/parseargs': 0.11.0 - dev: true - /jake@10.8.7: - resolution: {integrity: sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==} - engines: {node: '>=10'} - hasBin: true + jake@10.8.7: dependencies: async: 3.2.5 chalk: 4.1.2 filelist: 1.0.4 minimatch: 3.1.2 - dev: false - /jest-changed-files@29.7.0: - resolution: {integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-changed-files@29.7.0: dependencies: execa: 5.1.1 jest-util: 29.7.0 p-limit: 3.1.0 - dev: true - /jest-circus@29.7.0: - resolution: {integrity: sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-circus@29.7.0(babel-plugin-macros@3.1.0): dependencies: '@jest/environment': 29.7.0 '@jest/expect': 29.7.0 @@ -6618,7 +9181,7 @@ packages: '@types/node': 20.11.30 chalk: 4.1.2 co: 4.6.0 - dedent: 1.5.1 + dedent: 1.5.1(babel-plugin-macros@3.1.0) is-generator-fn: 2.1.0 jest-each: 29.7.0 jest-matcher-utils: 29.7.0 @@ -6634,26 +9197,17 @@ packages: transitivePeerDependencies: - babel-plugin-macros - supports-color - dev: true - /jest-cli@29.7.0(@types/node@20.11.30)(ts-node@10.9.2): - resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true + jest-cli@29.7.0(@types/node@20.11.30)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.4.8)(@types/node@20.11.30)(typescript@5.4.2)): dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2) + '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.4.8)(@types/node@20.11.30)(typescript@5.4.2)) '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@20.11.30)(ts-node@10.9.2) + create-jest: 29.7.0(@types/node@20.11.30)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.4.8)(@types/node@20.11.30)(typescript@5.4.2)) exit: 0.1.2 import-local: 3.1.0 - jest-config: 29.7.0(@types/node@20.11.30)(ts-node@10.9.2) + jest-config: 29.7.0(@types/node@20.11.30)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.4.8)(@types/node@20.11.30)(typescript@5.4.2)) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -6662,31 +9216,19 @@ packages: - babel-plugin-macros - supports-color - ts-node - dev: true - /jest-config@29.7.0(@types/node@20.11.30)(ts-node@10.9.2): - resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - '@types/node': '*' - ts-node: '>=9.0.0' - peerDependenciesMeta: - '@types/node': - optional: true - ts-node: - optional: true + jest-config@29.7.0(@types/node@20.11.30)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.4.8)(@types/node@20.11.30)(typescript@5.4.2)): dependencies: '@babel/core': 7.24.3 '@jest/test-sequencer': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.11.30 babel-jest: 29.7.0(@babel/core@7.24.3) chalk: 4.1.2 ci-info: 3.9.0 deepmerge: 4.3.1 glob: 7.2.3 graceful-fs: 4.2.11 - jest-circus: 29.7.0 + jest-circus: 29.7.0(babel-plugin-macros@3.1.0) jest-environment-node: 29.7.0 jest-get-type: 29.6.3 jest-regex-util: 29.6.3 @@ -6699,48 +9241,33 @@ packages: pretty-format: 29.7.0 slash: 3.0.0 strip-json-comments: 3.1.1 - ts-node: 10.9.2(@types/node@20.11.30)(typescript@5.4.2) + optionalDependencies: + '@types/node': 20.11.30 + ts-node: 10.9.2(@swc/core@1.4.8)(@types/node@20.11.30)(typescript@5.4.2) transitivePeerDependencies: - babel-plugin-macros - supports-color - dev: true - /jest-diff@29.7.0: - resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-diff@29.7.0: dependencies: chalk: 4.1.2 diff-sequences: 29.6.3 jest-get-type: 29.6.3 pretty-format: 29.7.0 - dev: true - /jest-docblock@29.7.0: - resolution: {integrity: sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-docblock@29.7.0: dependencies: detect-newline: 3.1.0 - dev: true - /jest-each@29.7.0: - resolution: {integrity: sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-each@29.7.0: dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 jest-get-type: 29.6.3 jest-util: 29.7.0 pretty-format: 29.7.0 - dev: true - /jest-environment-jsdom@29.7.0: - resolution: {integrity: sha512-k9iQbsf9OyOfdzWH8HDmrRT0gSIcX+FLNW7IQq94tFX0gynPwqDTW0Ho6iMVNjGz/nb+l/vW3dWM2bbLLpkbXA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - canvas: ^2.5.0 - peerDependenciesMeta: - canvas: - optional: true + jest-environment-jsdom@29.7.0: dependencies: '@jest/environment': 29.7.0 '@jest/fake-timers': 29.7.0 @@ -6754,11 +9281,8 @@ packages: - bufferutil - supports-color - utf-8-validate - dev: true - /jest-environment-node@29.7.0: - resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-environment-node@29.7.0: dependencies: '@jest/environment': 29.7.0 '@jest/fake-timers': 29.7.0 @@ -6766,16 +9290,10 @@ packages: '@types/node': 20.11.30 jest-mock: 29.7.0 jest-util: 29.7.0 - dev: true - /jest-get-type@29.6.3: - resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dev: true + jest-get-type@29.6.3: {} - /jest-haste-map@29.7.0: - resolution: {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-haste-map@29.7.0: dependencies: '@jest/types': 29.6.3 '@types/graceful-fs': 4.1.9 @@ -6790,29 +9308,20 @@ packages: walker: 1.0.8 optionalDependencies: fsevents: 2.3.3 - dev: true - /jest-leak-detector@29.7.0: - resolution: {integrity: sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-leak-detector@29.7.0: dependencies: jest-get-type: 29.6.3 pretty-format: 29.7.0 - dev: true - /jest-matcher-utils@29.7.0: - resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-matcher-utils@29.7.0: dependencies: chalk: 4.1.2 jest-diff: 29.7.0 jest-get-type: 29.6.3 pretty-format: 29.7.0 - dev: true - /jest-message-util@29.7.0: - resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-message-util@29.7.0: dependencies: '@babel/code-frame': 7.24.2 '@jest/types': 29.6.3 @@ -6823,47 +9332,27 @@ packages: pretty-format: 29.7.0 slash: 3.0.0 stack-utils: 2.0.6 - dev: true - /jest-mock@29.7.0: - resolution: {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-mock@29.7.0: dependencies: '@jest/types': 29.6.3 '@types/node': 20.11.30 jest-util: 29.7.0 - dev: true - /jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): - resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} - engines: {node: '>=6'} - peerDependencies: - jest-resolve: '*' - peerDependenciesMeta: - jest-resolve: - optional: true - dependencies: + jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): + optionalDependencies: jest-resolve: 29.7.0 - dev: true - /jest-regex-util@29.6.3: - resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dev: true + jest-regex-util@29.6.3: {} - /jest-resolve-dependencies@29.7.0: - resolution: {integrity: sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-resolve-dependencies@29.7.0: dependencies: jest-regex-util: 29.6.3 jest-snapshot: 29.7.0 transitivePeerDependencies: - supports-color - dev: true - /jest-resolve@29.7.0: - resolution: {integrity: sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-resolve@29.7.0: dependencies: chalk: 4.1.2 graceful-fs: 4.2.11 @@ -6874,11 +9363,8 @@ packages: resolve: 1.22.8 resolve.exports: 2.0.2 slash: 3.0.0 - dev: true - /jest-runner@29.7.0: - resolution: {integrity: sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-runner@29.7.0: dependencies: '@jest/console': 29.7.0 '@jest/environment': 29.7.0 @@ -6903,11 +9389,8 @@ packages: source-map-support: 0.5.13 transitivePeerDependencies: - supports-color - dev: true - /jest-runtime@29.7.0: - resolution: {integrity: sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-runtime@29.7.0: dependencies: '@jest/environment': 29.7.0 '@jest/fake-timers': 29.7.0 @@ -6933,11 +9416,8 @@ packages: strip-bom: 4.0.0 transitivePeerDependencies: - supports-color - dev: true - /jest-snapshot@29.7.0: - resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-snapshot@29.7.0: dependencies: '@babel/core': 7.24.3 '@babel/generator': 7.24.1 @@ -6961,11 +9441,8 @@ packages: semver: 7.6.0 transitivePeerDependencies: - supports-color - dev: true - /jest-util@29.7.0: - resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-util@29.7.0: dependencies: '@jest/types': 29.6.3 '@types/node': 20.11.30 @@ -6973,11 +9450,8 @@ packages: ci-info: 3.9.0 graceful-fs: 4.2.11 picomatch: 2.3.1 - dev: true - /jest-validate@29.7.0: - resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-validate@29.7.0: dependencies: '@jest/types': 29.6.3 camelcase: 6.3.0 @@ -6985,11 +9459,8 @@ packages: jest-get-type: 29.6.3 leven: 3.1.0 pretty-format: 29.7.0 - dev: true - /jest-watcher@29.7.0: - resolution: {integrity: sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-watcher@29.7.0: dependencies: '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 @@ -6999,84 +9470,48 @@ packages: emittery: 0.13.1 jest-util: 29.7.0 string-length: 4.0.2 - dev: true - /jest-worker@29.7.0: - resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-worker@29.7.0: dependencies: '@types/node': 20.11.30 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 - dev: true - /jest@29.7.0(@types/node@20.11.30)(ts-node@10.9.2): - resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true + jest@29.7.0(@types/node@20.11.30)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.4.8)(@types/node@20.11.30)(typescript@5.4.2)): dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2) + '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.4.8)(@types/node@20.11.30)(typescript@5.4.2)) '@jest/types': 29.6.3 import-local: 3.1.0 - jest-cli: 29.7.0(@types/node@20.11.30)(ts-node@10.9.2) + jest-cli: 29.7.0(@types/node@20.11.30)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.4.8)(@types/node@20.11.30)(typescript@5.4.2)) transitivePeerDependencies: - '@types/node' - babel-plugin-macros - supports-color - ts-node - dev: true - /jju@1.4.0: - resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} - dev: true + jju@1.4.0: {} - /joi@17.12.3: - resolution: {integrity: sha512-2RRziagf555owrm9IRVtdKynOBeITiDpuZqIpgwqXShPncPKNiRQoiGsl/T8SQdq+8ugRzH2LqY67irr2y/d+g==} + joi@17.12.3: dependencies: '@hapi/hoek': 9.3.0 '@hapi/topo': 5.1.0 '@sideway/address': 4.1.5 '@sideway/formula': 3.0.1 '@sideway/pinpoint': 2.0.0 - dev: true - - /js-levenshtein@1.1.6: - resolution: {integrity: sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==} - engines: {node: '>=0.10.0'} - dev: true - /js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + js-tokens@4.0.0: {} - /js-yaml@3.14.1: - resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} - hasBin: true + js-yaml@3.14.1: dependencies: argparse: 1.0.10 esprima: 4.0.1 - dev: true - /js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true + js-yaml@4.1.0: dependencies: argparse: 2.0.1 - dev: true - /jsdom@20.0.3: - resolution: {integrity: sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==} - engines: {node: '>=14'} - peerDependencies: - canvas: ^2.5.0 - peerDependenciesMeta: - canvas: - optional: true + jsdom@20.0.3: dependencies: abab: 2.0.6 acorn: 8.11.3 @@ -7108,115 +9543,64 @@ packages: - bufferutil - supports-color - utf-8-validate - dev: true - /jsesc@0.5.0: - resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} - hasBin: true - dev: false + jsesc@0.5.0: {} - /jsesc@2.5.2: - resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} - engines: {node: '>=4'} - hasBin: true + jsesc@2.5.2: {} - /json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - dev: true + json-buffer@3.0.1: {} - /json-parse-even-better-errors@2.3.1: - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + json-parse-even-better-errors@2.3.1: {} - /json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - dev: true + json-schema-traverse@0.4.1: {} - /json-schema-traverse@1.0.0: - resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + json-schema-traverse@1.0.0: {} - /json-schema-typed@7.0.3: - resolution: {integrity: sha512-7DE8mpG+/fVw+dTpjbxnx47TaMnDfOI1jwft9g1VybltZCduyRQPJPvc+zzKY9WPHxhPWczyFuYa6I8Mw4iU5A==} - dev: true + json-schema-typed@7.0.3: {} - /json-schema@0.4.0: - resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} - dev: false + json-schema@0.4.0: {} - /json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - dev: true + json-stable-stringify-without-jsonify@1.0.1: {} - /json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} - hasBin: true + json5@1.0.2: dependencies: minimist: 1.2.8 - dev: true - /json5@2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} - engines: {node: '>=6'} - hasBin: true + json5@2.2.3: {} - /jsonfile@6.1.0: - resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + jsonfile@6.1.0: dependencies: universalify: 2.0.1 optionalDependencies: graceful-fs: 4.2.11 - dev: false - /jsonparse@1.3.1: - resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} - engines: {'0': node >= 0.2.0} - dev: true + jsonparse@1.3.1: {} - /jsonpointer@5.0.1: - resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==} - engines: {node: '>=0.10.0'} - dev: false + jsonpointer@5.0.1: {} - /jsx-ast-utils@3.3.5: - resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} - engines: {node: '>=4.0'} + jsx-ast-utils@3.3.5: dependencies: array-includes: 3.1.7 array.prototype.flat: 1.3.2 object.assign: 4.1.5 object.values: 1.2.0 - dev: true - /keyv@4.5.4: - resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + keyv@4.5.4: dependencies: json-buffer: 3.0.1 - dev: true - /kleur@3.0.3: - resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} - engines: {node: '>=6'} - dev: true + kleur@3.0.3: {} - /kuler@2.0.0: - resolution: {integrity: sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==} - dev: true + kuler@2.0.0: {} - /leven@3.1.0: - resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} - engines: {node: '>=6'} + leven@3.1.0: {} - /levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} + levn@0.4.1: dependencies: prelude-ls: 1.2.1 type-check: 0.4.0 - dev: true - /license-compliance@3.0.0(typescript@5.4.2): - resolution: {integrity: sha512-0kXEr7JSdP+jPSTSEnAiyGvpOoFnkiVXqmTFhXx22+tCay7shTN1mVM7Z+p2F3YNeIhx0tmADglrp5ddWGyHnQ==} - engines: {node: '>=18.20.1'} - hasBin: true + license-compliance@3.0.0(typescript@5.4.2): dependencies: chalk: 4.1.2 commander: 12.0.0 @@ -7230,20 +9614,12 @@ packages: transitivePeerDependencies: - supports-color - typescript - dev: true - /lilconfig@3.0.0: - resolution: {integrity: sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==} - engines: {node: '>=14'} - dev: true + lilconfig@3.0.0: {} - /lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + lines-and-columns@1.2.4: {} - /lint-staged@15.2.2: - resolution: {integrity: sha512-TiTt93OPh1OZOsb5B7k96A/ATl2AjIZo+vnzFZ6oHK5FuTk63ByDtxGQpHm+kFETjEWqgkF95M8FRXKR/LEBcw==} - engines: {node: '>=18.12.0'} - hasBin: true + lint-staged@15.2.2: dependencies: chalk: 5.3.0 commander: 11.1.0 @@ -7257,11 +9633,8 @@ packages: yaml: 2.3.4 transitivePeerDependencies: - supports-color - dev: true - /listr2@8.0.1: - resolution: {integrity: sha512-ovJXBXkKGfq+CwmKTjluEqFi3p4h8xvkxGQQAQan22YCgef4KZ1mKGjzfGh6PL6AW5Csw0QiQPNuQyH+6Xk3hA==} - engines: {node: '>=18.0.0'} + listr2@8.0.1: dependencies: cli-truncate: 4.0.0 colorette: 2.0.20 @@ -7269,75 +9642,46 @@ packages: log-update: 6.0.0 rfdc: 1.3.1 wrap-ansi: 9.0.0 - dev: true - /locate-path@3.0.0: - resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} - engines: {node: '>=6'} + locate-path@3.0.0: dependencies: p-locate: 3.0.0 path-exists: 3.0.0 - dev: true - /locate-path@5.0.0: - resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} - engines: {node: '>=8'} + locate-path@5.0.0: dependencies: p-locate: 4.1.0 - dev: true - /locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} + locate-path@6.0.0: dependencies: p-locate: 5.0.0 - dev: true - /lodash.camelcase@4.3.0: - resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} - dev: false + lodash.camelcase@4.3.0: {} - /lodash.debounce@4.0.8: - resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} - dev: false + lodash.debounce@4.0.8: {} - /lodash.memoize@4.1.2: - resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} - dev: true + lodash.memoize@4.1.2: {} - /lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - dev: true + lodash.merge@4.6.2: {} - /lodash.sortby@4.7.0: - resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} - dev: false + lodash.sortby@4.7.0: {} - /lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + lodash@4.17.21: {} - /log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} + log-symbols@4.1.0: dependencies: chalk: 4.1.2 is-unicode-supported: 0.1.0 - dev: true - /log-update@6.0.0: - resolution: {integrity: sha512-niTvB4gqvtof056rRIrTZvjNYE4rCUzO6X/X+kYjd7WFxXeJ0NwEFnRxX6ehkvv3jTwrXnNdtAak5XYZuIyPFw==} - engines: {node: '>=18'} + log-update@6.0.0: dependencies: ansi-escapes: 6.2.0 cli-cursor: 4.0.0 slice-ansi: 7.1.0 strip-ansi: 7.1.0 wrap-ansi: 9.0.0 - dev: true - /logform@2.6.0: - resolution: {integrity: sha512-1ulHeNPp6k/LD8H91o7VYFBng5i1BDE7HoKxVbZiGFidS1Rj65qcywLxX+pVfAPoQJEjRdvKcusKwOupHCVOVQ==} - engines: {node: '>= 12.0.0'} + logform@2.6.0: dependencies: '@colors/colors': 1.6.0 '@types/triple-beam': 1.3.5 @@ -7345,399 +9689,221 @@ packages: ms: 2.1.3 safe-stable-stringify: 2.4.3 triple-beam: 1.4.1 - dev: true - /loose-envify@1.4.0: - resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} - hasBin: true + loose-envify@1.4.0: dependencies: js-tokens: 4.0.0 - /lowercase-keys@2.0.0: - resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} - engines: {node: '>=8'} - dev: true + lowercase-keys@2.0.0: {} - /lru-cache@10.2.0: - resolution: {integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==} - engines: {node: 14 || >=16.14} - dev: true + lru-cache@10.2.0: {} - /lru-cache@5.1.1: - resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + lru-cache@5.1.1: dependencies: yallist: 3.1.1 - /lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} + lru-cache@6.0.0: dependencies: yallist: 4.0.0 - dev: true - /lz-string@1.5.0: - resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} - hasBin: true - dev: true + lz-string@1.5.0: {} - /magic-string@0.25.9: - resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} + magic-string@0.25.9: dependencies: sourcemap-codec: 1.4.8 - dev: false - /make-dir@3.1.0: - resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} - engines: {node: '>=8'} + make-dir@3.1.0: dependencies: semver: 6.3.1 - dev: true - /make-dir@4.0.0: - resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} - engines: {node: '>=10'} + make-dir@4.0.0: dependencies: semver: 7.6.0 - dev: true - /make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - dev: true + make-error@1.3.6: {} - /makeerror@1.0.12: - resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} + makeerror@1.0.12: dependencies: tmpl: 1.0.5 - dev: true - /map-stream@0.0.7: - resolution: {integrity: sha512-C0X0KQmGm3N2ftbTGBhSyuydQ+vV1LC3f3zPvT3RXHXNZrvfPZcoXp/N5DOa8vedX/rTMm2CjTtivFg2STJMRQ==} - dev: true + map-stream@0.0.7: {} - /merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} - dev: true + merge-stream@2.0.0: {} - /merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} + merge2@1.4.1: {} - /micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} - engines: {node: '>=8.6'} + micromatch@4.0.5: dependencies: braces: 3.0.2 picomatch: 2.3.1 - /mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} + mime-db@1.52.0: {} - /mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} + mime-types@2.1.35: dependencies: mime-db: 1.52.0 - /mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} - dev: true + mimic-fn@2.1.0: {} - /mimic-fn@3.1.0: - resolution: {integrity: sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==} - engines: {node: '>=8'} - dev: true + mimic-fn@3.1.0: {} - /mimic-fn@4.0.0: - resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} - engines: {node: '>=12'} - dev: true + mimic-fn@4.0.0: {} - /mimic-response@1.0.1: - resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} - engines: {node: '>=4'} - dev: true + mimic-response@1.0.1: {} - /mimic-response@3.1.0: - resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} - engines: {node: '>=10'} - dev: true + mimic-response@3.1.0: {} - /min-indent@1.0.1: - resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} - engines: {node: '>=4'} - dev: true + min-indent@1.0.1: {} - /minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + minimatch@3.1.2: dependencies: brace-expansion: 1.1.11 - /minimatch@5.1.6: - resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} - engines: {node: '>=10'} + minimatch@5.1.6: dependencies: brace-expansion: 2.0.1 - dev: false - /minimatch@9.0.3: - resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} - engines: {node: '>=16 || 14 >=14.17'} + minimatch@9.0.3: dependencies: brace-expansion: 2.0.1 - dev: true - /minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - dev: true + minimist@1.2.8: {} - /minipass@7.0.4: - resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} - engines: {node: '>=16 || 14 >=14.17'} - dev: true + minipass@7.0.4: {} - /ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + ms@2.1.2: {} - /ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - dev: true + ms@2.1.3: {} - /msw@1.3.3(typescript@5.4.2): - resolution: {integrity: sha512-CiPyRFiYJCXYyH/vwxT7m+sa4VZHuUH6cGwRBj0kaTjBGpsk4EnL47YzhoA859htVCF2vzqZuOsomIUlFqg9GQ==} - engines: {node: '>=14'} - hasBin: true - requiresBuild: true - peerDependencies: - typescript: '>= 4.4.x' - peerDependenciesMeta: - typescript: - optional: true + msw@2.2.14(typescript@5.4.2): dependencies: - '@mswjs/cookies': 0.2.2 - '@mswjs/interceptors': 0.17.10 - '@open-draft/until': 1.0.3 - '@types/cookie': 0.4.1 - '@types/js-levenshtein': 1.1.3 + '@bundled-es-modules/cookie': 2.0.0 + '@bundled-es-modules/statuses': 1.0.1 + '@inquirer/confirm': 3.1.6 + '@mswjs/cookies': 1.1.0 + '@mswjs/interceptors': 0.26.15 + '@open-draft/until': 2.1.0 + '@types/cookie': 0.6.0 + '@types/statuses': 2.0.5 chalk: 4.1.2 - chokidar: 3.6.0 - cookie: 0.4.2 graphql: 16.8.1 - headers-polyfill: 3.2.5 - inquirer: 8.2.6 + headers-polyfill: 4.0.3 is-node-process: 1.2.0 - js-levenshtein: 1.1.6 - node-fetch: 2.7.0 outvariant: 1.4.2 path-to-regexp: 6.2.1 - strict-event-emitter: 0.4.6 - type-fest: 2.19.0 - typescript: 5.4.2 + strict-event-emitter: 0.5.1 + type-fest: 4.18.0 yargs: 17.7.2 - transitivePeerDependencies: - - encoding - - supports-color - dev: true - - /mute-stream@0.0.8: - resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} - dev: true - - /mute-stream@1.0.0: - resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: true + optionalDependencies: + typescript: 5.4.2 - /nanoid@3.3.7: - resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true + mute-stream@1.0.0: {} - /natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - dev: true + nanoid@3.3.7: {} - /node-domexception@1.0.0: - resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} - engines: {node: '>=10.5.0'} - dev: true + natural-compare@1.4.0: {} - /node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - dependencies: - whatwg-url: 5.0.0 - dev: true + node-domexception@1.0.0: {} - /node-fetch@3.3.2: - resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + node-fetch@3.3.2: dependencies: data-uri-to-buffer: 4.0.1 fetch-blob: 3.2.0 formdata-polyfill: 4.0.10 - dev: true - /node-int64@0.4.0: - resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} - dev: true + node-int64@0.4.0: {} - /node-releases@2.0.14: - resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} + node-releases@2.0.14: {} - /normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - dev: true + normalize-path@3.0.0: {} - /normalize-range@0.1.2: - resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} - engines: {node: '>=0.10.0'} - dev: true + normalize-range@0.1.2: {} - /normalize-url@6.1.0: - resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} - engines: {node: '>=10'} - dev: true + normalize-url@6.1.0: {} - /npm-run-path@4.0.1: - resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} - engines: {node: '>=8'} + npm-run-path@4.0.1: dependencies: path-key: 3.1.1 - dev: true - /npm-run-path@5.3.0: - resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + npm-run-path@5.3.0: dependencies: path-key: 4.0.0 - dev: true - /nwsapi@2.2.7: - resolution: {integrity: sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==} - dev: true + nwsapi@2.2.7: {} - /object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} + object-assign@4.1.1: {} - /object-inspect@1.13.1: - resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} + object-inspect@1.13.1: {} - /object-is@1.1.6: - resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} - engines: {node: '>= 0.4'} + object-is@1.1.6: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - dev: true - /object-keys@1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} + object-keys@1.1.1: {} - /object-treeify@1.1.33: - resolution: {integrity: sha512-EFVjAYfzWqWsBMRHPMAXLCDIJnpMhdWAqR7xG6M6a2cs6PMFpl/+Z20w9zDW4vkxOFfddegBKq9Rehd0bxWE7A==} - engines: {node: '>= 10'} - dev: true + object-treeify@1.1.33: {} - /object.assign@4.1.5: - resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} - engines: {node: '>= 0.4'} + object.assign@4.1.5: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 has-symbols: 1.0.3 object-keys: 1.1.1 - /object.entries@1.1.8: - resolution: {integrity: sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==} - engines: {node: '>= 0.4'} + object.entries@1.1.8: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-object-atoms: 1.0.0 - dev: true - /object.fromentries@2.0.8: - resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} - engines: {node: '>= 0.4'} + object.fromentries@2.0.8: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.23.2 es-object-atoms: 1.0.0 - dev: true - /object.groupby@1.0.3: - resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} - engines: {node: '>= 0.4'} + object.groupby@1.0.3: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.23.2 - dev: true - /object.hasown@1.1.3: - resolution: {integrity: sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==} + object.hasown@1.1.3: dependencies: define-properties: 1.2.1 es-abstract: 1.22.5 - dev: true - /object.values@1.2.0: - resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==} - engines: {node: '>= 0.4'} + object.values@1.2.0: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-object-atoms: 1.0.0 - dev: true - /once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + once@1.4.0: dependencies: wrappy: 1.0.2 - /one-time@1.0.0: - resolution: {integrity: sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==} + one-time@1.0.0: dependencies: fn.name: 1.1.0 - dev: true - /onetime@5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} + onetime@5.1.2: dependencies: mimic-fn: 2.1.0 - dev: true - /onetime@6.0.0: - resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} - engines: {node: '>=12'} + onetime@6.0.0: dependencies: mimic-fn: 4.0.0 - dev: true - /open@8.4.2: - resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} - engines: {node: '>=12'} + open@8.4.2: dependencies: define-lazy-prop: 2.0.0 is-docker: 2.2.1 is-wsl: 2.2.0 - dev: true - /optionator@0.9.3: - resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} - engines: {node: '>= 0.8.0'} + optionator@0.9.3: dependencies: '@aashutoshrathi/word-wrap': 1.2.6 deep-is: 0.1.4 @@ -7745,11 +9911,8 @@ packages: levn: 0.4.1 prelude-ls: 1.2.1 type-check: 0.4.0 - dev: true - /ora@5.4.1: - resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} - engines: {node: '>=10'} + ora@5.4.1: dependencies: bl: 4.1.0 chalk: 4.1.2 @@ -7760,425 +9923,235 @@ packages: log-symbols: 4.1.0 strip-ansi: 6.0.1 wcwidth: 1.0.1 - dev: true - /os-tmpdir@1.0.2: - resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} - engines: {node: '>=0.10.0'} - dev: true + os-tmpdir@1.0.2: {} - /outvariant@1.4.2: - resolution: {integrity: sha512-Ou3dJ6bA/UJ5GVHxah4LnqDwZRwAmWxrG3wtrHrbGnP4RnLCtA64A4F+ae7Y8ww660JaddSoArUR5HjipWSHAQ==} - dev: true + outvariant@1.4.2: {} - /p-cancelable@2.1.1: - resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==} - engines: {node: '>=8'} - dev: true + p-cancelable@2.1.1: {} - /p-limit@2.3.0: - resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} - engines: {node: '>=6'} + p-limit@2.3.0: dependencies: p-try: 2.2.0 - dev: true - /p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} + p-limit@3.1.0: dependencies: yocto-queue: 0.1.0 - dev: true - /p-locate@3.0.0: - resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} - engines: {node: '>=6'} + p-locate@3.0.0: dependencies: p-limit: 2.3.0 - dev: true - /p-locate@4.1.0: - resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} - engines: {node: '>=8'} + p-locate@4.1.0: dependencies: p-limit: 2.3.0 - dev: true - /p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} + p-locate@5.0.0: dependencies: p-limit: 3.1.0 - dev: true - /p-try@2.2.0: - resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} - engines: {node: '>=6'} - dev: true + p-try@2.2.0: {} - /package-json@7.0.0: - resolution: {integrity: sha512-CHJqc94AA8YfSLHGQT3DbvSIuE12NLFekpM4n7LRrAd3dOJtA911+4xe9q6nC3/jcKraq7nNS9VxgtT0KC+diA==} - engines: {node: '>=12'} + package-json@7.0.0: dependencies: got: 11.8.6 registry-auth-token: 4.2.2 registry-url: 5.1.0 semver: 7.6.0 - dev: true - /parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} + parent-module@1.0.1: dependencies: callsites: 3.1.0 - /parse-json@5.2.0: - resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} - engines: {node: '>=8'} + parse-json@5.2.0: dependencies: '@babel/code-frame': 7.24.2 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 - /parse5@7.1.2: - resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} + parse5@7.1.2: dependencies: entities: 4.5.0 - dev: true - /path-exists@3.0.0: - resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} - engines: {node: '>=4'} - dev: true + path-exists@3.0.0: {} - /path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - dev: true + path-exists@4.0.0: {} - /path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} + path-is-absolute@1.0.1: {} - /path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} - dev: true + path-key@3.1.1: {} - /path-key@4.0.0: - resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} - engines: {node: '>=12'} - dev: true + path-key@4.0.0: {} - /path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + path-parse@1.0.7: {} - /path-scurry@1.10.1: - resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} - engines: {node: '>=16 || 14 >=14.17'} + path-scurry@1.10.1: dependencies: lru-cache: 10.2.0 minipass: 7.0.4 - dev: true - /path-to-regexp@6.2.1: - resolution: {integrity: sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==} - dev: true + path-to-regexp@6.2.1: {} - /path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} + path-type@4.0.0: {} - /pause-stream@0.0.11: - resolution: {integrity: sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==} + pause-stream@0.0.11: dependencies: through: 2.3.8 - dev: true - /picocolors@1.0.0: - resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + picocolors@1.0.0: {} - /picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} + picomatch@2.3.1: {} - /pidtree@0.6.0: - resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} - engines: {node: '>=0.10'} - hasBin: true - dev: true + pidtree@0.6.0: {} - /pirates@4.0.6: - resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} - engines: {node: '>= 6'} - dev: true + pirates@4.0.6: {} - /pkg-dir@4.2.0: - resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} - engines: {node: '>=8'} + pkg-dir@4.2.0: dependencies: find-up: 4.1.0 - dev: true - /pkg-up@3.1.0: - resolution: {integrity: sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==} - engines: {node: '>=8'} + pkg-up@3.1.0: dependencies: find-up: 3.0.0 - dev: true - /playwright-core@1.42.1: - resolution: {integrity: sha512-mxz6zclokgrke9p1vtdy/COWBH+eOZgYUVVU34C73M+4j4HLlQJHtfcqiqqxpP0o8HhMkflvfbquLX5dg6wlfA==} - engines: {node: '>=16'} - hasBin: true - dev: true + playwright-core@1.42.1: {} - /playwright@1.42.1: - resolution: {integrity: sha512-PgwB03s2DZBcNRoW+1w9E+VkLBxweib6KTXM0M3tkiT4jVxKSi6PmVJ591J+0u10LUrgxB7dLRbiJqO5s2QPMg==} - engines: {node: '>=16'} - hasBin: true + playwright@1.42.1: dependencies: playwright-core: 1.42.1 optionalDependencies: fsevents: 2.3.2 - dev: true - /possible-typed-array-names@1.0.0: - resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} - engines: {node: '>= 0.4'} + possible-typed-array-names@1.0.0: {} - /postcss-value-parser@4.2.0: - resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - dev: true + postcss-value-parser@4.2.0: {} - /postcss@8.4.38: - resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} - engines: {node: ^10 || ^12 || >=14} + postcss@8.4.38: dependencies: nanoid: 3.3.7 picocolors: 1.0.0 source-map-js: 1.2.0 - /prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} - dev: true + prelude-ls@1.2.1: {} - /prettier-linter-helpers@1.0.0: - resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} - engines: {node: '>=6.0.0'} + prettier-linter-helpers@1.0.0: dependencies: fast-diff: 1.3.0 - dev: true - /prettier-plugin-sort-imports@1.8.5(typescript@5.4.2): - resolution: {integrity: sha512-PkizzuO2S8h3kJeWHytnMZXqvv/fD6g+en/dhv4y5QjoiMm1wq3FWzFiFT7c/BilX95l0ZIqJTlMsXYs8z/WQQ==} - peerDependencies: - typescript: '>4.0.0' + prettier-plugin-sort-imports@1.8.5(typescript@5.4.2): dependencies: prettier: 3.2.5 typescript: 5.4.2 - dev: true - /prettier@3.2.5: - resolution: {integrity: sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==} - engines: {node: '>=14'} - hasBin: true - dev: true + prettier@3.2.5: {} - /pretty-bytes@5.6.0: - resolution: {integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==} - engines: {node: '>=6'} - dev: false + pretty-bytes@5.6.0: {} - /pretty-bytes@6.1.1: - resolution: {integrity: sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==} - engines: {node: ^14.13.1 || >=16.0.0} - dev: false + pretty-bytes@6.1.1: {} - /pretty-format@27.5.1: - resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + pretty-format@27.5.1: dependencies: ansi-regex: 5.0.1 ansi-styles: 5.2.0 react-is: 17.0.2 - dev: true - /pretty-format@29.7.0: - resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + pretty-format@29.7.0: dependencies: '@jest/schemas': 29.6.3 ansi-styles: 5.2.0 react-is: 18.2.0 - dev: true - /prompts@2.4.2: - resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} - engines: {node: '>= 6'} + prompts@2.4.2: dependencies: kleur: 3.0.3 sisteransi: 1.0.5 - dev: true - /prop-types@15.8.1: - resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + prop-types@15.8.1: dependencies: loose-envify: 1.4.0 object-assign: 4.1.1 react-is: 16.13.1 - /property-expr@2.0.6: - resolution: {integrity: sha512-SVtmxhRE/CGkn3eZY1T6pC8Nln6Fr/lu1mKSgRud0eC73whjGfoAogbn78LkD8aFL0zz3bAFerKSnOl7NlErBA==} - dev: false + property-expr@2.0.6: {} - /proxy-from-env@1.1.0: - resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} - dev: false + proxy-from-env@1.1.0: {} - /psl@1.9.0: - resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} - dev: true + psl@1.9.0: {} - /pump@3.0.0: - resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + pump@3.0.0: dependencies: end-of-stream: 1.4.4 once: 1.4.0 - dev: true - /punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} - engines: {node: '>=6'} + punycode@2.3.1: {} - /pupa@2.1.1: - resolution: {integrity: sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==} - engines: {node: '>=8'} + pupa@2.1.1: dependencies: escape-goat: 2.1.1 - dev: true - /pure-rand@6.0.4: - resolution: {integrity: sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA==} - dev: true + pure-rand@6.0.4: {} - /querystringify@2.2.0: - resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} - dev: true + querystringify@2.2.0: {} - /queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + queue-microtask@1.2.3: {} - /quick-lru@5.1.1: - resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} - engines: {node: '>=10'} - dev: true + quick-lru@5.1.1: {} - /randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + randombytes@2.1.0: dependencies: safe-buffer: 5.2.1 - dev: false - /rc@1.2.8: - resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} - hasBin: true + rc@1.2.8: dependencies: deep-extend: 0.6.0 ini: 1.3.8 minimist: 1.2.8 strip-json-comments: 2.0.1 - dev: true - /react-dom@18.2.0(react@18.2.0): - resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} - peerDependencies: - react: ^18.2.0 + react-dom@18.2.0(react@18.2.0): dependencies: loose-envify: 1.4.0 react: 18.2.0 scheduler: 0.23.0 - /react-error-boundary@4.0.13(react@18.2.0): - resolution: {integrity: sha512-b6PwbdSv8XeOSYvjt8LpgpKrZ0yGdtZokYwkwV2wlcZbxgopHX/hgPl5VgpnoVOWd868n1hktM8Qm4b+02MiLQ==} - peerDependencies: - react: '>=16.13.1' + react-error-boundary@4.0.13(react@18.2.0): dependencies: '@babel/runtime': 7.24.1 react: 18.2.0 - dev: false - /react-hook-form@7.51.3(react@18.2.0): - resolution: {integrity: sha512-cvJ/wbHdhYx8aviSWh28w9ImjmVsb5Y05n1+FW786vEZQJV5STNM0pW6ujS+oiBecb0ARBxJFyAnXj9+GHXACQ==} - engines: {node: '>=12.22.0'} - peerDependencies: - react: ^16.8.0 || ^17 || ^18 + react-hook-form@7.51.3(react@18.2.0): dependencies: react: 18.2.0 - dev: false - - /react-is@16.13.1: - resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} - /react-is@17.0.2: - resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} - dev: true - - /react-is@18.2.0: - resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} + react-is@16.13.1: {} - /react-redux@9.1.0(@types/react@18.2.67)(react@18.2.0)(redux@5.0.1): - resolution: {integrity: sha512-6qoDzIO+gbrza8h3hjMA9aq4nwVFCKFtY2iLxCtVT38Swyy2C/dJCGBXHeHLtx6qlg/8qzc2MrhOeduf5K32wQ==} - peerDependencies: - '@types/react': ^18.2.25 - react: ^18.0 - react-native: '>=0.69' - redux: ^5.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - react-native: - optional: true - redux: - optional: true + react-is@17.0.2: {} + + react-is@18.2.0: {} + + react-redux@9.1.0(@types/react@18.2.67)(react@18.2.0)(redux@5.0.1): dependencies: - '@types/react': 18.2.67 '@types/use-sync-external-store': 0.0.3 react: 18.2.0 - redux: 5.0.1 use-sync-external-store: 1.2.0(react@18.2.0) - dev: false + optionalDependencies: + '@types/react': 18.2.67 + redux: 5.0.1 - /react-router-dom@6.22.3(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-7ZILI7HjcE+p31oQvwbokjk6OA/bnFxrhJ19n82Ex9Ph8fNAq+Hm/7KchpMGlTgWhUxRHMMCut+vEtNpWpowKw==} - engines: {node: '>=14.0.0'} - peerDependencies: - react: '>=16.8' - react-dom: '>=16.8' + react-router-dom@6.22.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: '@remix-run/router': 1.15.3 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) react-router: 6.22.3(react@18.2.0) - dev: false - /react-router@6.22.3(react@18.2.0): - resolution: {integrity: sha512-dr2eb3Mj5zK2YISHK++foM9w4eBnO23eKnZEDs7c880P6oKbrjz/Svg9+nxqtHQK+oMW4OtjZca0RqPglXxguQ==} - engines: {node: '>=14.0.0'} - peerDependencies: - react: '>=16.8' + react-router@6.22.3(react@18.2.0): dependencies: '@remix-run/router': 1.15.3 react: 18.2.0 - dev: false - /react-transition-group@4.4.5(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==} - peerDependencies: - react: '>=16.6.0' - react-dom: '>=16.6.0' + react-transition-group@4.4.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: '@babel/runtime': 7.24.1 dom-helpers: 5.2.1 @@ -8186,64 +10159,35 @@ packages: prop-types: 15.8.1 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - dev: false - /react@18.2.0: - resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} - engines: {node: '>=0.10.0'} + react@18.2.0: dependencies: loose-envify: 1.4.0 - /readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} + readable-stream@3.6.2: dependencies: inherits: 2.0.4 string_decoder: 1.3.0 util-deprecate: 1.0.2 - dev: true - /readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - dependencies: - picomatch: 2.3.1 - dev: true - - /readline-transform@1.0.0: - resolution: {integrity: sha512-7KA6+N9IGat52d83dvxnApAWN+MtVb1MiVuMR/cf1O4kYsJG+g/Aav0AHcHKsb6StinayfPLne0+fMX2sOzAKg==} - engines: {node: '>=6'} - dev: true + readline-transform@1.0.0: {} - /redent@3.0.0: - resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} - engines: {node: '>=8'} + redent@3.0.0: dependencies: indent-string: 4.0.0 strip-indent: 3.0.0 - dev: true - /redux-thunk@3.1.0(redux@5.0.1): - resolution: {integrity: sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw==} - peerDependencies: - redux: ^5.0.0 + redux-thunk@3.1.0(redux@5.0.1): dependencies: redux: 5.0.1 - dev: false - /redux@4.2.1: - resolution: {integrity: sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==} + redux@4.2.1: dependencies: '@babel/runtime': 7.24.1 - dev: true - /redux@5.0.1: - resolution: {integrity: sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==} - dev: false + redux@5.0.1: {} - /reflect.getprototypeof@1.0.6: - resolution: {integrity: sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==} - engines: {node: '>= 0.4'} + reflect.getprototypeof@1.0.6: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 @@ -8252,40 +10196,27 @@ packages: get-intrinsic: 1.2.4 globalthis: 1.0.3 which-builtin-type: 1.1.3 - dev: true - /regenerate-unicode-properties@10.1.1: - resolution: {integrity: sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==} - engines: {node: '>=4'} + regenerate-unicode-properties@10.1.1: dependencies: regenerate: 1.4.2 - dev: false - /regenerate@1.4.2: - resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} - dev: false + regenerate@1.4.2: {} - /regenerator-runtime@0.14.1: - resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + regenerator-runtime@0.14.1: {} - /regenerator-transform@0.15.2: - resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} + regenerator-transform@0.15.2: dependencies: '@babel/runtime': 7.24.5 - dev: false - /regexp.prototype.flags@1.5.2: - resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} - engines: {node: '>= 0.4'} + regexp.prototype.flags@1.5.2: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-errors: 1.3.0 set-function-name: 2.0.2 - /regexpu-core@5.3.2: - resolution: {integrity: sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==} - engines: {node: '>=4'} + regexpu-core@5.3.2: dependencies: '@babel/regjsgen': 0.8.0 regenerate: 1.4.2 @@ -8293,141 +10224,80 @@ packages: regjsparser: 0.9.1 unicode-match-property-ecmascript: 2.0.0 unicode-match-property-value-ecmascript: 2.1.0 - dev: false - /registry-auth-token@4.2.2: - resolution: {integrity: sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg==} - engines: {node: '>=6.0.0'} + registry-auth-token@4.2.2: dependencies: rc: 1.2.8 - dev: true - /registry-url@5.1.0: - resolution: {integrity: sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==} - engines: {node: '>=8'} + registry-url@5.1.0: dependencies: rc: 1.2.8 - dev: true - /regjsparser@0.9.1: - resolution: {integrity: sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==} - hasBin: true + regjsparser@0.9.1: dependencies: jsesc: 0.5.0 - dev: false - /require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - dev: true + require-directory@2.1.1: {} - /require-from-string@2.0.2: - resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} - engines: {node: '>=0.10.0'} + require-from-string@2.0.2: {} - /requires-port@1.0.0: - resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} - dev: true + requires-port@1.0.0: {} - /reselect@5.1.0: - resolution: {integrity: sha512-aw7jcGLDpSgNDyWBQLv2cedml85qd95/iszJjN988zX1t7AVRJi19d9kto5+W7oCfQ94gyo40dVbT6g2k4/kXg==} - dev: false + reselect@5.1.0: {} - /resolve-alpn@1.2.1: - resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} - dev: true + resolve-alpn@1.2.1: {} - /resolve-cwd@3.0.0: - resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} - engines: {node: '>=8'} + resolve-cwd@3.0.0: dependencies: resolve-from: 5.0.0 - dev: true - /resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} + resolve-from@4.0.0: {} - /resolve-from@5.0.0: - resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} - engines: {node: '>=8'} - dev: true + resolve-from@5.0.0: {} - /resolve-pkg-maps@1.0.0: - resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - dev: true + resolve-pkg-maps@1.0.0: {} - /resolve.exports@2.0.2: - resolution: {integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==} - engines: {node: '>=10'} - dev: true + resolve.exports@2.0.2: {} - /resolve@1.22.8: - resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} - hasBin: true + resolve@1.22.8: dependencies: is-core-module: 2.13.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - /resolve@2.0.0-next.5: - resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} - hasBin: true + resolve@2.0.0-next.5: dependencies: is-core-module: 2.13.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - dev: true - /responselike@2.0.1: - resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==} + responselike@2.0.1: dependencies: lowercase-keys: 2.0.0 - dev: true - /restore-cursor@3.1.0: - resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} - engines: {node: '>=8'} + restore-cursor@3.1.0: dependencies: onetime: 5.1.2 signal-exit: 3.0.7 - dev: true - /restore-cursor@4.0.0: - resolution: {integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + restore-cursor@4.0.0: dependencies: onetime: 5.1.2 signal-exit: 3.0.7 - dev: true - /reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + reusify@1.0.4: {} - /rfdc@1.3.1: - resolution: {integrity: sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==} - dev: true + rfdc@1.3.1: {} - /rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - hasBin: true + rimraf@3.0.2: dependencies: glob: 7.2.3 - dev: true - /rollup@2.79.1: - resolution: {integrity: sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==} - engines: {node: '>=10.0.0'} - hasBin: true + rollup@2.79.1: optionalDependencies: fsevents: 2.3.3 - dev: false - /rollup@4.14.0: - resolution: {integrity: sha512-Qe7w62TyawbDzB4yt32R0+AbIo6m1/sqO7UPzFS8Z/ksL5mrfhA0v4CavfdmFav3D+ub4QeAgsGEe84DoWe/nQ==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} - hasBin: true + rollup@4.14.0: dependencies: '@types/estree': 1.0.5 optionalDependencies: @@ -8448,100 +10318,54 @@ packages: '@rollup/rollup-win32-x64-msvc': 4.14.0 fsevents: 2.3.3 - /run-async@2.4.1: - resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} - engines: {node: '>=0.12.0'} - dev: true - - /run-async@3.0.0: - resolution: {integrity: sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==} - engines: {node: '>=0.12.0'} - dev: true + run-async@3.0.0: {} - /run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 - /rxjs@7.8.1: - resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} - dependencies: - tslib: 2.6.2 - dev: true - - /safe-array-concat@1.1.2: - resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} - engines: {node: '>=0.4'} + safe-array-concat@1.1.2: dependencies: call-bind: 1.0.7 get-intrinsic: 1.2.4 has-symbols: 1.0.3 isarray: 2.0.5 - /safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + safe-buffer@5.2.1: {} - /safe-regex-test@1.0.3: - resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} - engines: {node: '>= 0.4'} + safe-regex-test@1.0.3: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 is-regex: 1.1.4 - /safe-stable-stringify@2.4.3: - resolution: {integrity: sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==} - engines: {node: '>=10'} - dev: true + safe-stable-stringify@2.4.3: {} - /safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - dev: true + safer-buffer@2.1.2: {} - /saxes@6.0.0: - resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} - engines: {node: '>=v12.22.7'} + saxes@6.0.0: dependencies: xmlchars: 2.2.0 - dev: true - /scheduler@0.23.0: - resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} + scheduler@0.23.0: dependencies: loose-envify: 1.4.0 - /semver-diff@3.1.1: - resolution: {integrity: sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==} - engines: {node: '>=8'} + semver-diff@3.1.1: dependencies: semver: 6.3.1 - dev: true - /semver@6.3.1: - resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} - hasBin: true + semver@6.3.1: {} - /semver@7.6.0: - resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} - engines: {node: '>=10'} - hasBin: true + semver@7.6.0: dependencies: lru-cache: 6.0.0 - dev: true - /serialize-javascript@6.0.2: - resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + serialize-javascript@6.0.2: dependencies: randombytes: 2.1.0 - dev: false - /set-cookie-parser@2.6.0: - resolution: {integrity: sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==} - dev: true - - /set-function-length@1.2.2: - resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} - engines: {node: '>= 0.4'} + set-function-length@1.2.2: dependencies: define-data-property: 1.1.4 es-errors: 1.3.0 @@ -8550,249 +10374,151 @@ packages: gopd: 1.0.1 has-property-descriptors: 1.0.2 - /set-function-name@2.0.2: - resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} - engines: {node: '>= 0.4'} + set-function-name@2.0.2: dependencies: define-data-property: 1.1.4 es-errors: 1.3.0 functions-have-names: 1.2.3 has-property-descriptors: 1.0.2 - /shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 - dev: true - /shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} - dev: true + shebang-regex@3.0.0: {} - /side-channel@1.0.6: - resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} - engines: {node: '>= 0.4'} + side-channel@1.0.6: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 get-intrinsic: 1.2.4 object-inspect: 1.13.1 - /signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - dev: true + signal-exit@3.0.7: {} - /signal-exit@4.1.0: - resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} - engines: {node: '>=14'} - dev: true + signal-exit@4.1.0: {} - /simple-swizzle@0.2.2: - resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} + simple-swizzle@0.2.2: dependencies: is-arrayish: 0.3.2 - dev: true - /sisteransi@1.0.5: - resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} - dev: true + sisteransi@1.0.5: {} - /slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} - dev: true + slash@3.0.0: {} - /slice-ansi@5.0.0: - resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} - engines: {node: '>=12'} + slice-ansi@5.0.0: dependencies: ansi-styles: 6.2.1 is-fullwidth-code-point: 4.0.0 - dev: true - /slice-ansi@7.1.0: - resolution: {integrity: sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==} - engines: {node: '>=18'} + slice-ansi@7.1.0: dependencies: ansi-styles: 6.2.1 is-fullwidth-code-point: 5.0.0 - dev: true - /smob@1.5.0: - resolution: {integrity: sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==} - dev: false + smob@1.5.0: {} - /source-map-js@1.2.0: - resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} - engines: {node: '>=0.10.0'} + source-map-js@1.2.0: {} - /source-map-support@0.5.13: - resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} + source-map-support@0.5.13: dependencies: buffer-from: 1.1.2 source-map: 0.6.1 - dev: true - /source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + source-map-support@0.5.21: dependencies: buffer-from: 1.1.2 source-map: 0.6.1 - dev: false - /source-map@0.5.7: - resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} - engines: {node: '>=0.10.0'} - dev: false + source-map@0.5.7: {} - /source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} + source-map@0.6.1: {} - /source-map@0.8.0-beta.0: - resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} - engines: {node: '>= 8'} + source-map@0.8.0-beta.0: dependencies: whatwg-url: 7.1.0 - dev: false - /sourcemap-codec@1.4.8: - resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} - deprecated: Please use @jridgewell/sourcemap-codec instead - dev: false + sourcemap-codec@1.4.8: {} - /spdx-compare@1.0.0: - resolution: {integrity: sha512-C1mDZOX0hnu0ep9dfmuoi03+eOdDoz2yvK79RxbcrVEG1NO1Ph35yW102DHWKN4pk80nwCgeMmSY5L25VE4D9A==} + spdx-compare@1.0.0: dependencies: array-find-index: 1.0.2 spdx-expression-parse: 3.0.1 spdx-ranges: 2.1.1 - dev: true - /spdx-exceptions@2.5.0: - resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} - dev: true + spdx-exceptions@2.5.0: {} - /spdx-expression-parse@3.0.1: - resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + spdx-expression-parse@3.0.1: dependencies: spdx-exceptions: 2.5.0 spdx-license-ids: 3.0.17 - dev: true - /spdx-expression-parse@4.0.0: - resolution: {integrity: sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==} + spdx-expression-parse@4.0.0: dependencies: spdx-exceptions: 2.5.0 spdx-license-ids: 3.0.17 - dev: true - /spdx-license-ids@3.0.17: - resolution: {integrity: sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==} - dev: true + spdx-license-ids@3.0.17: {} - /spdx-ranges@2.1.1: - resolution: {integrity: sha512-mcdpQFV7UDAgLpXEE/jOMqvK4LBoO0uTQg0uvXUewmEFhpiZx5yJSZITHB8w1ZahKdhfZqP5GPEOKLyEq5p8XA==} - dev: true + spdx-ranges@2.1.1: {} - /spdx-satisfies@5.0.1: - resolution: {integrity: sha512-Nwor6W6gzFp8XX4neaKQ7ChV4wmpSh2sSDemMFSzHxpTw460jxFYeOn+jq4ybnSSw/5sc3pjka9MQPouksQNpw==} + spdx-satisfies@5.0.1: dependencies: spdx-compare: 1.0.0 spdx-expression-parse: 3.0.1 spdx-ranges: 2.1.1 - dev: true - /split@1.0.1: - resolution: {integrity: sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==} + split@1.0.1: dependencies: through: 2.3.8 - dev: true - /sprintf-js@1.0.3: - resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - dev: true + sprintf-js@1.0.3: {} - /stack-trace@0.0.10: - resolution: {integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==} - dev: true + stack-trace@0.0.10: {} - /stack-utils@2.0.6: - resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} - engines: {node: '>=10'} + stack-utils@2.0.6: dependencies: escape-string-regexp: 2.0.0 - dev: true - /stop-iteration-iterator@1.0.0: - resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==} - engines: {node: '>= 0.4'} + statuses@2.0.1: {} + + stop-iteration-iterator@1.0.0: dependencies: internal-slot: 1.0.7 - dev: true - /stream-combiner@0.2.2: - resolution: {integrity: sha512-6yHMqgLYDzQDcAkL+tjJDC5nSNuNIx0vZtRZeiPh7Saef7VHX9H5Ijn9l2VIol2zaNYlYEX6KyuT/237A58qEQ==} + stream-combiner@0.2.2: dependencies: duplexer: 0.1.2 through: 2.3.8 - dev: true - - /strict-event-emitter@0.2.8: - resolution: {integrity: sha512-KDf/ujU8Zud3YaLtMCcTI4xkZlZVIYxTLr+XIULexP+77EEVWixeXroLUXQXiVtH4XH2W7jr/3PT1v3zBuvc3A==} - dependencies: - events: 3.3.0 - dev: true - /strict-event-emitter@0.4.6: - resolution: {integrity: sha512-12KWeb+wixJohmnwNFerbyiBrAlq5qJLwIt38etRtKtmmHyDSoGlIqFE9wx+4IwG0aDjI7GV8tc8ZccjWZZtTg==} - dev: true + strict-event-emitter@0.5.1: {} - /string-argv@0.3.2: - resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} - engines: {node: '>=0.6.19'} - dev: true + string-argv@0.3.2: {} - /string-length@4.0.2: - resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} - engines: {node: '>=10'} + string-length@4.0.2: dependencies: char-regex: 1.0.2 strip-ansi: 6.0.1 - dev: true - /string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} + string-width@4.2.3: dependencies: emoji-regex: 8.0.0 is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 - dev: true - /string-width@5.1.2: - resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} - engines: {node: '>=12'} + string-width@5.1.2: dependencies: eastasianwidth: 0.2.0 emoji-regex: 9.2.2 strip-ansi: 7.1.0 - dev: true - /string-width@7.1.0: - resolution: {integrity: sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==} - engines: {node: '>=18'} + string-width@7.1.0: dependencies: emoji-regex: 10.3.0 get-east-asian-width: 1.2.0 strip-ansi: 7.1.0 - dev: true - /string.prototype.matchall@4.0.11: - resolution: {integrity: sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==} - engines: {node: '>= 0.4'} + string.prototype.matchall@4.0.11: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 @@ -8807,286 +10533,156 @@ packages: set-function-name: 2.0.2 side-channel: 1.0.6 - /string.prototype.trim@1.2.9: - resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} - engines: {node: '>= 0.4'} + string.prototype.trim@1.2.9: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.23.2 es-object-atoms: 1.0.0 - /string.prototype.trimend@1.0.8: - resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} + string.prototype.trimend@1.0.8: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-object-atoms: 1.0.0 - /string.prototype.trimstart@1.0.7: - resolution: {integrity: sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==} + string.prototype.trimstart@1.0.7: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.22.5 - /string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + string_decoder@1.3.0: dependencies: safe-buffer: 5.2.1 - dev: true - /stringify-object@3.3.0: - resolution: {integrity: sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==} - engines: {node: '>=4'} + stringify-object@3.3.0: dependencies: get-own-enumerable-property-symbols: 3.0.2 is-obj: 1.0.1 is-regexp: 1.0.0 - dev: false - /strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} + strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 - dev: true - /strip-ansi@7.1.0: - resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} - engines: {node: '>=12'} + strip-ansi@7.1.0: dependencies: ansi-regex: 6.0.1 - dev: true - /strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - dev: true + strip-bom@3.0.0: {} - /strip-bom@4.0.0: - resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} - engines: {node: '>=8'} - dev: true + strip-bom@4.0.0: {} - /strip-comments@2.0.1: - resolution: {integrity: sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==} - engines: {node: '>=10'} - dev: false + strip-comments@2.0.1: {} - /strip-final-newline@2.0.0: - resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} - engines: {node: '>=6'} - dev: true + strip-final-newline@2.0.0: {} - /strip-final-newline@3.0.0: - resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} - engines: {node: '>=12'} - dev: true + strip-final-newline@3.0.0: {} - /strip-indent@3.0.0: - resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} - engines: {node: '>=8'} + strip-indent@3.0.0: dependencies: min-indent: 1.0.1 - dev: true - /strip-json-comments@2.0.1: - resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} - engines: {node: '>=0.10.0'} - dev: true + strip-json-comments@2.0.1: {} - /strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - dev: true + strip-json-comments@3.1.1: {} - /stylis@4.2.0: - resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==} - dev: false + stylis@4.2.0: {} - /supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} + supports-color@5.5.0: dependencies: has-flag: 3.0.0 - /supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} + supports-color@7.2.0: dependencies: has-flag: 4.0.0 - /supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} + supports-color@8.1.1: dependencies: has-flag: 4.0.0 - dev: true - /supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} + supports-preserve-symlinks-flag@1.0.0: {} - /symbol-tree@3.2.4: - resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} - dev: true + symbol-tree@3.2.4: {} - /synckit@0.8.8: - resolution: {integrity: sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==} - engines: {node: ^14.18.0 || >=16.0.0} + synckit@0.8.8: dependencies: '@pkgr/core': 0.1.1 tslib: 2.6.2 - dev: true - /tapable@2.2.1: - resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} - engines: {node: '>=6'} - dev: true + tapable@2.2.1: {} - /temp-dir@2.0.0: - resolution: {integrity: sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==} - engines: {node: '>=8'} - dev: false + temp-dir@2.0.0: {} - /tempy@0.6.0: - resolution: {integrity: sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==} - engines: {node: '>=10'} + tempy@0.6.0: dependencies: is-stream: 2.0.1 temp-dir: 2.0.0 type-fest: 0.16.0 unique-string: 2.0.0 - dev: false - /terser@5.31.0: - resolution: {integrity: sha512-Q1JFAoUKE5IMfI4Z/lkE/E6+SwgzO+x4tq4v1AyBLRj8VSYvRO6A/rQrPg1yud4g0En9EKI1TvFRF2tQFcoUkg==} - engines: {node: '>=10'} - hasBin: true + terser@5.31.0: dependencies: '@jridgewell/source-map': 0.3.6 acorn: 8.11.3 commander: 2.20.3 source-map-support: 0.5.21 - dev: false - /test-exclude@6.0.0: - resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} - engines: {node: '>=8'} + test-exclude@6.0.0: dependencies: '@istanbuljs/schema': 0.1.3 glob: 7.2.3 minimatch: 3.1.2 - dev: true - /text-hex@1.0.0: - resolution: {integrity: sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==} - dev: true + text-hex@1.0.0: {} - /text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - dev: true + text-table@0.2.0: {} - /through@2.3.8: - resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} - dev: true + through@2.3.8: {} - /tiny-case@1.0.3: - resolution: {integrity: sha512-Eet/eeMhkO6TX8mnUteS9zgPbUMQa4I6Kkp5ORiBD5476/m+PIRiumP5tmh5ioJpH7k51Kehawy2UDfsnxxY8Q==} - dev: false + tiny-case@1.0.3: {} - /tmp@0.0.33: - resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} - engines: {node: '>=0.6.0'} + tmp@0.0.33: dependencies: os-tmpdir: 1.0.2 - dev: true - /tmpl@1.0.5: - resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} - dev: true + tmpl@1.0.5: {} - /to-fast-properties@2.0.0: - resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} - engines: {node: '>=4'} + to-fast-properties@2.0.0: {} - /to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} + to-regex-range@5.0.1: dependencies: is-number: 7.0.0 - /toposort@2.0.2: - resolution: {integrity: sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg==} - dev: false + toposort@2.0.2: {} - /tough-cookie@4.1.3: - resolution: {integrity: sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==} - engines: {node: '>=6'} + tough-cookie@4.1.3: dependencies: psl: 1.9.0 punycode: 2.3.1 universalify: 0.2.0 url-parse: 1.5.10 - dev: true - - /tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - dev: true - /tr46@1.0.1: - resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} + tr46@1.0.1: dependencies: punycode: 2.3.1 - dev: false - /tr46@3.0.0: - resolution: {integrity: sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==} - engines: {node: '>=12'} + tr46@3.0.0: dependencies: punycode: 2.3.1 - dev: true - - /triple-beam@1.4.1: - resolution: {integrity: sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==} - engines: {node: '>= 14.0.0'} - dev: true - /ts-api-utils@1.3.0(typescript@5.4.2): - resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} - engines: {node: '>=16'} - peerDependencies: - typescript: '>=4.2.0' + triple-beam@1.4.1: {} + + ts-api-utils@1.3.0(typescript@5.4.2): dependencies: typescript: 5.4.2 - dev: true - /ts-jest@29.1.2(@babel/core@7.24.3)(jest@29.7.0)(typescript@5.4.2): - resolution: {integrity: sha512-br6GJoH/WUX4pu7FbZXuWGKGNDuU7b8Uj77g/Sp7puZV6EXzuByl6JrECvm0MzVzSTkSHWTihsXt+5XYER5b+g==} - engines: {node: ^16.10.0 || ^18.0.0 || >=20.0.0} - hasBin: true - peerDependencies: - '@babel/core': '>=7.0.0-beta.0 <8' - '@jest/types': ^29.0.0 - babel-jest: ^29.0.0 - esbuild: '*' - jest: ^29.0.0 - typescript: '>=4.3 <6' - peerDependenciesMeta: - '@babel/core': - optional: true - '@jest/types': - optional: true - babel-jest: - optional: true - esbuild: - optional: true + ts-jest@29.1.2(@babel/core@7.24.3)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.24.3))(jest@29.7.0(@types/node@20.11.30)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.4.8)(@types/node@20.11.30)(typescript@5.4.2)))(typescript@5.4.2): dependencies: - '@babel/core': 7.24.3 bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@20.11.30)(ts-node@10.9.2) + jest: 29.7.0(@types/node@20.11.30)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.4.8)(@types/node@20.11.30)(typescript@5.4.2)) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -9094,21 +10690,12 @@ packages: semver: 7.6.0 typescript: 5.4.2 yargs-parser: 21.1.1 - dev: true + optionalDependencies: + '@babel/core': 7.24.3 + '@jest/types': 29.6.3 + babel-jest: 29.7.0(@babel/core@7.24.3) - /ts-node@10.9.2(@types/node@20.11.30)(typescript@5.4.2): - resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} - hasBin: true - peerDependencies: - '@swc/core': '>=1.2.50' - '@swc/wasm': '>=1.2.50' - '@types/node': '*' - typescript: '>=2.7' - peerDependenciesMeta: - '@swc/core': - optional: true - '@swc/wasm': - optional: true + ts-node@10.9.2(@swc/core@1.4.8)(@types/node@20.11.30)(typescript@5.4.2): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.9 @@ -9125,77 +10712,47 @@ packages: typescript: 5.4.2 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 - dev: true + optionalDependencies: + '@swc/core': 1.4.8 - /tsc-files@1.1.4(typescript@5.4.2): - resolution: {integrity: sha512-RePsRsOLru3BPpnf237y1Xe1oCGta8rmSYzM76kYo5tLGsv5R2r3s64yapYorGTPuuLyfS9NVbh9ydzmvNie2w==} - hasBin: true - peerDependencies: - typescript: '>=3' + tsc-files@1.1.4(typescript@5.4.2): dependencies: typescript: 5.4.2 - dev: true - /tsconfig-paths@3.15.0: - resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} + tsconfig-paths@3.15.0: dependencies: '@types/json5': 0.0.29 json5: 1.0.2 minimist: 1.2.8 strip-bom: 3.0.0 - dev: true - /tslib@2.6.2: - resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} - dev: true + tslib@2.6.2: {} - /type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} + type-check@0.4.0: dependencies: prelude-ls: 1.2.1 - dev: true - /type-detect@4.0.8: - resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} - engines: {node: '>=4'} - dev: true + type-detect@4.0.8: {} - /type-fest@0.16.0: - resolution: {integrity: sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==} - engines: {node: '>=10'} - dev: false + type-fest@0.16.0: {} - /type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} - dev: true + type-fest@0.20.2: {} - /type-fest@0.21.3: - resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} - engines: {node: '>=10'} - dev: true + type-fest@0.21.3: {} - /type-fest@2.19.0: - resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} - engines: {node: '>=12.20'} + type-fest@2.19.0: {} - /type-fest@3.13.1: - resolution: {integrity: sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==} - engines: {node: '>=14.16'} - dev: true + type-fest@3.13.1: {} - /typed-array-buffer@1.0.2: - resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} - engines: {node: '>= 0.4'} + type-fest@4.18.0: {} + + typed-array-buffer@1.0.2: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 is-typed-array: 1.1.13 - /typed-array-byte-length@1.0.1: - resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} - engines: {node: '>= 0.4'} + typed-array-byte-length@1.0.1: dependencies: call-bind: 1.0.7 for-each: 0.3.3 @@ -9203,9 +10760,7 @@ packages: has-proto: 1.0.3 is-typed-array: 1.1.13 - /typed-array-byte-offset@1.0.2: - resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} - engines: {node: '>= 0.4'} + typed-array-byte-offset@1.0.2: dependencies: available-typed-arrays: 1.0.7 call-bind: 1.0.7 @@ -9214,9 +10769,7 @@ packages: has-proto: 1.0.3 is-typed-array: 1.1.13 - /typed-array-length@1.0.5: - resolution: {integrity: sha512-yMi0PlwuznKHxKmcpoOdeLwxBoVPkqZxd7q2FgMkmD3bNwvF5VW0+UlUQ1k1vmktTu4Yu13Q0RIxEP8+B+wloA==} - engines: {node: '>= 0.4'} + typed-array-length@1.0.5: dependencies: call-bind: 1.0.7 for-each: 0.3.3 @@ -9225,275 +10778,136 @@ packages: is-typed-array: 1.1.13 possible-typed-array-names: 1.0.0 - /typedarray-to-buffer@3.1.5: - resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} + typedarray-to-buffer@3.1.5: dependencies: is-typedarray: 1.0.0 - dev: true - /typescript@5.4.2: - resolution: {integrity: sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==} - engines: {node: '>=14.17'} - hasBin: true + typescript@5.4.2: {} - /unbox-primitive@1.0.2: - resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + unbox-primitive@1.0.2: dependencies: call-bind: 1.0.7 has-bigints: 1.0.2 has-symbols: 1.0.3 which-boxed-primitive: 1.0.2 - /undici-types@5.26.5: - resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + undici-types@5.26.5: {} - /undici@5.28.4: - resolution: {integrity: sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==} - engines: {node: '>=14.0'} + undici@5.28.4: dependencies: '@fastify/busboy': 2.1.1 - dev: true - /unicode-canonical-property-names-ecmascript@2.0.0: - resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==} - engines: {node: '>=4'} - dev: false + undici@6.15.0: {} - /unicode-match-property-ecmascript@2.0.0: - resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} - engines: {node: '>=4'} + unicode-canonical-property-names-ecmascript@2.0.0: {} + + unicode-match-property-ecmascript@2.0.0: dependencies: unicode-canonical-property-names-ecmascript: 2.0.0 unicode-property-aliases-ecmascript: 2.1.0 - dev: false - /unicode-match-property-value-ecmascript@2.1.0: - resolution: {integrity: sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==} - engines: {node: '>=4'} - dev: false + unicode-match-property-value-ecmascript@2.1.0: {} - /unicode-property-aliases-ecmascript@2.1.0: - resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} - engines: {node: '>=4'} - dev: false + unicode-property-aliases-ecmascript@2.1.0: {} - /unique-string@2.0.0: - resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==} - engines: {node: '>=8'} + unique-string@2.0.0: dependencies: crypto-random-string: 2.0.0 - /universalify@0.2.0: - resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} - engines: {node: '>= 4.0.0'} - dev: true + universalify@0.2.0: {} - /universalify@2.0.1: - resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} - engines: {node: '>= 10.0.0'} - dev: false + universalify@2.0.1: {} - /upath@1.2.0: - resolution: {integrity: sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==} - engines: {node: '>=4'} - dev: false + upath@1.2.0: {} - /update-browserslist-db@1.0.13(browserslist@4.23.0): - resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' + update-browserslist-db@1.0.13(browserslist@4.23.0): dependencies: browserslist: 4.23.0 escalade: 3.1.2 picocolors: 1.0.0 - /uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + uri-js@4.4.1: dependencies: punycode: 2.3.1 - /url-parse@1.5.10: - resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + url-parse@1.5.10: dependencies: querystringify: 2.2.0 requires-port: 1.0.0 - dev: true - /use-sync-external-store@1.2.0(react@18.2.0): - resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 + use-sync-external-store@1.2.0(react@18.2.0): dependencies: react: 18.2.0 - dev: false - - /util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - dev: true - /util@0.12.5: - resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} - dependencies: - inherits: 2.0.4 - is-arguments: 1.1.1 - is-generator-function: 1.0.10 - is-typed-array: 1.1.13 - which-typed-array: 1.1.15 - dev: true + util-deprecate@1.0.2: {} - /v8-compile-cache-lib@3.0.1: - resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} - dev: true + v8-compile-cache-lib@3.0.1: {} - /v8-to-istanbul@9.2.0: - resolution: {integrity: sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==} - engines: {node: '>=10.12.0'} + v8-to-istanbul@9.2.0: dependencies: '@jridgewell/trace-mapping': 0.3.25 '@types/istanbul-lib-coverage': 2.0.6 convert-source-map: 2.0.0 - dev: true - /vite-plugin-pwa@0.19.5(vite@5.2.6)(workbox-build@7.1.0)(workbox-window@7.1.0): - resolution: {integrity: sha512-3xJEc2Gmq6SBf730UAV1N2/MqOm+MiyvaLToSTglg+pH9b9qm666yPVxrBBlcOhGoJJWjJpu+Z9tROKek2CODg==} - engines: {node: '>=16.0.0'} - peerDependencies: - '@vite-pwa/assets-generator': ^0.2.4 - vite: ^3.1.0 || ^4.0.0 || ^5.0.0 - workbox-build: ^7.0.0 - workbox-window: ^7.0.0 - peerDependenciesMeta: - '@vite-pwa/assets-generator': - optional: true + vite-plugin-pwa@0.19.5(vite@5.2.6(@types/node@20.11.30)(terser@5.31.0))(workbox-build@7.1.0(@types/babel__core@7.20.5))(workbox-window@7.1.0): dependencies: debug: 4.3.4 fast-glob: 3.3.2 pretty-bytes: 6.1.1 - vite: 5.2.6(@types/node@20.11.30) - workbox-build: 7.1.0 + vite: 5.2.6(@types/node@20.11.30)(terser@5.31.0) + workbox-build: 7.1.0(@types/babel__core@7.20.5) workbox-window: 7.1.0 transitivePeerDependencies: - supports-color - dev: false - /vite@5.2.6(@types/node@20.11.30): - resolution: {integrity: sha512-FPtnxFlSIKYjZ2eosBQamz4CbyrTizbZ3hnGJlh/wMtCrlp1Hah6AzBLjGI5I2urTfNnpovpHdrL6YRuBOPnCA==} - engines: {node: ^18.0.0 || >=20.0.0} - hasBin: true - peerDependencies: - '@types/node': ^18.0.0 || >=20.0.0 - less: '*' - lightningcss: ^1.21.0 - sass: '*' - stylus: '*' - sugarss: '*' - terser: ^5.4.0 - peerDependenciesMeta: - '@types/node': - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true + vite@5.2.6(@types/node@20.11.30)(terser@5.31.0): dependencies: - '@types/node': 20.11.30 esbuild: 0.20.2 postcss: 8.4.38 rollup: 4.14.0 optionalDependencies: + '@types/node': 20.11.30 fsevents: 2.3.3 + terser: 5.31.0 - /w3c-xmlserializer@4.0.0: - resolution: {integrity: sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==} - engines: {node: '>=14'} + w3c-xmlserializer@4.0.0: dependencies: xml-name-validator: 4.0.0 - dev: true - /walker@1.0.8: - resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} + walker@1.0.8: dependencies: makeerror: 1.0.12 - dev: true - /wcwidth@1.0.1: - resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + wcwidth@1.0.1: dependencies: defaults: 1.0.4 - dev: true - /web-encoding@1.1.5: - resolution: {integrity: sha512-HYLeVCdJ0+lBYV2FvNZmv3HJ2Nt0QYXqZojk3d9FJOLkwnuhzM9tmamh8d7HPM8QqjKH8DeHkFTx+CFlWpZZDA==} - dependencies: - util: 0.12.5 - optionalDependencies: - '@zxing/text-encoding': 0.9.0 - dev: true - - /web-streams-polyfill@3.3.3: - resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} - engines: {node: '>= 8'} - dev: true + web-streams-polyfill@3.3.3: {} - /webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - dev: true + web-streams-polyfill@4.0.0: {} - /webidl-conversions@4.0.2: - resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} - dev: false + webidl-conversions@4.0.2: {} - /webidl-conversions@7.0.0: - resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} - engines: {node: '>=12'} - dev: true + webidl-conversions@7.0.0: {} - /whatwg-encoding@2.0.0: - resolution: {integrity: sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==} - engines: {node: '>=12'} + whatwg-encoding@2.0.0: dependencies: iconv-lite: 0.6.3 - dev: true - /whatwg-mimetype@3.0.0: - resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==} - engines: {node: '>=12'} - dev: true + whatwg-mimetype@3.0.0: {} - /whatwg-url@11.0.0: - resolution: {integrity: sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==} - engines: {node: '>=12'} + whatwg-url@11.0.0: dependencies: tr46: 3.0.0 webidl-conversions: 7.0.0 - dev: true - - /whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 - dev: true - /whatwg-url@7.1.0: - resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} + whatwg-url@7.1.0: dependencies: lodash.sortby: 4.7.0 tr46: 1.0.1 webidl-conversions: 4.0.2 - dev: false - /which-boxed-primitive@1.0.2: - resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + which-boxed-primitive@1.0.2: dependencies: is-bigint: 1.0.4 is-boolean-object: 1.1.2 @@ -9501,9 +10915,7 @@ packages: is-string: 1.0.7 is-symbol: 1.0.4 - /which-builtin-type@1.1.3: - resolution: {integrity: sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==} - engines: {node: '>= 0.4'} + which-builtin-type@1.1.3: dependencies: function.prototype.name: 1.1.6 has-tostringtag: 1.0.2 @@ -9517,21 +10929,15 @@ packages: which-boxed-primitive: 1.0.2 which-collection: 1.0.2 which-typed-array: 1.1.15 - dev: true - /which-collection@1.0.2: - resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} - engines: {node: '>= 0.4'} + which-collection@1.0.2: dependencies: is-map: 2.0.3 is-set: 2.0.3 is-weakmap: 2.0.2 is-weakset: 2.0.3 - dev: true - /which-typed-array@1.1.15: - resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} - engines: {node: '>= 0.4'} + which-typed-array@1.1.15: dependencies: available-typed-arrays: 1.0.7 call-bind: 1.0.7 @@ -9539,41 +10945,25 @@ packages: gopd: 1.0.1 has-tostringtag: 1.0.2 - /which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true + which@2.0.2: dependencies: isexe: 2.0.0 - dev: true - /which@4.0.0: - resolution: {integrity: sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==} - engines: {node: ^16.13.0 || >=18.0.0} - hasBin: true + which@4.0.0: dependencies: isexe: 3.1.1 - dev: true - /widest-line@3.1.0: - resolution: {integrity: sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==} - engines: {node: '>=8'} + widest-line@3.1.0: dependencies: string-width: 4.2.3 - dev: true - /winston-transport@4.7.0: - resolution: {integrity: sha512-ajBj65K5I7denzer2IYW6+2bNIVqLGDHqDw3Ow8Ohh+vdW+rv4MZ6eiDvHoKhfJFZ2auyN8byXieDDJ96ViONg==} - engines: {node: '>= 12.0.0'} + winston-transport@4.7.0: dependencies: logform: 2.6.0 readable-stream: 3.6.2 triple-beam: 1.4.1 - dev: true - /winston@3.12.0: - resolution: {integrity: sha512-OwbxKaOlESDi01mC9rkM0dQqQt2I8DAUMRLZ/HpbwvDXm85IryEHgoogy5fziQy38PntgZsLlhAYHz//UPHZ5w==} - engines: {node: '>= 12.0.0'} + winston@3.12.0: dependencies: '@colors/colors': 1.6.0 '@dabh/diagnostics': 2.0.3 @@ -9586,30 +10976,23 @@ packages: stack-trace: 0.0.10 triple-beam: 1.4.1 winston-transport: 4.7.0 - dev: true - /workbox-background-sync@7.1.0: - resolution: {integrity: sha512-rMbgrzueVWDFcEq1610YyDW71z0oAXLfdRHRQcKw4SGihkfOK0JUEvqWHFwA6rJ+6TClnMIn7KQI5PNN1XQXwQ==} + workbox-background-sync@7.1.0: dependencies: idb: 7.1.1 workbox-core: 7.1.0 - dev: false - /workbox-broadcast-update@7.1.0: - resolution: {integrity: sha512-O36hIfhjej/c5ar95pO67k1GQw0/bw5tKP7CERNgK+JdxBANQhDmIuOXZTNvwb2IHBx9hj2kxvcDyRIh5nzOgQ==} + workbox-broadcast-update@7.1.0: dependencies: workbox-core: 7.1.0 - dev: false - /workbox-build@7.1.0: - resolution: {integrity: sha512-F6R94XAxjB2j4ETMkP1EXKfjECOtDmyvt0vz3BzgWJMI68TNSXIVNkgatwUKBlPGOfy9n2F/4voYRNAhEvPJNg==} - engines: {node: '>=16.0.0'} + workbox-build@7.1.0(@types/babel__core@7.20.5): dependencies: '@apideck/better-ajv-errors': 0.3.6(ajv@8.13.0) '@babel/core': 7.24.5 '@babel/preset-env': 7.24.5(@babel/core@7.24.5) '@babel/runtime': 7.24.5 - '@rollup/plugin-babel': 5.3.1(@babel/core@7.24.5)(rollup@2.79.1) + '@rollup/plugin-babel': 5.3.1(@babel/core@7.24.5)(@types/babel__core@7.20.5)(rollup@2.79.1) '@rollup/plugin-node-resolve': 15.2.3(rollup@2.79.1) '@rollup/plugin-replace': 2.4.2(rollup@2.79.1) '@rollup/plugin-terser': 0.4.4(rollup@2.79.1) @@ -9645,56 +11028,40 @@ packages: transitivePeerDependencies: - '@types/babel__core' - supports-color - dev: false - /workbox-cacheable-response@7.1.0: - resolution: {integrity: sha512-iwsLBll8Hvua3xCuBB9h92+/e0wdsmSVgR2ZlvcfjepZWwhd3osumQB3x9o7flj+FehtWM2VHbZn8UJeBXXo6Q==} + workbox-cacheable-response@7.1.0: dependencies: workbox-core: 7.1.0 - dev: false - /workbox-core@7.1.0: - resolution: {integrity: sha512-5KB4KOY8rtL31nEF7BfvU7FMzKT4B5TkbYa2tzkS+Peqj0gayMT9SytSFtNzlrvMaWgv6y/yvP9C0IbpFjV30Q==} - dev: false + workbox-core@7.1.0: {} - /workbox-expiration@7.1.0: - resolution: {integrity: sha512-m5DcMY+A63rJlPTbbBNtpJ20i3enkyOtSgYfv/l8h+D6YbbNiA0zKEkCUaMsdDlxggla1oOfRkyqTvl5Ni5KQQ==} + workbox-expiration@7.1.0: dependencies: idb: 7.1.1 workbox-core: 7.1.0 - dev: false - /workbox-google-analytics@7.1.0: - resolution: {integrity: sha512-FvE53kBQHfVTcZyczeBVRexhh7JTkyQ8HAvbVY6mXd2n2A7Oyz/9fIwnY406ZcDhvE4NFfKGjW56N4gBiqkrew==} + workbox-google-analytics@7.1.0: dependencies: workbox-background-sync: 7.1.0 workbox-core: 7.1.0 workbox-routing: 7.1.0 workbox-strategies: 7.1.0 - dev: false - /workbox-navigation-preload@7.1.0: - resolution: {integrity: sha512-4wyAbo0vNI/X0uWNJhCMKxnPanNyhybsReMGN9QUpaePLTiDpKxPqFxl4oUmBNddPwIXug01eTSLVIFXimRG/A==} + workbox-navigation-preload@7.1.0: dependencies: workbox-core: 7.1.0 - dev: false - /workbox-precaching@7.1.0: - resolution: {integrity: sha512-LyxzQts+UEpgtmfnolo0hHdNjoB7EoRWcF7EDslt+lQGd0lW4iTvvSe3v5JiIckQSB5KTW5xiCqjFviRKPj1zA==} + workbox-precaching@7.1.0: dependencies: workbox-core: 7.1.0 workbox-routing: 7.1.0 workbox-strategies: 7.1.0 - dev: false - /workbox-range-requests@7.1.0: - resolution: {integrity: sha512-m7+O4EHolNs5yb/79CrnwPR/g/PRzMFYEdo01LqwixVnc/sbzNSvKz0d04OE3aMRel1CwAAZQheRsqGDwATgPQ==} + workbox-range-requests@7.1.0: dependencies: workbox-core: 7.1.0 - dev: false - /workbox-recipes@7.1.0: - resolution: {integrity: sha512-NRrk4ycFN9BHXJB6WrKiRX3W3w75YNrNrzSX9cEZgFB5ubeGoO8s/SDmOYVrFYp9HMw6sh1Pm3eAY/1gVS8YLg==} + workbox-recipes@7.1.0: dependencies: workbox-cacheable-response: 7.1.0 workbox-core: 7.1.0 @@ -9702,162 +11069,92 @@ packages: workbox-precaching: 7.1.0 workbox-routing: 7.1.0 workbox-strategies: 7.1.0 - dev: false - /workbox-routing@7.1.0: - resolution: {integrity: sha512-oOYk+kLriUY2QyHkIilxUlVcFqwduLJB7oRZIENbqPGeBP/3TWHYNNdmGNhz1dvKuw7aqvJ7CQxn27/jprlTdg==} + workbox-routing@7.1.0: dependencies: workbox-core: 7.1.0 - dev: false - /workbox-strategies@7.1.0: - resolution: {integrity: sha512-/UracPiGhUNehGjRm/tLUQ+9PtWmCbRufWtV0tNrALuf+HZ4F7cmObSEK+E4/Bx1p8Syx2tM+pkIrvtyetdlew==} + workbox-strategies@7.1.0: dependencies: workbox-core: 7.1.0 - dev: false - /workbox-streams@7.1.0: - resolution: {integrity: sha512-WyHAVxRXBMfysM8ORwiZnI98wvGWTVAq/lOyBjf00pXFvG0mNaVz4Ji+u+fKa/mf1i2SnTfikoYKto4ihHeS6w==} + workbox-streams@7.1.0: dependencies: workbox-core: 7.1.0 workbox-routing: 7.1.0 - dev: false - /workbox-sw@7.1.0: - resolution: {integrity: sha512-Hml/9+/njUXBglv3dtZ9WBKHI235AQJyLBV1G7EFmh4/mUdSQuXui80RtjDeVRrXnm/6QWgRUEHG3/YBVbxtsA==} - dev: false + workbox-sw@7.1.0: {} - /workbox-window@7.1.0: - resolution: {integrity: sha512-ZHeROyqR+AS5UPzholQRDttLFqGMwP0Np8MKWAdyxsDETxq3qOAyXvqessc3GniohG6e0mAqSQyKOHmT8zPF7g==} + workbox-window@7.1.0: dependencies: '@types/trusted-types': 2.0.7 workbox-core: 7.1.0 - dev: false - /wrap-ansi@6.2.0: - resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} - engines: {node: '>=8'} + wrap-ansi@6.2.0: dependencies: ansi-styles: 4.3.0 string-width: 4.2.3 strip-ansi: 6.0.1 - dev: true - /wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} + wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 string-width: 4.2.3 strip-ansi: 6.0.1 - dev: true - /wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} + wrap-ansi@8.1.0: dependencies: ansi-styles: 6.2.1 string-width: 5.1.2 strip-ansi: 7.1.0 - dev: true - /wrap-ansi@9.0.0: - resolution: {integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==} - engines: {node: '>=18'} + wrap-ansi@9.0.0: dependencies: ansi-styles: 6.2.1 string-width: 7.1.0 strip-ansi: 7.1.0 - dev: true - /wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + wrappy@1.0.2: {} - /write-file-atomic@3.0.3: - resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} + write-file-atomic@3.0.3: dependencies: imurmurhash: 0.1.4 is-typedarray: 1.0.0 signal-exit: 3.0.7 typedarray-to-buffer: 3.1.5 - dev: true - /write-file-atomic@4.0.2: - resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + write-file-atomic@4.0.2: dependencies: imurmurhash: 0.1.4 signal-exit: 3.0.7 - dev: true - /ws@8.16.0: - resolution: {integrity: sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - dev: true + ws@8.16.0: {} - /xdg-basedir@4.0.0: - resolution: {integrity: sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==} - engines: {node: '>=8'} - dev: true + xdg-basedir@4.0.0: {} - /xml-name-validator@4.0.0: - resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} - engines: {node: '>=12'} - dev: true + xml-name-validator@4.0.0: {} - /xmlbuilder@15.1.1: - resolution: {integrity: sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==} - engines: {node: '>=8.0'} - dev: true + xmlbuilder@15.1.1: {} - /xmlchars@2.2.0: - resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} - dev: true + xmlchars@2.2.0: {} - /xxhashjs@0.2.2: - resolution: {integrity: sha512-AkTuIuVTET12tpsVIQo+ZU6f/qDmKuRUcjaqR+OIvm+aCBsZ95i7UVY5WJ9TMsSaZ0DA2WxoZ4acu0sPH+OKAw==} + xxhashjs@0.2.2: dependencies: cuint: 0.2.2 - dev: true - /y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - dev: true + y18n@5.0.8: {} - /yallist@3.1.1: - resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + yallist@3.1.1: {} - /yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - dev: true + yallist@4.0.0: {} - /yaml@1.10.2: - resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} - engines: {node: '>= 6'} - dev: false + yaml@1.10.2: {} - /yaml@2.3.4: - resolution: {integrity: sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==} - engines: {node: '>= 14'} - dev: true + yaml@2.3.4: {} - /yargs-parser@21.1.1: - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} - engines: {node: '>=12'} - dev: true + yargs-parser@21.1.1: {} - /yargs@17.7.2: - resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} - engines: {node: '>=12'} + yargs@17.7.2: dependencies: cliui: 8.0.1 escalade: 3.1.2 @@ -9866,23 +11163,14 @@ packages: string-width: 4.2.3 y18n: 5.0.8 yargs-parser: 21.1.1 - dev: true - /yn@3.1.1: - resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} - engines: {node: '>=6'} - dev: true + yn@3.1.1: {} - /yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - dev: true + yocto-queue@0.1.0: {} - /yup@1.4.0: - resolution: {integrity: sha512-wPbgkJRCqIf+OHyiTBQoJiP5PFuAXaWiJK6AmYkzQAh5/c2K9hzSApBZG5wV9KoKSePF7sAxmNSvh/13YHkFDg==} + yup@1.4.0: dependencies: property-expr: 2.0.6 tiny-case: 1.0.3 toposort: 2.0.2 type-fest: 2.19.0 - dev: false diff --git a/frontend/src/clients/HttpClient.ts b/frontend/src/clients/HttpClient.ts index 8be0eaf00e..81d9f65389 100644 --- a/frontend/src/clients/HttpClient.ts +++ b/frontend/src/clients/HttpClient.ts @@ -1,3 +1,4 @@ +/* istanbul ignore file */ // to cover #29 import { AXIOS_NETWORK_ERROR_CODES, AXIOS_REQUEST_ERROR_CODE } from '@src/constants/resources'; import { InternalServerError } from '@src/errors/InternalServerError'; import { UnauthorizedError } from '@src/errors/UnauthorizedError'; @@ -24,6 +25,8 @@ export class HttpClient { const { code, response } = error; if (AXIOS_NETWORK_ERROR_CODES.some((predefinedCode) => predefinedCode === code)) { throw new TimeoutError(error?.message, AXIOS_REQUEST_ERROR_CODE.TIMEOUT); + // Can't find any solution to cover below line due to upgrading the msw from v1 to v2 + /* istanbul ignore branch */ } else if (response && response.status && response.status > 0) { const { status, data, statusText } = response; const errorMessage = data?.hintInfo ?? statusText; @@ -45,6 +48,8 @@ export class HttpClient { throw new UnknownError(); } } else { + // Can't find any solution to cover below line due to upgrading the msw from v1 to v2 + /* istanbul ignore next */ throw new UnknownError(); } }, diff --git a/frontend/tsconfig.json b/frontend/tsconfig.json index 0a5bd5048b..dd3f976b84 100644 --- a/frontend/tsconfig.json +++ b/frontend/tsconfig.json @@ -23,6 +23,12 @@ "types": ["node", "vite-plugin-pwa/react", "jest"] }, "include": ["src", "__tests__", "e2e", "*.ts"], - "exclude": ["__tests__/__mocks__/svgTransformer.ts", "package.json", "pnpm-lock.yaml"], + "exclude": [ + "__tests__/__mocks__/svgTransformer.ts", + "package.json", + "pnpm-lock.yaml", + "jsdom.extended.ts", + "jest.polyfills.ts" + ], "references": [{ "path": "./tsconfig.node.json" }, { "path": "./tsconfig.scripts.json" }] } From bf12a13caff97c0c9500312415e0ddba6780bfa6 Mon Sep 17 00:00:00 2001 From: guzhongren Date: Sat, 4 May 2024 00:00:34 +0800 Subject: [PATCH 63/81] Upgrade[frontend] (#1428) * chore(deps): upgrade deps * chore(deps): upgrade deps 2 * chore(deps): downgrade deps --- frontend/package.json | 56 +- frontend/pnpm-lock.yaml | 2519 +++++++++++++-------------------------- 2 files changed, 830 insertions(+), 1745 deletions(-) diff --git a/frontend/package.json b/frontend/package.json index 1cad939091..f8a38ec005 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -45,56 +45,56 @@ }, "dependencies": { "@emotion/react": "^11.11.4", - "@emotion/styled": "^11.11.0", - "@fontsource/roboto": "^5.0.12", + "@emotion/styled": "^11.11.5", + "@fontsource/roboto": "^5.0.13", "@hookform/resolvers": "^3.3.4", - "@mui/icons-material": "^5.15.14", - "@mui/material": "^5.15.14", - "@mui/x-date-pickers": "^7.0.0", - "@reduxjs/toolkit": "^2.2.2", + "@mui/icons-material": "^5.15.16", + "@mui/material": "^5.15.16", + "@mui/x-date-pickers": "^7.3.2", + "@reduxjs/toolkit": "^2.2.3", "axios": "^1.6.8", - "dayjs": "^1.11.10", + "dayjs": "^1.11.11", "lodash": "^4.17.21", "lodash.camelcase": "^4.3.0", - "react": "^18.2.0", - "react-dom": "^18.2.0", + "react": "^18.3.1", + "react-dom": "^18.3.1", "react-error-boundary": "^4.0.13", "react-hook-form": "^7.51.3", - "react-redux": "^9.0.0", - "react-router-dom": "^6.22.3", - "typescript": "^5.4.2", - "vite": "^5.2.2", - "vite-plugin-pwa": "^0.19.5", + "react-redux": "^9.1.2", + "react-router-dom": "^6.23.0", + "typescript": "^5.4.5", + "vite": "^5.2.11", + "vite-plugin-pwa": "^0.20.0", "yup": "^1.4.0" }, "devDependencies": { - "@dotenvx/dotenvx": "^0.27.0", - "@playwright/test": "^1.42.1", - "@testing-library/jest-dom": "^6.4.2", - "@testing-library/react": "^14.2.2", + "@dotenvx/dotenvx": "^0.37.1", + "@playwright/test": "^1.43.1", + "@testing-library/jest-dom": "^6.4.3", + "@testing-library/react": "^15.0.6", "@testing-library/user-event": "^14.5.2", "@types/jest": "^29.5.12", "@types/lodash": "^4.17.0", "@types/lodash.camelcase": "^4.3.9", - "@types/node": "^20.11.30", + "@types/node": "^20.12.8", "@types/node-fetch": "^2.6.11", - "@types/react": "^18.2.67", - "@types/react-dom": "^18.2.22", + "@types/react": "^18.3.1", + "@types/react-dom": "^18.3.0", "@types/react-redux": "^7.1.33", - "@typescript-eslint/eslint-plugin": "^7.3.1", - "@typescript-eslint/parser": "^7.3.1", + "@typescript-eslint/eslint-plugin": "^7.8.0", + "@typescript-eslint/parser": "^7.8.0", "@vitejs/plugin-react-swc": "^3.6.0", "audit-ci": "^6.6.1", - "autoprefixer": "^10.4.18", + "autoprefixer": "^10.4.19", "csv-parse": "^5.5.5", "eslint": "^8.57.0", "eslint-config-prettier": "^9.1.0", "eslint-plugin-import": "^2.29.1", - "eslint-plugin-n": "^17.0.0", + "eslint-plugin-n": "^17.4.0", "eslint-plugin-prettier": "^5.1.3", "eslint-plugin-promise": "^6.1.1", "eslint-plugin-react": "^7.34.1", - "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react-hooks": "^4.6.2", "execa": "^8.0.1", "husky": "^9.0.11", "identity-obj-proxy": "^3.0.0", @@ -102,10 +102,10 @@ "jest-environment-jsdom": "^29.7.0", "license-compliance": "^3.0.0", "lint-staged": "^15.2.2", - "msw": "^2.0.0", + "msw": "^2.2.14", "node-fetch": "^3.3.2", "prettier": "3.2.5", - "prettier-plugin-sort-imports": "^1.8.4", + "prettier-plugin-sort-imports": "^1.8.5", "ts-jest": "^29.1.2", "ts-node": "^10.9.2", "tsc-files": "^1.1.4", diff --git a/frontend/pnpm-lock.yaml b/frontend/pnpm-lock.yaml index 470f91cae3..8b8e7dc2a4 100644 --- a/frontend/pnpm-lock.yaml +++ b/frontend/pnpm-lock.yaml @@ -10,34 +10,34 @@ importers: dependencies: '@emotion/react': specifier: ^11.11.4 - version: 11.11.4(@types/react@18.2.67)(react@18.2.0) + version: 11.11.4(@types/react@18.3.1)(react@18.3.1) '@emotion/styled': - specifier: ^11.11.0 - version: 11.11.5(@emotion/react@11.11.4(@types/react@18.2.67)(react@18.2.0))(@types/react@18.2.67)(react@18.2.0) + specifier: ^11.11.5 + version: 11.11.5(@emotion/react@11.11.4(@types/react@18.3.1)(react@18.3.1))(@types/react@18.3.1)(react@18.3.1) '@fontsource/roboto': - specifier: ^5.0.12 - version: 5.0.12 + specifier: ^5.0.13 + version: 5.0.13 '@hookform/resolvers': specifier: ^3.3.4 - version: 3.3.4(react-hook-form@7.51.3(react@18.2.0)) + version: 3.3.4(react-hook-form@7.51.3(react@18.3.1)) '@mui/icons-material': - specifier: ^5.15.14 - version: 5.15.14(@mui/material@5.15.14(@emotion/react@11.11.4(@types/react@18.2.67)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.67)(react@18.2.0))(@types/react@18.2.67)(react@18.2.0))(@types/react@18.2.67)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@types/react@18.2.67)(react@18.2.0) + specifier: ^5.15.16 + version: 5.15.16(@mui/material@5.15.16(@emotion/react@11.11.4(@types/react@18.3.1)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.1)(react@18.3.1))(@types/react@18.3.1)(react@18.3.1))(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.1)(react@18.3.1) '@mui/material': - specifier: ^5.15.14 - version: 5.15.14(@emotion/react@11.11.4(@types/react@18.2.67)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.67)(react@18.2.0))(@types/react@18.2.67)(react@18.2.0))(@types/react@18.2.67)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + specifier: ^5.15.16 + version: 5.15.16(@emotion/react@11.11.4(@types/react@18.3.1)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.1)(react@18.3.1))(@types/react@18.3.1)(react@18.3.1))(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mui/x-date-pickers': - specifier: ^7.0.0 - version: 7.0.0(@emotion/react@11.11.4(@types/react@18.2.67)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.67)(react@18.2.0))(@types/react@18.2.67)(react@18.2.0))(@mui/material@5.15.14(@emotion/react@11.11.4(@types/react@18.2.67)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.67)(react@18.2.0))(@types/react@18.2.67)(react@18.2.0))(@types/react@18.2.67)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@types/react@18.2.67)(dayjs@1.11.10)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + specifier: ^7.3.2 + version: 7.3.2(@emotion/react@11.11.4(@types/react@18.3.1)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.1)(react@18.3.1))(@types/react@18.3.1)(react@18.3.1))(@mui/material@5.15.16(@emotion/react@11.11.4(@types/react@18.3.1)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.1)(react@18.3.1))(@types/react@18.3.1)(react@18.3.1))(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.1)(dayjs@1.11.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@reduxjs/toolkit': - specifier: ^2.2.2 - version: 2.2.2(react-redux@9.1.0(@types/react@18.2.67)(react@18.2.0)(redux@5.0.1))(react@18.2.0) + specifier: ^2.2.3 + version: 2.2.3(react-redux@9.1.2(@types/react@18.3.1)(react@18.3.1)(redux@5.0.1))(react@18.3.1) axios: specifier: ^1.6.8 version: 1.6.8 dayjs: - specifier: ^1.11.10 - version: 1.11.10 + specifier: ^1.11.11 + version: 1.11.11 lodash: specifier: ^4.17.21 version: 4.17.21 @@ -45,48 +45,48 @@ importers: specifier: ^4.3.0 version: 4.3.0 react: - specifier: ^18.2.0 - version: 18.2.0 + specifier: ^18.3.1 + version: 18.3.1 react-dom: - specifier: ^18.2.0 - version: 18.2.0(react@18.2.0) + specifier: ^18.3.1 + version: 18.3.1(react@18.3.1) react-error-boundary: specifier: ^4.0.13 - version: 4.0.13(react@18.2.0) + version: 4.0.13(react@18.3.1) react-hook-form: specifier: ^7.51.3 - version: 7.51.3(react@18.2.0) + version: 7.51.3(react@18.3.1) react-redux: - specifier: ^9.0.0 - version: 9.1.0(@types/react@18.2.67)(react@18.2.0)(redux@5.0.1) + specifier: ^9.1.2 + version: 9.1.2(@types/react@18.3.1)(react@18.3.1)(redux@5.0.1) react-router-dom: - specifier: ^6.22.3 - version: 6.22.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + specifier: ^6.23.0 + version: 6.23.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) typescript: - specifier: ^5.4.2 - version: 5.4.2 + specifier: ^5.4.5 + version: 5.4.5 vite: - specifier: ^5.2.2 - version: 5.2.6(@types/node@20.11.30)(terser@5.31.0) + specifier: ^5.2.11 + version: 5.2.11(@types/node@20.12.8)(terser@5.31.0) vite-plugin-pwa: - specifier: ^0.19.5 - version: 0.19.5(vite@5.2.6(@types/node@20.11.30)(terser@5.31.0))(workbox-build@7.1.0(@types/babel__core@7.20.5))(workbox-window@7.1.0) + specifier: ^0.20.0 + version: 0.20.0(vite@5.2.11(@types/node@20.12.8)(terser@5.31.0))(workbox-build@7.1.0(@types/babel__core@7.20.5))(workbox-window@7.1.0) yup: specifier: ^1.4.0 version: 1.4.0 devDependencies: '@dotenvx/dotenvx': - specifier: ^0.27.0 - version: 0.27.0 + specifier: ^0.37.1 + version: 0.37.1 '@playwright/test': - specifier: ^1.42.1 - version: 1.42.1 + specifier: ^1.43.1 + version: 1.43.1 '@testing-library/jest-dom': - specifier: ^6.4.2 - version: 6.4.2(@jest/globals@29.7.0)(@types/jest@29.5.12)(jest@29.7.0(@types/node@20.11.30)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.4.8)(@types/node@20.11.30)(typescript@5.4.2))) + specifier: ^6.4.3 + version: 6.4.3(@jest/globals@29.7.0)(@types/jest@29.5.12)(jest@29.7.0(@types/node@20.12.8)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.4.17)(@types/node@20.12.8)(typescript@5.4.5))) '@testing-library/react': - specifier: ^14.2.2 - version: 14.2.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + specifier: ^15.0.6 + version: 15.0.6(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@testing-library/user-event': specifier: ^14.5.2 version: 14.5.2(@testing-library/dom@10.1.0) @@ -100,35 +100,35 @@ importers: specifier: ^4.3.9 version: 4.3.9 '@types/node': - specifier: ^20.11.30 - version: 20.11.30 + specifier: ^20.12.8 + version: 20.12.8 '@types/node-fetch': specifier: ^2.6.11 version: 2.6.11 '@types/react': - specifier: ^18.2.67 - version: 18.2.67 + specifier: ^18.3.1 + version: 18.3.1 '@types/react-dom': - specifier: ^18.2.22 - version: 18.2.22 + specifier: ^18.3.0 + version: 18.3.0 '@types/react-redux': specifier: ^7.1.33 version: 7.1.33 '@typescript-eslint/eslint-plugin': - specifier: ^7.3.1 - version: 7.4.0(@typescript-eslint/parser@7.4.0(eslint@8.57.0)(typescript@5.4.2))(eslint@8.57.0)(typescript@5.4.2) + specifier: ^7.8.0 + version: 7.8.0(@typescript-eslint/parser@7.8.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5) '@typescript-eslint/parser': - specifier: ^7.3.1 - version: 7.4.0(eslint@8.57.0)(typescript@5.4.2) + specifier: ^7.8.0 + version: 7.8.0(eslint@8.57.0)(typescript@5.4.5) '@vitejs/plugin-react-swc': specifier: ^3.6.0 - version: 3.6.0(vite@5.2.6(@types/node@20.11.30)(terser@5.31.0)) + version: 3.6.0(vite@5.2.11(@types/node@20.12.8)(terser@5.31.0)) audit-ci: specifier: ^6.6.1 version: 6.6.1 autoprefixer: - specifier: ^10.4.18 - version: 10.4.18(postcss@8.4.38) + specifier: ^10.4.19 + version: 10.4.19(postcss@8.4.38) csv-parse: specifier: ^5.5.5 version: 5.5.5 @@ -140,10 +140,10 @@ importers: version: 9.1.0(eslint@8.57.0) eslint-plugin-import: specifier: ^2.29.1 - version: 2.29.1(@typescript-eslint/parser@7.4.0(eslint@8.57.0)(typescript@5.4.2))(eslint@8.57.0) + version: 2.29.1(@typescript-eslint/parser@7.8.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0) eslint-plugin-n: - specifier: ^17.0.0 - version: 17.3.1(eslint@8.57.0) + specifier: ^17.4.0 + version: 17.4.0(eslint@8.57.0) eslint-plugin-prettier: specifier: ^5.1.3 version: 5.1.3(eslint-config-prettier@9.1.0(eslint@8.57.0))(eslint@8.57.0)(prettier@3.2.5) @@ -154,8 +154,8 @@ importers: specifier: ^7.34.1 version: 7.34.1(eslint@8.57.0) eslint-plugin-react-hooks: - specifier: ^4.6.0 - version: 4.6.0(eslint@8.57.0) + specifier: ^4.6.2 + version: 4.6.2(eslint@8.57.0) execa: specifier: ^8.0.1 version: 8.0.1 @@ -167,19 +167,19 @@ importers: version: 3.0.0 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@20.11.30)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.4.8)(@types/node@20.11.30)(typescript@5.4.2)) + version: 29.7.0(@types/node@20.12.8)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.4.17)(@types/node@20.12.8)(typescript@5.4.5)) jest-environment-jsdom: specifier: ^29.7.0 version: 29.7.0 license-compliance: specifier: ^3.0.0 - version: 3.0.0(typescript@5.4.2) + version: 3.0.0(typescript@5.4.5) lint-staged: specifier: ^15.2.2 version: 15.2.2 msw: - specifier: ^2.0.0 - version: 2.2.14(typescript@5.4.2) + specifier: ^2.2.14 + version: 2.2.14(typescript@5.4.5) node-fetch: specifier: ^3.3.2 version: 3.3.2 @@ -187,17 +187,17 @@ importers: specifier: 3.2.5 version: 3.2.5 prettier-plugin-sort-imports: - specifier: ^1.8.4 - version: 1.8.5(typescript@5.4.2) + specifier: ^1.8.5 + version: 1.8.5(typescript@5.4.5) ts-jest: specifier: ^29.1.2 - version: 29.1.2(@babel/core@7.24.3)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.24.3))(jest@29.7.0(@types/node@20.11.30)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.4.8)(@types/node@20.11.30)(typescript@5.4.2)))(typescript@5.4.2) + version: 29.1.2(@babel/core@7.24.5)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.24.5))(jest@29.7.0(@types/node@20.12.8)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.4.17)(@types/node@20.12.8)(typescript@5.4.5)))(typescript@5.4.5) ts-node: specifier: ^10.9.2 - version: 10.9.2(@swc/core@1.4.8)(@types/node@20.11.30)(typescript@5.4.2) + version: 10.9.2(@swc/core@1.4.17)(@types/node@20.12.8)(typescript@5.4.5) tsc-files: specifier: ^1.1.4 - version: 1.1.4(typescript@5.4.2) + version: 1.1.4(typescript@5.4.5) undici: specifier: ^6.15.0 version: 6.15.0 @@ -207,10 +207,6 @@ importers: packages: - '@aashutoshrathi/word-wrap@1.2.6': - resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} - engines: {node: '>=0.10.0'} - '@adobe/css-tools@4.3.3': resolution: {integrity: sha512-rE0Pygv0sEZ4vBWHlAgJLGDU7Pm8xoO6p3wsEceb7GYAjScrOHpEo8KK/eVkAcnSM+slAEtXjA2JpdjLp4fJQQ==} @@ -228,26 +224,14 @@ packages: resolution: {integrity: sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==} engines: {node: '>=6.9.0'} - '@babel/compat-data@7.24.1': - resolution: {integrity: sha512-Pc65opHDliVpRHuKfzI+gSA4zcgr65O4cl64fFJIWEEh8JoHIHh0Oez1Eo8Arz8zq/JhgKodQaxEwUPRtZylVA==} - engines: {node: '>=6.9.0'} - '@babel/compat-data@7.24.4': resolution: {integrity: sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==} engines: {node: '>=6.9.0'} - '@babel/core@7.24.3': - resolution: {integrity: sha512-5FcvN1JHw2sHJChotgx8Ek0lyuh4kCKelgMTTqhYJJtloNvUfpAFMeNQUtdlIaktwrSV9LtCdqwk48wL2wBacQ==} - engines: {node: '>=6.9.0'} - '@babel/core@7.24.5': resolution: {integrity: sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA==} engines: {node: '>=6.9.0'} - '@babel/generator@7.24.1': - resolution: {integrity: sha512-DfCRfZsBcrPEHUfuBMgbJ1Ut01Y/itOs+hY2nFLgqsqXd52/iSiVq5TITtUasIUgm+IIKdY2/1I7auiQOEeC9A==} - engines: {node: '>=6.9.0'} - '@babel/generator@7.24.5': resolution: {integrity: sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA==} engines: {node: '>=6.9.0'} @@ -301,12 +285,6 @@ packages: resolution: {integrity: sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==} engines: {node: '>=6.9.0'} - '@babel/helper-module-transforms@7.23.3': - resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - '@babel/helper-module-transforms@7.24.5': resolution: {integrity: sha512-9GxeY8c2d2mdQUP1Dye0ks3VDyIMS98kt/llQ2nUId8IsWqTF0l1LkSX0/uP7l7MCDrzXS009Hyhe2gzTiGW8A==} engines: {node: '>=6.9.0'} @@ -317,10 +295,6 @@ packages: resolution: {integrity: sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==} engines: {node: '>=6.9.0'} - '@babel/helper-plugin-utils@7.24.0': - resolution: {integrity: sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==} - engines: {node: '>=6.9.0'} - '@babel/helper-plugin-utils@7.24.5': resolution: {integrity: sha512-xjNLDopRzW2o6ba0gKbkZq5YWEBaK3PCyTOY1K2P/O07LGMhMqlMXPxwN4S5/RhWuCobT8z0jrlKGlYmeR1OhQ==} engines: {node: '>=6.9.0'} @@ -337,10 +311,6 @@ packages: peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-simple-access@7.22.5': - resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} - engines: {node: '>=6.9.0'} - '@babel/helper-simple-access@7.24.5': resolution: {integrity: sha512-uH3Hmf5q5n7n8mz7arjUlDOCbttY/DW4DYhE6FUsjKJ/oYC1kQQUvwEQWxRwUpX9qQKRXeqLwWxrqilMrf32sQ==} engines: {node: '>=6.9.0'} @@ -349,10 +319,6 @@ packages: resolution: {integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==} engines: {node: '>=6.9.0'} - '@babel/helper-split-export-declaration@7.22.6': - resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} - engines: {node: '>=6.9.0'} - '@babel/helper-split-export-declaration@7.24.5': resolution: {integrity: sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q==} engines: {node: '>=6.9.0'} @@ -361,10 +327,6 @@ packages: resolution: {integrity: sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.22.20': - resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} - engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.24.5': resolution: {integrity: sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA==} engines: {node: '>=6.9.0'} @@ -377,23 +339,14 @@ packages: resolution: {integrity: sha512-/xxzuNvgRl4/HLNKvnFwdhdgN3cpLxgLROeLDl83Yx0AJ1SGvq1ak0OszTOjDfiB8Vx03eJbeDWh9r+jCCWttw==} engines: {node: '>=6.9.0'} - '@babel/helpers@7.24.1': - resolution: {integrity: sha512-BpU09QqEe6ZCHuIHFphEFgvNSrubve1FtyMton26ekZ85gRGi6LrTF7zArARp2YvyFxloeiRmtSCq5sjh1WqIg==} - engines: {node: '>=6.9.0'} - '@babel/helpers@7.24.5': resolution: {integrity: sha512-CiQmBMMpMQHwM5m01YnrM6imUG1ebgYJ+fAIW4FZe6m4qHTPaRHti+R8cggAwkdz4oXhtO4/K9JWlh+8hIfR2Q==} engines: {node: '>=6.9.0'} - '@babel/highlight@7.24.2': - resolution: {integrity: sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==} + '@babel/highlight@7.24.5': + resolution: {integrity: sha512-8lLmua6AVh/8SLJRRVD6V8p73Hir9w5mJrhE+IPpILG31KKlI9iz5zmBYKcWPS59qSfgP9RaSBQSHHE81WKuEw==} engines: {node: '>=6.9.0'} - '@babel/parser@7.24.1': - resolution: {integrity: sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg==} - engines: {node: '>=6.0.0'} - hasBin: true - '@babel/parser@7.24.5': resolution: {integrity: sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==} engines: {node: '>=6.0.0'} @@ -844,10 +797,6 @@ packages: '@babel/regjsgen@0.8.0': resolution: {integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==} - '@babel/runtime@7.24.1': - resolution: {integrity: sha512-+BIznRzyqBf+2wCTxcKE3wDjfGeCoVE61KSHGpkzqrLi8qxqFwBeUFyId2cxkTmm55fzDGnm0+yCxaxygrLUnQ==} - engines: {node: '>=6.9.0'} - '@babel/runtime@7.24.5': resolution: {integrity: sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g==} engines: {node: '>=6.9.0'} @@ -856,18 +805,10 @@ packages: resolution: {integrity: sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.24.1': - resolution: {integrity: sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==} - engines: {node: '>=6.9.0'} - '@babel/traverse@7.24.5': resolution: {integrity: sha512-7aaBLeDQ4zYcUFDUD41lJc1fG8+5IU9DaNSJAgal866FGvmD5EbWQgnEC6kO1gGLsX0esNkfnJSndbTXA3r7UA==} engines: {node: '>=6.9.0'} - '@babel/types@7.24.0': - resolution: {integrity: sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==} - engines: {node: '>=6.9.0'} - '@babel/types@7.24.5': resolution: {integrity: sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ==} engines: {node: '>=6.9.0'} @@ -892,8 +833,8 @@ packages: '@dabh/diagnostics@2.0.3': resolution: {integrity: sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==} - '@dotenvx/dotenvx@0.27.0': - resolution: {integrity: sha512-zB01t8/4HxERp2qqz3CHniBUm6LtWK/8U6snewLY1zxeletpBhDKo5rgHslOoKPeRVWKLshSvHYNTEEXVlzFRQ==} + '@dotenvx/dotenvx@0.37.1': + resolution: {integrity: sha512-CN8A4cxuIQ5eRIaWK6qeRAYXPtt5Mo5XHw6o9kP+VWYlTg8UY3k426tCxcgrMRTI/GKMyu8wryHng+thUFCNYg==} hasBin: true '@emotion/babel-plugin@11.11.0': @@ -920,9 +861,6 @@ packages: '@types/react': optional: true - '@emotion/serialize@1.1.3': - resolution: {integrity: sha512-iD4D6QVZFDhcbH0RAG1uVu1CwVLMWUkCvAqqlewO/rxf8+87yIBAlt4+AxMiiKPLs5hFc0owNk/sLLAOROw3cA==} - '@emotion/serialize@1.1.4': resolution: {integrity: sha512-RIN04MBT8g+FnDwgvIUi8czvr1LU1alUMI05LekWB5DGyTm8cCBMCRpq3GqaiyEDRptEXOyXnvZ58GZYu4kBxQ==} @@ -1113,23 +1051,23 @@ packages: resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} engines: {node: '>=14'} - '@floating-ui/core@1.6.0': - resolution: {integrity: sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==} + '@floating-ui/core@1.6.1': + resolution: {integrity: sha512-42UH54oPZHPdRHdw6BgoBD6cg/eVTmVrFcgeRDM3jbO7uxSoipVcmcIGFcA5jmOHO5apcyvBhkSKES3fQJnu7A==} - '@floating-ui/dom@1.6.3': - resolution: {integrity: sha512-RnDthu3mzPlQ31Ss/BTwQ1zjzIhr3lk1gZB1OC56h/1vEtaXkESrOqL5fQVMfXpwGtRwX+YsZBdyHtJMQnkArw==} + '@floating-ui/dom@1.6.4': + resolution: {integrity: sha512-0G8R+zOvQsAG1pg2Q99P21jiqxqGBW1iRe/iXHsBRBxnpXKFI8QwbB4x5KmYLggNO5m34IQgOIu9SCRfR/WWiQ==} - '@floating-ui/react-dom@2.0.8': - resolution: {integrity: sha512-HOdqOt3R3OGeTKidaLvJKcgg75S6tibQ3Tif4eyd91QnIJWr0NLvoXFpJA/j8HqkFSL68GDca9AuyWEHlhyClw==} + '@floating-ui/react-dom@2.0.9': + resolution: {integrity: sha512-q0umO0+LQK4+p6aGyvzASqKbKOJcAHJ7ycE9CuUvfx3s9zTHWmGJTPOIlM/hmSBfUfg/XfY5YhLBLR/LHwShQQ==} peerDependencies: react: '>=16.8.0' react-dom: '>=16.8.0' - '@floating-ui/utils@0.2.1': - resolution: {integrity: sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==} + '@floating-ui/utils@0.2.2': + resolution: {integrity: sha512-J4yDIIthosAsRZ5CPYP/jQvUAQtlZTTD/4suA08/FEnlxqW3sKS9iAhgsa9VYLZ6vDHn/ixJgIqRQPotoBjxIw==} - '@fontsource/roboto@5.0.12': - resolution: {integrity: sha512-x0o17jvgoSSbS9OZnUX2+xJmVRvVCfeaYJjkS7w62iN7CuJWtMf5vJj8LqgC7ibqIkitOHVW+XssRjgrcHn62g==} + '@fontsource/roboto@5.0.13': + resolution: {integrity: sha512-j61DHjsdUCKMXSdNLTOxcG701FWnF0jcqNNQi2iPCDxU8seN/sMxeh62dC++UiagCWq9ghTypX+Pcy7kX+QOeQ==} '@hapi/hoek@9.3.0': resolution: {integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==} @@ -1150,12 +1088,8 @@ packages: resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} - '@humanwhocodes/object-schema@2.0.2': - resolution: {integrity: sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==} - - '@inquirer/checkbox@1.5.2': - resolution: {integrity: sha512-CifrkgQjDkUkWexmgYYNyB5603HhTHI91vLFeQXh6qrTKiCMVASol01Rs1cv6LP/A2WccZSRlJKZhbaBIs/9ZA==} - engines: {node: '>=14.18.0'} + '@humanwhocodes/object-schema@2.0.3': + resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} '@inquirer/confirm@2.0.17': resolution: {integrity: sha512-EqzhGryzmGpy2aJf6LxJVhndxYmFs+m8cxXzf8nejb1DE3sabf6mUgBcp4J0jAUEiAcYzqmkqRr7LPFh/WdnXA==} @@ -1173,42 +1107,10 @@ packages: resolution: {integrity: sha512-kfx0SU9nWgGe1f03ao/uXc85SFH1v2w3vQVH7QDGjKxdtJz+7vPitFtG++BTyJMYyYgH8MpXigutcXJeiQwVRw==} engines: {node: '>=18'} - '@inquirer/editor@1.2.15': - resolution: {integrity: sha512-gQ77Ls09x5vKLVNMH9q/7xvYPT6sIs5f7URksw+a2iJZ0j48tVS6crLqm2ugG33tgXHIwiEqkytY60Zyh5GkJQ==} - engines: {node: '>=14.18.0'} - - '@inquirer/expand@1.1.16': - resolution: {integrity: sha512-TGLU9egcuo+s7PxphKUCnJnpCIVY32/EwPCLLuu+gTvYiD8hZgx8Z2niNQD36sa6xcfpdLY6xXDBiL/+g1r2XQ==} - engines: {node: '>=14.18.0'} - '@inquirer/figures@1.0.1': resolution: {integrity: sha512-mtup3wVKia3ZwULPHcbs4Mor8Voi+iIXEWD7wCNbIO6lYR62oPCTQyrddi5OMYVXHzeCSoneZwJuS8sBvlEwDw==} engines: {node: '>=18'} - '@inquirer/input@1.2.16': - resolution: {integrity: sha512-Ou0LaSWvj1ni+egnyQ+NBtfM1885UwhRCMtsRt2bBO47DoC1dwtCa+ZUNgrxlnCHHF0IXsbQHYtIIjFGAavI4g==} - engines: {node: '>=14.18.0'} - - '@inquirer/password@1.1.16': - resolution: {integrity: sha512-aZYZVHLUXZ2gbBot+i+zOJrks1WaiI95lvZCn1sKfcw6MtSSlYC8uDX8sTzQvAsQ8epHoP84UNvAIT0KVGOGqw==} - engines: {node: '>=14.18.0'} - - '@inquirer/prompts@3.3.2': - resolution: {integrity: sha512-k52mOMRvTUejrqyF1h8Z07chC+sbaoaUYzzr1KrJXyj7yaX7Nrh0a9vktv8TuocRwIJOQMaj5oZEmkspEcJFYQ==} - engines: {node: '>=14.18.0'} - - '@inquirer/rawlist@1.2.16': - resolution: {integrity: sha512-pZ6TRg2qMwZAOZAV6TvghCtkr53dGnK29GMNQ3vMZXSNguvGqtOVc4j/h1T8kqGJFagjyfBZhUPGwNS55O5qPQ==} - engines: {node: '>=14.18.0'} - - '@inquirer/select@1.3.3': - resolution: {integrity: sha512-RzlRISXWqIKEf83FDC9ZtJ3JvuK1l7aGpretf41BCWYrvla2wU8W8MTRNMiPrPJ+1SIqrRC1nZdZ60hD9hRXLg==} - engines: {node: '>=14.18.0'} - - '@inquirer/type@1.2.1': - resolution: {integrity: sha512-xwMfkPAxeo8Ji/IxfUSqzRi0/+F2GIqJmpc5/thelgMGsjNZcjDDRBO9TLXT1s/hdx/mK5QbVIvgoLIFgXhTMQ==} - engines: {node: '>=18'} - '@inquirer/type@1.3.1': resolution: {integrity: sha512-Pe3PFccjPVJV1vtlfVvm9OnlbxqdnP5QcscFEFEnK5quChf1ufZtM0r8mR5ToWHMxZOh0s8o/qp9ANGRTo/DAw==} engines: {node: '>=18'} @@ -1334,11 +1236,11 @@ packages: '@types/react': optional: true - '@mui/core-downloads-tracker@5.15.14': - resolution: {integrity: sha512-on75VMd0XqZfaQW+9pGjSNiqW+ghc5E2ZSLRBXwcXl/C4YzjfyjrLPhrEpKnR9Uym9KXBvxrhoHfPcczYHweyA==} + '@mui/core-downloads-tracker@5.15.16': + resolution: {integrity: sha512-PTIbMJs5C/vYMfyJNW8ArOezh4eyHkg2pTeA7bBxh2kLP1Uzs0Nm+krXWbWGJPwTWjM8EhnDrr4aCF26+2oleg==} - '@mui/icons-material@5.15.14': - resolution: {integrity: sha512-vj/51k7MdFmt+XVw94sl30SCvGx6+wJLsNYjZRgxhS6y3UtnWnypMOsm3Kmg8TN+P0dqwsjy4/fX7B1HufJIhw==} + '@mui/icons-material@5.15.16': + resolution: {integrity: sha512-s8vYbyACzTNZRKv+20fCfVXJwJqNcVotns2EKnu1wmAga6wv2LAo5kB1d5yqQqZlMFtp34EJvRXf7cy8X0tJVA==} engines: {node: '>=12.0.0'} peerDependencies: '@mui/material': ^5.0.0 @@ -1348,8 +1250,8 @@ packages: '@types/react': optional: true - '@mui/material@5.15.14': - resolution: {integrity: sha512-kEbRw6fASdQ1SQ7LVdWR5OlWV3y7Y54ZxkLzd6LV5tmz+NpO3MJKZXSfgR0LHMP7meKsPiMm4AuzV0pXDpk/BQ==} + '@mui/material@5.15.16': + resolution: {integrity: sha512-ery2hFReewko9gpDBqOr2VmXwQG9ifXofPhGzIx09/b9JqCQC/06kZXZDGGrOTpIddK9HlIf4yrS+G70jPAzUQ==} engines: {node: '>=12.0.0'} peerDependencies: '@emotion/react': ^11.5.0 @@ -1388,8 +1290,8 @@ packages: '@emotion/styled': optional: true - '@mui/system@5.15.14': - resolution: {integrity: sha512-auXLXzUaCSSOLqJXmsAaq7P96VPRXg2Rrz6OHNV7lr+kB8lobUF+/N84Vd9C4G/wvCXYPs5TYuuGBRhcGbiBGg==} + '@mui/system@5.15.15': + resolution: {integrity: sha512-aulox6N1dnu5PABsfxVGOZffDVmlxPOVgj56HrUnJE8MCSh8lOvvkd47cebIVQQYAjpwieXQXiDPj5pwM40jTQ==} engines: {node: '>=12.0.0'} peerDependencies: '@emotion/react': ^11.5.0 @@ -1422,8 +1324,8 @@ packages: '@types/react': optional: true - '@mui/x-date-pickers@7.0.0': - resolution: {integrity: sha512-/9mp4O2WMixHOso63DBoZVfJVYGrzOHF5voheV2tYQ4XqDdTKp2AdWS3oh8PGwrsvCzqkvb3quzTqhKoEsJUwA==} + '@mui/x-date-pickers@7.3.2': + resolution: {integrity: sha512-i7JaDs1eXSZWyJihfszUHVV0t/C2HvtdMv5tHwv3E3enMx5Hup1vkJ64vZAH2fgGrTHQH8mjxvVsmI6jhDXIUg==} engines: {node: '>=14.0.0'} peerDependencies: '@emotion/react': ^11.9.0 @@ -1487,16 +1389,16 @@ packages: resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - '@playwright/test@1.42.1': - resolution: {integrity: sha512-Gq9rmS54mjBL/7/MvBaNOBwbfnh7beHvS6oS4srqXFcQHpQCV1+c8JXWE8VLPyRDhgS3H8x8A7hztqI9VnwrAQ==} + '@playwright/test@1.43.1': + resolution: {integrity: sha512-HgtQzFgNEEo4TE22K/X7sYTYNqEMMTZmFS8kTq6m8hXj+m1D8TgwgIbumHddJa9h4yl4GkKb8/bgAl2+g7eDgA==} engines: {node: '>=16'} hasBin: true '@popperjs/core@2.11.8': resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} - '@reduxjs/toolkit@2.2.2': - resolution: {integrity: sha512-454GZrEx3G6QSYwIx9ROaso1HR6sTH8qyZBe3KEsdWVGU3ayV8jYCwdaEJV3vl9V6+pi3GRl+7Xl7AeDna6qwQ==} + '@reduxjs/toolkit@2.2.3': + resolution: {integrity: sha512-76dll9EnJXg4EVcI5YNxZA/9hSAmZsFqzMmNRHvIlzw2WS/twfcVX3ysYrWGJMClwEmChQFC4yRq74tn6fdzRA==} peerDependencies: react: ^16.9.0 || ^17.0.0 || ^18 react-redux: ^7.2.1 || ^8.1.3 || ^9.0.0 @@ -1506,8 +1408,8 @@ packages: react-redux: optional: true - '@remix-run/router@1.15.3': - resolution: {integrity: sha512-Oy8rmScVrVxWZVOpEF57ovlnhpZ8CCPlnIIumVcV9nFdiSIrus99+Lw78ekXyGvVDlIsFJbSfmSovJUhCWYV3w==} + '@remix-run/router@1.16.0': + resolution: {integrity: sha512-Quz1KOffeEf/zwkCBM3kBtH4ZoZ+pT3xIXBG4PPW/XFtDP7EGhtTiC2+gpL9GnR7+Qdet5Oa6cYSvwKYg6kN9Q==} engines: {node: '>=14.0.0'} '@rollup/plugin-babel@5.3.1': @@ -1559,78 +1461,83 @@ packages: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.14.0': - resolution: {integrity: sha512-jwXtxYbRt1V+CdQSy6Z+uZti7JF5irRKF8hlKfEnF/xJpcNGuuiZMBvuoYM+x9sr9iWGnzrlM0+9hvQ1kgkf1w==} + '@rollup/rollup-android-arm-eabi@4.17.2': + resolution: {integrity: sha512-NM0jFxY8bB8QLkoKxIQeObCaDlJKewVlIEkuyYKm5An1tdVZ966w2+MPQ2l8LBZLjR+SgyV+nRkTIunzOYBMLQ==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.14.0': - resolution: {integrity: sha512-fI9nduZhCccjzlsA/OuAwtFGWocxA4gqXGTLvOyiF8d+8o0fZUeSztixkYjcGq1fGZY3Tkq4yRvHPFxU+jdZ9Q==} + '@rollup/rollup-android-arm64@4.17.2': + resolution: {integrity: sha512-yeX/Usk7daNIVwkq2uGoq2BYJKZY1JfyLTaHO/jaiSwi/lsf8fTFoQW/n6IdAsx5tx+iotu2zCJwz8MxI6D/Bw==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.14.0': - resolution: {integrity: sha512-BcnSPRM76/cD2gQC+rQNGBN6GStBs2pl/FpweW8JYuz5J/IEa0Fr4AtrPv766DB/6b2MZ/AfSIOSGw3nEIP8SA==} + '@rollup/rollup-darwin-arm64@4.17.2': + resolution: {integrity: sha512-kcMLpE6uCwls023+kknm71ug7MZOrtXo+y5p/tsg6jltpDtgQY1Eq5sGfHcQfb+lfuKwhBmEURDga9N0ol4YPw==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.14.0': - resolution: {integrity: sha512-LDyFB9GRolGN7XI6955aFeI3wCdCUszFWumWU0deHA8VpR3nWRrjG6GtGjBrQxQKFevnUTHKCfPR4IvrW3kCgQ==} + '@rollup/rollup-darwin-x64@4.17.2': + resolution: {integrity: sha512-AtKwD0VEx0zWkL0ZjixEkp5tbNLzX+FCqGG1SvOu993HnSz4qDI6S4kGzubrEJAljpVkhRSlg5bzpV//E6ysTQ==} cpu: [x64] os: [darwin] - '@rollup/rollup-linux-arm-gnueabihf@4.14.0': - resolution: {integrity: sha512-ygrGVhQP47mRh0AAD0zl6QqCbNsf0eTo+vgwkY6LunBcg0f2Jv365GXlDUECIyoXp1kKwL5WW6rsO429DBY/bA==} + '@rollup/rollup-linux-arm-gnueabihf@4.17.2': + resolution: {integrity: sha512-3reX2fUHqN7sffBNqmEyMQVj/CKhIHZd4y631duy0hZqI8Qoqf6lTtmAKvJFYa6bhU95B1D0WgzHkmTg33In0A==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.17.2': + resolution: {integrity: sha512-uSqpsp91mheRgw96xtyAGP9FW5ChctTFEoXP0r5FAzj/3ZRv3Uxjtc7taRQSaQM/q85KEKjKsZuiZM3GyUivRg==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.14.0': - resolution: {integrity: sha512-x+uJ6MAYRlHGe9wi4HQjxpaKHPM3d3JjqqCkeC5gpnnI6OWovLdXTpfa8trjxPLnWKyBsSi5kne+146GAxFt4A==} + '@rollup/rollup-linux-arm64-gnu@4.17.2': + resolution: {integrity: sha512-EMMPHkiCRtE8Wdk3Qhtciq6BndLtstqZIroHiiGzB3C5LDJmIZcSzVtLRbwuXuUft1Cnv+9fxuDtDxz3k3EW2A==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.14.0': - resolution: {integrity: sha512-nrRw8ZTQKg6+Lttwqo6a2VxR9tOroa2m91XbdQ2sUUzHoedXlsyvY1fN4xWdqz8PKmf4orDwejxXHjh7YBGUCA==} + '@rollup/rollup-linux-arm64-musl@4.17.2': + resolution: {integrity: sha512-NMPylUUZ1i0z/xJUIx6VUhISZDRT+uTWpBcjdv0/zkp7b/bQDF+NfnfdzuTiB1G6HTodgoFa93hp0O1xl+/UbA==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.14.0': - resolution: {integrity: sha512-xV0d5jDb4aFu84XKr+lcUJ9y3qpIWhttO3Qev97z8DKLXR62LC3cXT/bMZXrjLF9X+P5oSmJTzAhqwUbY96PnA==} - cpu: [ppc64le] + '@rollup/rollup-linux-powerpc64le-gnu@4.17.2': + resolution: {integrity: sha512-T19My13y8uYXPw/L/k0JYaX1fJKFT/PWdXiHr8mTbXWxjVF1t+8Xl31DgBBvEKclw+1b00Chg0hxE2O7bTG7GQ==} + cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.14.0': - resolution: {integrity: sha512-SDDhBQwZX6LPRoPYjAZWyL27LbcBo7WdBFWJi5PI9RPCzU8ijzkQn7tt8NXiXRiFMJCVpkuMkBf4OxSxVMizAw==} + '@rollup/rollup-linux-riscv64-gnu@4.17.2': + resolution: {integrity: sha512-BOaNfthf3X3fOWAB+IJ9kxTgPmMqPPH5f5k2DcCsRrBIbWnaJCgX2ll77dV1TdSy9SaXTR5iDXRL8n7AnoP5cg==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.14.0': - resolution: {integrity: sha512-RxB/qez8zIDshNJDufYlTT0ZTVut5eCpAZ3bdXDU9yTxBzui3KhbGjROK2OYTTor7alM7XBhssgoO3CZ0XD3qA==} + '@rollup/rollup-linux-s390x-gnu@4.17.2': + resolution: {integrity: sha512-W0UP/x7bnn3xN2eYMql2T/+wpASLE5SjObXILTMPUBDB/Fg/FxC+gX4nvCfPBCbNhz51C+HcqQp2qQ4u25ok6g==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.14.0': - resolution: {integrity: sha512-C6y6z2eCNCfhZxT9u+jAM2Fup89ZjiG5pIzZIDycs1IwESviLxwkQcFRGLjnDrP+PT+v5i4YFvlcfAs+LnreXg==} + '@rollup/rollup-linux-x64-gnu@4.17.2': + resolution: {integrity: sha512-Hy7pLwByUOuyaFC6mAr7m+oMC+V7qyifzs/nW2OJfC8H4hbCzOX07Ov0VFk/zP3kBsELWNFi7rJtgbKYsav9QQ==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.14.0': - resolution: {integrity: sha512-i0QwbHYfnOMYsBEyjxcwGu5SMIi9sImDVjDg087hpzXqhBSosxkE7gyIYFHgfFl4mr7RrXksIBZ4DoLoP4FhJg==} + '@rollup/rollup-linux-x64-musl@4.17.2': + resolution: {integrity: sha512-h1+yTWeYbRdAyJ/jMiVw0l6fOOm/0D1vNLui9iPuqgRGnXA0u21gAqOyB5iHjlM9MMfNOm9RHCQ7zLIzT0x11Q==} cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.14.0': - resolution: {integrity: sha512-Fq52EYb0riNHLBTAcL0cun+rRwyZ10S9vKzhGKKgeD+XbwunszSY0rVMco5KbOsTlwovP2rTOkiII/fQ4ih/zQ==} + '@rollup/rollup-win32-arm64-msvc@4.17.2': + resolution: {integrity: sha512-tmdtXMfKAjy5+IQsVtDiCfqbynAQE/TQRpWdVataHmhMb9DCoJxp9vLcCBjEQWMiUYxO1QprH/HbY9ragCEFLA==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.14.0': - resolution: {integrity: sha512-e/PBHxPdJ00O9p5Ui43+vixSgVf4NlLsmV6QneGERJ3lnjIua/kim6PRFe3iDueT1rQcgSkYP8ZBBXa/h4iPvw==} + '@rollup/rollup-win32-ia32-msvc@4.17.2': + resolution: {integrity: sha512-7II/QCSTAHuE5vdZaQEwJq2ZACkBpQDOmQsE6D6XUbnBHW8IAhm4eTufL6msLJorzrHDFv3CF8oCA/hSIRuZeQ==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.14.0': - resolution: {integrity: sha512-aGg7iToJjdklmxlUlJh/PaPNa4PmqHfyRMLunbL3eaMO0gp656+q1zOKkpJ/CVe9CryJv6tAN1HDoR8cNGzkag==} + '@rollup/rollup-win32-x64-msvc@4.17.2': + resolution: {integrity: sha512-TGGO7v7qOq4CYmSBVEYpI1Y5xDuCEnbVC5Vth8mOsW0gDSzxNrVERPc790IGHsrT2dQSimgMr9Ub3Y1Jci5/8w==} cpu: [x64] os: [win32] @@ -1646,10 +1553,6 @@ packages: '@sinclair/typebox@0.27.8': resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} - '@sindresorhus/is@4.6.0': - resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} - engines: {node: '>=10'} - '@sinonjs/commons@3.0.1': resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} @@ -1659,68 +1562,68 @@ packages: '@surma/rollup-plugin-off-main-thread@2.2.3': resolution: {integrity: sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==} - '@swc/core-darwin-arm64@1.4.8': - resolution: {integrity: sha512-hhQCffRTgzpTIbngSnC30vV6IJVTI9FFBF954WEsshsecVoCGFiMwazBbrkLG+RwXENTrMhgeREEFh6R3KRgKQ==} + '@swc/core-darwin-arm64@1.4.17': + resolution: {integrity: sha512-HVl+W4LezoqHBAYg2JCqR+s9ife9yPfgWSj37iIawLWzOmuuJ7jVdIB7Ee2B75bEisSEKyxRlTl6Y1Oq3owBgw==} engines: {node: '>=10'} cpu: [arm64] os: [darwin] - '@swc/core-darwin-x64@1.4.8': - resolution: {integrity: sha512-P3ZBw8Jr8rKhY/J8d+6WqWriqngGTgHwtFeJ8MIakQJTbdYbFgXSZxcvDiERg3psbGeFXaUaPI0GO6BXv9k/OQ==} + '@swc/core-darwin-x64@1.4.17': + resolution: {integrity: sha512-WYRO9Fdzq4S/he8zjW5I95G1zcvyd9yyD3Tgi4/ic84P5XDlSMpBDpBLbr/dCPjmSg7aUXxNQqKqGkl6dQxYlA==} engines: {node: '>=10'} cpu: [x64] os: [darwin] - '@swc/core-linux-arm-gnueabihf@1.4.8': - resolution: {integrity: sha512-PP9JIJt19bUWhAGcQW6qMwTjZOcMyzkvZa0/LWSlDm0ORYVLmDXUoeQbGD3e0Zju9UiZxyulnpjEN0ZihJgPTA==} + '@swc/core-linux-arm-gnueabihf@1.4.17': + resolution: {integrity: sha512-cgbvpWOvtMH0XFjvwppUCR+Y+nf6QPaGu6AQ5hqCP+5Lv2zO5PG0RfasC4zBIjF53xgwEaaWmGP5/361P30X8Q==} engines: {node: '>=10'} cpu: [arm] os: [linux] - '@swc/core-linux-arm64-gnu@1.4.8': - resolution: {integrity: sha512-HvEWnwKHkoVUr5iftWirTApFJ13hGzhAY2CMw4lz9lur2m+zhPviRRED0FCI6T95Knpv7+8eUOr98Z7ctrG6DQ==} + '@swc/core-linux-arm64-gnu@1.4.17': + resolution: {integrity: sha512-l7zHgaIY24cF9dyQ/FOWbmZDsEj2a9gRFbmgx2u19e3FzOPuOnaopFj0fRYXXKCmtdx+anD750iBIYnTR+pq/Q==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - '@swc/core-linux-arm64-musl@1.4.8': - resolution: {integrity: sha512-kY8+qa7k/dEeBq9p0Hrta18QnJPpsiJvDQSLNaTIFpdM3aEM9zbkshWz8gaX5VVGUEALowCBUWqmzO4VaqM+2w==} + '@swc/core-linux-arm64-musl@1.4.17': + resolution: {integrity: sha512-qhH4gr9gAlVk8MBtzXbzTP3BJyqbAfUOATGkyUtohh85fPXQYuzVlbExix3FZXTwFHNidGHY8C+ocscI7uDaYw==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - '@swc/core-linux-x64-gnu@1.4.8': - resolution: {integrity: sha512-0WWyIw432wpO/zeGblwq4f2YWam4pn8Z/Ig4KzHMgthR/KmiLU3f0Z7eo45eVmq5vcU7Os1zi/Zb65OOt09q/w==} + '@swc/core-linux-x64-gnu@1.4.17': + resolution: {integrity: sha512-vRDFATL1oN5oZMImkwbgSHEkp8xG1ofEASBypze01W1Tqto8t+yo6gsp69wzCZBlxldsvPpvFZW55Jq0Rn+UnA==} engines: {node: '>=10'} cpu: [x64] os: [linux] - '@swc/core-linux-x64-musl@1.4.8': - resolution: {integrity: sha512-p4yxvVS05rBNCrBaSTa20KK88vOwtg8ifTW7ec/yoab0bD5EwzzB8KbDmLLxE6uziFa0sdjF0dfRDwSZPex37Q==} + '@swc/core-linux-x64-musl@1.4.17': + resolution: {integrity: sha512-zQNPXAXn3nmPqv54JVEN8k2JMEcMTQ6veVuU0p5O+A7KscJq+AGle/7ZQXzpXSfUCXlLMX4wvd+rwfGhh3J4cw==} engines: {node: '>=10'} cpu: [x64] os: [linux] - '@swc/core-win32-arm64-msvc@1.4.8': - resolution: {integrity: sha512-jKuXihxAaqUnbFfvPxtmxjdJfs87F1GdBf33il+VUmSyWCP4BE6vW+/ReDAe8sRNsKyrZ3UH1vI5q1n64csBUA==} + '@swc/core-win32-arm64-msvc@1.4.17': + resolution: {integrity: sha512-z86n7EhOwyzxwm+DLE5NoLkxCTme2lq7QZlDjbQyfCxOt6isWz8rkW5QowTX8w9Rdmk34ncrjSLvnHOeLY17+w==} engines: {node: '>=10'} cpu: [arm64] os: [win32] - '@swc/core-win32-ia32-msvc@1.4.8': - resolution: {integrity: sha512-O0wT4AGHrX8aBeH6c2ADMHgagAJc5Kf6W48U5moyYDAkkVnKvtSc4kGhjWhe1Yl0sI0cpYh2In2FxvYsb44eWw==} + '@swc/core-win32-ia32-msvc@1.4.17': + resolution: {integrity: sha512-JBwuSTJIgiJJX6wtr4wmXbfvOswHFj223AumUrK544QV69k60FJ9q2adPW9Csk+a8wm1hLxq4HKa2K334UHJ/g==} engines: {node: '>=10'} cpu: [ia32] os: [win32] - '@swc/core-win32-x64-msvc@1.4.8': - resolution: {integrity: sha512-C2AYc3A2o+ECciqsJWRgIpp83Vk5EaRzHe7ed/xOWzVd0MsWR+fweEsyOjlmzHfpUxJSi46Ak3/BIZJlhZbXbg==} + '@swc/core-win32-x64-msvc@1.4.17': + resolution: {integrity: sha512-jFkOnGQamtVDBm3MF5Kq1lgW8vx4Rm1UvJWRUfg+0gx7Uc3Jp3QMFeMNw/rDNQYRDYPG3yunCC+2463ycd5+dg==} engines: {node: '>=10'} cpu: [x64] os: [win32] - '@swc/core@1.4.8': - resolution: {integrity: sha512-uY2RSJcFPgNOEg12RQZL197LZX+MunGiKxsbxmh22VfVxrOYGRvh4mPANFlrD1yb38CgmW1wI6YgIi8LkIwmWg==} + '@swc/core@1.4.17': + resolution: {integrity: sha512-tq+mdWvodMBNBBZbwFIMTVGYHe9N7zvEaycVVjfvAx20k1XozHbHhRv+9pEVFJjwRxLdXmtvFZd3QZHRAOpoNQ==} engines: {node: '>=10'} peerDependencies: '@swc/helpers': ^0.5.0 @@ -1734,20 +1637,12 @@ packages: '@swc/types@0.1.6': resolution: {integrity: sha512-/JLo/l2JsT/LRd80C3HfbmVpxOAJ11FO2RCEslFrgzLltoP9j8XIbsyDcfCt2WWyX+CM96rBoNM+IToAkFOugg==} - '@szmarczak/http-timer@4.0.6': - resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} - engines: {node: '>=10'} - '@testing-library/dom@10.1.0': resolution: {integrity: sha512-wdsYKy5zupPyLCW2Je5DLHSxSfbIp6h80WoHOQc+RPtmPGA52O9x5MJEkv92Sjonpq+poOAtUKhh1kBGAXBrNA==} engines: {node: '>=18'} - '@testing-library/dom@9.3.4': - resolution: {integrity: sha512-FlS4ZWlp97iiNWig0Muq8p+3rVDjRiYE+YKGbAqXOu9nwJFFOdL00kFpz42M+4huzYi86vAK1sOOfyOG45muIQ==} - engines: {node: '>=14'} - - '@testing-library/jest-dom@6.4.2': - resolution: {integrity: sha512-CzqH0AFymEMG48CpzXFriYYkOjk6ZGPCLMhW9e9jg3KMCn5OfJecF8GtGW7yGfR/IgCe3SX8BSwjdzI6BBbZLw==} + '@testing-library/jest-dom@6.4.3': + resolution: {integrity: sha512-d1NUtNEN0hSUB/XWdF1GgdlD5S2tS0huQb2tkFL2usXRatR/EiHS6AhLtDcCb/iD9CS7kRmbAHt2O5JadkKyuA==} engines: {node: '>=14', npm: '>=6', yarn: '>=1'} peerDependencies: '@jest/globals': '>= 28' @@ -1767,12 +1662,16 @@ packages: vitest: optional: true - '@testing-library/react@14.2.2': - resolution: {integrity: sha512-SOUuM2ysCvjUWBXTNfQ/ztmnKDmqaiPV3SvoIuyxMUca45rbSWWAT/qB8CUs/JQ/ux/8JFs9DNdFQ3f6jH3crA==} - engines: {node: '>=14'} + '@testing-library/react@15.0.6': + resolution: {integrity: sha512-UlbazRtEpQClFOiYp+1BapMT+xyqWMnE+hh9tn5DQ6gmlE7AIZWcGpzZukmDZuFk3By01oiqOf8lRedLS4k6xQ==} + engines: {node: '>=18'} peerDependencies: + '@types/react': ^18.0.0 react: ^18.0.0 react-dom: ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true '@testing-library/user-event@14.5.2': resolution: {integrity: sha512-YAh82Wh4TIrxYLmfGcixwD18oIjyC1pFQC2Y01F2lzV2HTMiYrI0nze0FD0ocB//CKS/7jIUgae+adPqxK5yCQ==} @@ -1784,8 +1683,8 @@ packages: resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} engines: {node: '>= 10'} - '@tsconfig/node10@1.0.9': - resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} + '@tsconfig/node10@1.0.11': + resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} '@tsconfig/node12@1.0.11': resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} @@ -1811,9 +1710,6 @@ packages: '@types/babel__traverse@7.20.5': resolution: {integrity: sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==} - '@types/cacheable-request@6.0.3': - resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==} - '@types/cookie@0.6.0': resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} @@ -1829,9 +1725,6 @@ packages: '@types/hoist-non-react-statics@3.3.5': resolution: {integrity: sha512-SbcrWzkKBw2cdwRTwQAswfpB9g9LJWfjtUeW/jvNwbhC8cpmmNYVePa+ncbUe0rGTQ7G3Ff6mYUN2VMfLVr+Sg==} - '@types/http-cache-semantics@4.0.4': - resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} - '@types/istanbul-lib-coverage@2.0.6': resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} @@ -1853,9 +1746,6 @@ packages: '@types/json5@0.0.29': resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - '@types/keyv@3.1.4': - resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} - '@types/lodash.camelcase@4.3.9': resolution: {integrity: sha512-ys9/hGBfsKxzmFI8hckII40V0ASQ83UM2pxfQRghHAwekhH4/jWtjz/3/9YDy7ZpUd/H0k2STSqmPR28dnj7Zg==} @@ -1868,20 +1758,17 @@ packages: '@types/node-fetch@2.6.11': resolution: {integrity: sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==} - '@types/node@20.11.30': - resolution: {integrity: sha512-dHM6ZxwlmuZaRmUPfv1p+KrdD1Dci04FbdEm/9wEMouFqxYoFl5aMkt0VMAUtYRQDyYvD41WJLukhq/ha3YuTw==} - - '@types/node@20.12.7': - resolution: {integrity: sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==} + '@types/node@20.12.8': + resolution: {integrity: sha512-NU0rJLJnshZWdE/097cdCBbyW1h4hEg0xpovcoAQYHl8dnEyp/NAOiE45pvc+Bd1Dt+2r94v2eGFpQJ4R7g+2w==} '@types/parse-json@4.0.2': resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} - '@types/prop-types@15.7.11': - resolution: {integrity: sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==} + '@types/prop-types@15.7.12': + resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} - '@types/react-dom@18.2.22': - resolution: {integrity: sha512-fHkBXPeNtfvri6gdsMYyW+dW7RXFo6Ad09nLFK0VQWR7yGLai/Cyvyj696gbwYvBnhGtevUG9cET0pmUbMtoPQ==} + '@types/react-dom@18.3.0': + resolution: {integrity: sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==} '@types/react-redux@7.1.33': resolution: {integrity: sha512-NF8m5AjWCkert+fosDsN3hAlHzpjSiXlVy9EgQEmLoBhaNXbmyeGs/aj5dQzKuF+/q+S7JQagorGDW8pJ28Hmg==} @@ -1889,18 +1776,12 @@ packages: '@types/react-transition-group@4.4.10': resolution: {integrity: sha512-hT/+s0VQs2ojCX823m60m5f0sL5idt9SO6Tj6Dg+rdphGPIeJbJ6CxvBYkgkGKrYeDjvIpKTR38UzmtHJOGW3Q==} - '@types/react@18.2.67': - resolution: {integrity: sha512-vkIE2vTIMHQ/xL0rgmuoECBCkZFZeHr49HeWSc24AptMbNRo7pwSBvj73rlJJs9fGKj0koS+V7kQB1jHS0uCgw==} + '@types/react@18.3.1': + resolution: {integrity: sha512-V0kuGBX3+prX+DQ/7r2qsv1NsdfnCLnTgnRJ1pYnxykBhGMz+qj+box5lq7XsO5mtZsBqpjwwTu/7wszPfMBcw==} '@types/resolve@1.20.2': resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} - '@types/responselike@1.0.3': - resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} - - '@types/scheduler@0.16.8': - resolution: {integrity: sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==} - '@types/semver@7.5.8': resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} @@ -1931,8 +1812,8 @@ packages: '@types/yargs@17.0.32': resolution: {integrity: sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==} - '@typescript-eslint/eslint-plugin@7.4.0': - resolution: {integrity: sha512-yHMQ/oFaM7HZdVrVm/M2WHaNPgyuJH4WelkSVEWSSsir34kxW2kDJCxlXRhhGWEsMN0WAW/vLpKfKVcm8k+MPw==} + '@typescript-eslint/eslint-plugin@7.8.0': + resolution: {integrity: sha512-gFTT+ezJmkwutUPmB0skOj3GZJtlEGnlssems4AjkVweUPGj7jRwwqg0Hhg7++kPGJqKtTYx+R05Ftww372aIg==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: '@typescript-eslint/parser': ^7.0.0 @@ -1942,8 +1823,8 @@ packages: typescript: optional: true - '@typescript-eslint/parser@7.4.0': - resolution: {integrity: sha512-ZvKHxHLusweEUVwrGRXXUVzFgnWhigo4JurEj0dGF1tbcGh6buL+ejDdjxOQxv6ytcY1uhun1p2sm8iWStlgLQ==} + '@typescript-eslint/parser@7.8.0': + resolution: {integrity: sha512-KgKQly1pv0l4ltcftP59uQZCi4HUYswCLbTqVZEJu7uLX8CTLyswqMLqLN+2QFz4jCptqWVV4SB7vdxcH2+0kQ==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 @@ -1952,12 +1833,12 @@ packages: typescript: optional: true - '@typescript-eslint/scope-manager@7.4.0': - resolution: {integrity: sha512-68VqENG5HK27ypafqLVs8qO+RkNc7TezCduYrx8YJpXq2QGZ30vmNZGJJJC48+MVn4G2dCV8m5ZTVnzRexTVtw==} + '@typescript-eslint/scope-manager@7.8.0': + resolution: {integrity: sha512-viEmZ1LmwsGcnr85gIq+FCYI7nO90DVbE37/ll51hjv9aG+YZMb4WDE2fyWpUR4O/UrhGRpYXK/XajcGTk2B8g==} engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/type-utils@7.4.0': - resolution: {integrity: sha512-247ETeHgr9WTRMqHbbQdzwzhuyaJ8dPTuyuUEMANqzMRB1rj/9qFIuIXK7l0FX9i9FXbHeBQl/4uz6mYuCE7Aw==} + '@typescript-eslint/type-utils@7.8.0': + resolution: {integrity: sha512-H70R3AefQDQpz9mGv13Uhi121FNMh+WEaRqcXTX09YEDky21km4dV1ZXJIp8QjXc4ZaVkXVdohvWDzbnbHDS+A==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 @@ -1966,12 +1847,12 @@ packages: typescript: optional: true - '@typescript-eslint/types@7.4.0': - resolution: {integrity: sha512-mjQopsbffzJskos5B4HmbsadSJQWaRK0UxqQ7GuNA9Ga4bEKeiO6b2DnB6cM6bpc8lemaPseh0H9B/wyg+J7rw==} + '@typescript-eslint/types@7.8.0': + resolution: {integrity: sha512-wf0peJ+ZGlcH+2ZS23aJbOv+ztjeeP8uQ9GgwMJGVLx/Nj9CJt17GWgWWoSmoRVKAX2X+7fzEnAjxdvK2gqCLw==} engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/typescript-estree@7.4.0': - resolution: {integrity: sha512-A99j5AYoME/UBQ1ucEbbMEmGkN7SE0BvZFreSnTd1luq7yulcHdyGamZKizU7canpGDWGJ+Q6ZA9SyQobipePg==} + '@typescript-eslint/typescript-estree@7.8.0': + resolution: {integrity: sha512-5pfUCOwK5yjPaJQNy44prjCwtr981dO8Qo9J9PwYXZ0MosgAbfEMB008dJ5sNo3+/BN6ytBPuSvXUg9SAqB0dg==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: typescript: '*' @@ -1979,14 +1860,14 @@ packages: typescript: optional: true - '@typescript-eslint/utils@7.4.0': - resolution: {integrity: sha512-NQt9QLM4Tt8qrlBVY9lkMYzfYtNz8/6qwZg8pI3cMGlPnj6mOpRxxAm7BMJN9K0AiY+1BwJ5lVC650YJqYOuNg==} + '@typescript-eslint/utils@7.8.0': + resolution: {integrity: sha512-L0yFqOCflVqXxiZyXrDr80lnahQfSOfc9ELAAZ75sqicqp2i36kEZZGuUymHNFoYOqxRT05up760b4iGsl02nQ==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 - '@typescript-eslint/visitor-keys@7.4.0': - resolution: {integrity: sha512-0zkC7YM0iX5Y41homUUeW1CHtZR01K3ybjM1l6QczoMuay0XKtrb93kv95AxUGwdjGr64nNqnOCwmEl616N8CA==} + '@typescript-eslint/visitor-keys@7.8.0': + resolution: {integrity: sha512-q4/gibTNBQNA0lGyYQCmWRS5D15n8rXh4QjK3KV+MBPlTYHpfBUT3D3PaPR/HeNiI9W6R7FvlkcGhNyAoP+caA==} engines: {node: ^18.18.0 || >=20.0.0} '@ungap/structured-clone@1.2.0': @@ -2037,21 +1918,15 @@ packages: ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - ajv@8.12.0: - resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} - ajv@8.13.0: resolution: {integrity: sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==} - ansi-align@3.0.1: - resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} - ansi-escapes@4.3.2: resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} engines: {node: '>=8'} - ansi-escapes@6.2.0: - resolution: {integrity: sha512-kzRaCqXnpzWs+3z5ABPQiVke+iq0KXkHo8xiWV4RPTi5Yli0l97BEQuhXV1s7+aSU/fu1kUuxgS4MsQ0fRuygw==} + ansi-escapes@6.2.1: + resolution: {integrity: sha512-4nJ3yixlEthEJ9Rk4vPcdBRkZvQZlYyu8j4/Mqz5sgIkddmEnH2Yj2ZrnP9S3tQOvSNRUIgVNF/1yPpRAGNRig==} engines: {node: '>=14.16'} ansi-regex@5.0.1: @@ -2094,9 +1969,6 @@ packages: argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - aria-query@5.1.3: - resolution: {integrity: sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==} - aria-query@5.3.0: resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} @@ -2108,8 +1980,8 @@ packages: resolution: {integrity: sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==} engines: {node: '>=0.10.0'} - array-includes@3.1.7: - resolution: {integrity: sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==} + array-includes@3.1.8: + resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} engines: {node: '>= 0.4'} array-union@2.1.0: @@ -2161,8 +2033,8 @@ packages: engines: {node: '>=12.9.0'} hasBin: true - autoprefixer@10.4.18: - resolution: {integrity: sha512-1DKbDfsr6KUElM6wg+0zRNkB/Q7WcKYAaK+pzXn+Xqmszm/5Xa9coeNdtP88Vi+dPzZnMjhge8GIV49ZQkDa+g==} + autoprefixer@10.4.19: + resolution: {integrity: sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==} engines: {node: ^10 || ^12 || >=14} hasBin: true peerDependencies: @@ -2228,10 +2100,6 @@ packages: bl@4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} - boxen@5.1.2: - resolution: {integrity: sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==} - engines: {node: '>=10'} - brace-expansion@1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} @@ -2264,14 +2132,6 @@ packages: resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} engines: {node: '>=6'} - cacheable-lookup@5.0.4: - resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==} - engines: {node: '>=10.6.0'} - - cacheable-request@7.0.4: - resolution: {integrity: sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==} - engines: {node: '>=8'} - call-bind@1.0.7: resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} engines: {node: '>= 0.4'} @@ -2288,8 +2148,8 @@ packages: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} - caniuse-lite@1.0.30001599: - resolution: {integrity: sha512-LRAQHZ4yT1+f9LemSMeqdMpMxZcc4RMWdj4tiFe3G8tNkWK+E58g+/tzotb5cU6TbcVJLr4fySiAW7XmxQvZQA==} + caniuse-lite@1.0.30001615: + resolution: {integrity: sha512-1IpazM5G3r38meiae0bHRnPhz+CBQ3ZLqbQMtrg+AsTPKAXgW38JNsXkyZ+v8waCsDmPq87lmfun5Q2AGysNEQ==} chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} @@ -2311,22 +2171,12 @@ packages: resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} engines: {node: '>=10'} - chardet@0.7.0: - resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} - - ci-info@2.0.0: - resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==} - ci-info@3.9.0: resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} engines: {node: '>=8'} - cjs-module-lexer@1.2.3: - resolution: {integrity: sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==} - - cli-boxes@2.2.1: - resolution: {integrity: sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==} - engines: {node: '>=6'} + cjs-module-lexer@1.3.1: + resolution: {integrity: sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q==} cli-cursor@3.1.0: resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} @@ -2352,15 +2202,12 @@ packages: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} - clone-response@1.0.3: - resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} - clone@1.0.4: resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} engines: {node: '>=0.8'} - clsx@2.1.0: - resolution: {integrity: sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==} + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} engines: {node: '>=6'} co@4.6.0: @@ -2421,10 +2268,6 @@ packages: resolution: {integrity: sha512-8fLl9F04EJqjSqH+QjITQfJF8BrOVaYr1jewVgSRAEWePfxT0sku4w2hrGQ60BC/TNLGQ2pgxNlTbWQmMPFvXg==} engines: {node: '>=12'} - configstore@5.0.1: - resolution: {integrity: sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==} - engines: {node: '>=8'} - convert-source-map@1.9.0: resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} @@ -2509,8 +2352,8 @@ packages: resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} engines: {node: '>= 0.4'} - dayjs@1.11.10: - resolution: {integrity: sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==} + dayjs@1.11.11: + resolution: {integrity: sha512-okzr3f11N6WuqYtZSvm+F776mB41wRZMhKP+hc34YdW+KmtYYK9iqvHSwo2k9FEH3fhGXvOPV6yz2IcSrfRUDg==} debounce-fn@4.0.0: resolution: {integrity: sha512-8pYCQiL9Xdcg0UPSD3d+0KMlOjp+KGU5EPwYddgzQ7DATsg4fuUDjQtsYLmWjnk2obnNHgV3vE2Y4jejSOJVBQ==} @@ -2536,26 +2379,14 @@ packages: decimal.js@10.4.3: resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} - decompress-response@6.0.0: - resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} - engines: {node: '>=10'} - - dedent@1.5.1: - resolution: {integrity: sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==} + dedent@1.5.3: + resolution: {integrity: sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==} peerDependencies: babel-plugin-macros: ^3.1.0 peerDependenciesMeta: babel-plugin-macros: optional: true - deep-equal@2.2.3: - resolution: {integrity: sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==} - engines: {node: '>= 0.4'} - - deep-extend@0.6.0: - resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} - engines: {node: '>=4.0.0'} - deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} @@ -2566,10 +2397,6 @@ packages: defaults@1.0.4: resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} - defer-to-connect@2.0.1: - resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} - engines: {node: '>=10'} - define-data-property@1.1.4: resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} engines: {node: '>= 0.4'} @@ -2602,6 +2429,10 @@ packages: resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} engines: {node: '>=0.3.1'} + diff@5.2.0: + resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} + engines: {node: '>=0.3.1'} + dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} @@ -2628,10 +2459,6 @@ packages: engines: {node: '>=12'} deprecated: Use your platform's native DOMException instead - dot-prop@5.3.0: - resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} - engines: {node: '>=8'} - dot-prop@6.0.1: resolution: {integrity: sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==} engines: {node: '>=10'} @@ -2655,8 +2482,8 @@ packages: engines: {node: '>=0.10.0'} hasBin: true - electron-to-chromium@1.4.711: - resolution: {integrity: sha512-hRg81qzvUEibX2lDxnFlVCHACa+LtrCPIsWAxo161LDYIB3jauf57RGsMZV9mvGwE98yGH06icj3zBEoOkxd/w==} + electron-to-chromium@1.4.755: + resolution: {integrity: sha512-9nop+3jZxSHIxe1EzEUcjDXzK+3qOv3fY5w0sE88nIZUntbv1aXWmoxGWlklX5XSO4txCpLssWkUSh8RQPovBg==} emittery@0.13.1: resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} @@ -2674,9 +2501,6 @@ packages: enabled@2.0.0: resolution: {integrity: sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==} - end-of-stream@1.4.4: - resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} - enhanced-resolve@5.16.0: resolution: {integrity: sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA==} engines: {node: '>=10.13.0'} @@ -2692,12 +2516,8 @@ packages: error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} - es-abstract@1.22.5: - resolution: {integrity: sha512-oW69R+4q2wG+Hc3KZePPZxOiisRIqfKBVo/HLx94QcJeWGU/8sZhCvc829rd1kS366vlJbzBfXf9yWwf0+Ko7w==} - engines: {node: '>= 0.4'} - - es-abstract@1.23.2: - resolution: {integrity: sha512-60s3Xv2T2p1ICykc7c+DNDPLDMm9t4QxCOUU0K9JxiLjM3C1zB9YVdN7tjxrFd4+AkZ8CdX1ovUga4P2+1e+/w==} + es-abstract@1.23.3: + resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==} engines: {node: '>= 0.4'} es-define-property@1.0.0: @@ -2708,11 +2528,8 @@ packages: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} - es-get-iterator@1.1.3: - resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==} - - es-iterator-helpers@1.0.18: - resolution: {integrity: sha512-scxAJaewsahbqTYrGKJihhViaM6DDZDDoucfvzNbK0pOren1g/daDQ3IAhzn+1G14rBG7w+i5N+qul60++zlKA==} + es-iterator-helpers@1.0.19: + resolution: {integrity: sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==} engines: {node: '>= 0.4'} es-object-atoms@1.0.0: @@ -2739,10 +2556,6 @@ packages: resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} engines: {node: '>=6'} - escape-goat@2.1.1: - resolution: {integrity: sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==} - engines: {node: '>=8'} - escape-string-regexp@1.0.5: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} engines: {node: '>=0.8.0'} @@ -2760,8 +2573,8 @@ packages: engines: {node: '>=6.0'} hasBin: true - eslint-compat-utils@0.1.2: - resolution: {integrity: sha512-Jia4JDldWnFNIru1Ehx1H5s9/yxiRHY/TimCuUc0jNexew3cF1gI6CYZil1ociakfWO3rRqFjl1mskBblB3RYg==} + eslint-compat-utils@0.5.0: + resolution: {integrity: sha512-dc6Y8tzEcSYZMHa+CMPLi/hyo1FzNeonbhJL7Ol0ccuKQkwopJcJBA9YL/xmMTLU1eKigXo9vj9nALElWYSowg==} engines: {node: '>=12'} peerDependencies: eslint: '>=6.0.0' @@ -2796,8 +2609,8 @@ packages: eslint-import-resolver-webpack: optional: true - eslint-plugin-es-x@7.5.0: - resolution: {integrity: sha512-ODswlDSO0HJDzXU0XvgZ3lF3lS3XAZEossh15Q2UHjwrJggWeBoKqqEsLTZLXl+dh5eOAozG0zRcYtuE35oTuQ==} + eslint-plugin-es-x@7.6.0: + resolution: {integrity: sha512-I0AmeNgevgaTR7y2lrVCJmGYF0rjoznpDvqV/kIkZSZbZ8Rw3eu4cGlvBBULScfkSOCzqKbff5LR4CNrV7mZHA==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: eslint: '>=8' @@ -2812,8 +2625,8 @@ packages: '@typescript-eslint/parser': optional: true - eslint-plugin-n@17.3.1: - resolution: {integrity: sha512-25+HTtKe1F8U/M4ERmdzbz/xkm/gaY0OYC8Fcv1z/WvpLJ8Xfh9LzJ13JV5uj4QyCUD8kOPJrNjn/3y+tc57Vw==} + eslint-plugin-n@17.4.0: + resolution: {integrity: sha512-RtgGgNpYxECwE9dFr+D66RtbN0B8r/fY6ZF8EVsmK2YnZxE8/n9LNQhgnkL9z37UFZjYVmvMuC32qu7fQBsLVQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: '>=8.23.0' @@ -2838,8 +2651,8 @@ packages: peerDependencies: eslint: ^7.0.0 || ^8.0.0 - eslint-plugin-react-hooks@4.6.0: - resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==} + eslint-plugin-react-hooks@4.6.2: + resolution: {integrity: sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==} engines: {node: '>=10'} peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 @@ -2916,10 +2729,6 @@ packages: resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - external-editor@3.1.0: - resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} - engines: {node: '>=4'} - fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -3069,10 +2878,6 @@ packages: resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} engines: {node: '>=8.0.0'} - get-stream@5.2.0: - resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} - engines: {node: '>=8'} - get-stream@6.0.1: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} @@ -3096,18 +2901,14 @@ packages: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} - glob@10.3.10: - resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} + glob@10.3.12: + resolution: {integrity: sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==} engines: {node: '>=16 || 14 >=14.17'} hasBin: true glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - global-dirs@3.0.1: - resolution: {integrity: sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==} - engines: {node: '>=10'} - globals@11.12.0: resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} engines: {node: '>=4'} @@ -3116,12 +2917,12 @@ packages: resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} engines: {node: '>=8'} - globals@15.0.0: - resolution: {integrity: sha512-m/C/yR4mjO6pXDTm9/R/SpYTAIyaUB4EOzcaaMEl7mds7Mshct9GfejiJNQGjHHbdMPey13Kpu4TMbYi9ex1pw==} + globals@15.1.0: + resolution: {integrity: sha512-926gJqg+4mkxwYKiFvoomM4J0kWESfk3qfTvRL2/oc/tK/eTDBbrfcKnSa2KtfdxB5onoL7D3A3qIHQFpd4+UA==} engines: {node: '>=18'} - globalthis@1.0.3: - resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} + globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} engines: {node: '>= 0.4'} globby@11.1.0: @@ -3131,10 +2932,6 @@ packages: gopd@1.0.1: resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} - got@11.8.6: - resolution: {integrity: sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==} - engines: {node: '>=10.19.0'} - graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} @@ -3174,10 +2971,6 @@ packages: resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} engines: {node: '>= 0.4'} - has-yarn@2.1.0: - resolution: {integrity: sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==} - engines: {node: '>=8'} - hasown@2.0.2: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} @@ -3195,17 +2988,10 @@ packages: html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} - http-cache-semantics@4.1.1: - resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} - http-proxy-agent@5.0.0: resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} engines: {node: '>= 6'} - http2-wrapper@1.0.3: - resolution: {integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==} - engines: {node: '>=10.19.0'} - https-proxy-agent@5.0.1: resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} engines: {node: '>= 6'} @@ -3223,10 +3009,6 @@ packages: engines: {node: '>=18'} hasBin: true - iconv-lite@0.4.24: - resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} - engines: {node: '>=0.10.0'} - iconv-lite@0.6.3: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} engines: {node: '>=0.10.0'} @@ -3245,17 +3027,13 @@ packages: resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} engines: {node: '>= 4'} - immer@10.0.4: - resolution: {integrity: sha512-cuBuGK40P/sk5IzWa9QPUaAdvPHjkk1c+xYsd9oZw+YQQEV+10G0P5uMpGctZZKnyQ+ibRO08bD25nWLmYi2pw==} + immer@10.1.1: + resolution: {integrity: sha512-s2MPrmjovJcoMaHtx6K11Ra7oD05NT97w1IC5zpMkT6Atjr7H8LjaDd81iIxUYpMKSRRNMJE703M1Fhr/TctHw==} import-fresh@3.3.0: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} engines: {node: '>=6'} - import-lazy@2.1.0: - resolution: {integrity: sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A==} - engines: {node: '>=4'} - import-local@3.1.0: resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==} engines: {node: '>=8'} @@ -3275,21 +3053,10 @@ packages: inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - ini@1.3.8: - resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} - - ini@2.0.0: - resolution: {integrity: sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==} - engines: {node: '>=10'} - internal-slot@1.0.7: resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} engines: {node: '>= 0.4'} - is-arguments@1.1.1: - resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} - engines: {node: '>= 0.4'} - is-array-buffer@3.0.4: resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} engines: {node: '>= 0.4'} @@ -3319,10 +3086,6 @@ packages: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} - is-ci@2.0.0: - resolution: {integrity: sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==} - hasBin: true - is-core-module@2.13.1: resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} @@ -3370,10 +3133,6 @@ packages: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} - is-installed-globally@0.4.0: - resolution: {integrity: sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==} - engines: {node: '>=10'} - is-interactive@1.0.0: resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} engines: {node: '>=8'} @@ -3392,10 +3151,6 @@ packages: is-node-process@1.2.0: resolution: {integrity: sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==} - is-npm@5.0.0: - resolution: {integrity: sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==} - engines: {node: '>=10'} - is-number-object@1.0.7: resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} engines: {node: '>= 0.4'} @@ -3455,9 +3210,6 @@ packages: resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} engines: {node: '>= 0.4'} - is-typedarray@1.0.0: - resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} - is-unicode-supported@0.1.0: resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} engines: {node: '>=10'} @@ -3477,9 +3229,6 @@ packages: resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} engines: {node: '>=8'} - is-yarn-global@0.3.0: - resolution: {integrity: sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==} - isarray@2.0.5: resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} @@ -3829,12 +3578,8 @@ packages: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true - lowercase-keys@2.0.0: - resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} - engines: {node: '>=8'} - - lru-cache@10.2.0: - resolution: {integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==} + lru-cache@10.2.2: + resolution: {integrity: sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==} engines: {node: 14 || >=16.14} lru-cache@5.1.1: @@ -3851,10 +3596,6 @@ packages: magic-string@0.25.9: resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} - make-dir@3.1.0: - resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} - engines: {node: '>=8'} - make-dir@4.0.0: resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} engines: {node: '>=10'} @@ -3899,14 +3640,6 @@ packages: resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} engines: {node: '>=12'} - mimic-response@1.0.1: - resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} - engines: {node: '>=4'} - - mimic-response@3.1.0: - resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} - engines: {node: '>=10'} - min-indent@1.0.1: resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} engines: {node: '>=4'} @@ -3918,8 +3651,8 @@ packages: resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} engines: {node: '>=10'} - minimatch@9.0.3: - resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} + minimatch@9.0.4: + resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} engines: {node: '>=16 || 14 >=14.17'} minimist@1.2.8: @@ -3979,10 +3712,6 @@ packages: resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} engines: {node: '>=0.10.0'} - normalize-url@6.1.0: - resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} - engines: {node: '>=10'} - npm-run-path@4.0.1: resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} engines: {node: '>=8'} @@ -3991,8 +3720,8 @@ packages: resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - nwsapi@2.2.7: - resolution: {integrity: sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==} + nwsapi@2.2.9: + resolution: {integrity: sha512-2f3F0SEEer8bBu0dsNCFF50N0cTThV1nWFYcEYFZttdW0lDAoybv9cQoK7X7/68Z89S7FoRrVjP1LPX4XRf9vg==} object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} @@ -4001,10 +3730,6 @@ packages: object-inspect@1.13.1: resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} - object-is@1.1.6: - resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} - engines: {node: '>= 0.4'} - object-keys@1.1.1: resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} engines: {node: '>= 0.4'} @@ -4029,8 +3754,9 @@ packages: resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} engines: {node: '>= 0.4'} - object.hasown@1.1.3: - resolution: {integrity: sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==} + object.hasown@1.1.4: + resolution: {integrity: sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg==} + engines: {node: '>= 0.4'} object.values@1.2.0: resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==} @@ -4054,25 +3780,17 @@ packages: resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} engines: {node: '>=12'} - optionator@0.9.3: - resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} ora@5.4.1: resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} engines: {node: '>=10'} - os-tmpdir@1.0.2: - resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} - engines: {node: '>=0.10.0'} - outvariant@1.4.2: resolution: {integrity: sha512-Ou3dJ6bA/UJ5GVHxah4LnqDwZRwAmWxrG3wtrHrbGnP4RnLCtA64A4F+ae7Y8ww660JaddSoArUR5HjipWSHAQ==} - p-cancelable@2.1.1: - resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==} - engines: {node: '>=8'} - p-limit@2.3.0: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} engines: {node: '>=6'} @@ -4097,10 +3815,6 @@ packages: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} - package-json@7.0.0: - resolution: {integrity: sha512-CHJqc94AA8YfSLHGQT3DbvSIuE12NLFekpM4n7LRrAd3dOJtA911+4xe9q6nC3/jcKraq7nNS9VxgtT0KC+diA==} - engines: {node: '>=12'} - parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} @@ -4135,12 +3849,12 @@ packages: path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - path-scurry@1.10.1: - resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} + path-scurry@1.10.2: + resolution: {integrity: sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==} engines: {node: '>=16 || 14 >=14.17'} - path-to-regexp@6.2.1: - resolution: {integrity: sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==} + path-to-regexp@6.2.2: + resolution: {integrity: sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==} path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} @@ -4173,13 +3887,13 @@ packages: resolution: {integrity: sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==} engines: {node: '>=8'} - playwright-core@1.42.1: - resolution: {integrity: sha512-mxz6zclokgrke9p1vtdy/COWBH+eOZgYUVVU34C73M+4j4HLlQJHtfcqiqqxpP0o8HhMkflvfbquLX5dg6wlfA==} + playwright-core@1.43.1: + resolution: {integrity: sha512-EI36Mto2Vrx6VF7rm708qSnesVQKbxEWvPrfA1IPY6HgczBplDx7ENtx+K2n4kJ41sLLkuGfmb0ZLSSXlDhqPg==} engines: {node: '>=16'} hasBin: true - playwright@1.42.1: - resolution: {integrity: sha512-PgwB03s2DZBcNRoW+1w9E+VkLBxweib6KTXM0M3tkiT4jVxKSi6PmVJ591J+0u10LUrgxB7dLRbiJqO5s2QPMg==} + playwright@1.43.1: + resolution: {integrity: sha512-V7SoH0ai2kNt1Md9E3Gwas5B9m8KR2GVvwZnAI6Pg0m3sh7UvgiYhRrhsziCmqMJNouPckiOhk8T+9bSAK0VIA==} engines: {node: '>=16'} hasBin: true @@ -4244,19 +3958,12 @@ packages: psl@1.9.0: resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} - pump@3.0.0: - resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} - punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} - pupa@2.1.1: - resolution: {integrity: sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==} - engines: {node: '>=8'} - - pure-rand@6.0.4: - resolution: {integrity: sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA==} + pure-rand@6.1.0: + resolution: {integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==} querystringify@2.2.0: resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} @@ -4264,21 +3971,13 @@ packages: queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - quick-lru@5.1.1: - resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} - engines: {node: '>=10'} - randombytes@2.1.0: resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - rc@1.2.8: - resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} - hasBin: true - - react-dom@18.2.0: - resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} + react-dom@18.3.1: + resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} peerDependencies: - react: ^18.2.0 + react: ^18.3.1 react-error-boundary@4.0.13: resolution: {integrity: sha512-b6PwbdSv8XeOSYvjt8LpgpKrZ0yGdtZokYwkwV2wlcZbxgopHX/hgPl5VgpnoVOWd868n1hktM8Qm4b+02MiLQ==} @@ -4297,33 +3996,30 @@ packages: react-is@17.0.2: resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} - react-is@18.2.0: - resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} + react-is@18.3.1: + resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} - react-redux@9.1.0: - resolution: {integrity: sha512-6qoDzIO+gbrza8h3hjMA9aq4nwVFCKFtY2iLxCtVT38Swyy2C/dJCGBXHeHLtx6qlg/8qzc2MrhOeduf5K32wQ==} + react-redux@9.1.2: + resolution: {integrity: sha512-0OA4dhM1W48l3uzmv6B7TXPCGmokUU4p1M44DGN2/D9a1FjVPukVjER1PcPX97jIg6aUeLq1XJo1IpfbgULn0w==} peerDependencies: '@types/react': ^18.2.25 react: ^18.0 - react-native: '>=0.69' redux: ^5.0.0 peerDependenciesMeta: '@types/react': optional: true - react-native: - optional: true redux: optional: true - react-router-dom@6.22.3: - resolution: {integrity: sha512-7ZILI7HjcE+p31oQvwbokjk6OA/bnFxrhJ19n82Ex9Ph8fNAq+Hm/7KchpMGlTgWhUxRHMMCut+vEtNpWpowKw==} + react-router-dom@6.23.0: + resolution: {integrity: sha512-Q9YaSYvubwgbal2c9DJKfx6hTNoBp3iJDsl+Duva/DwxoJH+OTXkxGpql4iUK2sla/8z4RpjAm6EWx1qUDuopQ==} engines: {node: '>=14.0.0'} peerDependencies: react: '>=16.8' react-dom: '>=16.8' - react-router@6.22.3: - resolution: {integrity: sha512-dr2eb3Mj5zK2YISHK++foM9w4eBnO23eKnZEDs7c880P6oKbrjz/Svg9+nxqtHQK+oMW4OtjZca0RqPglXxguQ==} + react-router@6.23.0: + resolution: {integrity: sha512-wPMZ8S2TuPadH0sF5irFGjkNLIcRvOSaEe7v+JER8508dyJumm6XZB1u5kztlX0RVq6AzRVndzqcUh6sFIauzA==} engines: {node: '>=14.0.0'} peerDependencies: react: '>=16.8' @@ -4334,8 +4030,8 @@ packages: react: '>=16.6.0' react-dom: '>=16.6.0' - react@18.2.0: - resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} + react@18.3.1: + resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} engines: {node: '>=0.10.0'} readable-stream@3.6.2: @@ -4386,14 +4082,6 @@ packages: resolution: {integrity: sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==} engines: {node: '>=4'} - registry-auth-token@4.2.2: - resolution: {integrity: sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg==} - engines: {node: '>=6.0.0'} - - registry-url@5.1.0: - resolution: {integrity: sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==} - engines: {node: '>=8'} - regjsparser@0.9.1: resolution: {integrity: sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==} hasBin: true @@ -4412,9 +4100,6 @@ packages: reselect@5.1.0: resolution: {integrity: sha512-aw7jcGLDpSgNDyWBQLv2cedml85qd95/iszJjN988zX1t7AVRJi19d9kto5+W7oCfQ94gyo40dVbT6g2k4/kXg==} - resolve-alpn@1.2.1: - resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} - resolve-cwd@3.0.0: resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} engines: {node: '>=8'} @@ -4442,9 +4127,6 @@ packages: resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} hasBin: true - responselike@2.0.1: - resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==} - restore-cursor@3.1.0: resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} engines: {node: '>=8'} @@ -4469,8 +4151,8 @@ packages: engines: {node: '>=10.0.0'} hasBin: true - rollup@4.14.0: - resolution: {integrity: sha512-Qe7w62TyawbDzB4yt32R0+AbIo6m1/sqO7UPzFS8Z/ksL5mrfhA0v4CavfdmFav3D+ub4QeAgsGEe84DoWe/nQ==} + rollup@4.17.2: + resolution: {integrity: sha512-/9ClTJPByC0U4zNLowV1tMBe8yMEAxewtR3cUNX5BoEpGH3dQEWpJLr6CLp0fPdYRF/fzVOgvDb1zXuakwF5kQ==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -4503,12 +4185,8 @@ packages: resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} engines: {node: '>=v12.22.7'} - scheduler@0.23.0: - resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} - - semver-diff@3.1.1: - resolution: {integrity: sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==} - engines: {node: '>=8'} + scheduler@0.23.2: + resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} @@ -4634,10 +4312,6 @@ packages: resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} engines: {node: '>= 0.8'} - stop-iteration-iterator@1.0.0: - resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==} - engines: {node: '>= 0.4'} - stream-combiner@0.2.2: resolution: {integrity: sha512-6yHMqgLYDzQDcAkL+tjJDC5nSNuNIx0vZtRZeiPh7Saef7VHX9H5Ijn9l2VIol2zaNYlYEX6KyuT/237A58qEQ==} @@ -4675,8 +4349,9 @@ packages: string.prototype.trimend@1.0.8: resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} - string.prototype.trimstart@1.0.7: - resolution: {integrity: sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==} + string.prototype.trimstart@1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} @@ -4717,10 +4392,6 @@ packages: resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} engines: {node: '>=8'} - strip-json-comments@2.0.1: - resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} - engines: {node: '>=0.10.0'} - strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} @@ -4784,10 +4455,6 @@ packages: tiny-case@1.0.3: resolution: {integrity: sha512-Eet/eeMhkO6TX8mnUteS9zgPbUMQa4I6Kkp5ORiBD5476/m+PIRiumP5tmh5ioJpH7k51Kehawy2UDfsnxxY8Q==} - tmp@0.0.33: - resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} - engines: {node: '>=0.6.0'} - tmpl@1.0.5: resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} @@ -4802,8 +4469,8 @@ packages: toposort@2.0.2: resolution: {integrity: sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg==} - tough-cookie@4.1.3: - resolution: {integrity: sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==} + tough-cookie@4.1.4: + resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==} engines: {node: '>=6'} tr46@1.0.1: @@ -4894,12 +4561,8 @@ packages: resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} engines: {node: '>=12.20'} - type-fest@3.13.1: - resolution: {integrity: sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==} - engines: {node: '>=14.16'} - - type-fest@4.18.0: - resolution: {integrity: sha512-+dbmiyliDY/2TTcjCS7NpI9yV2iEFlUDk5TKnsbkN7ZoRu5s7bT+zvYtNFhFXC2oLwURGT2frACAZvbbyNBI+w==} + type-fest@4.18.1: + resolution: {integrity: sha512-qXhgeNsX15bM63h5aapNFcQid9jRF/l3ojDoDFmekDQEUufZ9U4ErVt6SjDxnHp48Ltrw616R8yNc3giJ3KvVQ==} engines: {node: '>=16'} typed-array-buffer@1.0.2: @@ -4914,15 +4577,12 @@ packages: resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} engines: {node: '>= 0.4'} - typed-array-length@1.0.5: - resolution: {integrity: sha512-yMi0PlwuznKHxKmcpoOdeLwxBoVPkqZxd7q2FgMkmD3bNwvF5VW0+UlUQ1k1vmktTu4Yu13Q0RIxEP8+B+wloA==} + typed-array-length@1.0.6: + resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} engines: {node: '>= 0.4'} - typedarray-to-buffer@3.1.5: - resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} - - typescript@5.4.2: - resolution: {integrity: sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==} + typescript@5.4.5: + resolution: {integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==} engines: {node: '>=14.17'} hasBin: true @@ -4972,8 +4632,8 @@ packages: resolution: {integrity: sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==} engines: {node: '>=4'} - update-browserslist-db@1.0.13: - resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} + update-browserslist-db@1.0.14: + resolution: {integrity: sha512-JixKH8GR2pWYshIPUg/NujK3JO7JiqEEUiNArE86NQyrgUuZeTlZQN3xuS/yiV5Kb48ev9K6RqNkaJjXsdg7Jw==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' @@ -4984,8 +4644,8 @@ packages: url-parse@1.5.10: resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} - use-sync-external-store@1.2.0: - resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} + use-sync-external-store@1.2.2: + resolution: {integrity: sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -4999,20 +4659,20 @@ packages: resolution: {integrity: sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==} engines: {node: '>=10.12.0'} - vite-plugin-pwa@0.19.5: - resolution: {integrity: sha512-3xJEc2Gmq6SBf730UAV1N2/MqOm+MiyvaLToSTglg+pH9b9qm666yPVxrBBlcOhGoJJWjJpu+Z9tROKek2CODg==} + vite-plugin-pwa@0.20.0: + resolution: {integrity: sha512-/kDZyqF8KqoXRpMUQtR5Atri/7BWayW8Gp7Kz/4bfstsV6zSFTxjREbXZYL7zSuRL40HGA+o2hvUAFRmC+bL7g==} engines: {node: '>=16.0.0'} peerDependencies: '@vite-pwa/assets-generator': ^0.2.4 vite: ^3.1.0 || ^4.0.0 || ^5.0.0 - workbox-build: ^7.0.0 - workbox-window: ^7.0.0 + workbox-build: ^7.1.0 + workbox-window: ^7.1.0 peerDependenciesMeta: '@vite-pwa/assets-generator': optional: true - vite@5.2.6: - resolution: {integrity: sha512-FPtnxFlSIKYjZ2eosBQamz4CbyrTizbZ3hnGJlh/wMtCrlp1Hah6AzBLjGI5I2urTfNnpovpHdrL6YRuBOPnCA==} + vite@5.2.11: + resolution: {integrity: sha512-HndV31LWW05i1BLPMUCE1B9E9GFbOu1MbenhS58FuK6owSO5qHm7GiCotrNY1YE5rMeQSFBGmT5ZaLEjFizgiQ==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: @@ -5104,18 +4764,18 @@ packages: engines: {node: ^16.13.0 || >=18.0.0} hasBin: true - widest-line@3.1.0: - resolution: {integrity: sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==} - engines: {node: '>=8'} - winston-transport@4.7.0: resolution: {integrity: sha512-ajBj65K5I7denzer2IYW6+2bNIVqLGDHqDw3Ow8Ohh+vdW+rv4MZ6eiDvHoKhfJFZ2auyN8byXieDDJ96ViONg==} engines: {node: '>= 12.0.0'} - winston@3.12.0: - resolution: {integrity: sha512-OwbxKaOlESDi01mC9rkM0dQqQt2I8DAUMRLZ/HpbwvDXm85IryEHgoogy5fziQy38PntgZsLlhAYHz//UPHZ5w==} + winston@3.13.0: + resolution: {integrity: sha512-rwidmA1w3SE4j0E5MuIufFhyJPBDG7Nu71RkZor1p2+qHvJSZ9GYDA81AyleQcZbh/+V6HjeBdfnTZJm9rSeQQ==} engines: {node: '>= 12.0.0'} + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + workbox-background-sync@7.1.0: resolution: {integrity: sha512-rMbgrzueVWDFcEq1610YyDW71z0oAXLfdRHRQcKw4SGihkfOK0JUEvqWHFwA6rJ+6TClnMIn7KQI5PNN1XQXwQ==} @@ -5184,15 +4844,12 @@ packages: wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - write-file-atomic@3.0.3: - resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} - write-file-atomic@4.0.2: resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - ws@8.16.0: - resolution: {integrity: sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==} + ws@8.17.0: + resolution: {integrity: sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -5203,10 +4860,6 @@ packages: utf-8-validate: optional: true - xdg-basedir@4.0.0: - resolution: {integrity: sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==} - engines: {node: '>=8'} - xml-name-validator@4.0.0: resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} engines: {node: '>=12'} @@ -5260,8 +4913,6 @@ packages: snapshots: - '@aashutoshrathi/word-wrap@1.2.6': {} - '@adobe/css-tools@4.3.3': {} '@ampproject/remapping@2.3.0': @@ -5278,33 +4929,11 @@ snapshots: '@babel/code-frame@7.24.2': dependencies: - '@babel/highlight': 7.24.2 + '@babel/highlight': 7.24.5 picocolors: 1.0.0 - '@babel/compat-data@7.24.1': {} - '@babel/compat-data@7.24.4': {} - '@babel/core@7.24.3': - dependencies: - '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.24.2 - '@babel/generator': 7.24.1 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.3) - '@babel/helpers': 7.24.1 - '@babel/parser': 7.24.1 - '@babel/template': 7.24.0 - '@babel/traverse': 7.24.1 - '@babel/types': 7.24.0 - convert-source-map: 2.0.0 - debug: 4.3.4 - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - '@babel/core@7.24.5': dependencies: '@ampproject/remapping': 2.3.0 @@ -5325,13 +4954,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/generator@7.24.1': - dependencies: - '@babel/types': 7.24.0 - '@jridgewell/gen-mapping': 0.3.5 - '@jridgewell/trace-mapping': 0.3.25 - jsesc: 2.5.2 - '@babel/generator@7.24.5': dependencies: '@babel/types': 7.24.5 @@ -5349,7 +4971,7 @@ snapshots: '@babel/helper-compilation-targets@7.23.6': dependencies: - '@babel/compat-data': 7.24.1 + '@babel/compat-data': 7.24.4 '@babel/helper-validator-option': 7.23.5 browserslist: 4.23.0 lru-cache: 5.1.1 @@ -5391,11 +5013,11 @@ snapshots: '@babel/helper-function-name@7.23.0': dependencies: '@babel/template': 7.24.0 - '@babel/types': 7.24.0 + '@babel/types': 7.24.5 '@babel/helper-hoist-variables@7.22.5': dependencies: - '@babel/types': 7.24.0 + '@babel/types': 7.24.5 '@babel/helper-member-expression-to-functions@7.24.5': dependencies: @@ -5405,15 +5027,6 @@ snapshots: dependencies: '@babel/types': 7.24.5 - '@babel/helper-module-transforms@7.23.3(@babel/core@7.24.3)': - dependencies: - '@babel/core': 7.24.3 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-module-imports': 7.24.3 - '@babel/helper-simple-access': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/helper-validator-identifier': 7.22.20 - '@babel/helper-module-transforms@7.24.5(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 @@ -5427,8 +5040,6 @@ snapshots: dependencies: '@babel/types': 7.24.5 - '@babel/helper-plugin-utils@7.24.0': {} - '@babel/helper-plugin-utils@7.24.5': {} '@babel/helper-remap-async-to-generator@7.22.20(@babel/core@7.24.5)': @@ -5445,10 +5056,6 @@ snapshots: '@babel/helper-member-expression-to-functions': 7.24.5 '@babel/helper-optimise-call-expression': 7.22.5 - '@babel/helper-simple-access@7.22.5': - dependencies: - '@babel/types': 7.24.0 - '@babel/helper-simple-access@7.24.5': dependencies: '@babel/types': 7.24.5 @@ -5457,18 +5064,12 @@ snapshots: dependencies: '@babel/types': 7.24.5 - '@babel/helper-split-export-declaration@7.22.6': - dependencies: - '@babel/types': 7.24.0 - '@babel/helper-split-export-declaration@7.24.5': dependencies: '@babel/types': 7.24.5 '@babel/helper-string-parser@7.24.1': {} - '@babel/helper-validator-identifier@7.22.20': {} - '@babel/helper-validator-identifier@7.24.5': {} '@babel/helper-validator-option@7.23.5': {} @@ -5479,14 +5080,6 @@ snapshots: '@babel/template': 7.24.0 '@babel/types': 7.24.5 - '@babel/helpers@7.24.1': - dependencies: - '@babel/template': 7.24.0 - '@babel/traverse': 7.24.1 - '@babel/types': 7.24.0 - transitivePeerDependencies: - - supports-color - '@babel/helpers@7.24.5': dependencies: '@babel/template': 7.24.0 @@ -5495,17 +5088,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/highlight@7.24.2': + '@babel/highlight@7.24.5': dependencies: - '@babel/helper-validator-identifier': 7.22.20 + '@babel/helper-validator-identifier': 7.24.5 chalk: 2.4.2 js-tokens: 4.0.0 picocolors: 1.0.0 - '@babel/parser@7.24.1': - dependencies: - '@babel/types': 7.24.0 - '@babel/parser@7.24.5': dependencies: '@babel/types': 7.24.5 @@ -5538,30 +5127,20 @@ snapshots: dependencies: '@babel/core': 7.24.5 - '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.24.3)': - dependencies: - '@babel/core': 7.24.3 - '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.0 - - '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.24.3)': - dependencies: - '@babel/core': 7.24.3 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.24.3)': + '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.24.5)': dependencies: - '@babel/core': 7.24.3 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.24.5 + '@babel/helper-plugin-utils': 7.24.5 '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.5 '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.24.5)': dependencies: @@ -5588,110 +5167,65 @@ snapshots: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.24.3)': - dependencies: - '@babel/core': 7.24.3 - '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.0 - - '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.24.3)': - dependencies: - '@babel/core': 7.24.3 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.5 '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.0 - - '@babel/plugin-syntax-jsx@7.24.1(@babel/core@7.24.3)': - dependencies: - '@babel/core': 7.24.3 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.24.3)': + '@babel/plugin-syntax-jsx@7.24.1(@babel/core@7.24.5)': dependencies: - '@babel/core': 7.24.3 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.24.5 + '@babel/helper-plugin-utils': 7.24.5 '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.0 - - '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.24.3)': - dependencies: - '@babel/core': 7.24.3 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.5 '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.0 - - '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.24.3)': - dependencies: - '@babel/core': 7.24.3 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.5 '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.0 - - '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.24.3)': - dependencies: - '@babel/core': 7.24.3 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.5 '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.0 - - '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.24.3)': - dependencies: - '@babel/core': 7.24.3 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.5 '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.24.3)': - dependencies: - '@babel/core': 7.24.3 - '@babel/helper-plugin-utils': 7.24.0 - - '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.24.5)': + '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.5 '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.24.3)': - dependencies: - '@babel/core': 7.24.3 - '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.24.5)': dependencies: '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-typescript@7.24.1(@babel/core@7.24.3)': + '@babel/plugin-syntax-typescript@7.24.1(@babel/core@7.24.5)': dependencies: - '@babel/core': 7.24.3 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.24.5 + '@babel/helper-plugin-utils': 7.24.5 '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.24.5)': dependencies: @@ -6086,10 +5620,6 @@ snapshots: '@babel/regjsgen@0.8.0': {} - '@babel/runtime@7.24.1': - dependencies: - regenerator-runtime: 0.14.1 - '@babel/runtime@7.24.5': dependencies: regenerator-runtime: 0.14.1 @@ -6097,23 +5627,8 @@ snapshots: '@babel/template@7.24.0': dependencies: '@babel/code-frame': 7.24.2 - '@babel/parser': 7.24.1 - '@babel/types': 7.24.0 - - '@babel/traverse@7.24.1': - dependencies: - '@babel/code-frame': 7.24.2 - '@babel/generator': 7.24.1 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/parser': 7.24.1 - '@babel/types': 7.24.0 - debug: 4.3.4 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color + '@babel/parser': 7.24.5 + '@babel/types': 7.24.5 '@babel/traverse@7.24.5': dependencies: @@ -6130,12 +5645,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/types@7.24.0': - dependencies: - '@babel/helper-string-parser': 7.24.1 - '@babel/helper-validator-identifier': 7.22.20 - to-fast-properties: 2.0.0 - '@babel/types@7.24.5': dependencies: '@babel/helper-string-parser': 7.24.1 @@ -6164,39 +5673,27 @@ snapshots: enabled: 2.0.0 kuler: 2.0.0 - '@dotenvx/dotenvx@0.27.0': + '@dotenvx/dotenvx@0.37.1': dependencies: - '@inquirer/prompts': 3.3.2 + '@inquirer/confirm': 2.0.17 arch: 2.2.0 - boxen: 5.1.2 chalk: 4.1.2 commander: 11.1.0 conf: 10.2.0 - configstore: 5.0.1 + diff: 5.2.0 dotenv: 16.4.5 dotenv-expand: 11.0.6 execa: 5.1.1 - glob: 10.3.10 - got: 11.8.6 - has-yarn: 2.1.0 + glob: 10.3.12 ignore: 5.3.1 - import-lazy: 2.1.0 - is-ci: 2.0.0 - is-installed-globally: 0.4.0 - is-npm: 5.0.0 is-wsl: 2.2.0 - is-yarn-global: 0.3.0 object-treeify: 1.1.33 open: 8.4.2 ora: 5.4.1 - package-json: 7.0.0 - pupa: 2.1.1 semver: 7.6.0 - semver-diff: 3.1.1 undici: 5.28.4 which: 4.0.0 - winston: 3.12.0 - xdg-basedir: 4.0.0 + winston: 3.13.0 xxhashjs: 0.2.2 '@emotion/babel-plugin@11.11.0': @@ -6229,27 +5726,19 @@ snapshots: '@emotion/memoize@0.8.1': {} - '@emotion/react@11.11.4(@types/react@18.2.67)(react@18.2.0)': + '@emotion/react@11.11.4(@types/react@18.3.1)(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.5 '@emotion/babel-plugin': 11.11.0 '@emotion/cache': 11.11.0 - '@emotion/serialize': 1.1.3 - '@emotion/use-insertion-effect-with-fallbacks': 1.0.1(react@18.2.0) + '@emotion/serialize': 1.1.4 + '@emotion/use-insertion-effect-with-fallbacks': 1.0.1(react@18.3.1) '@emotion/utils': 1.2.1 '@emotion/weak-memoize': 0.3.1 hoist-non-react-statics: 3.3.2 - react: 18.2.0 + react: 18.3.1 optionalDependencies: - '@types/react': 18.2.67 - - '@emotion/serialize@1.1.3': - dependencies: - '@emotion/hash': 0.9.1 - '@emotion/memoize': 0.8.1 - '@emotion/unitless': 0.8.1 - '@emotion/utils': 1.2.1 - csstype: 3.1.3 + '@types/react': 18.3.1 '@emotion/serialize@1.1.4': dependencies: @@ -6261,24 +5750,24 @@ snapshots: '@emotion/sheet@1.2.2': {} - '@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.67)(react@18.2.0))(@types/react@18.2.67)(react@18.2.0)': + '@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.1)(react@18.3.1))(@types/react@18.3.1)(react@18.3.1)': dependencies: '@babel/runtime': 7.24.5 '@emotion/babel-plugin': 11.11.0 '@emotion/is-prop-valid': 1.2.2 - '@emotion/react': 11.11.4(@types/react@18.2.67)(react@18.2.0) + '@emotion/react': 11.11.4(@types/react@18.3.1)(react@18.3.1) '@emotion/serialize': 1.1.4 - '@emotion/use-insertion-effect-with-fallbacks': 1.0.1(react@18.2.0) + '@emotion/use-insertion-effect-with-fallbacks': 1.0.1(react@18.3.1) '@emotion/utils': 1.2.1 - react: 18.2.0 + react: 18.3.1 optionalDependencies: - '@types/react': 18.2.67 + '@types/react': 18.3.1 '@emotion/unitless@0.8.1': {} - '@emotion/use-insertion-effect-with-fallbacks@1.0.1(react@18.2.0)': + '@emotion/use-insertion-effect-with-fallbacks@1.0.1(react@18.3.1)': dependencies: - react: 18.2.0 + react: 18.3.1 '@emotion/utils@1.2.1': {} @@ -6378,24 +5867,24 @@ snapshots: '@fastify/busboy@2.1.1': {} - '@floating-ui/core@1.6.0': + '@floating-ui/core@1.6.1': dependencies: - '@floating-ui/utils': 0.2.1 + '@floating-ui/utils': 0.2.2 - '@floating-ui/dom@1.6.3': + '@floating-ui/dom@1.6.4': dependencies: - '@floating-ui/core': 1.6.0 - '@floating-ui/utils': 0.2.1 + '@floating-ui/core': 1.6.1 + '@floating-ui/utils': 0.2.2 - '@floating-ui/react-dom@2.0.8(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@floating-ui/react-dom@2.0.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@floating-ui/dom': 1.6.3 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + '@floating-ui/dom': 1.6.4 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) - '@floating-ui/utils@0.2.1': {} + '@floating-ui/utils@0.2.2': {} - '@fontsource/roboto@5.0.12': {} + '@fontsource/roboto@5.0.13': {} '@hapi/hoek@9.3.0': {} @@ -6403,13 +5892,13 @@ snapshots: dependencies: '@hapi/hoek': 9.3.0 - '@hookform/resolvers@3.3.4(react-hook-form@7.51.3(react@18.2.0))': + '@hookform/resolvers@3.3.4(react-hook-form@7.51.3(react@18.3.1))': dependencies: - react-hook-form: 7.51.3(react@18.2.0) + react-hook-form: 7.51.3(react@18.3.1) '@humanwhocodes/config-array@0.11.14': dependencies: - '@humanwhocodes/object-schema': 2.0.2 + '@humanwhocodes/object-schema': 2.0.3 debug: 4.3.4 minimatch: 3.1.2 transitivePeerDependencies: @@ -6417,20 +5906,12 @@ snapshots: '@humanwhocodes/module-importer@1.0.1': {} - '@humanwhocodes/object-schema@2.0.2': {} - - '@inquirer/checkbox@1.5.2': - dependencies: - '@inquirer/core': 6.0.0 - '@inquirer/type': 1.2.1 - ansi-escapes: 4.3.2 - chalk: 4.1.2 - figures: 3.2.0 + '@humanwhocodes/object-schema@2.0.3': {} '@inquirer/confirm@2.0.17': dependencies: '@inquirer/core': 6.0.0 - '@inquirer/type': 1.2.1 + '@inquirer/type': 1.3.1 chalk: 4.1.2 '@inquirer/confirm@3.1.6': @@ -6440,9 +5921,9 @@ snapshots: '@inquirer/core@6.0.0': dependencies: - '@inquirer/type': 1.2.1 + '@inquirer/type': 1.3.1 '@types/mute-stream': 0.0.4 - '@types/node': 20.11.30 + '@types/node': 20.12.8 '@types/wrap-ansi': 3.0.0 ansi-escapes: 4.3.2 chalk: 4.1.2 @@ -6460,7 +5941,7 @@ snapshots: '@inquirer/figures': 1.0.1 '@inquirer/type': 1.3.1 '@types/mute-stream': 0.0.4 - '@types/node': 20.12.7 + '@types/node': 20.12.8 '@types/wrap-ansi': 3.0.0 ansi-escapes: 4.3.2 chalk: 4.1.2 @@ -6471,63 +5952,8 @@ snapshots: strip-ansi: 6.0.1 wrap-ansi: 6.2.0 - '@inquirer/editor@1.2.15': - dependencies: - '@inquirer/core': 6.0.0 - '@inquirer/type': 1.2.1 - chalk: 4.1.2 - external-editor: 3.1.0 - - '@inquirer/expand@1.1.16': - dependencies: - '@inquirer/core': 6.0.0 - '@inquirer/type': 1.2.1 - chalk: 4.1.2 - figures: 3.2.0 - '@inquirer/figures@1.0.1': {} - '@inquirer/input@1.2.16': - dependencies: - '@inquirer/core': 6.0.0 - '@inquirer/type': 1.2.1 - chalk: 4.1.2 - - '@inquirer/password@1.1.16': - dependencies: - '@inquirer/core': 6.0.0 - '@inquirer/type': 1.2.1 - ansi-escapes: 4.3.2 - chalk: 4.1.2 - - '@inquirer/prompts@3.3.2': - dependencies: - '@inquirer/checkbox': 1.5.2 - '@inquirer/confirm': 2.0.17 - '@inquirer/core': 6.0.0 - '@inquirer/editor': 1.2.15 - '@inquirer/expand': 1.1.16 - '@inquirer/input': 1.2.16 - '@inquirer/password': 1.1.16 - '@inquirer/rawlist': 1.2.16 - '@inquirer/select': 1.3.3 - - '@inquirer/rawlist@1.2.16': - dependencies: - '@inquirer/core': 6.0.0 - '@inquirer/type': 1.2.1 - chalk: 4.1.2 - - '@inquirer/select@1.3.3': - dependencies: - '@inquirer/core': 6.0.0 - '@inquirer/type': 1.2.1 - ansi-escapes: 4.3.2 - chalk: 4.1.2 - figures: 3.2.0 - - '@inquirer/type@1.2.1': {} - '@inquirer/type@1.3.1': {} '@isaacs/cliui@8.0.2': @@ -6552,27 +5978,27 @@ snapshots: '@jest/console@29.7.0': dependencies: '@jest/types': 29.6.3 - '@types/node': 20.11.30 + '@types/node': 20.12.8 chalk: 4.1.2 jest-message-util: 29.7.0 jest-util: 29.7.0 slash: 3.0.0 - '@jest/core@29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.4.8)(@types/node@20.11.30)(typescript@5.4.2))': + '@jest/core@29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.4.17)(@types/node@20.12.8)(typescript@5.4.5))': dependencies: '@jest/console': 29.7.0 '@jest/reporters': 29.7.0 '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.11.30 + '@types/node': 20.12.8 ansi-escapes: 4.3.2 chalk: 4.1.2 ci-info: 3.9.0 exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@20.11.30)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.4.8)(@types/node@20.11.30)(typescript@5.4.2)) + jest-config: 29.7.0(@types/node@20.12.8)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.4.17)(@types/node@20.12.8)(typescript@5.4.5)) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -6597,7 +6023,7 @@ snapshots: dependencies: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.11.30 + '@types/node': 20.12.8 jest-mock: 29.7.0 '@jest/expect-utils@29.7.0': @@ -6615,7 +6041,7 @@ snapshots: dependencies: '@jest/types': 29.6.3 '@sinonjs/fake-timers': 10.3.0 - '@types/node': 20.11.30 + '@types/node': 20.12.8 jest-message-util: 29.7.0 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -6637,7 +6063,7 @@ snapshots: '@jest/transform': 29.7.0 '@jest/types': 29.6.3 '@jridgewell/trace-mapping': 0.3.25 - '@types/node': 20.11.30 + '@types/node': 20.12.8 chalk: 4.1.2 collect-v8-coverage: 1.0.2 exit: 0.1.2 @@ -6684,7 +6110,7 @@ snapshots: '@jest/transform@29.7.0': dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.5 '@jest/types': 29.6.3 '@jridgewell/trace-mapping': 0.3.25 babel-plugin-istanbul: 6.1.1 @@ -6707,7 +6133,7 @@ snapshots: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 20.11.30 + '@types/node': 20.12.8 '@types/yargs': 17.0.32 chalk: 4.1.2 @@ -6749,118 +6175,118 @@ snapshots: outvariant: 1.4.2 strict-event-emitter: 0.5.1 - '@mui/base@5.0.0-beta.40(@types/react@18.2.67)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@mui/base@5.0.0-beta.40(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.1 - '@floating-ui/react-dom': 2.0.8(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@mui/types': 7.2.14(@types/react@18.2.67) - '@mui/utils': 5.15.14(@types/react@18.2.67)(react@18.2.0) + '@babel/runtime': 7.24.5 + '@floating-ui/react-dom': 2.0.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@mui/types': 7.2.14(@types/react@18.3.1) + '@mui/utils': 5.15.14(@types/react@18.3.1)(react@18.3.1) '@popperjs/core': 2.11.8 - clsx: 2.1.0 + clsx: 2.1.1 prop-types: 15.8.1 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.2.67 + '@types/react': 18.3.1 - '@mui/core-downloads-tracker@5.15.14': {} + '@mui/core-downloads-tracker@5.15.16': {} - '@mui/icons-material@5.15.14(@mui/material@5.15.14(@emotion/react@11.11.4(@types/react@18.2.67)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.67)(react@18.2.0))(@types/react@18.2.67)(react@18.2.0))(@types/react@18.2.67)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@types/react@18.2.67)(react@18.2.0)': + '@mui/icons-material@5.15.16(@mui/material@5.15.16(@emotion/react@11.11.4(@types/react@18.3.1)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.1)(react@18.3.1))(@types/react@18.3.1)(react@18.3.1))(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.1)(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.1 - '@mui/material': 5.15.14(@emotion/react@11.11.4(@types/react@18.2.67)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.67)(react@18.2.0))(@types/react@18.2.67)(react@18.2.0))(@types/react@18.2.67)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - react: 18.2.0 + '@babel/runtime': 7.24.5 + '@mui/material': 5.15.16(@emotion/react@11.11.4(@types/react@18.3.1)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.1)(react@18.3.1))(@types/react@18.3.1)(react@18.3.1))(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 optionalDependencies: - '@types/react': 18.2.67 + '@types/react': 18.3.1 - '@mui/material@5.15.14(@emotion/react@11.11.4(@types/react@18.2.67)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.67)(react@18.2.0))(@types/react@18.2.67)(react@18.2.0))(@types/react@18.2.67)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@mui/material@5.15.16(@emotion/react@11.11.4(@types/react@18.3.1)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.1)(react@18.3.1))(@types/react@18.3.1)(react@18.3.1))(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.1 - '@mui/base': 5.0.0-beta.40(@types/react@18.2.67)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@mui/core-downloads-tracker': 5.15.14 - '@mui/system': 5.15.14(@emotion/react@11.11.4(@types/react@18.2.67)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.67)(react@18.2.0))(@types/react@18.2.67)(react@18.2.0))(@types/react@18.2.67)(react@18.2.0) - '@mui/types': 7.2.14(@types/react@18.2.67) - '@mui/utils': 5.15.14(@types/react@18.2.67)(react@18.2.0) + '@babel/runtime': 7.24.5 + '@mui/base': 5.0.0-beta.40(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@mui/core-downloads-tracker': 5.15.16 + '@mui/system': 5.15.15(@emotion/react@11.11.4(@types/react@18.3.1)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.1)(react@18.3.1))(@types/react@18.3.1)(react@18.3.1))(@types/react@18.3.1)(react@18.3.1) + '@mui/types': 7.2.14(@types/react@18.3.1) + '@mui/utils': 5.15.14(@types/react@18.3.1)(react@18.3.1) '@types/react-transition-group': 4.4.10 - clsx: 2.1.0 + clsx: 2.1.1 csstype: 3.1.3 prop-types: 15.8.1 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - react-is: 18.2.0 - react-transition-group: 4.4.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-is: 18.3.1 + react-transition-group: 4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) optionalDependencies: - '@emotion/react': 11.11.4(@types/react@18.2.67)(react@18.2.0) - '@emotion/styled': 11.11.5(@emotion/react@11.11.4(@types/react@18.2.67)(react@18.2.0))(@types/react@18.2.67)(react@18.2.0) - '@types/react': 18.2.67 + '@emotion/react': 11.11.4(@types/react@18.3.1)(react@18.3.1) + '@emotion/styled': 11.11.5(@emotion/react@11.11.4(@types/react@18.3.1)(react@18.3.1))(@types/react@18.3.1)(react@18.3.1) + '@types/react': 18.3.1 - '@mui/private-theming@5.15.14(@types/react@18.2.67)(react@18.2.0)': + '@mui/private-theming@5.15.14(@types/react@18.3.1)(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.1 - '@mui/utils': 5.15.14(@types/react@18.2.67)(react@18.2.0) + '@babel/runtime': 7.24.5 + '@mui/utils': 5.15.14(@types/react@18.3.1)(react@18.3.1) prop-types: 15.8.1 - react: 18.2.0 + react: 18.3.1 optionalDependencies: - '@types/react': 18.2.67 + '@types/react': 18.3.1 - '@mui/styled-engine@5.15.14(@emotion/react@11.11.4(@types/react@18.2.67)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.67)(react@18.2.0))(@types/react@18.2.67)(react@18.2.0))(react@18.2.0)': + '@mui/styled-engine@5.15.14(@emotion/react@11.11.4(@types/react@18.3.1)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.1)(react@18.3.1))(@types/react@18.3.1)(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.5 '@emotion/cache': 11.11.0 csstype: 3.1.3 prop-types: 15.8.1 - react: 18.2.0 + react: 18.3.1 optionalDependencies: - '@emotion/react': 11.11.4(@types/react@18.2.67)(react@18.2.0) - '@emotion/styled': 11.11.5(@emotion/react@11.11.4(@types/react@18.2.67)(react@18.2.0))(@types/react@18.2.67)(react@18.2.0) + '@emotion/react': 11.11.4(@types/react@18.3.1)(react@18.3.1) + '@emotion/styled': 11.11.5(@emotion/react@11.11.4(@types/react@18.3.1)(react@18.3.1))(@types/react@18.3.1)(react@18.3.1) - '@mui/system@5.15.14(@emotion/react@11.11.4(@types/react@18.2.67)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.67)(react@18.2.0))(@types/react@18.2.67)(react@18.2.0))(@types/react@18.2.67)(react@18.2.0)': + '@mui/system@5.15.15(@emotion/react@11.11.4(@types/react@18.3.1)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.1)(react@18.3.1))(@types/react@18.3.1)(react@18.3.1))(@types/react@18.3.1)(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.1 - '@mui/private-theming': 5.15.14(@types/react@18.2.67)(react@18.2.0) - '@mui/styled-engine': 5.15.14(@emotion/react@11.11.4(@types/react@18.2.67)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.67)(react@18.2.0))(@types/react@18.2.67)(react@18.2.0))(react@18.2.0) - '@mui/types': 7.2.14(@types/react@18.2.67) - '@mui/utils': 5.15.14(@types/react@18.2.67)(react@18.2.0) - clsx: 2.1.0 + '@babel/runtime': 7.24.5 + '@mui/private-theming': 5.15.14(@types/react@18.3.1)(react@18.3.1) + '@mui/styled-engine': 5.15.14(@emotion/react@11.11.4(@types/react@18.3.1)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.1)(react@18.3.1))(@types/react@18.3.1)(react@18.3.1))(react@18.3.1) + '@mui/types': 7.2.14(@types/react@18.3.1) + '@mui/utils': 5.15.14(@types/react@18.3.1)(react@18.3.1) + clsx: 2.1.1 csstype: 3.1.3 prop-types: 15.8.1 - react: 18.2.0 + react: 18.3.1 optionalDependencies: - '@emotion/react': 11.11.4(@types/react@18.2.67)(react@18.2.0) - '@emotion/styled': 11.11.5(@emotion/react@11.11.4(@types/react@18.2.67)(react@18.2.0))(@types/react@18.2.67)(react@18.2.0) - '@types/react': 18.2.67 + '@emotion/react': 11.11.4(@types/react@18.3.1)(react@18.3.1) + '@emotion/styled': 11.11.5(@emotion/react@11.11.4(@types/react@18.3.1)(react@18.3.1))(@types/react@18.3.1)(react@18.3.1) + '@types/react': 18.3.1 - '@mui/types@7.2.14(@types/react@18.2.67)': + '@mui/types@7.2.14(@types/react@18.3.1)': optionalDependencies: - '@types/react': 18.2.67 + '@types/react': 18.3.1 - '@mui/utils@5.15.14(@types/react@18.2.67)(react@18.2.0)': + '@mui/utils@5.15.14(@types/react@18.3.1)(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.1 - '@types/prop-types': 15.7.11 + '@babel/runtime': 7.24.5 + '@types/prop-types': 15.7.12 prop-types: 15.8.1 - react: 18.2.0 - react-is: 18.2.0 + react: 18.3.1 + react-is: 18.3.1 optionalDependencies: - '@types/react': 18.2.67 + '@types/react': 18.3.1 - '@mui/x-date-pickers@7.0.0(@emotion/react@11.11.4(@types/react@18.2.67)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.67)(react@18.2.0))(@types/react@18.2.67)(react@18.2.0))(@mui/material@5.15.14(@emotion/react@11.11.4(@types/react@18.2.67)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.67)(react@18.2.0))(@types/react@18.2.67)(react@18.2.0))(@types/react@18.2.67)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@types/react@18.2.67)(dayjs@1.11.10)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@mui/x-date-pickers@7.3.2(@emotion/react@11.11.4(@types/react@18.3.1)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.1)(react@18.3.1))(@types/react@18.3.1)(react@18.3.1))(@mui/material@5.15.16(@emotion/react@11.11.4(@types/react@18.3.1)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.1)(react@18.3.1))(@types/react@18.3.1)(react@18.3.1))(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.1)(dayjs@1.11.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.1 - '@mui/base': 5.0.0-beta.40(@types/react@18.2.67)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@mui/material': 5.15.14(@emotion/react@11.11.4(@types/react@18.2.67)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.67)(react@18.2.0))(@types/react@18.2.67)(react@18.2.0))(@types/react@18.2.67)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@mui/system': 5.15.14(@emotion/react@11.11.4(@types/react@18.2.67)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.67)(react@18.2.0))(@types/react@18.2.67)(react@18.2.0))(@types/react@18.2.67)(react@18.2.0) - '@mui/utils': 5.15.14(@types/react@18.2.67)(react@18.2.0) + '@babel/runtime': 7.24.5 + '@mui/base': 5.0.0-beta.40(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@mui/material': 5.15.16(@emotion/react@11.11.4(@types/react@18.3.1)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.1)(react@18.3.1))(@types/react@18.3.1)(react@18.3.1))(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@mui/system': 5.15.15(@emotion/react@11.11.4(@types/react@18.3.1)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.1)(react@18.3.1))(@types/react@18.3.1)(react@18.3.1))(@types/react@18.3.1)(react@18.3.1) + '@mui/utils': 5.15.14(@types/react@18.3.1)(react@18.3.1) '@types/react-transition-group': 4.4.10 - clsx: 2.1.0 + clsx: 2.1.1 prop-types: 15.8.1 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - react-transition-group: 4.4.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-transition-group: 4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) optionalDependencies: - '@emotion/react': 11.11.4(@types/react@18.2.67)(react@18.2.0) - '@emotion/styled': 11.11.5(@emotion/react@11.11.4(@types/react@18.2.67)(react@18.2.0))(@types/react@18.2.67)(react@18.2.0) - dayjs: 1.11.10 + '@emotion/react': 11.11.4(@types/react@18.3.1)(react@18.3.1) + '@emotion/styled': 11.11.5(@emotion/react@11.11.4(@types/react@18.3.1)(react@18.3.1))(@types/react@18.3.1)(react@18.3.1) + dayjs: 1.11.11 transitivePeerDependencies: - '@types/react' @@ -6890,23 +6316,23 @@ snapshots: '@pkgr/core@0.1.1': {} - '@playwright/test@1.42.1': + '@playwright/test@1.43.1': dependencies: - playwright: 1.42.1 + playwright: 1.43.1 '@popperjs/core@2.11.8': {} - '@reduxjs/toolkit@2.2.2(react-redux@9.1.0(@types/react@18.2.67)(react@18.2.0)(redux@5.0.1))(react@18.2.0)': + '@reduxjs/toolkit@2.2.3(react-redux@9.1.2(@types/react@18.3.1)(react@18.3.1)(redux@5.0.1))(react@18.3.1)': dependencies: - immer: 10.0.4 + immer: 10.1.1 redux: 5.0.1 redux-thunk: 3.1.0(redux@5.0.1) reselect: 5.1.0 optionalDependencies: - react: 18.2.0 - react-redux: 9.1.0(@types/react@18.2.67)(react@18.2.0)(redux@5.0.1) + react: 18.3.1 + react-redux: 9.1.2(@types/react@18.3.1)(react@18.3.1)(redux@5.0.1) - '@remix-run/router@1.15.3': {} + '@remix-run/router@1.16.0': {} '@rollup/plugin-babel@5.3.1(@babel/core@7.24.5)(@types/babel__core@7.20.5)(rollup@2.79.1)': dependencies: @@ -6957,49 +6383,52 @@ snapshots: optionalDependencies: rollup: 2.79.1 - '@rollup/rollup-android-arm-eabi@4.14.0': + '@rollup/rollup-android-arm-eabi@4.17.2': optional: true - '@rollup/rollup-android-arm64@4.14.0': + '@rollup/rollup-android-arm64@4.17.2': optional: true - '@rollup/rollup-darwin-arm64@4.14.0': + '@rollup/rollup-darwin-arm64@4.17.2': optional: true - '@rollup/rollup-darwin-x64@4.14.0': + '@rollup/rollup-darwin-x64@4.17.2': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.14.0': + '@rollup/rollup-linux-arm-gnueabihf@4.17.2': optional: true - '@rollup/rollup-linux-arm64-gnu@4.14.0': + '@rollup/rollup-linux-arm-musleabihf@4.17.2': optional: true - '@rollup/rollup-linux-arm64-musl@4.14.0': + '@rollup/rollup-linux-arm64-gnu@4.17.2': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.14.0': + '@rollup/rollup-linux-arm64-musl@4.17.2': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.14.0': + '@rollup/rollup-linux-powerpc64le-gnu@4.17.2': optional: true - '@rollup/rollup-linux-s390x-gnu@4.14.0': + '@rollup/rollup-linux-riscv64-gnu@4.17.2': optional: true - '@rollup/rollup-linux-x64-gnu@4.14.0': + '@rollup/rollup-linux-s390x-gnu@4.17.2': optional: true - '@rollup/rollup-linux-x64-musl@4.14.0': + '@rollup/rollup-linux-x64-gnu@4.17.2': optional: true - '@rollup/rollup-win32-arm64-msvc@4.14.0': + '@rollup/rollup-linux-x64-musl@4.17.2': optional: true - '@rollup/rollup-win32-ia32-msvc@4.14.0': + '@rollup/rollup-win32-arm64-msvc@4.17.2': optional: true - '@rollup/rollup-win32-x64-msvc@4.14.0': + '@rollup/rollup-win32-ia32-msvc@4.17.2': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.17.2': optional: true '@sideway/address@4.1.5': @@ -7012,8 +6441,6 @@ snapshots: '@sinclair/typebox@0.27.8': {} - '@sindresorhus/is@4.6.0': {} - '@sinonjs/commons@3.0.1': dependencies: type-detect: 4.0.8 @@ -7029,51 +6456,51 @@ snapshots: magic-string: 0.25.9 string.prototype.matchall: 4.0.11 - '@swc/core-darwin-arm64@1.4.8': + '@swc/core-darwin-arm64@1.4.17': optional: true - '@swc/core-darwin-x64@1.4.8': + '@swc/core-darwin-x64@1.4.17': optional: true - '@swc/core-linux-arm-gnueabihf@1.4.8': + '@swc/core-linux-arm-gnueabihf@1.4.17': optional: true - '@swc/core-linux-arm64-gnu@1.4.8': + '@swc/core-linux-arm64-gnu@1.4.17': optional: true - '@swc/core-linux-arm64-musl@1.4.8': + '@swc/core-linux-arm64-musl@1.4.17': optional: true - '@swc/core-linux-x64-gnu@1.4.8': + '@swc/core-linux-x64-gnu@1.4.17': optional: true - '@swc/core-linux-x64-musl@1.4.8': + '@swc/core-linux-x64-musl@1.4.17': optional: true - '@swc/core-win32-arm64-msvc@1.4.8': + '@swc/core-win32-arm64-msvc@1.4.17': optional: true - '@swc/core-win32-ia32-msvc@1.4.8': + '@swc/core-win32-ia32-msvc@1.4.17': optional: true - '@swc/core-win32-x64-msvc@1.4.8': + '@swc/core-win32-x64-msvc@1.4.17': optional: true - '@swc/core@1.4.8': + '@swc/core@1.4.17': dependencies: '@swc/counter': 0.1.3 '@swc/types': 0.1.6 optionalDependencies: - '@swc/core-darwin-arm64': 1.4.8 - '@swc/core-darwin-x64': 1.4.8 - '@swc/core-linux-arm-gnueabihf': 1.4.8 - '@swc/core-linux-arm64-gnu': 1.4.8 - '@swc/core-linux-arm64-musl': 1.4.8 - '@swc/core-linux-x64-gnu': 1.4.8 - '@swc/core-linux-x64-musl': 1.4.8 - '@swc/core-win32-arm64-msvc': 1.4.8 - '@swc/core-win32-ia32-msvc': 1.4.8 - '@swc/core-win32-x64-msvc': 1.4.8 + '@swc/core-darwin-arm64': 1.4.17 + '@swc/core-darwin-x64': 1.4.17 + '@swc/core-linux-arm-gnueabihf': 1.4.17 + '@swc/core-linux-arm64-gnu': 1.4.17 + '@swc/core-linux-arm64-musl': 1.4.17 + '@swc/core-linux-x64-gnu': 1.4.17 + '@swc/core-linux-x64-musl': 1.4.17 + '@swc/core-win32-arm64-msvc': 1.4.17 + '@swc/core-win32-ia32-msvc': 1.4.17 + '@swc/core-win32-x64-msvc': 1.4.17 '@swc/counter@0.1.3': {} @@ -7081,10 +6508,6 @@ snapshots: dependencies: '@swc/counter': 0.1.3 - '@szmarczak/http-timer@4.0.6': - dependencies: - defer-to-connect: 2.0.1 - '@testing-library/dom@10.1.0': dependencies: '@babel/code-frame': 7.24.2 @@ -7096,21 +6519,10 @@ snapshots: lz-string: 1.5.0 pretty-format: 27.5.1 - '@testing-library/dom@9.3.4': - dependencies: - '@babel/code-frame': 7.24.2 - '@babel/runtime': 7.24.1 - '@types/aria-query': 5.0.4 - aria-query: 5.1.3 - chalk: 4.1.2 - dom-accessibility-api: 0.5.16 - lz-string: 1.5.0 - pretty-format: 27.5.1 - - '@testing-library/jest-dom@6.4.2(@jest/globals@29.7.0)(@types/jest@29.5.12)(jest@29.7.0(@types/node@20.11.30)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.4.8)(@types/node@20.11.30)(typescript@5.4.2)))': + '@testing-library/jest-dom@6.4.3(@jest/globals@29.7.0)(@types/jest@29.5.12)(jest@29.7.0(@types/node@20.12.8)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.4.17)(@types/node@20.12.8)(typescript@5.4.5)))': dependencies: '@adobe/css-tools': 4.3.3 - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.5 aria-query: 5.3.0 chalk: 3.0.0 css.escape: 1.5.1 @@ -7120,15 +6532,17 @@ snapshots: optionalDependencies: '@jest/globals': 29.7.0 '@types/jest': 29.5.12 - jest: 29.7.0(@types/node@20.11.30)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.4.8)(@types/node@20.11.30)(typescript@5.4.2)) + jest: 29.7.0(@types/node@20.12.8)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.4.17)(@types/node@20.12.8)(typescript@5.4.5)) - '@testing-library/react@14.2.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@testing-library/react@15.0.6(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.1 - '@testing-library/dom': 9.3.4 - '@types/react-dom': 18.2.22 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + '@babel/runtime': 7.24.5 + '@testing-library/dom': 10.1.0 + '@types/react-dom': 18.3.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.1 '@testing-library/user-event@14.5.2(@testing-library/dom@10.1.0)': dependencies: @@ -7136,7 +6550,7 @@ snapshots: '@tootallnate/once@2.0.0': {} - '@tsconfig/node10@1.0.9': {} + '@tsconfig/node10@1.0.11': {} '@tsconfig/node12@1.0.11': {} @@ -7148,31 +6562,24 @@ snapshots: '@types/babel__core@7.20.5': dependencies: - '@babel/parser': 7.24.1 - '@babel/types': 7.24.0 + '@babel/parser': 7.24.5 + '@babel/types': 7.24.5 '@types/babel__generator': 7.6.8 '@types/babel__template': 7.4.4 '@types/babel__traverse': 7.20.5 '@types/babel__generator@7.6.8': dependencies: - '@babel/types': 7.24.0 + '@babel/types': 7.24.5 '@types/babel__template@7.4.4': dependencies: - '@babel/parser': 7.24.1 - '@babel/types': 7.24.0 + '@babel/parser': 7.24.5 + '@babel/types': 7.24.5 '@types/babel__traverse@7.20.5': dependencies: - '@babel/types': 7.24.0 - - '@types/cacheable-request@6.0.3': - dependencies: - '@types/http-cache-semantics': 4.0.4 - '@types/keyv': 3.1.4 - '@types/node': 20.11.30 - '@types/responselike': 1.0.3 + '@babel/types': 7.24.5 '@types/cookie@0.6.0': {} @@ -7182,15 +6589,13 @@ snapshots: '@types/graceful-fs@4.1.9': dependencies: - '@types/node': 20.11.30 + '@types/node': 20.12.8 '@types/hoist-non-react-statics@3.3.5': dependencies: - '@types/react': 18.2.67 + '@types/react': 18.3.1 hoist-non-react-statics: 3.3.2 - '@types/http-cache-semantics@4.0.4': {} - '@types/istanbul-lib-coverage@2.0.6': {} '@types/istanbul-lib-report@3.0.3': @@ -7208,7 +6613,7 @@ snapshots: '@types/jsdom@20.0.1': dependencies: - '@types/node': 20.11.30 + '@types/node': 20.12.8 '@types/tough-cookie': 4.0.5 parse5: 7.1.2 @@ -7216,10 +6621,6 @@ snapshots: '@types/json5@0.0.29': {} - '@types/keyv@3.1.4': - dependencies: - '@types/node': 20.11.30 - '@types/lodash.camelcase@4.3.9': dependencies: '@types/lodash': 4.17.0 @@ -7228,54 +6629,43 @@ snapshots: '@types/mute-stream@0.0.4': dependencies: - '@types/node': 20.12.7 + '@types/node': 20.12.8 '@types/node-fetch@2.6.11': dependencies: - '@types/node': 20.11.30 + '@types/node': 20.12.8 form-data: 4.0.0 - '@types/node@20.11.30': - dependencies: - undici-types: 5.26.5 - - '@types/node@20.12.7': + '@types/node@20.12.8': dependencies: undici-types: 5.26.5 '@types/parse-json@4.0.2': {} - '@types/prop-types@15.7.11': {} + '@types/prop-types@15.7.12': {} - '@types/react-dom@18.2.22': + '@types/react-dom@18.3.0': dependencies: - '@types/react': 18.2.67 + '@types/react': 18.3.1 '@types/react-redux@7.1.33': dependencies: '@types/hoist-non-react-statics': 3.3.5 - '@types/react': 18.2.67 + '@types/react': 18.3.1 hoist-non-react-statics: 3.3.2 redux: 4.2.1 '@types/react-transition-group@4.4.10': dependencies: - '@types/react': 18.2.67 + '@types/react': 18.3.1 - '@types/react@18.2.67': + '@types/react@18.3.1': dependencies: - '@types/prop-types': 15.7.11 - '@types/scheduler': 0.16.8 + '@types/prop-types': 15.7.12 csstype: 3.1.3 '@types/resolve@1.20.2': {} - '@types/responselike@1.0.3': - dependencies: - '@types/node': 20.11.30 - - '@types/scheduler@0.16.8': {} - '@types/semver@7.5.8': {} '@types/stack-utils@2.0.3': {} @@ -7298,98 +6688,98 @@ snapshots: dependencies: '@types/yargs-parser': 21.0.3 - '@typescript-eslint/eslint-plugin@7.4.0(@typescript-eslint/parser@7.4.0(eslint@8.57.0)(typescript@5.4.2))(eslint@8.57.0)(typescript@5.4.2)': + '@typescript-eslint/eslint-plugin@7.8.0(@typescript-eslint/parser@7.8.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5)': dependencies: '@eslint-community/regexpp': 4.10.0 - '@typescript-eslint/parser': 7.4.0(eslint@8.57.0)(typescript@5.4.2) - '@typescript-eslint/scope-manager': 7.4.0 - '@typescript-eslint/type-utils': 7.4.0(eslint@8.57.0)(typescript@5.4.2) - '@typescript-eslint/utils': 7.4.0(eslint@8.57.0)(typescript@5.4.2) - '@typescript-eslint/visitor-keys': 7.4.0 + '@typescript-eslint/parser': 7.8.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/scope-manager': 7.8.0 + '@typescript-eslint/type-utils': 7.8.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/utils': 7.8.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/visitor-keys': 7.8.0 debug: 4.3.4 eslint: 8.57.0 graphemer: 1.4.0 ignore: 5.3.1 natural-compare: 1.4.0 semver: 7.6.0 - ts-api-utils: 1.3.0(typescript@5.4.2) + ts-api-utils: 1.3.0(typescript@5.4.5) optionalDependencies: - typescript: 5.4.2 + typescript: 5.4.5 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@7.4.0(eslint@8.57.0)(typescript@5.4.2)': + '@typescript-eslint/parser@7.8.0(eslint@8.57.0)(typescript@5.4.5)': dependencies: - '@typescript-eslint/scope-manager': 7.4.0 - '@typescript-eslint/types': 7.4.0 - '@typescript-eslint/typescript-estree': 7.4.0(typescript@5.4.2) - '@typescript-eslint/visitor-keys': 7.4.0 + '@typescript-eslint/scope-manager': 7.8.0 + '@typescript-eslint/types': 7.8.0 + '@typescript-eslint/typescript-estree': 7.8.0(typescript@5.4.5) + '@typescript-eslint/visitor-keys': 7.8.0 debug: 4.3.4 eslint: 8.57.0 optionalDependencies: - typescript: 5.4.2 + typescript: 5.4.5 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@7.4.0': + '@typescript-eslint/scope-manager@7.8.0': dependencies: - '@typescript-eslint/types': 7.4.0 - '@typescript-eslint/visitor-keys': 7.4.0 + '@typescript-eslint/types': 7.8.0 + '@typescript-eslint/visitor-keys': 7.8.0 - '@typescript-eslint/type-utils@7.4.0(eslint@8.57.0)(typescript@5.4.2)': + '@typescript-eslint/type-utils@7.8.0(eslint@8.57.0)(typescript@5.4.5)': dependencies: - '@typescript-eslint/typescript-estree': 7.4.0(typescript@5.4.2) - '@typescript-eslint/utils': 7.4.0(eslint@8.57.0)(typescript@5.4.2) + '@typescript-eslint/typescript-estree': 7.8.0(typescript@5.4.5) + '@typescript-eslint/utils': 7.8.0(eslint@8.57.0)(typescript@5.4.5) debug: 4.3.4 eslint: 8.57.0 - ts-api-utils: 1.3.0(typescript@5.4.2) + ts-api-utils: 1.3.0(typescript@5.4.5) optionalDependencies: - typescript: 5.4.2 + typescript: 5.4.5 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@7.4.0': {} + '@typescript-eslint/types@7.8.0': {} - '@typescript-eslint/typescript-estree@7.4.0(typescript@5.4.2)': + '@typescript-eslint/typescript-estree@7.8.0(typescript@5.4.5)': dependencies: - '@typescript-eslint/types': 7.4.0 - '@typescript-eslint/visitor-keys': 7.4.0 + '@typescript-eslint/types': 7.8.0 + '@typescript-eslint/visitor-keys': 7.8.0 debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 - minimatch: 9.0.3 + minimatch: 9.0.4 semver: 7.6.0 - ts-api-utils: 1.3.0(typescript@5.4.2) + ts-api-utils: 1.3.0(typescript@5.4.5) optionalDependencies: - typescript: 5.4.2 + typescript: 5.4.5 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@7.4.0(eslint@8.57.0)(typescript@5.4.2)': + '@typescript-eslint/utils@7.8.0(eslint@8.57.0)(typescript@5.4.5)': dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) '@types/json-schema': 7.0.15 '@types/semver': 7.5.8 - '@typescript-eslint/scope-manager': 7.4.0 - '@typescript-eslint/types': 7.4.0 - '@typescript-eslint/typescript-estree': 7.4.0(typescript@5.4.2) + '@typescript-eslint/scope-manager': 7.8.0 + '@typescript-eslint/types': 7.8.0 + '@typescript-eslint/typescript-estree': 7.8.0(typescript@5.4.5) eslint: 8.57.0 semver: 7.6.0 transitivePeerDependencies: - supports-color - typescript - '@typescript-eslint/visitor-keys@7.4.0': + '@typescript-eslint/visitor-keys@7.8.0': dependencies: - '@typescript-eslint/types': 7.4.0 + '@typescript-eslint/types': 7.8.0 eslint-visitor-keys: 3.4.3 '@ungap/structured-clone@1.2.0': {} - '@vitejs/plugin-react-swc@3.6.0(vite@5.2.6(@types/node@20.11.30)(terser@5.31.0))': + '@vitejs/plugin-react-swc@3.6.0(vite@5.2.11(@types/node@20.12.8)(terser@5.31.0))': dependencies: - '@swc/core': 1.4.8 - vite: 5.2.6(@types/node@20.11.30)(terser@5.31.0) + '@swc/core': 1.4.17 + vite: 5.2.11(@types/node@20.12.8)(terser@5.31.0) transitivePeerDependencies: - '@swc/helpers' @@ -7419,9 +6809,9 @@ snapshots: transitivePeerDependencies: - supports-color - ajv-formats@2.1.1(ajv@8.12.0): + ajv-formats@2.1.1(ajv@8.13.0): optionalDependencies: - ajv: 8.12.0 + ajv: 8.13.0 ajv@6.12.6: dependencies: @@ -7430,13 +6820,6 @@ snapshots: json-schema-traverse: 0.4.1 uri-js: 4.4.1 - ajv@8.12.0: - dependencies: - fast-deep-equal: 3.1.3 - json-schema-traverse: 1.0.0 - require-from-string: 2.0.2 - uri-js: 4.4.1 - ajv@8.13.0: dependencies: fast-deep-equal: 3.1.3 @@ -7444,17 +6827,11 @@ snapshots: require-from-string: 2.0.2 uri-js: 4.4.1 - ansi-align@3.0.1: - dependencies: - string-width: 4.2.3 - ansi-escapes@4.3.2: dependencies: type-fest: 0.21.3 - ansi-escapes@6.2.0: - dependencies: - type-fest: 3.13.1 + ansi-escapes@6.2.1: {} ansi-regex@5.0.1: {} @@ -7487,10 +6864,6 @@ snapshots: argparse@2.0.1: {} - aria-query@5.1.3: - dependencies: - deep-equal: 2.2.3 - aria-query@5.3.0: dependencies: dequal: 2.0.3 @@ -7502,11 +6875,12 @@ snapshots: array-find-index@1.0.2: {} - array-includes@3.1.7: + array-includes@3.1.8: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-abstract: 1.23.3 + es-object-atoms: 1.0.0 get-intrinsic: 1.2.4 is-string: 1.0.7 @@ -7516,7 +6890,7 @@ snapshots: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.23.2 + es-abstract: 1.23.3 es-errors: 1.3.0 es-object-atoms: 1.0.0 es-shim-unscopables: 1.0.2 @@ -7525,7 +6899,7 @@ snapshots: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.23.2 + es-abstract: 1.23.3 es-errors: 1.3.0 es-object-atoms: 1.0.0 es-shim-unscopables: 1.0.2 @@ -7534,28 +6908,28 @@ snapshots: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-abstract: 1.23.3 es-shim-unscopables: 1.0.2 array.prototype.flatmap@1.3.2: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-abstract: 1.23.3 es-shim-unscopables: 1.0.2 array.prototype.toreversed@1.1.2: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-abstract: 1.23.3 es-shim-unscopables: 1.0.2 array.prototype.tosorted@1.1.3: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-abstract: 1.23.3 es-errors: 1.3.0 es-shim-unscopables: 1.0.2 @@ -7564,7 +6938,7 @@ snapshots: array-buffer-byte-length: 1.0.1 call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-abstract: 1.23.3 es-errors: 1.3.0 get-intrinsic: 1.2.4 is-array-buffer: 3.0.4 @@ -7589,10 +6963,10 @@ snapshots: semver: 7.6.0 yargs: 17.7.2 - autoprefixer@10.4.18(postcss@8.4.38): + autoprefixer@10.4.19(postcss@8.4.38): dependencies: browserslist: 4.23.0 - caniuse-lite: 1.0.30001599 + caniuse-lite: 1.0.30001615 fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.0.0 @@ -7611,13 +6985,13 @@ snapshots: transitivePeerDependencies: - debug - babel-jest@29.7.0(@babel/core@7.24.3): + babel-jest@29.7.0(@babel/core@7.24.5): dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.5 '@jest/transform': 29.7.0 '@types/babel__core': 7.20.5 babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 29.6.3(@babel/core@7.24.3) + babel-preset-jest: 29.6.3(@babel/core@7.24.5) chalk: 4.1.2 graceful-fs: 4.2.11 slash: 3.0.0 @@ -7626,7 +7000,7 @@ snapshots: babel-plugin-istanbul@6.1.1: dependencies: - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.5 '@istanbuljs/load-nyc-config': 1.1.0 '@istanbuljs/schema': 0.1.3 istanbul-lib-instrument: 5.2.1 @@ -7637,7 +7011,7 @@ snapshots: babel-plugin-jest-hoist@29.6.3: dependencies: '@babel/template': 7.24.0 - '@babel/types': 7.24.0 + '@babel/types': 7.24.5 '@types/babel__core': 7.20.5 '@types/babel__traverse': 7.20.5 @@ -7671,27 +7045,27 @@ snapshots: transitivePeerDependencies: - supports-color - babel-preset-current-node-syntax@1.0.1(@babel/core@7.24.3): - dependencies: - '@babel/core': 7.24.3 - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.3) - '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.24.3) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.24.3) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.24.3) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.3) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.3) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.3) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.3) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.3) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.3) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.3) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.24.3) - - babel-preset-jest@29.6.3(@babel/core@7.24.3): - dependencies: - '@babel/core': 7.24.3 + babel-preset-current-node-syntax@1.0.1(@babel/core@7.24.5): + dependencies: + '@babel/core': 7.24.5 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.5) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.24.5) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.24.5) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.24.5) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.5) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.5) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.5) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.5) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.5) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.5) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.5) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.24.5) + + babel-preset-jest@29.6.3(@babel/core@7.24.5): + dependencies: + '@babel/core': 7.24.5 babel-plugin-jest-hoist: 29.6.3 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.24.3) + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.24.5) balanced-match@1.0.2: {} @@ -7703,17 +7077,6 @@ snapshots: inherits: 2.0.4 readable-stream: 3.6.2 - boxen@5.1.2: - dependencies: - ansi-align: 3.0.1 - camelcase: 6.3.0 - chalk: 4.1.2 - cli-boxes: 2.2.1 - string-width: 4.2.3 - type-fest: 0.20.2 - widest-line: 3.1.0 - wrap-ansi: 7.0.0 - brace-expansion@1.1.11: dependencies: balanced-match: 1.0.2 @@ -7729,10 +7092,10 @@ snapshots: browserslist@4.23.0: dependencies: - caniuse-lite: 1.0.30001599 - electron-to-chromium: 1.4.711 + caniuse-lite: 1.0.30001615 + electron-to-chromium: 1.4.755 node-releases: 2.0.14 - update-browserslist-db: 1.0.13(browserslist@4.23.0) + update-browserslist-db: 1.0.14(browserslist@4.23.0) bs-logger@0.2.6: dependencies: @@ -7751,18 +7114,6 @@ snapshots: builtin-modules@3.3.0: {} - cacheable-lookup@5.0.4: {} - - cacheable-request@7.0.4: - dependencies: - clone-response: 1.0.3 - get-stream: 5.2.0 - http-cache-semantics: 4.1.1 - keyv: 4.5.4 - lowercase-keys: 2.0.0 - normalize-url: 6.1.0 - responselike: 2.0.1 - call-bind@1.0.7: dependencies: es-define-property: 1.0.0 @@ -7777,7 +7128,7 @@ snapshots: camelcase@6.3.0: {} - caniuse-lite@1.0.30001599: {} + caniuse-lite@1.0.30001615: {} chalk@2.4.2: dependencies: @@ -7799,15 +7150,9 @@ snapshots: char-regex@1.0.2: {} - chardet@0.7.0: {} - - ci-info@2.0.0: {} - ci-info@3.9.0: {} - cjs-module-lexer@1.2.3: {} - - cli-boxes@2.2.1: {} + cjs-module-lexer@1.3.1: {} cli-cursor@3.1.0: dependencies: @@ -7832,13 +7177,9 @@ snapshots: strip-ansi: 6.0.1 wrap-ansi: 7.0.0 - clone-response@1.0.3: - dependencies: - mimic-response: 1.0.1 - clone@1.0.4: {} - clsx@2.1.0: {} + clsx@2.1.1: {} co@4.6.0: {} @@ -7889,8 +7230,8 @@ snapshots: conf@10.2.0: dependencies: - ajv: 8.12.0 - ajv-formats: 2.1.1(ajv@8.12.0) + ajv: 8.13.0 + ajv-formats: 2.1.1(ajv@8.13.0) atomically: 1.7.0 debounce-fn: 4.0.0 dot-prop: 6.0.1 @@ -7900,15 +7241,6 @@ snapshots: pkg-up: 3.1.0 semver: 7.6.0 - configstore@5.0.1: - dependencies: - dot-prop: 5.3.0 - graceful-fs: 4.2.11 - make-dir: 3.1.0 - unique-string: 2.0.0 - write-file-atomic: 3.0.3 - xdg-basedir: 4.0.0 - convert-source-map@1.9.0: {} convert-source-map@2.0.0: {} @@ -7927,22 +7259,22 @@ snapshots: path-type: 4.0.0 yaml: 1.10.2 - cosmiconfig@9.0.0(typescript@5.4.2): + cosmiconfig@9.0.0(typescript@5.4.5): dependencies: env-paths: 2.2.1 import-fresh: 3.3.0 js-yaml: 4.1.0 parse-json: 5.2.0 optionalDependencies: - typescript: 5.4.2 + typescript: 5.4.5 - create-jest@29.7.0(@types/node@20.11.30)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.4.8)(@types/node@20.11.30)(typescript@5.4.2)): + create-jest@29.7.0(@types/node@20.12.8)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.4.17)(@types/node@20.12.8)(typescript@5.4.5)): dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@20.11.30)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.4.8)(@types/node@20.11.30)(typescript@5.4.2)) + jest-config: 29.7.0(@types/node@20.12.8)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.4.17)(@types/node@20.12.8)(typescript@5.4.5)) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -8003,7 +7335,7 @@ snapshots: es-errors: 1.3.0 is-data-view: 1.0.1 - dayjs@1.11.10: {} + dayjs@1.11.11: {} debounce-fn@4.0.0: dependencies: @@ -8019,37 +7351,10 @@ snapshots: decimal.js@10.4.3: {} - decompress-response@6.0.0: - dependencies: - mimic-response: 3.1.0 - - dedent@1.5.1(babel-plugin-macros@3.1.0): + dedent@1.5.3(babel-plugin-macros@3.1.0): optionalDependencies: babel-plugin-macros: 3.1.0 - deep-equal@2.2.3: - dependencies: - array-buffer-byte-length: 1.0.1 - call-bind: 1.0.7 - es-get-iterator: 1.1.3 - get-intrinsic: 1.2.4 - is-arguments: 1.1.1 - is-array-buffer: 3.0.4 - is-date-object: 1.0.5 - is-regex: 1.1.4 - is-shared-array-buffer: 1.0.3 - isarray: 2.0.5 - object-is: 1.1.6 - object-keys: 1.1.1 - object.assign: 4.1.5 - regexp.prototype.flags: 1.5.2 - side-channel: 1.0.6 - which-boxed-primitive: 1.0.2 - which-collection: 1.0.2 - which-typed-array: 1.1.15 - - deep-extend@0.6.0: {} - deep-is@0.1.4: {} deepmerge@4.3.1: {} @@ -8058,8 +7363,6 @@ snapshots: dependencies: clone: 1.0.4 - defer-to-connect@2.0.1: {} - define-data-property@1.1.4: dependencies: es-define-property: 1.0.0 @@ -8084,6 +7387,8 @@ snapshots: diff@4.0.2: {} + diff@5.2.0: {} + dir-glob@3.0.1: dependencies: path-type: 4.0.0 @@ -8102,17 +7407,13 @@ snapshots: dom-helpers@5.2.1: dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.5 csstype: 3.1.3 domexception@4.0.0: dependencies: webidl-conversions: 7.0.0 - dot-prop@5.3.0: - dependencies: - is-obj: 2.0.0 - dot-prop@6.0.1: dependencies: is-obj: 2.0.0 @@ -8131,7 +7432,7 @@ snapshots: dependencies: jake: 10.8.7 - electron-to-chromium@1.4.711: {} + electron-to-chromium@1.4.755: {} emittery@0.13.1: {} @@ -8143,10 +7444,6 @@ snapshots: enabled@2.0.0: {} - end-of-stream@1.4.4: - dependencies: - once: 1.4.0 - enhanced-resolve@5.16.0: dependencies: graceful-fs: 4.2.11 @@ -8160,51 +7457,7 @@ snapshots: dependencies: is-arrayish: 0.2.1 - es-abstract@1.22.5: - dependencies: - array-buffer-byte-length: 1.0.1 - arraybuffer.prototype.slice: 1.0.3 - available-typed-arrays: 1.0.7 - call-bind: 1.0.7 - es-define-property: 1.0.0 - es-errors: 1.3.0 - es-set-tostringtag: 2.0.3 - es-to-primitive: 1.2.1 - function.prototype.name: 1.1.6 - get-intrinsic: 1.2.4 - get-symbol-description: 1.0.2 - globalthis: 1.0.3 - gopd: 1.0.1 - has-property-descriptors: 1.0.2 - has-proto: 1.0.3 - has-symbols: 1.0.3 - hasown: 2.0.2 - internal-slot: 1.0.7 - is-array-buffer: 3.0.4 - is-callable: 1.2.7 - is-negative-zero: 2.0.3 - is-regex: 1.1.4 - is-shared-array-buffer: 1.0.3 - is-string: 1.0.7 - is-typed-array: 1.1.13 - is-weakref: 1.0.2 - object-inspect: 1.13.1 - object-keys: 1.1.1 - object.assign: 4.1.5 - regexp.prototype.flags: 1.5.2 - safe-array-concat: 1.1.2 - safe-regex-test: 1.0.3 - string.prototype.trim: 1.2.9 - string.prototype.trimend: 1.0.8 - string.prototype.trimstart: 1.0.7 - typed-array-buffer: 1.0.2 - typed-array-byte-length: 1.0.1 - typed-array-byte-offset: 1.0.2 - typed-array-length: 1.0.5 - unbox-primitive: 1.0.2 - which-typed-array: 1.1.15 - - es-abstract@1.23.2: + es-abstract@1.23.3: dependencies: array-buffer-byte-length: 1.0.1 arraybuffer.prototype.slice: 1.0.3 @@ -8221,7 +7474,7 @@ snapshots: function.prototype.name: 1.1.6 get-intrinsic: 1.2.4 get-symbol-description: 1.0.2 - globalthis: 1.0.3 + globalthis: 1.0.4 gopd: 1.0.1 has-property-descriptors: 1.0.2 has-proto: 1.0.3 @@ -8245,11 +7498,11 @@ snapshots: safe-regex-test: 1.0.3 string.prototype.trim: 1.2.9 string.prototype.trimend: 1.0.8 - string.prototype.trimstart: 1.0.7 + string.prototype.trimstart: 1.0.8 typed-array-buffer: 1.0.2 typed-array-byte-length: 1.0.1 typed-array-byte-offset: 1.0.2 - typed-array-length: 1.0.5 + typed-array-length: 1.0.6 unbox-primitive: 1.0.2 which-typed-array: 1.1.15 @@ -8259,28 +7512,16 @@ snapshots: es-errors@1.3.0: {} - es-get-iterator@1.1.3: - dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 - has-symbols: 1.0.3 - is-arguments: 1.1.1 - is-map: 2.0.3 - is-set: 2.0.3 - is-string: 1.0.7 - isarray: 2.0.5 - stop-iteration-iterator: 1.0.0 - - es-iterator-helpers@1.0.18: + es-iterator-helpers@1.0.19: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.23.2 + es-abstract: 1.23.3 es-errors: 1.3.0 es-set-tostringtag: 2.0.3 function-bind: 1.1.2 get-intrinsic: 1.2.4 - globalthis: 1.0.3 + globalthis: 1.0.4 has-property-descriptors: 1.0.2 has-proto: 1.0.3 has-symbols: 1.0.3 @@ -8336,8 +7577,6 @@ snapshots: escalade@3.1.2: {} - escape-goat@2.1.1: {} - escape-string-regexp@1.0.5: {} escape-string-regexp@2.0.0: {} @@ -8352,9 +7591,10 @@ snapshots: optionalDependencies: source-map: 0.6.1 - eslint-compat-utils@0.1.2(eslint@8.57.0): + eslint-compat-utils@0.5.0(eslint@8.57.0): dependencies: eslint: 8.57.0 + semver: 7.6.0 eslint-config-prettier@9.1.0(eslint@8.57.0): dependencies: @@ -8368,26 +7608,26 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.8.1(@typescript-eslint/parser@7.4.0(eslint@8.57.0)(typescript@5.4.2))(eslint-import-resolver-node@0.3.9)(eslint@8.57.0): + eslint-module-utils@2.8.1(@typescript-eslint/parser@7.8.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint@8.57.0): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 7.4.0(eslint@8.57.0)(typescript@5.4.2) + '@typescript-eslint/parser': 7.8.0(eslint@8.57.0)(typescript@5.4.5) eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: - supports-color - eslint-plugin-es-x@7.5.0(eslint@8.57.0): + eslint-plugin-es-x@7.6.0(eslint@8.57.0): dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) '@eslint-community/regexpp': 4.10.0 eslint: 8.57.0 - eslint-compat-utils: 0.1.2(eslint@8.57.0) + eslint-compat-utils: 0.5.0(eslint@8.57.0) - eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.4.0(eslint@8.57.0)(typescript@5.4.2))(eslint@8.57.0): + eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.8.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0): dependencies: - array-includes: 3.1.7 + array-includes: 3.1.8 array.prototype.findlastindex: 1.2.5 array.prototype.flat: 1.3.2 array.prototype.flatmap: 1.3.2 @@ -8395,7 +7635,7 @@ snapshots: doctrine: 2.1.0 eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.4.0(eslint@8.57.0)(typescript@5.4.2))(eslint-import-resolver-node@0.3.9)(eslint@8.57.0) + eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.8.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint@8.57.0) hasown: 2.0.2 is-core-module: 2.13.1 is-glob: 4.0.3 @@ -8406,22 +7646,22 @@ snapshots: semver: 6.3.1 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 7.4.0(eslint@8.57.0)(typescript@5.4.2) + '@typescript-eslint/parser': 7.8.0(eslint@8.57.0)(typescript@5.4.5) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-n@17.3.1(eslint@8.57.0): + eslint-plugin-n@17.4.0(eslint@8.57.0): dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) enhanced-resolve: 5.16.0 eslint: 8.57.0 - eslint-plugin-es-x: 7.5.0(eslint@8.57.0) + eslint-plugin-es-x: 7.6.0(eslint@8.57.0) get-tsconfig: 4.7.3 - globals: 15.0.0 + globals: 15.1.0 ignore: 5.3.1 - minimatch: 9.0.3 + minimatch: 9.0.4 semver: 7.6.0 eslint-plugin-prettier@5.1.3(eslint-config-prettier@9.1.0(eslint@8.57.0))(eslint@8.57.0)(prettier@3.2.5): @@ -8437,26 +7677,26 @@ snapshots: dependencies: eslint: 8.57.0 - eslint-plugin-react-hooks@4.6.0(eslint@8.57.0): + eslint-plugin-react-hooks@4.6.2(eslint@8.57.0): dependencies: eslint: 8.57.0 eslint-plugin-react@7.34.1(eslint@8.57.0): dependencies: - array-includes: 3.1.7 + 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.3 doctrine: 2.1.0 - es-iterator-helpers: 1.0.18 + es-iterator-helpers: 1.0.19 eslint: 8.57.0 estraverse: 5.3.0 jsx-ast-utils: 3.3.5 minimatch: 3.1.2 object.entries: 1.1.8 object.fromentries: 2.0.8 - object.hasown: 1.1.3 + object.hasown: 1.1.4 object.values: 1.2.0 prop-types: 15.8.1 resolve: 2.0.0-next.5 @@ -8507,7 +7747,7 @@ snapshots: lodash.merge: 4.6.2 minimatch: 3.1.2 natural-compare: 1.4.0 - optionator: 0.9.3 + optionator: 0.9.4 strip-ansi: 6.0.1 text-table: 0.2.0 transitivePeerDependencies: @@ -8583,12 +7823,6 @@ snapshots: jest-message-util: 29.7.0 jest-util: 29.7.0 - external-editor@3.1.0: - dependencies: - chardet: 0.7.0 - iconv-lite: 0.4.24 - tmp: 0.0.33 - fast-deep-equal@3.1.3: {} fast-diff@1.3.0: {} @@ -8708,7 +7942,7 @@ snapshots: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-abstract: 1.23.3 functions-have-names: 1.2.3 functions-have-names@1.2.3: {} @@ -8731,10 +7965,6 @@ snapshots: get-package-type@0.1.0: {} - get-stream@5.2.0: - dependencies: - pump: 3.0.0 - get-stream@6.0.1: {} get-stream@8.0.1: {} @@ -8757,13 +7987,13 @@ snapshots: dependencies: is-glob: 4.0.3 - glob@10.3.10: + glob@10.3.12: dependencies: foreground-child: 3.1.1 jackspeak: 2.3.6 - minimatch: 9.0.3 + minimatch: 9.0.4 minipass: 7.0.4 - path-scurry: 1.10.1 + path-scurry: 1.10.2 glob@7.2.3: dependencies: @@ -8774,21 +8004,18 @@ snapshots: once: 1.4.0 path-is-absolute: 1.0.1 - global-dirs@3.0.1: - dependencies: - ini: 2.0.0 - globals@11.12.0: {} globals@13.24.0: dependencies: type-fest: 0.20.2 - globals@15.0.0: {} + globals@15.1.0: {} - globalthis@1.0.3: + globalthis@1.0.4: dependencies: define-properties: 1.2.1 + gopd: 1.0.1 globby@11.1.0: dependencies: @@ -8803,20 +8030,6 @@ snapshots: dependencies: get-intrinsic: 1.2.4 - got@11.8.6: - dependencies: - '@sindresorhus/is': 4.6.0 - '@szmarczak/http-timer': 4.0.6 - '@types/cacheable-request': 6.0.3 - '@types/responselike': 1.0.3 - cacheable-lookup: 5.0.4 - cacheable-request: 7.0.4 - decompress-response: 6.0.0 - http2-wrapper: 1.0.3 - lowercase-keys: 2.0.0 - p-cancelable: 2.1.1 - responselike: 2.0.1 - graceful-fs@4.2.11: {} graphemer@1.4.0: {} @@ -8843,8 +8056,6 @@ snapshots: dependencies: has-symbols: 1.0.3 - has-yarn@2.1.0: {} - hasown@2.0.2: dependencies: function-bind: 1.1.2 @@ -8861,8 +8072,6 @@ snapshots: html-escaper@2.0.2: {} - http-cache-semantics@4.1.1: {} - http-proxy-agent@5.0.0: dependencies: '@tootallnate/once': 2.0.0 @@ -8871,11 +8080,6 @@ snapshots: transitivePeerDependencies: - supports-color - http2-wrapper@1.0.3: - dependencies: - quick-lru: 5.1.1 - resolve-alpn: 1.2.1 - https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 @@ -8889,10 +8093,6 @@ snapshots: husky@9.0.11: {} - iconv-lite@0.4.24: - dependencies: - safer-buffer: 2.1.2 - iconv-lite@0.6.3: dependencies: safer-buffer: 2.1.2 @@ -8907,15 +8107,13 @@ snapshots: ignore@5.3.1: {} - immer@10.0.4: {} + immer@10.1.1: {} import-fresh@3.3.0: dependencies: parent-module: 1.0.1 resolve-from: 4.0.0 - import-lazy@2.1.0: {} - import-local@3.1.0: dependencies: pkg-dir: 4.2.0 @@ -8932,21 +8130,12 @@ snapshots: inherits@2.0.4: {} - ini@1.3.8: {} - - ini@2.0.0: {} - internal-slot@1.0.7: dependencies: es-errors: 1.3.0 hasown: 2.0.2 side-channel: 1.0.6 - is-arguments@1.1.1: - dependencies: - call-bind: 1.0.7 - has-tostringtag: 1.0.2 - is-array-buffer@3.0.4: dependencies: call-bind: 1.0.7 @@ -8975,10 +8164,6 @@ snapshots: is-callable@1.2.7: {} - is-ci@2.0.0: - dependencies: - ci-info: 2.0.0 - is-core-module@2.13.1: dependencies: hasown: 2.0.2 @@ -9017,11 +8202,6 @@ snapshots: dependencies: is-extglob: 2.1.1 - is-installed-globally@0.4.0: - dependencies: - global-dirs: 3.0.1 - is-path-inside: 3.0.3 - is-interactive@1.0.0: {} is-map@2.0.3: {} @@ -9032,8 +8212,6 @@ snapshots: is-node-process@1.2.0: {} - is-npm@5.0.0: {} - is-number-object@1.0.7: dependencies: has-tostringtag: 1.0.2 @@ -9077,8 +8255,6 @@ snapshots: dependencies: which-typed-array: 1.1.15 - is-typedarray@1.0.0: {} - is-unicode-supported@0.1.0: {} is-weakmap@2.0.2: {} @@ -9096,8 +8272,6 @@ snapshots: dependencies: is-docker: 2.2.1 - is-yarn-global@0.3.0: {} - isarray@2.0.5: {} isexe@2.0.0: {} @@ -9108,8 +8282,8 @@ snapshots: istanbul-lib-instrument@5.2.1: dependencies: - '@babel/core': 7.24.3 - '@babel/parser': 7.24.1 + '@babel/core': 7.24.5 + '@babel/parser': 7.24.5 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 semver: 6.3.1 @@ -9118,8 +8292,8 @@ snapshots: istanbul-lib-instrument@6.0.2: dependencies: - '@babel/core': 7.24.3 - '@babel/parser': 7.24.1 + '@babel/core': 7.24.5 + '@babel/parser': 7.24.5 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 semver: 7.6.0 @@ -9178,10 +8352,10 @@ snapshots: '@jest/expect': 29.7.0 '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.11.30 + '@types/node': 20.12.8 chalk: 4.1.2 co: 4.6.0 - dedent: 1.5.1(babel-plugin-macros@3.1.0) + dedent: 1.5.3(babel-plugin-macros@3.1.0) is-generator-fn: 2.1.0 jest-each: 29.7.0 jest-matcher-utils: 29.7.0 @@ -9191,23 +8365,23 @@ snapshots: jest-util: 29.7.0 p-limit: 3.1.0 pretty-format: 29.7.0 - pure-rand: 6.0.4 + pure-rand: 6.1.0 slash: 3.0.0 stack-utils: 2.0.6 transitivePeerDependencies: - babel-plugin-macros - supports-color - jest-cli@29.7.0(@types/node@20.11.30)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.4.8)(@types/node@20.11.30)(typescript@5.4.2)): + jest-cli@29.7.0(@types/node@20.12.8)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.4.17)(@types/node@20.12.8)(typescript@5.4.5)): dependencies: - '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.4.8)(@types/node@20.11.30)(typescript@5.4.2)) + '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.4.17)(@types/node@20.12.8)(typescript@5.4.5)) '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@20.11.30)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.4.8)(@types/node@20.11.30)(typescript@5.4.2)) + create-jest: 29.7.0(@types/node@20.12.8)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.4.17)(@types/node@20.12.8)(typescript@5.4.5)) exit: 0.1.2 import-local: 3.1.0 - jest-config: 29.7.0(@types/node@20.11.30)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.4.8)(@types/node@20.11.30)(typescript@5.4.2)) + jest-config: 29.7.0(@types/node@20.12.8)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.4.17)(@types/node@20.12.8)(typescript@5.4.5)) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -9217,12 +8391,12 @@ snapshots: - supports-color - ts-node - jest-config@29.7.0(@types/node@20.11.30)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.4.8)(@types/node@20.11.30)(typescript@5.4.2)): + jest-config@29.7.0(@types/node@20.12.8)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.4.17)(@types/node@20.12.8)(typescript@5.4.5)): dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.5 '@jest/test-sequencer': 29.7.0 '@jest/types': 29.6.3 - babel-jest: 29.7.0(@babel/core@7.24.3) + babel-jest: 29.7.0(@babel/core@7.24.5) chalk: 4.1.2 ci-info: 3.9.0 deepmerge: 4.3.1 @@ -9242,8 +8416,8 @@ snapshots: slash: 3.0.0 strip-json-comments: 3.1.1 optionalDependencies: - '@types/node': 20.11.30 - ts-node: 10.9.2(@swc/core@1.4.8)(@types/node@20.11.30)(typescript@5.4.2) + '@types/node': 20.12.8 + ts-node: 10.9.2(@swc/core@1.4.17)(@types/node@20.12.8)(typescript@5.4.5) transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -9273,7 +8447,7 @@ snapshots: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 '@types/jsdom': 20.0.1 - '@types/node': 20.11.30 + '@types/node': 20.12.8 jest-mock: 29.7.0 jest-util: 29.7.0 jsdom: 20.0.3 @@ -9287,7 +8461,7 @@ snapshots: '@jest/environment': 29.7.0 '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.11.30 + '@types/node': 20.12.8 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -9297,7 +8471,7 @@ snapshots: dependencies: '@jest/types': 29.6.3 '@types/graceful-fs': 4.1.9 - '@types/node': 20.11.30 + '@types/node': 20.12.8 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -9336,7 +8510,7 @@ snapshots: jest-mock@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 20.11.30 + '@types/node': 20.12.8 jest-util: 29.7.0 jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): @@ -9371,7 +8545,7 @@ snapshots: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.11.30 + '@types/node': 20.12.8 chalk: 4.1.2 emittery: 0.13.1 graceful-fs: 4.2.11 @@ -9399,9 +8573,9 @@ snapshots: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.11.30 + '@types/node': 20.12.8 chalk: 4.1.2 - cjs-module-lexer: 1.2.3 + cjs-module-lexer: 1.3.1 collect-v8-coverage: 1.0.2 glob: 7.2.3 graceful-fs: 4.2.11 @@ -9419,15 +8593,15 @@ snapshots: jest-snapshot@29.7.0: dependencies: - '@babel/core': 7.24.3 - '@babel/generator': 7.24.1 - '@babel/plugin-syntax-jsx': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-syntax-typescript': 7.24.1(@babel/core@7.24.3) - '@babel/types': 7.24.0 + '@babel/core': 7.24.5 + '@babel/generator': 7.24.5 + '@babel/plugin-syntax-jsx': 7.24.1(@babel/core@7.24.5) + '@babel/plugin-syntax-typescript': 7.24.1(@babel/core@7.24.5) + '@babel/types': 7.24.5 '@jest/expect-utils': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.24.3) + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.24.5) chalk: 4.1.2 expect: 29.7.0 graceful-fs: 4.2.11 @@ -9445,7 +8619,7 @@ snapshots: jest-util@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 20.11.30 + '@types/node': 20.12.8 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 @@ -9464,7 +8638,7 @@ snapshots: dependencies: '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.11.30 + '@types/node': 20.12.8 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 @@ -9473,17 +8647,17 @@ snapshots: jest-worker@29.7.0: dependencies: - '@types/node': 20.11.30 + '@types/node': 20.12.8 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 - jest@29.7.0(@types/node@20.11.30)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.4.8)(@types/node@20.11.30)(typescript@5.4.2)): + jest@29.7.0(@types/node@20.12.8)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.4.17)(@types/node@20.12.8)(typescript@5.4.5)): dependencies: - '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.4.8)(@types/node@20.11.30)(typescript@5.4.2)) + '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.4.17)(@types/node@20.12.8)(typescript@5.4.5)) '@jest/types': 29.6.3 import-local: 3.1.0 - jest-cli: 29.7.0(@types/node@20.11.30)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.4.8)(@types/node@20.11.30)(typescript@5.4.2)) + jest-cli: 29.7.0(@types/node@20.12.8)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.4.17)(@types/node@20.12.8)(typescript@5.4.5)) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -9527,17 +8701,17 @@ snapshots: http-proxy-agent: 5.0.0 https-proxy-agent: 5.0.1 is-potential-custom-element-name: 1.0.1 - nwsapi: 2.2.7 + nwsapi: 2.2.9 parse5: 7.1.2 saxes: 6.0.0 symbol-tree: 3.2.4 - tough-cookie: 4.1.3 + tough-cookie: 4.1.4 w3c-xmlserializer: 4.0.0 webidl-conversions: 7.0.0 whatwg-encoding: 2.0.0 whatwg-mimetype: 3.0.0 whatwg-url: 11.0.0 - ws: 8.16.0 + ws: 8.17.0 xml-name-validator: 4.0.0 transitivePeerDependencies: - bufferutil @@ -9580,7 +8754,7 @@ snapshots: jsx-ast-utils@3.3.5: dependencies: - array-includes: 3.1.7 + array-includes: 3.1.8 array.prototype.flat: 1.3.2 object.assign: 4.1.5 object.values: 1.2.0 @@ -9600,11 +8774,11 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 - license-compliance@3.0.0(typescript@5.4.2): + license-compliance@3.0.0(typescript@5.4.5): dependencies: chalk: 4.1.2 commander: 12.0.0 - cosmiconfig: 9.0.0(typescript@5.4.2) + cosmiconfig: 9.0.0(typescript@5.4.5) debug: 4.3.4 joi: 17.12.3 spdx-expression-parse: 4.0.0 @@ -9675,7 +8849,7 @@ snapshots: log-update@6.0.0: dependencies: - ansi-escapes: 6.2.0 + ansi-escapes: 6.2.1 cli-cursor: 4.0.0 slice-ansi: 7.1.0 strip-ansi: 7.1.0 @@ -9694,9 +8868,7 @@ snapshots: dependencies: js-tokens: 4.0.0 - lowercase-keys@2.0.0: {} - - lru-cache@10.2.0: {} + lru-cache@10.2.2: {} lru-cache@5.1.1: dependencies: @@ -9712,10 +8884,6 @@ snapshots: dependencies: sourcemap-codec: 1.4.8 - make-dir@3.1.0: - dependencies: - semver: 6.3.1 - make-dir@4.0.0: dependencies: semver: 7.6.0 @@ -9749,10 +8917,6 @@ snapshots: mimic-fn@4.0.0: {} - mimic-response@1.0.1: {} - - mimic-response@3.1.0: {} - min-indent@1.0.1: {} minimatch@3.1.2: @@ -9763,7 +8927,7 @@ snapshots: dependencies: brace-expansion: 2.0.1 - minimatch@9.0.3: + minimatch@9.0.4: dependencies: brace-expansion: 2.0.1 @@ -9775,7 +8939,7 @@ snapshots: ms@2.1.3: {} - msw@2.2.14(typescript@5.4.2): + msw@2.2.14(typescript@5.4.5): dependencies: '@bundled-es-modules/cookie': 2.0.0 '@bundled-es-modules/statuses': 1.0.1 @@ -9790,12 +8954,12 @@ snapshots: headers-polyfill: 4.0.3 is-node-process: 1.2.0 outvariant: 1.4.2 - path-to-regexp: 6.2.1 + path-to-regexp: 6.2.2 strict-event-emitter: 0.5.1 - type-fest: 4.18.0 + type-fest: 4.18.1 yargs: 17.7.2 optionalDependencies: - typescript: 5.4.2 + typescript: 5.4.5 mute-stream@1.0.0: {} @@ -9819,8 +8983,6 @@ snapshots: normalize-range@0.1.2: {} - normalize-url@6.1.0: {} - npm-run-path@4.0.1: dependencies: path-key: 3.1.1 @@ -9829,17 +8991,12 @@ snapshots: dependencies: path-key: 4.0.0 - nwsapi@2.2.7: {} + nwsapi@2.2.9: {} object-assign@4.1.1: {} object-inspect@1.13.1: {} - object-is@1.1.6: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - object-keys@1.1.1: {} object-treeify@1.1.33: {} @@ -9861,19 +9018,20 @@ snapshots: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.23.2 + es-abstract: 1.23.3 es-object-atoms: 1.0.0 object.groupby@1.0.3: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.23.2 + es-abstract: 1.23.3 - object.hasown@1.1.3: + object.hasown@1.1.4: dependencies: define-properties: 1.2.1 - es-abstract: 1.22.5 + es-abstract: 1.23.3 + es-object-atoms: 1.0.0 object.values@1.2.0: dependencies: @@ -9903,14 +9061,14 @@ snapshots: is-docker: 2.2.1 is-wsl: 2.2.0 - optionator@0.9.3: + optionator@0.9.4: dependencies: - '@aashutoshrathi/word-wrap': 1.2.6 deep-is: 0.1.4 fast-levenshtein: 2.0.6 levn: 0.4.1 prelude-ls: 1.2.1 type-check: 0.4.0 + word-wrap: 1.2.5 ora@5.4.1: dependencies: @@ -9924,12 +9082,8 @@ snapshots: strip-ansi: 6.0.1 wcwidth: 1.0.1 - os-tmpdir@1.0.2: {} - outvariant@1.4.2: {} - p-cancelable@2.1.1: {} - p-limit@2.3.0: dependencies: p-try: 2.2.0 @@ -9952,13 +9106,6 @@ snapshots: p-try@2.2.0: {} - package-json@7.0.0: - dependencies: - got: 11.8.6 - registry-auth-token: 4.2.2 - registry-url: 5.1.0 - semver: 7.6.0 - parent-module@1.0.1: dependencies: callsites: 3.1.0 @@ -9986,12 +9133,12 @@ snapshots: path-parse@1.0.7: {} - path-scurry@1.10.1: + path-scurry@1.10.2: dependencies: - lru-cache: 10.2.0 + lru-cache: 10.2.2 minipass: 7.0.4 - path-to-regexp@6.2.1: {} + path-to-regexp@6.2.2: {} path-type@4.0.0: {} @@ -10015,11 +9162,11 @@ snapshots: dependencies: find-up: 3.0.0 - playwright-core@1.42.1: {} + playwright-core@1.43.1: {} - playwright@1.42.1: + playwright@1.43.1: dependencies: - playwright-core: 1.42.1 + playwright-core: 1.43.1 optionalDependencies: fsevents: 2.3.2 @@ -10039,10 +9186,10 @@ snapshots: dependencies: fast-diff: 1.3.0 - prettier-plugin-sort-imports@1.8.5(typescript@5.4.2): + prettier-plugin-sort-imports@1.8.5(typescript@5.4.5): dependencies: prettier: 3.2.5 - typescript: 5.4.2 + typescript: 5.4.5 prettier@3.2.5: {} @@ -10060,7 +9207,7 @@ snapshots: dependencies: '@jest/schemas': 29.6.3 ansi-styles: 5.2.0 - react-is: 18.2.0 + react-is: 18.3.1 prompts@2.4.2: dependencies: @@ -10079,88 +9226,70 @@ snapshots: psl@1.9.0: {} - pump@3.0.0: - dependencies: - end-of-stream: 1.4.4 - once: 1.4.0 - punycode@2.3.1: {} - pupa@2.1.1: - dependencies: - escape-goat: 2.1.1 - - pure-rand@6.0.4: {} + pure-rand@6.1.0: {} querystringify@2.2.0: {} queue-microtask@1.2.3: {} - quick-lru@5.1.1: {} - randombytes@2.1.0: dependencies: safe-buffer: 5.2.1 - rc@1.2.8: - dependencies: - deep-extend: 0.6.0 - ini: 1.3.8 - minimist: 1.2.8 - strip-json-comments: 2.0.1 - - react-dom@18.2.0(react@18.2.0): + react-dom@18.3.1(react@18.3.1): dependencies: loose-envify: 1.4.0 - react: 18.2.0 - scheduler: 0.23.0 + react: 18.3.1 + scheduler: 0.23.2 - react-error-boundary@4.0.13(react@18.2.0): + react-error-boundary@4.0.13(react@18.3.1): dependencies: - '@babel/runtime': 7.24.1 - react: 18.2.0 + '@babel/runtime': 7.24.5 + react: 18.3.1 - react-hook-form@7.51.3(react@18.2.0): + react-hook-form@7.51.3(react@18.3.1): dependencies: - react: 18.2.0 + react: 18.3.1 react-is@16.13.1: {} react-is@17.0.2: {} - react-is@18.2.0: {} + react-is@18.3.1: {} - react-redux@9.1.0(@types/react@18.2.67)(react@18.2.0)(redux@5.0.1): + react-redux@9.1.2(@types/react@18.3.1)(react@18.3.1)(redux@5.0.1): dependencies: '@types/use-sync-external-store': 0.0.3 - react: 18.2.0 - use-sync-external-store: 1.2.0(react@18.2.0) + react: 18.3.1 + use-sync-external-store: 1.2.2(react@18.3.1) optionalDependencies: - '@types/react': 18.2.67 + '@types/react': 18.3.1 redux: 5.0.1 - react-router-dom@6.22.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + react-router-dom@6.23.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@remix-run/router': 1.15.3 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - react-router: 6.22.3(react@18.2.0) + '@remix-run/router': 1.16.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-router: 6.23.0(react@18.3.1) - react-router@6.22.3(react@18.2.0): + react-router@6.23.0(react@18.3.1): dependencies: - '@remix-run/router': 1.15.3 - react: 18.2.0 + '@remix-run/router': 1.16.0 + react: 18.3.1 - react-transition-group@4.4.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + react-transition-group@4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.5 dom-helpers: 5.2.1 loose-envify: 1.4.0 prop-types: 15.8.1 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) - react@18.2.0: + react@18.3.1: dependencies: loose-envify: 1.4.0 @@ -10183,7 +9312,7 @@ snapshots: redux@4.2.1: dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.5 redux@5.0.1: {} @@ -10191,10 +9320,10 @@ snapshots: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.23.2 + es-abstract: 1.23.3 es-errors: 1.3.0 get-intrinsic: 1.2.4 - globalthis: 1.0.3 + globalthis: 1.0.4 which-builtin-type: 1.1.3 regenerate-unicode-properties@10.1.1: @@ -10225,14 +9354,6 @@ snapshots: unicode-match-property-ecmascript: 2.0.0 unicode-match-property-value-ecmascript: 2.1.0 - registry-auth-token@4.2.2: - dependencies: - rc: 1.2.8 - - registry-url@5.1.0: - dependencies: - rc: 1.2.8 - regjsparser@0.9.1: dependencies: jsesc: 0.5.0 @@ -10245,8 +9366,6 @@ snapshots: reselect@5.1.0: {} - resolve-alpn@1.2.1: {} - resolve-cwd@3.0.0: dependencies: resolve-from: 5.0.0 @@ -10271,10 +9390,6 @@ snapshots: path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - responselike@2.0.1: - dependencies: - lowercase-keys: 2.0.0 - restore-cursor@3.1.0: dependencies: onetime: 5.1.2 @@ -10297,25 +9412,26 @@ snapshots: optionalDependencies: fsevents: 2.3.3 - rollup@4.14.0: + rollup@4.17.2: dependencies: '@types/estree': 1.0.5 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.14.0 - '@rollup/rollup-android-arm64': 4.14.0 - '@rollup/rollup-darwin-arm64': 4.14.0 - '@rollup/rollup-darwin-x64': 4.14.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.14.0 - '@rollup/rollup-linux-arm64-gnu': 4.14.0 - '@rollup/rollup-linux-arm64-musl': 4.14.0 - '@rollup/rollup-linux-powerpc64le-gnu': 4.14.0 - '@rollup/rollup-linux-riscv64-gnu': 4.14.0 - '@rollup/rollup-linux-s390x-gnu': 4.14.0 - '@rollup/rollup-linux-x64-gnu': 4.14.0 - '@rollup/rollup-linux-x64-musl': 4.14.0 - '@rollup/rollup-win32-arm64-msvc': 4.14.0 - '@rollup/rollup-win32-ia32-msvc': 4.14.0 - '@rollup/rollup-win32-x64-msvc': 4.14.0 + '@rollup/rollup-android-arm-eabi': 4.17.2 + '@rollup/rollup-android-arm64': 4.17.2 + '@rollup/rollup-darwin-arm64': 4.17.2 + '@rollup/rollup-darwin-x64': 4.17.2 + '@rollup/rollup-linux-arm-gnueabihf': 4.17.2 + '@rollup/rollup-linux-arm-musleabihf': 4.17.2 + '@rollup/rollup-linux-arm64-gnu': 4.17.2 + '@rollup/rollup-linux-arm64-musl': 4.17.2 + '@rollup/rollup-linux-powerpc64le-gnu': 4.17.2 + '@rollup/rollup-linux-riscv64-gnu': 4.17.2 + '@rollup/rollup-linux-s390x-gnu': 4.17.2 + '@rollup/rollup-linux-x64-gnu': 4.17.2 + '@rollup/rollup-linux-x64-musl': 4.17.2 + '@rollup/rollup-win32-arm64-msvc': 4.17.2 + '@rollup/rollup-win32-ia32-msvc': 4.17.2 + '@rollup/rollup-win32-x64-msvc': 4.17.2 fsevents: 2.3.3 run-async@3.0.0: {} @@ -10347,14 +9463,10 @@ snapshots: dependencies: xmlchars: 2.2.0 - scheduler@0.23.0: + scheduler@0.23.2: dependencies: loose-envify: 1.4.0 - semver-diff@3.1.1: - dependencies: - semver: 6.3.1 - semver@6.3.1: {} semver@7.6.0: @@ -10482,10 +9594,6 @@ snapshots: statuses@2.0.1: {} - stop-iteration-iterator@1.0.0: - dependencies: - internal-slot: 1.0.7 - stream-combiner@0.2.2: dependencies: duplexer: 0.1.2 @@ -10522,7 +9630,7 @@ snapshots: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.23.2 + es-abstract: 1.23.3 es-errors: 1.3.0 es-object-atoms: 1.0.0 get-intrinsic: 1.2.4 @@ -10537,7 +9645,7 @@ snapshots: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.23.2 + es-abstract: 1.23.3 es-object-atoms: 1.0.0 string.prototype.trimend@1.0.8: @@ -10546,11 +9654,11 @@ snapshots: define-properties: 1.2.1 es-object-atoms: 1.0.0 - string.prototype.trimstart@1.0.7: + string.prototype.trimstart@1.0.8: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-object-atoms: 1.0.0 string_decoder@1.3.0: dependencies: @@ -10584,8 +9692,6 @@ snapshots: dependencies: min-indent: 1.0.1 - strip-json-comments@2.0.1: {} - strip-json-comments@3.1.1: {} stylis@4.2.0: {} @@ -10643,10 +9749,6 @@ snapshots: tiny-case@1.0.3: {} - tmp@0.0.33: - dependencies: - os-tmpdir: 1.0.2 - tmpl@1.0.5: {} to-fast-properties@2.0.0: {} @@ -10657,7 +9759,7 @@ snapshots: toposort@2.0.2: {} - tough-cookie@4.1.3: + tough-cookie@4.1.4: dependencies: psl: 1.9.0 punycode: 2.3.1 @@ -10674,50 +9776,50 @@ snapshots: triple-beam@1.4.1: {} - ts-api-utils@1.3.0(typescript@5.4.2): + ts-api-utils@1.3.0(typescript@5.4.5): dependencies: - typescript: 5.4.2 + typescript: 5.4.5 - ts-jest@29.1.2(@babel/core@7.24.3)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.24.3))(jest@29.7.0(@types/node@20.11.30)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.4.8)(@types/node@20.11.30)(typescript@5.4.2)))(typescript@5.4.2): + ts-jest@29.1.2(@babel/core@7.24.5)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.24.5))(jest@29.7.0(@types/node@20.12.8)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.4.17)(@types/node@20.12.8)(typescript@5.4.5)))(typescript@5.4.5): dependencies: bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@20.11.30)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.4.8)(@types/node@20.11.30)(typescript@5.4.2)) + jest: 29.7.0(@types/node@20.12.8)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.4.17)(@types/node@20.12.8)(typescript@5.4.5)) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 make-error: 1.3.6 semver: 7.6.0 - typescript: 5.4.2 + typescript: 5.4.5 yargs-parser: 21.1.1 optionalDependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.5 '@jest/types': 29.6.3 - babel-jest: 29.7.0(@babel/core@7.24.3) + babel-jest: 29.7.0(@babel/core@7.24.5) - ts-node@10.9.2(@swc/core@1.4.8)(@types/node@20.11.30)(typescript@5.4.2): + ts-node@10.9.2(@swc/core@1.4.17)(@types/node@20.12.8)(typescript@5.4.5): dependencies: '@cspotcode/source-map-support': 0.8.1 - '@tsconfig/node10': 1.0.9 + '@tsconfig/node10': 1.0.11 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 20.11.30 + '@types/node': 20.12.8 acorn: 8.11.3 acorn-walk: 8.3.2 arg: 4.1.3 create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 5.4.2 + typescript: 5.4.5 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 optionalDependencies: - '@swc/core': 1.4.8 + '@swc/core': 1.4.17 - tsc-files@1.1.4(typescript@5.4.2): + tsc-files@1.1.4(typescript@5.4.5): dependencies: - typescript: 5.4.2 + typescript: 5.4.5 tsconfig-paths@3.15.0: dependencies: @@ -10742,9 +9844,7 @@ snapshots: type-fest@2.19.0: {} - type-fest@3.13.1: {} - - type-fest@4.18.0: {} + type-fest@4.18.1: {} typed-array-buffer@1.0.2: dependencies: @@ -10769,7 +9869,7 @@ snapshots: has-proto: 1.0.3 is-typed-array: 1.1.13 - typed-array-length@1.0.5: + typed-array-length@1.0.6: dependencies: call-bind: 1.0.7 for-each: 0.3.3 @@ -10778,11 +9878,7 @@ snapshots: is-typed-array: 1.1.13 possible-typed-array-names: 1.0.0 - typedarray-to-buffer@3.1.5: - dependencies: - is-typedarray: 1.0.0 - - typescript@5.4.2: {} + typescript@5.4.5: {} unbox-primitive@1.0.2: dependencies: @@ -10820,7 +9916,7 @@ snapshots: upath@1.2.0: {} - update-browserslist-db@1.0.13(browserslist@4.23.0): + update-browserslist-db@1.0.14(browserslist@4.23.0): dependencies: browserslist: 4.23.0 escalade: 3.1.2 @@ -10835,9 +9931,9 @@ snapshots: querystringify: 2.2.0 requires-port: 1.0.0 - use-sync-external-store@1.2.0(react@18.2.0): + use-sync-external-store@1.2.2(react@18.3.1): dependencies: - react: 18.2.0 + react: 18.3.1 util-deprecate@1.0.2: {} @@ -10849,24 +9945,24 @@ snapshots: '@types/istanbul-lib-coverage': 2.0.6 convert-source-map: 2.0.0 - vite-plugin-pwa@0.19.5(vite@5.2.6(@types/node@20.11.30)(terser@5.31.0))(workbox-build@7.1.0(@types/babel__core@7.20.5))(workbox-window@7.1.0): + vite-plugin-pwa@0.20.0(vite@5.2.11(@types/node@20.12.8)(terser@5.31.0))(workbox-build@7.1.0(@types/babel__core@7.20.5))(workbox-window@7.1.0): dependencies: debug: 4.3.4 fast-glob: 3.3.2 pretty-bytes: 6.1.1 - vite: 5.2.6(@types/node@20.11.30)(terser@5.31.0) + vite: 5.2.11(@types/node@20.12.8)(terser@5.31.0) workbox-build: 7.1.0(@types/babel__core@7.20.5) workbox-window: 7.1.0 transitivePeerDependencies: - supports-color - vite@5.2.6(@types/node@20.11.30)(terser@5.31.0): + vite@5.2.11(@types/node@20.12.8)(terser@5.31.0): dependencies: esbuild: 0.20.2 postcss: 8.4.38 - rollup: 4.14.0 + rollup: 4.17.2 optionalDependencies: - '@types/node': 20.11.30 + '@types/node': 20.12.8 fsevents: 2.3.3 terser: 5.31.0 @@ -10953,17 +10049,13 @@ snapshots: dependencies: isexe: 3.1.1 - widest-line@3.1.0: - dependencies: - string-width: 4.2.3 - winston-transport@4.7.0: dependencies: logform: 2.6.0 readable-stream: 3.6.2 triple-beam: 1.4.1 - winston@3.12.0: + winston@3.13.0: dependencies: '@colors/colors': 1.6.0 '@dabh/diagnostics': 2.0.3 @@ -10977,6 +10069,8 @@ snapshots: triple-beam: 1.4.1 winston-transport: 4.7.0 + word-wrap@1.2.5: {} + workbox-background-sync@7.1.0: dependencies: idb: 7.1.1 @@ -11116,21 +10210,12 @@ snapshots: wrappy@1.0.2: {} - write-file-atomic@3.0.3: - dependencies: - imurmurhash: 0.1.4 - is-typedarray: 1.0.0 - signal-exit: 3.0.7 - typedarray-to-buffer: 3.1.5 - write-file-atomic@4.0.2: dependencies: imurmurhash: 0.1.4 signal-exit: 3.0.7 - ws@8.16.0: {} - - xdg-basedir@4.0.0: {} + ws@8.17.0: {} xml-name-validator@4.0.0: {} From 4b98284f53acb35ae8267eddd1464a04a995c264 Mon Sep 17 00:00:00 2001 From: Chao <89126516+mrcuriosity-tw@users.noreply.github.com> Date: Mon, 6 May 2024 14:56:29 +0800 Subject: [PATCH 64/81] [ADM-931]: [frontend]: optimization of sorting button (#1427) * ADM-931:[frontend]fix imported config file & make sorting button disabled in three conditions * ADM-931:[frontend]config file with wrong sortType should show alert * ADM-931:[frontend]add test * ADM-931:[frontend]refactor sort time range * ADM-931:[frontend]add test * [ADM-931] chore: remove unnecessary code. * [ADM-931] feat: remove unnecessary code. * [ADM-931] feat: reduce unnecesssary state. * [ADM-931] feat: reset `sortIndex` to a constant integer when removing * [ADM-931] feat: optimize code. * [ADM-931] chore: update dependencies accordinglly. * [ADM-931] test: give more accurate test fixtures. * [ADM-931] test: remove unnecessary spy and case. * [ADM-931] chore: update trivignore --------- Co-authored-by: Pengfei Qian --- .trivyignore | 1 + .../ConfigStep/DateRangePicker.test.tsx | 249 +- .../ConfigStep/SortingDateRange.test.tsx | 47 +- .../__tests__/context/configSlice.test.ts | 50 + frontend/pnpm-lock.yaml | 11899 +++++++--------- .../DateRangePicker/DateRangePicker.tsx | 20 +- .../DateRangePicker/DateRangePickerGroup.tsx | 49 +- .../DateRangePicker/SortingDateRange.tsx | 33 +- .../ConfigStep/DateRangePicker/index.tsx | 25 +- .../ConfigStep/DateRangePicker/style.tsx | 18 +- .../ConfigStep/DateRangePicker/types.ts | 13 +- .../src/containers/MetricsStepper/index.tsx | 5 - frontend/src/context/config/configSlice.ts | 7 +- 13 files changed, 5763 insertions(+), 6653 deletions(-) diff --git a/.trivyignore b/.trivyignore index c5fb36668b..73db827c33 100644 --- a/.trivyignore +++ b/.trivyignore @@ -17,3 +17,4 @@ CVE-2024-28085 CVE-2024-22262 CVE-2024-2961 CVE-2019-10744 +CVE-2024-33599 \ No newline at end of file diff --git a/frontend/__tests__/containers/ConfigStep/DateRangePicker.test.tsx b/frontend/__tests__/containers/ConfigStep/DateRangePicker.test.tsx index b209ed96e3..27e0375673 100644 --- a/frontend/__tests__/containers/ConfigStep/DateRangePicker.test.tsx +++ b/frontend/__tests__/containers/ConfigStep/DateRangePicker.test.tsx @@ -1,4 +1,5 @@ import { updateShouldGetBoardConfig, updateShouldGetPipelineConfig } from '@src/context/Metrics/metricsSlice'; +import { SortedDateRangeType, sortFn, SortType } from '@src/containers/ConfigStep/DateRangePicker/types'; import { basicInfoDefaultValues } from '@src/containers/ConfigStep/Form/useDefaultValues'; import { DateRangePickerSection } from '@src/containers/ConfigStep/DateRangePicker'; import { basicInfoSchema } from '@src/containers/ConfigStep/Form/schema'; @@ -7,7 +8,11 @@ import { render, screen, within } from '@testing-library/react'; import { setupStore } from '../../utils/setupStoreUtil'; import { FormProvider } from '@test/utils/FormProvider'; import userEvent from '@testing-library/user-event'; +import { ThemeProvider } from '@mui/material'; import { Provider } from 'react-redux'; +import sortBy from 'lodash/sortBy'; +import { theme } from '@src/theme'; +import get from 'lodash/get'; import React from 'react'; import dayjs from 'dayjs'; @@ -29,9 +34,11 @@ const setup = () => { store = setupStore(); return render( - - - + + + + + , ); }; @@ -230,6 +237,48 @@ describe('DateRangePickerSection', () => { expect(screen.getByText(TIME_RANGE_ERROR_MESSAGE.START_DATE_INVALID_TEXT)).toBeVisible(); expect(screen.getByText(TIME_RANGE_ERROR_MESSAGE.END_DATE_INVALID_TEXT)).toBeVisible(); }); + + it('should provide unified error message when given all invalid time input', async () => { + const correctRange = ['03/15/2024', '03/25/2024']; + const rangeOfTooEarly = ['03/15/1899', '03/25/1898']; + const rangeOfInvalidFormat = ['XXxYY/2024', 'ZZ/11/2024']; + const startDateRequiredErrorMessage = 'Start date is required'; + const endDateRequiredErrorMessage = 'End date is required'; + const unifiedStartDateErrorMessage = 'Start date is invalid'; + const unifiedEndDateErrorMessage = 'End date is invalid'; + + const ranges = screen.getAllByLabelText('Range picker row'); + const startDateInput = within(ranges[0]).getByRole('textbox', { name: START_DATE_LABEL }) as HTMLInputElement; + const endDateInput = within(ranges[0]).getByRole('textbox', { name: END_DATE_LABEL }) as HTMLInputElement; + await userEvent.type(startDateInput, rangeOfTooEarly[0]); + await userEvent.type(endDateInput, rangeOfTooEarly[1]); + + expect(await screen.findByText(unifiedStartDateErrorMessage)).toBeVisible(); + expect(await screen.findByText(unifiedEndDateErrorMessage)).toBeVisible(); + + await userEvent.clear(startDateInput); + await userEvent.clear(endDateInput); + await userEvent.keyboard('{Tab}'); + + expect(await screen.findByText(startDateRequiredErrorMessage)).toBeVisible(); + expect(await screen.findByText(endDateRequiredErrorMessage)).toBeVisible(); + + await userEvent.type(startDateInput, correctRange[0]); + await userEvent.type(endDateInput, correctRange[1]); + + expect(screen.queryByText(startDateRequiredErrorMessage)).toBeNull(); + expect(screen.queryByText(endDateRequiredErrorMessage)).toBeNull(); + expect(screen.queryByText(unifiedStartDateErrorMessage)).toBeNull(); + expect(screen.queryByText(unifiedEndDateErrorMessage)).toBeNull(); + + await userEvent.type(startDateInput, rangeOfInvalidFormat[0]); + await userEvent.type(endDateInput, rangeOfInvalidFormat[1]); + + expect(screen.queryByText(startDateRequiredErrorMessage)).toBeNull(); + expect(screen.queryByText(endDateRequiredErrorMessage)).toBeNull(); + expect(screen.queryByText(unifiedStartDateErrorMessage)).toBeVisible(); + expect(screen.queryByText(unifiedEndDateErrorMessage)).toBeVisible(); + }); }); describe('Sort date range behaviors', () => { @@ -243,108 +292,104 @@ describe('DateRangePickerSection', () => { const sortButtonContainer = screen.queryByLabelText('Sorting date range'); expect(sortButtonContainer).toBeNull(); }); - }); - it('should show sort button given more than one time range', async () => { - const rangeDate1 = ['03/15/2024', '03/25/2024']; - const rangeDate2 = ['03/08/2024', '03/11/2024']; - - const addButton = screen.getByLabelText('Button for adding date range'); - await userEvent.click(addButton); - const ranges = screen.getAllByLabelText('Range picker row'); - const startDate1Input = within(ranges[0]).getByRole('textbox', { name: START_DATE_LABEL }) as HTMLInputElement; - const endDate1Input = within(ranges[0]).getByRole('textbox', { name: END_DATE_LABEL }) as HTMLInputElement; - const startDate2Input = within(ranges[1]).getByRole('textbox', { name: START_DATE_LABEL }) as HTMLInputElement; - const endDate12nput = within(ranges[1]).getByRole('textbox', { name: END_DATE_LABEL }) as HTMLInputElement; - await userEvent.type(startDate1Input, rangeDate1[0]); - await userEvent.type(endDate1Input, rangeDate1[1]); - await userEvent.type(startDate2Input, rangeDate2[0]); - await userEvent.type(endDate12nput, rangeDate2[1]); - const sortButton = screen.getByLabelText('Sorting date range'); - expect(sortButton).toBeInTheDocument(); - }); + it('should show sort button given more than one time range', async () => { + const rangeDate1 = ['03/15/2024', '03/25/2024']; + const rangeDate2 = ['03/08/2024', '03/11/2024']; - it('should not show sort button given exist errors in date range', async () => { - const rangeDate1 = ['03/12/2024', '03/25/2024']; - const rangeDate2 = ['03/08/2024', '03/26/2024']; - - const addButton = screen.getByLabelText('Button for adding date range'); - await userEvent.click(addButton); - await userEvent.click(addButton); - const ranges = screen.getAllByLabelText('Range picker row'); - const startDate1Input = within(ranges[0]).getByRole('textbox', { name: START_DATE_LABEL }) as HTMLInputElement; - const endDate1Input = within(ranges[0]).getByRole('textbox', { name: END_DATE_LABEL }) as HTMLInputElement; - const startDate2Input = within(ranges[1]).getByRole('textbox', { name: START_DATE_LABEL }) as HTMLInputElement; - const endDate12nput = within(ranges[1]).getByRole('textbox', { name: END_DATE_LABEL }) as HTMLInputElement; - await userEvent.type(startDate1Input, rangeDate1[0]); - await userEvent.type(endDate1Input, rangeDate1[1]); - await userEvent.type(startDate2Input, rangeDate2[0]); - await userEvent.type(endDate12nput, rangeDate2[1]); - const sortButtonContainer = screen.queryByLabelText('Sorting date range'); - expect(sortButtonContainer).toBeNull(); - }); + const addButton = screen.getByLabelText('Button for adding date range'); + await userEvent.click(addButton); + const ranges = screen.getAllByLabelText('Range picker row'); + const startDate1Input = within(ranges[0]).getByRole('textbox', { name: START_DATE_LABEL }) as HTMLInputElement; + const endDate1Input = within(ranges[0]).getByRole('textbox', { name: END_DATE_LABEL }) as HTMLInputElement; + const startDate2Input = within(ranges[1]).getByRole('textbox', { name: START_DATE_LABEL }) as HTMLInputElement; + const endDate12nput = within(ranges[1]).getByRole('textbox', { name: END_DATE_LABEL }) as HTMLInputElement; + await userEvent.type(startDate1Input, rangeDate1[0]); + await userEvent.type(endDate1Input, rangeDate1[1]); + await userEvent.type(startDate2Input, rangeDate2[0]); + await userEvent.type(endDate12nput, rangeDate2[1]); + const sortButton = screen.getByLabelText('Sorting date range'); + expect(sortButton).toBeInTheDocument(); + }); - it('should update sort status when handleSortTypeChange is called', async () => { - const rangeDate1 = ['03/15/2024', '03/25/2024']; - const rangeDate2 = ['03/08/2024', '03/11/2024']; - - const addButton = screen.getByLabelText('Button for adding date range'); - await userEvent.click(addButton); - const ranges = screen.getAllByLabelText('Range picker row'); - const startDate1Input = within(ranges[0]).getByRole('textbox', { name: START_DATE_LABEL }) as HTMLInputElement; - const endDate1Input = within(ranges[0]).getByRole('textbox', { name: END_DATE_LABEL }) as HTMLInputElement; - const startDate2Input = within(ranges[1]).getByRole('textbox', { name: START_DATE_LABEL }) as HTMLInputElement; - const endDate12nput = within(ranges[1]).getByRole('textbox', { name: END_DATE_LABEL }) as HTMLInputElement; - await userEvent.type(startDate1Input, rangeDate1[0]); - await userEvent.type(endDate1Input, rangeDate1[1]); - await userEvent.type(startDate2Input, rangeDate2[0]); - await userEvent.type(endDate12nput, rangeDate2[1]); - const sortButton = screen.getByLabelText('sort button'); - await userEvent.click(sortButton); - expect(screen.getByRole('button', { name: 'Descending' })).toBeInTheDocument(); - await userEvent.click(sortButton); - expect(screen.getByRole('button', { name: 'Ascending' })).toBeInTheDocument(); - }); + it('should disabled sort button given exist errors in date range', async () => { + const rangeDate1 = ['03/12/2024', '03/25/2024']; + const rangeDate2 = ['03/08/2024', '03/26/2024']; - it('should provide unified error message when given all invalid time input', async () => { - const correctRange = ['03/15/2024', '03/25/2024']; - const rangeOfTooEarly = ['03/15/1600', '03/25/1600']; - const rangeOfInvalidFormat = ['XXxYY/2024', 'ZZ/11/2024']; - const startDateRequiredErrorMessage = 'Start date is required'; - const endDateRequiredErrorMessage = 'End date is required'; - const unifiedStartDateErrorMessage = 'Start date is invalid'; - const unifiedEndDateErrorMessage = 'End date is invalid'; - - const ranges = screen.getAllByLabelText('Range picker row'); - const startDateInput = within(ranges[0]).getByRole('textbox', { name: START_DATE_LABEL }) as HTMLInputElement; - const endDateInput = within(ranges[0]).getByRole('textbox', { name: END_DATE_LABEL }) as HTMLInputElement; - await userEvent.type(startDateInput, rangeOfTooEarly[0]); - await userEvent.type(endDateInput, rangeOfTooEarly[1]); - - expect(await screen.findByText(unifiedStartDateErrorMessage)).toBeVisible(); - expect(await screen.findByText(unifiedEndDateErrorMessage)).toBeVisible(); - - await userEvent.clear(startDateInput); - await userEvent.clear(endDateInput); - await userEvent.keyboard('{Tab}'); - - expect(await screen.findByText(startDateRequiredErrorMessage)).toBeVisible(); - expect(await screen.findByText(endDateRequiredErrorMessage)).toBeVisible(); - - await userEvent.type(startDateInput, correctRange[0]); - await userEvent.type(endDateInput, correctRange[1]); - - expect(screen.queryByText(startDateRequiredErrorMessage)).toBeNull(); - expect(screen.queryByText(endDateRequiredErrorMessage)).toBeNull(); - expect(screen.queryByText(unifiedStartDateErrorMessage)).toBeNull(); - expect(screen.queryByText(unifiedEndDateErrorMessage)).toBeNull(); - - await userEvent.type(startDateInput, rangeOfInvalidFormat[0]); - await userEvent.type(endDateInput, rangeOfInvalidFormat[1]); - - expect(screen.queryByText(startDateRequiredErrorMessage)).toBeNull(); - expect(screen.queryByText(endDateRequiredErrorMessage)).toBeNull(); - expect(screen.queryByText(unifiedStartDateErrorMessage)).toBeVisible(); - expect(screen.queryByText(unifiedEndDateErrorMessage)).toBeVisible(); + const addButton = screen.getByLabelText('Button for adding date range'); + await userEvent.click(addButton); + await userEvent.click(addButton); + const ranges = screen.getAllByLabelText('Range picker row'); + const startDate1Input = within(ranges[0]).getByRole('textbox', { name: START_DATE_LABEL }) as HTMLInputElement; + const endDate1Input = within(ranges[0]).getByRole('textbox', { name: END_DATE_LABEL }) as HTMLInputElement; + const startDate2Input = within(ranges[1]).getByRole('textbox', { name: START_DATE_LABEL }) as HTMLInputElement; + const endDate12nput = within(ranges[1]).getByRole('textbox', { name: END_DATE_LABEL }) as HTMLInputElement; + await userEvent.type(startDate1Input, rangeDate1[0]); + await userEvent.type(endDate1Input, rangeDate1[1]); + await userEvent.type(startDate2Input, rangeDate2[0]); + await userEvent.type(endDate12nput, rangeDate2[1]); + const sortButtonContainer = screen.queryByLabelText('sort button'); + expect(sortButtonContainer).toBeDisabled(); + }); + + it('should update sort status when handleSortTypeChange is called', async () => { + const rangeDate1 = ['03/15/2024', '03/25/2024']; + const rangeDate2 = ['03/08/2024', '03/11/2024']; + + const addButton = screen.getByLabelText('Button for adding date range'); + await userEvent.click(addButton); + const ranges = screen.getAllByLabelText('Range picker row'); + const startDate1Input = within(ranges[0]).getByRole('textbox', { name: START_DATE_LABEL }) as HTMLInputElement; + const endDate1Input = within(ranges[0]).getByRole('textbox', { name: END_DATE_LABEL }) as HTMLInputElement; + const startDate2Input = within(ranges[1]).getByRole('textbox', { name: START_DATE_LABEL }) as HTMLInputElement; + const endDate12nput = within(ranges[1]).getByRole('textbox', { name: END_DATE_LABEL }) as HTMLInputElement; + await userEvent.type(startDate1Input, rangeDate1[0]); + await userEvent.type(endDate1Input, rangeDate1[1]); + await userEvent.type(startDate2Input, rangeDate2[0]); + await userEvent.type(endDate12nput, rangeDate2[1]); + const sortButton = screen.getByLabelText('sort button'); + await userEvent.click(sortButton); + expect(screen.getByRole('button', { name: 'Descending' })).toBeInTheDocument(); + await userEvent.click(sortButton); + expect(screen.getByRole('button', { name: 'Ascending' })).toBeInTheDocument(); + }); + const dateRange1: SortedDateRangeType = { + startDate: '2024-03-10', + endDate: '2024-03-15', + sortIndex: 1, + startDateError: null, + endDateError: null, + }; + + const dateRange2: SortedDateRangeType = { + startDate: '2024-03-05', + endDate: '2024-03-08', + sortIndex: 2, + startDateError: null, + endDateError: null, + }; + + const dateRange3: SortedDateRangeType = { + startDate: '2024-03-20', + endDate: '2024-03-25', + sortIndex: 3, + startDateError: null, + endDateError: null, + }; + + it('should correctly sort by default sortIndex', () => { + const sorted = [dateRange1, dateRange2, dateRange3].sort(sortFn[SortType.DEFAULT]); + expect(sorted).toEqual([dateRange1, dateRange2, dateRange3]); + }); + + it('should correctly sort by startDate in descending order', () => { + const sorted = sortBy([dateRange1, dateRange2, dateRange3], get(sortFn, SortType.DESCENDING)); + expect(sorted).toEqual([dateRange3, dateRange1, dateRange2]); + }); + + it('should correctly sort by startDate in ascending order', () => { + const sorted = sortBy([dateRange1, dateRange2, dateRange3], get(sortFn, SortType.ASCENDING)); + expect(sorted).toEqual([dateRange2, dateRange1, dateRange3]); + }); }); }); diff --git a/frontend/__tests__/containers/ConfigStep/SortingDateRange.test.tsx b/frontend/__tests__/containers/ConfigStep/SortingDateRange.test.tsx index e7e22fe33c..0aa7047f9f 100644 --- a/frontend/__tests__/containers/ConfigStep/SortingDateRange.test.tsx +++ b/frontend/__tests__/containers/ConfigStep/SortingDateRange.test.tsx @@ -1,10 +1,11 @@ +import { AscendingIcon, DescendingIcon } from '@src/containers/ConfigStep/DateRangePicker/style'; import { SortingDateRange } from '@src/containers/ConfigStep/DateRangePicker/SortingDateRange'; -import { SortType } from '@src/containers/ConfigStep/DateRangePicker/types'; -import { updateDateRangeSortType } from '@src/context/config/configSlice'; import { setupStore } from '@test/utils/setupStoreUtil'; import { render, screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; +import { ThemeProvider } from '@mui/material'; import { Provider } from 'react-redux'; +import { theme } from '@src/theme'; import React from 'react'; let store = setupStore(); @@ -12,14 +13,12 @@ const setup = () => { store = setupStore(); return render( - {}} sortType={SortType.DEFAULT} /> + + + , ); }; -jest.mock('@src/context/config/configSlice', () => ({ - ...jest.requireActual('@src/context/config/configSlice'), - updateDateRangeSortType: jest.fn().mockReturnValue({ type: 'SHOULD_UPDATE_SORT_STATUS' }), -})); describe('SortDateRange button behaviors', () => { it('should show sort time rang button', () => { @@ -34,23 +33,7 @@ describe('SortDateRange button behaviors', () => { expect(sortButton).toBeInTheDocument(); }); - it('should change sort order given SortButton is clicked', async () => { - setup(); - const sortButtonContainer = screen.getByLabelText('Sorting date range'); - expect(sortButtonContainer).toBeInTheDocument(); - - const sortTextButton = screen.getByText('Default sort'); - - expect(sortTextButton).toBeInTheDocument(); - - const sortButton = screen.getByLabelText('sort button'); - await userEvent.click(sortButton); - - expect(updateDateRangeSortType).toHaveBeenCalledTimes(1); - expect(updateDateRangeSortType).toHaveBeenCalledWith(SortType.DESCENDING); - }); - - it('should render right icon with sort status', async () => { + it('should change sort order iterately given SortButton is clicked', async () => { setup(); const sortButton = screen.getByLabelText('sort button'); await userEvent.click(sortButton); @@ -60,4 +43,20 @@ describe('SortDateRange button behaviors', () => { const arrowDropUp = screen.getByRole('button', { name: 'Ascending' }); expect(arrowDropUp).toBeInTheDocument(); }); + + it('should render AscendingIcon with correct styles', () => { + render(); + + const ascendingIcon = screen.getByTestId('ArrowDropUpIcon'); + expect(ascendingIcon).toBeInTheDocument(); + expect(ascendingIcon).toHaveStyle(`color: ${theme.main.button.disabled.color}`); + }); + + it('should render DescendingIcon with correct styles', () => { + render(); + + const descendingIcon = screen.getByTestId('ArrowDropDownIcon'); + expect(descendingIcon).toBeInTheDocument(); + expect(descendingIcon).toHaveStyle(`color: ${theme.main.button.disabled.color}`); + }); }); diff --git a/frontend/__tests__/context/configSlice.test.ts b/frontend/__tests__/context/configSlice.test.ts index bc6d4f85ac..b11f0150a8 100644 --- a/frontend/__tests__/context/configSlice.test.ts +++ b/frontend/__tests__/context/configSlice.test.ts @@ -174,6 +174,7 @@ describe('config reducer', () => { payload: { ...MockBasicState, dateRange: mockDateRange, + sortType: SortType.DEFAULT, }, }; @@ -203,4 +204,53 @@ describe('config reducer', () => { expect(config.basic.dateRange[0]).toEqual(mockDateRange); }); + + it('should set warning message when imported sortType is invalid', () => { + const initialState = { + ...initialConfigState, + isProjectCreated: false, + }; + const mockDateRange = [ + { + startDate: '2024-01-15T00:00:00.000+08:00', + endDate: '2024-01-16T00:00:00.000+08:00', + }, + { + startDate: '2024-01-17T00:00:00.000+08:00', + endDate: '2024-01-18T00:00:00.000+08:00', + }, + ]; + const action = { + type: 'config/updateBasicConfigState', + payload: { ...MockBasicState, dateRange: mockDateRange, sortType: 'test' }, + }; + const config = configReducer(initialState, action); + expect(config.warningMessage).toBe(CONFIG_PAGE_VERIFY_IMPORT_ERROR_MESSAGE); + }); + + it('should not set warning message when imported date ranges has length 1 and importedSortType is null', () => { + const initialState = { + ...initialConfigState, + isProjectCreated: false, + }; + const action = { + type: 'config/updateBasicConfigState', + payload: { ...MockBasicState, dateRange: [MockBasicState.dateRange[0]], sortType: null }, + }; + const config = configReducer(initialState, action); + expect(config.warningMessage).toBe(null); + }); + + it('should set warning message when imported date ranges has length 1 and importedSortType is valid', () => { + const initialState = { + ...initialConfigState, + isProjectCreated: false, + }; + const action = { + type: 'config/updateBasicConfigState', + payload: { ...MockBasicState, dateRange: [MockBasicState.dateRange[0]], sortType: SortType.DEFAULT }, + }; + const config = configReducer(initialState, action); + expect(config.warningMessage).toBe(null); + }); }); diff --git a/frontend/pnpm-lock.yaml b/frontend/pnpm-lock.yaml index 8b8e7dc2a4..dc952b6734 100644 --- a/frontend/pnpm-lock.yaml +++ b/frontend/pnpm-lock.yaml @@ -1,858 +1,1705 @@ -lockfileVersion: '9.0' +lockfileVersion: '6.0' settings: autoInstallPeers: true excludeLinksFromLockfile: false -importers: - - .: - dependencies: - '@emotion/react': - specifier: ^11.11.4 - version: 11.11.4(@types/react@18.3.1)(react@18.3.1) - '@emotion/styled': - specifier: ^11.11.5 - version: 11.11.5(@emotion/react@11.11.4(@types/react@18.3.1)(react@18.3.1))(@types/react@18.3.1)(react@18.3.1) - '@fontsource/roboto': - specifier: ^5.0.13 - version: 5.0.13 - '@hookform/resolvers': - specifier: ^3.3.4 - version: 3.3.4(react-hook-form@7.51.3(react@18.3.1)) - '@mui/icons-material': - specifier: ^5.15.16 - version: 5.15.16(@mui/material@5.15.16(@emotion/react@11.11.4(@types/react@18.3.1)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.1)(react@18.3.1))(@types/react@18.3.1)(react@18.3.1))(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.1)(react@18.3.1) - '@mui/material': - specifier: ^5.15.16 - version: 5.15.16(@emotion/react@11.11.4(@types/react@18.3.1)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.1)(react@18.3.1))(@types/react@18.3.1)(react@18.3.1))(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@mui/x-date-pickers': - specifier: ^7.3.2 - version: 7.3.2(@emotion/react@11.11.4(@types/react@18.3.1)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.1)(react@18.3.1))(@types/react@18.3.1)(react@18.3.1))(@mui/material@5.15.16(@emotion/react@11.11.4(@types/react@18.3.1)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.1)(react@18.3.1))(@types/react@18.3.1)(react@18.3.1))(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.1)(dayjs@1.11.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@reduxjs/toolkit': - specifier: ^2.2.3 - version: 2.2.3(react-redux@9.1.2(@types/react@18.3.1)(react@18.3.1)(redux@5.0.1))(react@18.3.1) - axios: - specifier: ^1.6.8 - version: 1.6.8 - dayjs: - specifier: ^1.11.11 - version: 1.11.11 - lodash: - specifier: ^4.17.21 - version: 4.17.21 - lodash.camelcase: - specifier: ^4.3.0 - version: 4.3.0 - react: - specifier: ^18.3.1 - version: 18.3.1 - react-dom: - specifier: ^18.3.1 - version: 18.3.1(react@18.3.1) - react-error-boundary: - specifier: ^4.0.13 - version: 4.0.13(react@18.3.1) - react-hook-form: - specifier: ^7.51.3 - version: 7.51.3(react@18.3.1) - react-redux: - specifier: ^9.1.2 - version: 9.1.2(@types/react@18.3.1)(react@18.3.1)(redux@5.0.1) - react-router-dom: - specifier: ^6.23.0 - version: 6.23.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - typescript: - specifier: ^5.4.5 - version: 5.4.5 - vite: - specifier: ^5.2.11 - version: 5.2.11(@types/node@20.12.8)(terser@5.31.0) - vite-plugin-pwa: - specifier: ^0.20.0 - version: 0.20.0(vite@5.2.11(@types/node@20.12.8)(terser@5.31.0))(workbox-build@7.1.0(@types/babel__core@7.20.5))(workbox-window@7.1.0) - yup: - specifier: ^1.4.0 - version: 1.4.0 - devDependencies: - '@dotenvx/dotenvx': - specifier: ^0.37.1 - version: 0.37.1 - '@playwright/test': - specifier: ^1.43.1 - version: 1.43.1 - '@testing-library/jest-dom': - specifier: ^6.4.3 - version: 6.4.3(@jest/globals@29.7.0)(@types/jest@29.5.12)(jest@29.7.0(@types/node@20.12.8)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.4.17)(@types/node@20.12.8)(typescript@5.4.5))) - '@testing-library/react': - specifier: ^15.0.6 - version: 15.0.6(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@testing-library/user-event': - specifier: ^14.5.2 - version: 14.5.2(@testing-library/dom@10.1.0) - '@types/jest': - specifier: ^29.5.12 - version: 29.5.12 - '@types/lodash': - specifier: ^4.17.0 - version: 4.17.0 - '@types/lodash.camelcase': - specifier: ^4.3.9 - version: 4.3.9 - '@types/node': - specifier: ^20.12.8 - version: 20.12.8 - '@types/node-fetch': - specifier: ^2.6.11 - version: 2.6.11 - '@types/react': - specifier: ^18.3.1 - version: 18.3.1 - '@types/react-dom': - specifier: ^18.3.0 - version: 18.3.0 - '@types/react-redux': - specifier: ^7.1.33 - version: 7.1.33 - '@typescript-eslint/eslint-plugin': - specifier: ^7.8.0 - version: 7.8.0(@typescript-eslint/parser@7.8.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5) - '@typescript-eslint/parser': - specifier: ^7.8.0 - version: 7.8.0(eslint@8.57.0)(typescript@5.4.5) - '@vitejs/plugin-react-swc': - specifier: ^3.6.0 - version: 3.6.0(vite@5.2.11(@types/node@20.12.8)(terser@5.31.0)) - audit-ci: - specifier: ^6.6.1 - version: 6.6.1 - autoprefixer: - specifier: ^10.4.19 - version: 10.4.19(postcss@8.4.38) - csv-parse: - specifier: ^5.5.5 - version: 5.5.5 - eslint: - specifier: ^8.57.0 - version: 8.57.0 - eslint-config-prettier: - specifier: ^9.1.0 - version: 9.1.0(eslint@8.57.0) - eslint-plugin-import: - specifier: ^2.29.1 - version: 2.29.1(@typescript-eslint/parser@7.8.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0) - eslint-plugin-n: - specifier: ^17.4.0 - version: 17.4.0(eslint@8.57.0) - eslint-plugin-prettier: - specifier: ^5.1.3 - version: 5.1.3(eslint-config-prettier@9.1.0(eslint@8.57.0))(eslint@8.57.0)(prettier@3.2.5) - eslint-plugin-promise: - specifier: ^6.1.1 - version: 6.1.1(eslint@8.57.0) - eslint-plugin-react: - specifier: ^7.34.1 - version: 7.34.1(eslint@8.57.0) - eslint-plugin-react-hooks: - specifier: ^4.6.2 - version: 4.6.2(eslint@8.57.0) - execa: - specifier: ^8.0.1 - version: 8.0.1 - husky: - specifier: ^9.0.11 - version: 9.0.11 - identity-obj-proxy: - specifier: ^3.0.0 - version: 3.0.0 - jest: - specifier: ^29.7.0 - version: 29.7.0(@types/node@20.12.8)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.4.17)(@types/node@20.12.8)(typescript@5.4.5)) - jest-environment-jsdom: - specifier: ^29.7.0 - version: 29.7.0 - license-compliance: - specifier: ^3.0.0 - version: 3.0.0(typescript@5.4.5) - lint-staged: - specifier: ^15.2.2 - version: 15.2.2 - msw: - specifier: ^2.2.14 - version: 2.2.14(typescript@5.4.5) - node-fetch: - specifier: ^3.3.2 - version: 3.3.2 - prettier: - specifier: 3.2.5 - version: 3.2.5 - prettier-plugin-sort-imports: - specifier: ^1.8.5 - version: 1.8.5(typescript@5.4.5) - ts-jest: - specifier: ^29.1.2 - version: 29.1.2(@babel/core@7.24.5)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.24.5))(jest@29.7.0(@types/node@20.12.8)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.4.17)(@types/node@20.12.8)(typescript@5.4.5)))(typescript@5.4.5) - ts-node: - specifier: ^10.9.2 - version: 10.9.2(@swc/core@1.4.17)(@types/node@20.12.8)(typescript@5.4.5) - tsc-files: - specifier: ^1.1.4 - version: 1.1.4(typescript@5.4.5) - undici: - specifier: ^6.15.0 - version: 6.15.0 - web-streams-polyfill: - specifier: ^4.0.0 - version: 4.0.0 +dependencies: + '@emotion/react': + specifier: ^11.11.4 + version: 11.11.4(@types/react@18.3.1)(react@18.3.1) + '@emotion/styled': + specifier: ^11.11.5 + version: 11.11.5(@emotion/react@11.11.4)(@types/react@18.3.1)(react@18.3.1) + '@fontsource/roboto': + specifier: ^5.0.13 + version: 5.0.13 + '@hookform/resolvers': + specifier: ^3.3.4 + version: 3.3.4(react-hook-form@7.51.3) + '@mui/icons-material': + specifier: ^5.15.16 + version: 5.15.16(@mui/material@5.15.16)(@types/react@18.3.1)(react@18.3.1) + '@mui/material': + specifier: ^5.15.16 + version: 5.15.16(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) + '@mui/x-date-pickers': + specifier: ^7.3.2 + version: 7.3.2(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@mui/material@5.15.16)(@types/react@18.3.1)(dayjs@1.11.11)(react-dom@18.3.1)(react@18.3.1) + '@reduxjs/toolkit': + specifier: ^2.2.3 + version: 2.2.3(react-redux@9.1.2)(react@18.3.1) + axios: + specifier: ^1.6.8 + version: 1.6.8 + dayjs: + specifier: ^1.11.11 + version: 1.11.11 + lodash: + specifier: ^4.17.21 + version: 4.17.21 + lodash.camelcase: + specifier: ^4.3.0 + version: 4.3.0 + react: + specifier: ^18.3.1 + version: 18.3.1 + react-dom: + specifier: ^18.3.1 + version: 18.3.1(react@18.3.1) + react-error-boundary: + specifier: ^4.0.13 + version: 4.0.13(react@18.3.1) + react-hook-form: + specifier: ^7.51.3 + version: 7.51.3(react@18.3.1) + react-redux: + specifier: ^9.1.2 + version: 9.1.2(@types/react@18.3.1)(react@18.3.1)(redux@5.0.1) + react-router-dom: + specifier: ^6.23.0 + version: 6.23.0(react-dom@18.3.1)(react@18.3.1) + typescript: + specifier: ^5.4.5 + version: 5.4.5 + vite: + specifier: ^5.2.11 + version: 5.2.11(@types/node@20.12.8) + vite-plugin-pwa: + specifier: ^0.20.0 + version: 0.20.0(vite@5.2.11)(workbox-build@7.1.0)(workbox-window@7.1.0) + yup: + specifier: ^1.4.0 + version: 1.4.0 + +devDependencies: + '@dotenvx/dotenvx': + specifier: ^0.37.1 + version: 0.37.1 + '@playwright/test': + specifier: ^1.43.1 + version: 1.43.1 + '@testing-library/jest-dom': + specifier: ^6.4.3 + version: 6.4.5(@types/jest@29.5.12)(jest@29.7.0) + '@testing-library/react': + specifier: ^15.0.6 + version: 15.0.6(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) + '@testing-library/user-event': + specifier: ^14.5.2 + version: 14.5.2(@testing-library/dom@9.3.4) + '@types/jest': + specifier: ^29.5.12 + version: 29.5.12 + '@types/lodash': + specifier: ^4.17.0 + version: 4.17.0 + '@types/lodash.camelcase': + specifier: ^4.3.9 + version: 4.3.9 + '@types/node': + specifier: ^20.12.8 + version: 20.12.8 + '@types/node-fetch': + specifier: ^2.6.11 + version: 2.6.11 + '@types/react': + specifier: ^18.3.1 + version: 18.3.1 + '@types/react-dom': + specifier: ^18.3.0 + version: 18.3.0 + '@types/react-redux': + specifier: ^7.1.33 + version: 7.1.33 + '@typescript-eslint/eslint-plugin': + specifier: ^7.8.0 + version: 7.8.0(@typescript-eslint/parser@7.8.0)(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/parser': + specifier: ^7.8.0 + version: 7.8.0(eslint@8.57.0)(typescript@5.4.5) + '@vitejs/plugin-react-swc': + specifier: ^3.6.0 + version: 3.6.0(vite@5.2.11) + audit-ci: + specifier: ^6.6.1 + version: 6.6.1 + autoprefixer: + specifier: ^10.4.19 + version: 10.4.19(postcss@8.4.38) + csv-parse: + specifier: ^5.5.5 + version: 5.5.5 + eslint: + specifier: ^8.57.0 + version: 8.57.0 + eslint-config-prettier: + specifier: ^9.1.0 + version: 9.1.0(eslint@8.57.0) + eslint-plugin-import: + specifier: ^2.29.1 + version: 2.29.1(@typescript-eslint/parser@7.8.0)(eslint@8.57.0) + eslint-plugin-n: + specifier: ^17.4.0 + version: 17.4.0(eslint@8.57.0) + eslint-plugin-prettier: + specifier: ^5.1.3 + version: 5.1.3(eslint-config-prettier@9.1.0)(eslint@8.57.0)(prettier@3.2.5) + eslint-plugin-promise: + specifier: ^6.1.1 + version: 6.1.1(eslint@8.57.0) + eslint-plugin-react: + specifier: ^7.34.1 + version: 7.34.1(eslint@8.57.0) + eslint-plugin-react-hooks: + specifier: ^4.6.2 + version: 4.6.2(eslint@8.57.0) + execa: + specifier: ^8.0.1 + version: 8.0.1 + husky: + specifier: ^9.0.11 + version: 9.0.11 + identity-obj-proxy: + specifier: ^3.0.0 + version: 3.0.0 + jest: + specifier: ^29.7.0 + version: 29.7.0(@types/node@20.12.8)(ts-node@10.9.2) + jest-environment-jsdom: + specifier: ^29.7.0 + version: 29.7.0 + license-compliance: + specifier: ^3.0.0 + version: 3.0.0(typescript@5.4.5) + lint-staged: + specifier: ^15.2.2 + version: 15.2.2 + msw: + specifier: ^2.2.14 + version: 2.2.14(typescript@5.4.5) + node-fetch: + specifier: ^3.3.2 + version: 3.3.2 + prettier: + specifier: 3.2.5 + version: 3.2.5 + prettier-plugin-sort-imports: + specifier: ^1.8.5 + version: 1.8.5(typescript@5.4.5) + ts-jest: + specifier: ^29.1.2 + version: 29.1.2(@babel/core@7.24.3)(jest@29.7.0)(typescript@5.4.5) + ts-node: + specifier: ^10.9.2 + version: 10.9.2(@types/node@20.12.8)(typescript@5.4.5) + tsc-files: + specifier: ^1.1.4 + version: 1.1.4(typescript@5.4.5) + undici: + specifier: ^6.15.0 + version: 6.15.0 + web-streams-polyfill: + specifier: ^4.0.0 + version: 4.0.0 packages: - '@adobe/css-tools@4.3.3': + /@aashutoshrathi/word-wrap@1.2.6: + resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} + engines: {node: '>=0.10.0'} + dev: true + + /@adobe/css-tools@4.3.3: resolution: {integrity: sha512-rE0Pygv0sEZ4vBWHlAgJLGDU7Pm8xoO6p3wsEceb7GYAjScrOHpEo8KK/eVkAcnSM+slAEtXjA2JpdjLp4fJQQ==} + dev: true - '@ampproject/remapping@2.3.0': + /@ampproject/remapping@2.3.0: resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 - '@apideck/better-ajv-errors@0.3.6': + /@apideck/better-ajv-errors@0.3.6(ajv@8.12.0): resolution: {integrity: sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==} engines: {node: '>=10'} peerDependencies: ajv: '>=8' + dependencies: + ajv: 8.12.0 + json-schema: 0.4.0 + jsonpointer: 5.0.1 + leven: 3.1.0 + dev: false - '@babel/code-frame@7.24.2': + /@babel/code-frame@7.24.2: resolution: {integrity: sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==} engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.24.2 + picocolors: 1.0.0 + + /@babel/compat-data@7.24.1: + resolution: {integrity: sha512-Pc65opHDliVpRHuKfzI+gSA4zcgr65O4cl64fFJIWEEh8JoHIHh0Oez1Eo8Arz8zq/JhgKodQaxEwUPRtZylVA==} + engines: {node: '>=6.9.0'} - '@babel/compat-data@7.24.4': + /@babel/compat-data@7.24.4: resolution: {integrity: sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==} engines: {node: '>=6.9.0'} + dev: false + + /@babel/core@7.24.3: + resolution: {integrity: sha512-5FcvN1JHw2sHJChotgx8Ek0lyuh4kCKelgMTTqhYJJtloNvUfpAFMeNQUtdlIaktwrSV9LtCdqwk48wL2wBacQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.24.2 + '@babel/generator': 7.24.1 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.3) + '@babel/helpers': 7.24.1 + '@babel/parser': 7.24.1 + '@babel/template': 7.24.0 + '@babel/traverse': 7.24.1 + '@babel/types': 7.24.0 + convert-source-map: 2.0.0 + debug: 4.3.4 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/core@7.24.4: + resolution: {integrity: sha512-MBVlMXP+kkl5394RBLSxxk/iLTeVGuXTV3cIDXavPpMMqnSnt6apKgan/U8O3USWZCWZT/TbgfEpKa4uMgN4Dg==} + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.24.2 + '@babel/generator': 7.24.4 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.4) + '@babel/helpers': 7.24.4 + '@babel/parser': 7.24.4 + '@babel/template': 7.24.0 + '@babel/traverse': 7.24.1 + '@babel/types': 7.24.0 + convert-source-map: 2.0.0 + debug: 4.3.4 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: false - '@babel/core@7.24.5': - resolution: {integrity: sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA==} + /@babel/generator@7.24.1: + resolution: {integrity: sha512-DfCRfZsBcrPEHUfuBMgbJ1Ut01Y/itOs+hY2nFLgqsqXd52/iSiVq5TITtUasIUgm+IIKdY2/1I7auiQOEeC9A==} engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.0 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 2.5.2 - '@babel/generator@7.24.5': - resolution: {integrity: sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA==} + /@babel/generator@7.24.4: + resolution: {integrity: sha512-Xd6+v6SnjWVx/nus+y0l1sxMOTOMBkyL4+BIdbALyatQnAe/SRVjANeDPSCYaX+i1iJmuGSKf3Z+E+V/va1Hvw==} engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.0 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 2.5.2 + dev: false - '@babel/helper-annotate-as-pure@7.22.5': + /@babel/helper-annotate-as-pure@7.22.5: resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.0 + dev: false - '@babel/helper-builder-binary-assignment-operator-visitor@7.22.15': + /@babel/helper-builder-binary-assignment-operator-visitor@7.22.15: resolution: {integrity: sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==} engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.0 + dev: false - '@babel/helper-compilation-targets@7.23.6': + /@babel/helper-compilation-targets@7.23.6: resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==} engines: {node: '>=6.9.0'} + dependencies: + '@babel/compat-data': 7.24.1 + '@babel/helper-validator-option': 7.23.5 + browserslist: 4.23.0 + lru-cache: 5.1.1 + semver: 6.3.1 - '@babel/helper-create-class-features-plugin@7.24.5': - resolution: {integrity: sha512-uRc4Cv8UQWnE4NXlYTIIdM7wfFkOqlFztcC/gVXDKohKoVB3OyonfelUBaJzSwpBntZ2KYGF/9S7asCHsXwW6g==} + /@babel/helper-create-class-features-plugin@7.24.4(@babel/core@7.24.4): + resolution: {integrity: sha512-lG75yeuUSVu0pIcbhiYMXBXANHrpUPaOfu7ryAzskCgKUHuAxRQI5ssrtmF0X9UXldPlvT0XM/A4F44OXRt6iQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-member-expression-to-functions': 7.23.0 + '@babel/helper-optimise-call-expression': 7.22.5 + '@babel/helper-replace-supers': 7.24.1(@babel/core@7.24.4) + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + semver: 6.3.1 + dev: false - '@babel/helper-create-regexp-features-plugin@7.22.15': + /@babel/helper-create-regexp-features-plugin@7.22.15(@babel/core@7.24.4): resolution: {integrity: sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-annotate-as-pure': 7.22.5 + regexpu-core: 5.3.2 + semver: 6.3.1 + dev: false - '@babel/helper-define-polyfill-provider@0.6.2': - resolution: {integrity: sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==} + /@babel/helper-define-polyfill-provider@0.6.1(@babel/core@7.24.4): + resolution: {integrity: sha512-o7SDgTJuvx5vLKD6SFvkydkSMBvahDKGiNJzG22IZYXhiqoe9efY7zocICBgzHV4IRg5wdgl2nEL/tulKIEIbA==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-plugin-utils': 7.24.0 + debug: 4.3.4 + lodash.debounce: 4.0.8 + resolve: 1.22.8 + transitivePeerDependencies: + - supports-color + dev: false - '@babel/helper-environment-visitor@7.22.20': + /@babel/helper-environment-visitor@7.22.20: resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} engines: {node: '>=6.9.0'} - '@babel/helper-function-name@7.23.0': + /@babel/helper-function-name@7.23.0: resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.24.0 + '@babel/types': 7.24.0 - '@babel/helper-hoist-variables@7.22.5': + /@babel/helper-hoist-variables@7.22.5: resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.0 - '@babel/helper-member-expression-to-functions@7.24.5': - resolution: {integrity: sha512-4owRteeihKWKamtqg4JmWSsEZU445xpFRXPEwp44HbgbxdWlUV1b4Agg4lkA806Lil5XM/e+FJyS0vj5T6vmcA==} + /@babel/helper-member-expression-to-functions@7.23.0: + resolution: {integrity: sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==} engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.0 + dev: false - '@babel/helper-module-imports@7.24.3': + /@babel/helper-module-imports@7.24.3: resolution: {integrity: sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==} engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.0 + + /@babel/helper-module-transforms@7.23.3(@babel/core@7.24.3): + resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-module-imports': 7.24.3 + '@babel/helper-simple-access': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/helper-validator-identifier': 7.22.20 + dev: true - '@babel/helper-module-transforms@7.24.5': - resolution: {integrity: sha512-9GxeY8c2d2mdQUP1Dye0ks3VDyIMS98kt/llQ2nUId8IsWqTF0l1LkSX0/uP7l7MCDrzXS009Hyhe2gzTiGW8A==} + /@babel/helper-module-transforms@7.23.3(@babel/core@7.24.4): + resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-module-imports': 7.24.3 + '@babel/helper-simple-access': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/helper-validator-identifier': 7.22.20 + dev: false - '@babel/helper-optimise-call-expression@7.22.5': + /@babel/helper-optimise-call-expression@7.22.5: resolution: {integrity: sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==} engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.0 + dev: false - '@babel/helper-plugin-utils@7.24.5': - resolution: {integrity: sha512-xjNLDopRzW2o6ba0gKbkZq5YWEBaK3PCyTOY1K2P/O07LGMhMqlMXPxwN4S5/RhWuCobT8z0jrlKGlYmeR1OhQ==} + /@babel/helper-plugin-utils@7.24.0: + resolution: {integrity: sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==} engines: {node: '>=6.9.0'} - '@babel/helper-remap-async-to-generator@7.22.20': + /@babel/helper-remap-async-to-generator@7.22.20(@babel/core@7.24.4): resolution: {integrity: sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-wrap-function': 7.22.20 + dev: false - '@babel/helper-replace-supers@7.24.1': + /@babel/helper-replace-supers@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-QCR1UqC9BzG5vZl8BMicmZ28RuUBnHhAMddD8yHFHDRH9lLTZ9uUPehX8ctVPT8l0TKblJidqcgUUKGVrePleQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-member-expression-to-functions': 7.23.0 + '@babel/helper-optimise-call-expression': 7.22.5 + dev: false - '@babel/helper-simple-access@7.24.5': - resolution: {integrity: sha512-uH3Hmf5q5n7n8mz7arjUlDOCbttY/DW4DYhE6FUsjKJ/oYC1kQQUvwEQWxRwUpX9qQKRXeqLwWxrqilMrf32sQ==} + /@babel/helper-simple-access@7.22.5: + resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.0 - '@babel/helper-skip-transparent-expression-wrappers@7.22.5': + /@babel/helper-skip-transparent-expression-wrappers@7.22.5: resolution: {integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==} engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.0 + dev: false - '@babel/helper-split-export-declaration@7.24.5': - resolution: {integrity: sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q==} + /@babel/helper-split-export-declaration@7.22.6: + resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.0 - '@babel/helper-string-parser@7.24.1': + /@babel/helper-string-parser@7.24.1: resolution: {integrity: sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.24.5': - resolution: {integrity: sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA==} + /@babel/helper-validator-identifier@7.22.20: + resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-option@7.23.5': + /@babel/helper-validator-option@7.23.5: resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} engines: {node: '>=6.9.0'} - '@babel/helper-wrap-function@7.24.5': - resolution: {integrity: sha512-/xxzuNvgRl4/HLNKvnFwdhdgN3cpLxgLROeLDl83Yx0AJ1SGvq1ak0OszTOjDfiB8Vx03eJbeDWh9r+jCCWttw==} + /@babel/helper-wrap-function@7.22.20: + resolution: {integrity: sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-function-name': 7.23.0 + '@babel/template': 7.24.0 + '@babel/types': 7.24.0 + dev: false + + /@babel/helpers@7.24.1: + resolution: {integrity: sha512-BpU09QqEe6ZCHuIHFphEFgvNSrubve1FtyMton26ekZ85gRGi6LrTF7zArARp2YvyFxloeiRmtSCq5sjh1WqIg==} engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.24.0 + '@babel/traverse': 7.24.1 + '@babel/types': 7.24.0 + transitivePeerDependencies: + - supports-color + dev: true - '@babel/helpers@7.24.5': - resolution: {integrity: sha512-CiQmBMMpMQHwM5m01YnrM6imUG1ebgYJ+fAIW4FZe6m4qHTPaRHti+R8cggAwkdz4oXhtO4/K9JWlh+8hIfR2Q==} + /@babel/helpers@7.24.4: + resolution: {integrity: sha512-FewdlZbSiwaVGlgT1DPANDuCHaDMiOo+D/IDYRFYjHOuv66xMSJ7fQwwODwRNAPkADIO/z1EoF/l2BCWlWABDw==} engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.24.0 + '@babel/traverse': 7.24.1 + '@babel/types': 7.24.0 + transitivePeerDependencies: + - supports-color + dev: false - '@babel/highlight@7.24.5': - resolution: {integrity: sha512-8lLmua6AVh/8SLJRRVD6V8p73Hir9w5mJrhE+IPpILG31KKlI9iz5zmBYKcWPS59qSfgP9RaSBQSHHE81WKuEw==} + /@babel/highlight@7.24.2: + resolution: {integrity: sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==} engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.22.20 + chalk: 2.4.2 + js-tokens: 4.0.0 + picocolors: 1.0.0 + + /@babel/parser@7.24.1: + resolution: {integrity: sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.24.0 - '@babel/parser@7.24.5': - resolution: {integrity: sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==} + /@babel/parser@7.24.4: + resolution: {integrity: sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==} engines: {node: '>=6.0.0'} hasBin: true + dependencies: + '@babel/types': 7.24.0 + dev: false - '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.24.5': - resolution: {integrity: sha512-LdXRi1wEMTrHVR4Zc9F8OewC3vdm5h4QB6L71zy6StmYeqGi1b3ttIO8UC+BfZKcH9jdr4aI249rBkm+3+YvHw==} + /@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.24.4(@babel/core@7.24.4): + resolution: {integrity: sha512-qpl6vOOEEzTLLcsuqYYo8yDtrTocmu2xkGvgNebvPjT9DTtfFYGmgDqY+rBYXNlqL4s9qLDn6xkrJv4RxAPiTA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-plugin-utils': 7.24.0 + dev: false - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.24.1': + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-y4HqEnkelJIOQGd+3g1bTeKsA5c6qM7eOn7VggGVbBc0y8MLSKHacwcIE2PplNlQSj0PqS9rrXL/nkPVK+kUNg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + dev: false - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.24.1': + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-Hj791Ii4ci8HqnaKHAlLNs+zaLXb0EzSDhiAWp5VNlyvCNymYfacs64pxTxbH1znW/NcArSmwpmG9IKE/TUVVQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.13.0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/plugin-transform-optional-chaining': 7.24.1(@babel/core@7.24.4) + dev: false - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.24.1': + /@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-m9m/fXsXLiHfwdgydIFnpk+7jlVbnvlK5B2EKiPdLUb6WX654ZaaEWJUjk8TftRbZpK0XibovlLWX4KIZhV6jw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-plugin-utils': 7.24.0 + dev: false - '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2': + /@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.24.4): resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.4 + dev: false + + /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.24.3): + resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-plugin-utils': 7.24.0 + dev: true - '@babel/plugin-syntax-async-generators@7.8.4': + /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.24.4): resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} peerDependencies: '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + dev: false - '@babel/plugin-syntax-bigint@7.8.3': + /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.24.3): resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} peerDependencies: '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.24.3): + resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-plugin-utils': 7.24.0 + dev: true - '@babel/plugin-syntax-class-properties@7.12.13': + /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.24.4): resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} peerDependencies: '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + dev: false - '@babel/plugin-syntax-class-static-block@7.14.5': + /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.24.4): resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + dev: false - '@babel/plugin-syntax-dynamic-import@7.8.3': + /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.24.4): resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} peerDependencies: '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + dev: false - '@babel/plugin-syntax-export-namespace-from@7.8.3': + /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.24.4): resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} peerDependencies: '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + dev: false - '@babel/plugin-syntax-import-assertions@7.24.1': + /@babel/plugin-syntax-import-assertions@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-IuwnI5XnuF189t91XbxmXeCDz3qs6iDRO7GJ++wcfgeXNs/8FmIlKcpDSXNVyuLQxlwvskmI3Ct73wUODkJBlQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + dev: false - '@babel/plugin-syntax-import-attributes@7.24.1': + /@babel/plugin-syntax-import-attributes@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-zhQTMH0X2nVLnb04tz+s7AMuasX8U0FnpE+nHTOhSOINjWMnopoZTxtIKsd45n4GQ/HIZLyfIpoul8e2m0DnRA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + dev: false + + /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.24.3): + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-plugin-utils': 7.24.0 + dev: true - '@babel/plugin-syntax-import-meta@7.10.4': + /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.24.4): resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} peerDependencies: '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + dev: false + + /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.24.3): + resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-plugin-utils': 7.24.0 + dev: true - '@babel/plugin-syntax-json-strings@7.8.3': + /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.24.4): resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} peerDependencies: '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + dev: false - '@babel/plugin-syntax-jsx@7.24.1': + /@babel/plugin-syntax-jsx@7.24.1(@babel/core@7.24.3): resolution: {integrity: sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-plugin-utils': 7.24.0 + dev: true + + /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.24.3): + resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-plugin-utils': 7.24.0 + dev: true - '@babel/plugin-syntax-logical-assignment-operators@7.10.4': + /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.24.4): resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} peerDependencies: '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + dev: false + + /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.24.3): + resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-plugin-utils': 7.24.0 + dev: true - '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3': + /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.24.4): resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} peerDependencies: '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + dev: false + + /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.24.3): + resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-plugin-utils': 7.24.0 + dev: true - '@babel/plugin-syntax-numeric-separator@7.10.4': + /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.24.4): resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} peerDependencies: '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + dev: false + + /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.24.3): + resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-plugin-utils': 7.24.0 + dev: true - '@babel/plugin-syntax-object-rest-spread@7.8.3': + /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.24.4): resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} peerDependencies: '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + dev: false + + /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.24.3): + resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-plugin-utils': 7.24.0 + dev: true - '@babel/plugin-syntax-optional-catch-binding@7.8.3': + /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.24.4): resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} peerDependencies: '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + dev: false + + /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.24.3): + resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-plugin-utils': 7.24.0 + dev: true - '@babel/plugin-syntax-optional-chaining@7.8.3': + /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.24.4): resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} peerDependencies: '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + dev: false - '@babel/plugin-syntax-private-property-in-object@7.14.5': + /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.24.4): resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + dev: false + + /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.24.3): + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-plugin-utils': 7.24.0 + dev: true - '@babel/plugin-syntax-top-level-await@7.14.5': + /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.24.4): resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + dev: false - '@babel/plugin-syntax-typescript@7.24.1': + /@babel/plugin-syntax-typescript@7.24.1(@babel/core@7.24.3): resolution: {integrity: sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-plugin-utils': 7.24.0 + dev: true - '@babel/plugin-syntax-unicode-sets-regex@7.18.6': + /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.24.4): resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.4) + '@babel/helper-plugin-utils': 7.24.0 + dev: false - '@babel/plugin-transform-arrow-functions@7.24.1': + /@babel/plugin-transform-arrow-functions@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-ngT/3NkRhsaep9ck9uj2Xhv9+xB1zShY3tM3g6om4xxCELwCDN4g4Aq5dRn48+0hasAql7s2hdBOysCfNpr4fw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + dev: false - '@babel/plugin-transform-async-generator-functions@7.24.3': + /@babel/plugin-transform-async-generator-functions@7.24.3(@babel/core@7.24.4): resolution: {integrity: sha512-Qe26CMYVjpQxJ8zxM1340JFNjZaF+ISWpr1Kt/jGo+ZTUzKkfw/pphEWbRCb+lmSM6k/TOgfYLvmbHkUQ0asIg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.24.4) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.4) + dev: false - '@babel/plugin-transform-async-to-generator@7.24.1': + /@babel/plugin-transform-async-to-generator@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-AawPptitRXp1y0n4ilKcGbRYWfbbzFWz2NqNu7dacYDtFtz0CMjG64b3LQsb3KIgnf4/obcUL78hfaOS7iCUfw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-module-imports': 7.24.3 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.24.4) + dev: false - '@babel/plugin-transform-block-scoped-functions@7.24.1': + /@babel/plugin-transform-block-scoped-functions@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-TWWC18OShZutrv9C6mye1xwtam+uNi2bnTOCBUd5sZxyHOiWbU6ztSROofIMrK84uweEZC219POICK/sTYwfgg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + dev: false - '@babel/plugin-transform-block-scoping@7.24.5': - resolution: {integrity: sha512-sMfBc3OxghjC95BkYrYocHL3NaOplrcaunblzwXhGmlPwpmfsxr4vK+mBBt49r+S240vahmv+kUxkeKgs+haCw==} + /@babel/plugin-transform-block-scoping@7.24.4(@babel/core@7.24.4): + resolution: {integrity: sha512-nIFUZIpGKDf9O9ttyRXpHFpKC+X3Y5mtshZONuEUYBomAKoM4y029Jr+uB1bHGPhNmK8YXHevDtKDOLmtRrp6g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + dev: false - '@babel/plugin-transform-class-properties@7.24.1': + /@babel/plugin-transform-class-properties@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-OMLCXi0NqvJfORTaPQBwqLXHhb93wkBKZ4aNwMl6WtehO7ar+cmp+89iPEQPqxAnxsOKTaMcs3POz3rKayJ72g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-create-class-features-plugin': 7.24.4(@babel/core@7.24.4) + '@babel/helper-plugin-utils': 7.24.0 + dev: false - '@babel/plugin-transform-class-static-block@7.24.4': + /@babel/plugin-transform-class-static-block@7.24.4(@babel/core@7.24.4): resolution: {integrity: sha512-B8q7Pz870Hz/q9UgP8InNpY01CSLDSCyqX7zcRuv3FcPl87A2G17lASroHWaCtbdIcbYzOZ7kWmXFKbijMSmFg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.12.0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-create-class-features-plugin': 7.24.4(@babel/core@7.24.4) + '@babel/helper-plugin-utils': 7.24.0 + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.24.4) + dev: false - '@babel/plugin-transform-classes@7.24.5': - resolution: {integrity: sha512-gWkLP25DFj2dwe9Ck8uwMOpko4YsqyfZJrOmqqcegeDYEbp7rmn4U6UQZNj08UF6MaX39XenSpKRCvpDRBtZ7Q==} + /@babel/plugin-transform-classes@7.24.1(@babel/core@7.24.4): + resolution: {integrity: sha512-ZTIe3W7UejJd3/3R4p7ScyyOoafetUShSf4kCqV0O7F/RiHxVj/wRaRnQlrGwflvcehNA8M42HkAiEDYZu2F1Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-replace-supers': 7.24.1(@babel/core@7.24.4) + '@babel/helper-split-export-declaration': 7.22.6 + globals: 11.12.0 + dev: false - '@babel/plugin-transform-computed-properties@7.24.1': + /@babel/plugin-transform-computed-properties@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-5pJGVIUfJpOS+pAqBQd+QMaTD2vCL/HcePooON6pDpHgRp4gNRmzyHTPIkXntwKsq3ayUFVfJaIKPw2pOkOcTw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/template': 7.24.0 + dev: false - '@babel/plugin-transform-destructuring@7.24.5': - resolution: {integrity: sha512-SZuuLyfxvsm+Ah57I/i1HVjveBENYK9ue8MJ7qkc7ndoNjqquJiElzA7f5yaAXjyW2hKojosOTAQQRX50bPSVg==} + /@babel/plugin-transform-destructuring@7.24.1(@babel/core@7.24.4): + resolution: {integrity: sha512-ow8jciWqNxR3RYbSNVuF4U2Jx130nwnBnhRw6N6h1bOejNkABmcI5X5oz29K4alWX7vf1C+o6gtKXikzRKkVdw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + dev: false - '@babel/plugin-transform-dotall-regex@7.24.1': + /@babel/plugin-transform-dotall-regex@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-p7uUxgSoZwZ2lPNMzUkqCts3xlp8n+o05ikjy7gbtFJSt9gdU88jAmtfmOxHM14noQXBxfgzf2yRWECiNVhTCw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.4) + '@babel/helper-plugin-utils': 7.24.0 + dev: false - '@babel/plugin-transform-duplicate-keys@7.24.1': + /@babel/plugin-transform-duplicate-keys@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-msyzuUnvsjsaSaocV6L7ErfNsa5nDWL1XKNnDePLgmz+WdU4w/J8+AxBMrWfi9m4IxfL5sZQKUPQKDQeeAT6lA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + dev: false - '@babel/plugin-transform-dynamic-import@7.24.1': + /@babel/plugin-transform-dynamic-import@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-av2gdSTyXcJVdI+8aFZsCAtR29xJt0S5tas+Ef8NvBNmD1a+N/3ecMLeMBgfcK+xzsjdLDT6oHt+DFPyeqUbDA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.24.4) + dev: false - '@babel/plugin-transform-exponentiation-operator@7.24.1': + /@babel/plugin-transform-exponentiation-operator@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-U1yX13dVBSwS23DEAqU+Z/PkwE9/m7QQy8Y9/+Tdb8UWYaGNDYwTLi19wqIAiROr8sXVum9A/rtiH5H0boUcTw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-builder-binary-assignment-operator-visitor': 7.22.15 + '@babel/helper-plugin-utils': 7.24.0 + dev: false - '@babel/plugin-transform-export-namespace-from@7.24.1': + /@babel/plugin-transform-export-namespace-from@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-Ft38m/KFOyzKw2UaJFkWG9QnHPG/Q/2SkOrRk4pNBPg5IPZ+dOxcmkK5IyuBcxiNPyyYowPGUReyBvrvZs7IlQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.24.4) + dev: false - '@babel/plugin-transform-for-of@7.24.1': + /@babel/plugin-transform-for-of@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-OxBdcnF04bpdQdR3i4giHZNZQn7cm8RQKcSwA17wAAqEELo1ZOwp5FFgeptWUQXFyT9kwHo10aqqauYkRZPCAg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + dev: false - '@babel/plugin-transform-function-name@7.24.1': + /@babel/plugin-transform-function-name@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-BXmDZpPlh7jwicKArQASrj8n22/w6iymRnvHYYd2zO30DbE277JO20/7yXJT3QxDPtiQiOxQBbZH4TpivNXIxA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-plugin-utils': 7.24.0 + dev: false - '@babel/plugin-transform-json-strings@7.24.1': + /@babel/plugin-transform-json-strings@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-U7RMFmRvoasscrIFy5xA4gIp8iWnWubnKkKuUGJjsuOH7GfbMkB+XZzeslx2kLdEGdOJDamEmCqOks6e8nv8DQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.4) + dev: false - '@babel/plugin-transform-literals@7.24.1': + /@babel/plugin-transform-literals@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-zn9pwz8U7nCqOYIiBaOxoQOtYmMODXTJnkxG4AtX8fPmnCRYWBOHD0qcpwS9e2VDSp1zNJYpdnFMIKb8jmwu6g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + dev: false - '@babel/plugin-transform-logical-assignment-operators@7.24.1': + /@babel/plugin-transform-logical-assignment-operators@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-OhN6J4Bpz+hIBqItTeWJujDOfNP+unqv/NJgyhlpSqgBTPm37KkMmZV6SYcOj+pnDbdcl1qRGV/ZiIjX9Iy34w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.4) + dev: false - '@babel/plugin-transform-member-expression-literals@7.24.1': + /@babel/plugin-transform-member-expression-literals@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-4ojai0KysTWXzHseJKa1XPNXKRbuUrhkOPY4rEGeR+7ChlJVKxFa3H3Bz+7tWaGKgJAXUWKOGmltN+u9B3+CVg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + dev: false - '@babel/plugin-transform-modules-amd@7.24.1': + /@babel/plugin-transform-modules-amd@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-lAxNHi4HVtjnHd5Rxg3D5t99Xm6H7b04hUS7EHIXcUl2EV4yl1gWdqZrNzXnSrHveL9qMdbODlLF55mvgjAfaQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.4) + '@babel/helper-plugin-utils': 7.24.0 + dev: false - '@babel/plugin-transform-modules-commonjs@7.24.1': + /@babel/plugin-transform-modules-commonjs@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-szog8fFTUxBfw0b98gEWPaEqF42ZUD/T3bkynW/wtgx2p/XCP55WEsb+VosKceRSd6njipdZvNogqdtI4Q0chw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.4) + '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-simple-access': 7.22.5 + dev: false - '@babel/plugin-transform-modules-systemjs@7.24.1': + /@babel/plugin-transform-modules-systemjs@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-mqQ3Zh9vFO1Tpmlt8QPnbwGHzNz3lpNEMxQb1kAemn/erstyqw1r9KeOlOfo3y6xAnFEcOv2tSyrXfmMk+/YZA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.4) + '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-validator-identifier': 7.22.20 + dev: false - '@babel/plugin-transform-modules-umd@7.24.1': + /@babel/plugin-transform-modules-umd@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-tuA3lpPj+5ITfcCluy6nWonSL7RvaG0AOTeAuvXqEKS34lnLzXpDb0dcP6K8jD0zWZFNDVly90AGFJPnm4fOYg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.4) + '@babel/helper-plugin-utils': 7.24.0 + dev: false - '@babel/plugin-transform-named-capturing-groups-regex@7.22.5': + /@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.24.4): resolution: {integrity: sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.4) + '@babel/helper-plugin-utils': 7.24.0 + dev: false - '@babel/plugin-transform-new-target@7.24.1': + /@babel/plugin-transform-new-target@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-/rurytBM34hYy0HKZQyA0nHbQgQNFm4Q/BOc9Hflxi2X3twRof7NaE5W46j4kQitm7SvACVRXsa6N/tSZxvPug==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + dev: false - '@babel/plugin-transform-nullish-coalescing-operator@7.24.1': + /@babel/plugin-transform-nullish-coalescing-operator@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-iQ+caew8wRrhCikO5DrUYx0mrmdhkaELgFa+7baMcVuhxIkN7oxt06CZ51D65ugIb1UWRQ8oQe+HXAVM6qHFjw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.4) + dev: false - '@babel/plugin-transform-numeric-separator@7.24.1': + /@babel/plugin-transform-numeric-separator@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-7GAsGlK4cNL2OExJH1DzmDeKnRv/LXq0eLUSvudrehVA5Rgg4bIrqEUW29FbKMBRT0ztSqisv7kjP+XIC4ZMNw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.4) + dev: false - '@babel/plugin-transform-object-rest-spread@7.24.5': - resolution: {integrity: sha512-7EauQHszLGM3ay7a161tTQH7fj+3vVM/gThlz5HpFtnygTxjrlvoeq7MPVA1Vy9Q555OB8SnAOsMkLShNkkrHA==} + /@babel/plugin-transform-object-rest-spread@7.24.1(@babel/core@7.24.4): + resolution: {integrity: sha512-XjD5f0YqOtebto4HGISLNfiNMTTs6tbkFf2TOqJlYKYmbo+mN9Dnpl4SRoofiziuOWMIyq3sZEUqLo3hLITFEA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.4) + '@babel/plugin-transform-parameters': 7.24.1(@babel/core@7.24.4) + dev: false - '@babel/plugin-transform-object-super@7.24.1': + /@babel/plugin-transform-object-super@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-oKJqR3TeI5hSLRxudMjFQ9re9fBVUU0GICqM3J1mi8MqlhVr6hC/ZN4ttAyMuQR6EZZIY6h/exe5swqGNNIkWQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-replace-supers': 7.24.1(@babel/core@7.24.4) + dev: false - '@babel/plugin-transform-optional-catch-binding@7.24.1': + /@babel/plugin-transform-optional-catch-binding@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-oBTH7oURV4Y+3EUrf6cWn1OHio3qG/PVwO5J03iSJmBg6m2EhKjkAu/xuaXaYwWW9miYtvbWv4LNf0AmR43LUA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.4) + dev: false - '@babel/plugin-transform-optional-chaining@7.24.5': - resolution: {integrity: sha512-xWCkmwKT+ihmA6l7SSTpk8e4qQl/274iNbSKRRS8mpqFR32ksy36+a+LWY8OXCCEefF8WFlnOHVsaDI2231wBg==} + /@babel/plugin-transform-optional-chaining@7.24.1(@babel/core@7.24.4): + resolution: {integrity: sha512-n03wmDt+987qXwAgcBlnUUivrZBPZ8z1plL0YvgQalLm+ZE5BMhGm94jhxXtA1wzv1Cu2aaOv1BM9vbVttrzSg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.4) + dev: false - '@babel/plugin-transform-parameters@7.24.5': - resolution: {integrity: sha512-9Co00MqZ2aoky+4j2jhofErthm6QVLKbpQrvz20c3CH9KQCLHyNB+t2ya4/UrRpQGR+Wrwjg9foopoeSdnHOkA==} + /@babel/plugin-transform-parameters@7.24.1(@babel/core@7.24.4): + resolution: {integrity: sha512-8Jl6V24g+Uw5OGPeWNKrKqXPDw2YDjLc53ojwfMcKwlEoETKU9rU0mHUtcg9JntWI/QYzGAXNWEcVHZ+fR+XXg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + dev: false - '@babel/plugin-transform-private-methods@7.24.1': + /@babel/plugin-transform-private-methods@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-tGvisebwBO5em4PaYNqt4fkw56K2VALsAbAakY0FjTYqJp7gfdrgr7YX76Or8/cpik0W6+tj3rZ0uHU9Oil4tw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-create-class-features-plugin': 7.24.4(@babel/core@7.24.4) + '@babel/helper-plugin-utils': 7.24.0 + dev: false - '@babel/plugin-transform-private-property-in-object@7.24.5': - resolution: {integrity: sha512-JM4MHZqnWR04jPMujQDTBVRnqxpLLpx2tkn7iPn+Hmsc0Gnb79yvRWOkvqFOx3Z7P7VxiRIR22c4eGSNj87OBQ==} + /@babel/plugin-transform-private-property-in-object@7.24.1(@babel/core@7.24.4): + resolution: {integrity: sha512-pTHxDVa0BpUbvAgX3Gat+7cSciXqUcY9j2VZKTbSB6+VQGpNgNO9ailxTGHSXlqOnX1Hcx1Enme2+yv7VqP9bg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-create-class-features-plugin': 7.24.4(@babel/core@7.24.4) + '@babel/helper-plugin-utils': 7.24.0 + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.24.4) + dev: false - '@babel/plugin-transform-property-literals@7.24.1': + /@babel/plugin-transform-property-literals@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-LetvD7CrHmEx0G442gOomRr66d7q8HzzGGr4PMHGr+5YIm6++Yke+jxj246rpvsbyhJwCLxcTn6zW1P1BSenqA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + dev: false - '@babel/plugin-transform-regenerator@7.24.1': + /@babel/plugin-transform-regenerator@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-sJwZBCzIBE4t+5Q4IGLaaun5ExVMRY0lYwos/jNecjMrVCygCdph3IKv0tkP5Fc87e/1+bebAmEAGBfnRD+cnw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + regenerator-transform: 0.15.2 + dev: false - '@babel/plugin-transform-reserved-words@7.24.1': + /@babel/plugin-transform-reserved-words@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-JAclqStUfIwKN15HrsQADFgeZt+wexNQ0uLhuqvqAUFoqPMjEcFCYZBhq0LUdz6dZK/mD+rErhW71fbx8RYElg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + dev: false - '@babel/plugin-transform-shorthand-properties@7.24.1': + /@babel/plugin-transform-shorthand-properties@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-LyjVB1nsJ6gTTUKRjRWx9C1s9hE7dLfP/knKdrfeH9UPtAGjYGgxIbFfx7xyLIEWs7Xe1Gnf8EWiUqfjLhInZA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + dev: false - '@babel/plugin-transform-spread@7.24.1': + /@babel/plugin-transform-spread@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-KjmcIM+fxgY+KxPVbjelJC6hrH1CgtPmTvdXAfn3/a9CnWGSTY7nH4zm5+cjmWJybdcPSsD0++QssDsjcpe47g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + dev: false - '@babel/plugin-transform-sticky-regex@7.24.1': + /@babel/plugin-transform-sticky-regex@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-9v0f1bRXgPVcPrngOQvLXeGNNVLc8UjMVfebo9ka0WF3/7+aVUHmaJVT3sa0XCzEFioPfPHZiOcYG9qOsH63cw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + dev: false - '@babel/plugin-transform-template-literals@7.24.1': + /@babel/plugin-transform-template-literals@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-WRkhROsNzriarqECASCNu/nojeXCDTE/F2HmRgOzi7NGvyfYGq1NEjKBK3ckLfRgGc6/lPAqP0vDOSw3YtG34g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + dev: false - '@babel/plugin-transform-typeof-symbol@7.24.5': - resolution: {integrity: sha512-UTGnhYVZtTAjdwOTzT+sCyXmTn8AhaxOS/MjG9REclZ6ULHWF9KoCZur0HSGU7hk8PdBFKKbYe6+gqdXWz84Jg==} + /@babel/plugin-transform-typeof-symbol@7.24.1(@babel/core@7.24.4): + resolution: {integrity: sha512-CBfU4l/A+KruSUoW+vTQthwcAdwuqbpRNB8HQKlZABwHRhsdHZ9fezp4Sn18PeAlYxTNiLMlx4xUBV3AWfg1BA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + dev: false - '@babel/plugin-transform-unicode-escapes@7.24.1': + /@babel/plugin-transform-unicode-escapes@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-RlkVIcWT4TLI96zM660S877E7beKlQw7Ig+wqkKBiWfj0zH5Q4h50q6er4wzZKRNSYpfo6ILJ+hrJAGSX2qcNw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + dev: false - '@babel/plugin-transform-unicode-property-regex@7.24.1': + /@babel/plugin-transform-unicode-property-regex@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-Ss4VvlfYV5huWApFsF8/Sq0oXnGO+jB+rijFEFugTd3cwSObUSnUi88djgR5528Csl0uKlrI331kRqe56Ov2Ng==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.4) + '@babel/helper-plugin-utils': 7.24.0 + dev: false - '@babel/plugin-transform-unicode-regex@7.24.1': + /@babel/plugin-transform-unicode-regex@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-2A/94wgZgxfTsiLaQ2E36XAOdcZmGAaEEgVmxQWwZXWkGhvoHbaqXcKnU8zny4ycpu3vNqg0L/PcCiYtHtA13g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.4) + '@babel/helper-plugin-utils': 7.24.0 + dev: false - '@babel/plugin-transform-unicode-sets-regex@7.24.1': + /@babel/plugin-transform-unicode-sets-regex@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-fqj4WuzzS+ukpgerpAoOnMfQXwUHFxXUZUE84oL2Kao2N8uSlvcpnAidKASgsNgzZHBsHWvcm8s9FPWUhAb8fA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.4) + '@babel/helper-plugin-utils': 7.24.0 + dev: false - '@babel/preset-env@7.24.5': - resolution: {integrity: sha512-UGK2ifKtcC8i5AI4cH+sbLLuLc2ktYSFJgBAXorKAsHUZmrQ1q6aQ6i3BvU24wWs2AAKqQB6kq3N9V9Gw1HiMQ==} + /@babel/preset-env@7.24.4(@babel/core@7.24.4): + resolution: {integrity: sha512-7Kl6cSmYkak0FK/FXjSEnLJ1N9T/WA2RkMhu17gZ/dsxKJUuTYNIylahPTzqpLyJN4WhDif8X0XK1R8Wsguo/A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.24.4 + '@babel/core': 7.24.4 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-validator-option': 7.23.5 + '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.24.4(@babel/core@7.24.4) + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.24.4) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.4) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.24.4) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.24.4) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.24.4) + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.24.4) + '@babel/plugin-syntax-import-assertions': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-syntax-import-attributes': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.24.4) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.4) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.4) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.4) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.4) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.4) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.4) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.4) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.24.4) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.24.4) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.24.4) + '@babel/plugin-transform-arrow-functions': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-async-generator-functions': 7.24.3(@babel/core@7.24.4) + '@babel/plugin-transform-async-to-generator': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-block-scoped-functions': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-block-scoping': 7.24.4(@babel/core@7.24.4) + '@babel/plugin-transform-class-properties': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-class-static-block': 7.24.4(@babel/core@7.24.4) + '@babel/plugin-transform-classes': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-computed-properties': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-destructuring': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-dotall-regex': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-duplicate-keys': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-dynamic-import': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-exponentiation-operator': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-export-namespace-from': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-for-of': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-function-name': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-json-strings': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-literals': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-logical-assignment-operators': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-member-expression-literals': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-modules-amd': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-modules-commonjs': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-modules-systemjs': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-modules-umd': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.24.4) + '@babel/plugin-transform-new-target': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-nullish-coalescing-operator': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-numeric-separator': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-object-rest-spread': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-object-super': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-optional-catch-binding': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-optional-chaining': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-parameters': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-private-methods': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-private-property-in-object': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-property-literals': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-regenerator': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-reserved-words': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-shorthand-properties': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-spread': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-sticky-regex': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-template-literals': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-typeof-symbol': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-unicode-escapes': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-unicode-property-regex': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-unicode-regex': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-unicode-sets-regex': 7.24.1(@babel/core@7.24.4) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.24.4) + babel-plugin-polyfill-corejs2: 0.4.10(@babel/core@7.24.4) + babel-plugin-polyfill-corejs3: 0.10.4(@babel/core@7.24.4) + babel-plugin-polyfill-regenerator: 0.6.1(@babel/core@7.24.4) + core-js-compat: 3.36.1 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: false - '@babel/preset-modules@0.1.6-no-external-plugins': + /@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.24.4): resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} peerDependencies: '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + '@babel/types': 7.24.0 + esutils: 2.0.3 + dev: false - '@babel/regjsgen@0.8.0': + /@babel/regjsgen@0.8.0: resolution: {integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==} + dev: false + + /@babel/runtime@7.24.1: + resolution: {integrity: sha512-+BIznRzyqBf+2wCTxcKE3wDjfGeCoVE61KSHGpkzqrLi8qxqFwBeUFyId2cxkTmm55fzDGnm0+yCxaxygrLUnQ==} + engines: {node: '>=6.9.0'} + dependencies: + regenerator-runtime: 0.14.1 + dev: false - '@babel/runtime@7.24.5': - resolution: {integrity: sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g==} + /@babel/runtime@7.24.4: + resolution: {integrity: sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA==} engines: {node: '>=6.9.0'} + dependencies: + regenerator-runtime: 0.14.1 - '@babel/template@7.24.0': + /@babel/template@7.24.0: resolution: {integrity: sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==} engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.24.2 + '@babel/parser': 7.24.1 + '@babel/types': 7.24.0 - '@babel/traverse@7.24.5': - resolution: {integrity: sha512-7aaBLeDQ4zYcUFDUD41lJc1fG8+5IU9DaNSJAgal866FGvmD5EbWQgnEC6kO1gGLsX0esNkfnJSndbTXA3r7UA==} + /@babel/traverse@7.24.1: + resolution: {integrity: sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==} engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.24.2 + '@babel/generator': 7.24.1 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/parser': 7.24.1 + '@babel/types': 7.24.0 + debug: 4.3.4 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color - '@babel/types@7.24.5': - resolution: {integrity: sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ==} + /@babel/types@7.24.0: + resolution: {integrity: sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==} engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.24.1 + '@babel/helper-validator-identifier': 7.22.20 + to-fast-properties: 2.0.0 - '@bcoe/v8-coverage@0.2.3': + /@bcoe/v8-coverage@0.2.3: resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + dev: true - '@bundled-es-modules/cookie@2.0.0': + /@bundled-es-modules/cookie@2.0.0: resolution: {integrity: sha512-Or6YHg/kamKHpxULAdSqhGqnWFneIXu1NKvvfBBzKGwpVsYuFIQ5aBPHDnnoR3ghW1nvSkALd+EF9iMtY7Vjxw==} + dependencies: + cookie: 0.5.0 + dev: true - '@bundled-es-modules/statuses@1.0.1': + /@bundled-es-modules/statuses@1.0.1: resolution: {integrity: sha512-yn7BklA5acgcBr+7w064fGV+SGIFySjCKpqjcWgBAIfrAkY+4GQTJJHQMeT3V/sgz23VTEVV8TtOmkvJAhFVfg==} + dependencies: + statuses: 2.0.1 + dev: true - '@colors/colors@1.6.0': + /@colors/colors@1.6.0: resolution: {integrity: sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==} engines: {node: '>=0.1.90'} + dev: true - '@cspotcode/source-map-support@0.8.1': + /@cspotcode/source-map-support@0.8.1: resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} + dependencies: + '@jridgewell/trace-mapping': 0.3.9 + dev: true - '@dabh/diagnostics@2.0.3': + /@dabh/diagnostics@2.0.3: resolution: {integrity: sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==} + dependencies: + colorspace: 1.1.4 + enabled: 2.0.0 + kuler: 2.0.0 + dev: true - '@dotenvx/dotenvx@0.37.1': + /@dotenvx/dotenvx@0.37.1: resolution: {integrity: sha512-CN8A4cxuIQ5eRIaWK6qeRAYXPtt5Mo5XHw6o9kP+VWYlTg8UY3k426tCxcgrMRTI/GKMyu8wryHng+thUFCNYg==} hasBin: true + dependencies: + '@inquirer/confirm': 2.0.17 + arch: 2.2.0 + chalk: 4.1.2 + commander: 11.1.0 + conf: 10.2.0 + diff: 5.2.0 + dotenv: 16.4.5 + dotenv-expand: 11.0.6 + execa: 5.1.1 + glob: 10.3.10 + ignore: 5.3.1 + is-wsl: 2.2.0 + object-treeify: 1.1.33 + open: 8.4.2 + ora: 5.4.1 + semver: 7.6.0 + undici: 5.28.4 + which: 4.0.0 + winston: 3.12.0 + xxhashjs: 0.2.2 + dev: true - '@emotion/babel-plugin@11.11.0': + /@emotion/babel-plugin@11.11.0: resolution: {integrity: sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==} + dependencies: + '@babel/helper-module-imports': 7.24.3 + '@babel/runtime': 7.24.1 + '@emotion/hash': 0.9.1 + '@emotion/memoize': 0.8.1 + '@emotion/serialize': 1.1.3 + babel-plugin-macros: 3.1.0 + convert-source-map: 1.9.0 + escape-string-regexp: 4.0.0 + find-root: 1.1.0 + source-map: 0.5.7 + stylis: 4.2.0 + dev: false - '@emotion/cache@11.11.0': + /@emotion/cache@11.11.0: resolution: {integrity: sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==} + dependencies: + '@emotion/memoize': 0.8.1 + '@emotion/sheet': 1.2.2 + '@emotion/utils': 1.2.1 + '@emotion/weak-memoize': 0.3.1 + stylis: 4.2.0 + dev: false - '@emotion/hash@0.9.1': + /@emotion/hash@0.9.1: resolution: {integrity: sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==} + dev: false - '@emotion/is-prop-valid@1.2.2': + /@emotion/is-prop-valid@1.2.2: resolution: {integrity: sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==} + dependencies: + '@emotion/memoize': 0.8.1 + dev: false - '@emotion/memoize@0.8.1': + /@emotion/memoize@0.8.1: resolution: {integrity: sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==} + dev: false - '@emotion/react@11.11.4': + /@emotion/react@11.11.4(@types/react@18.3.1)(react@18.3.1): resolution: {integrity: sha512-t8AjMlF0gHpvvxk5mAtCqR4vmxiGHCeJBaQO6gncUSdklELOgtwjerNY2yuJNfwnc6vi16U/+uMF+afIawJ9iw==} peerDependencies: '@types/react': '*' @@ -860,14 +1707,44 @@ packages: peerDependenciesMeta: '@types/react': optional: true + dependencies: + '@babel/runtime': 7.24.1 + '@emotion/babel-plugin': 11.11.0 + '@emotion/cache': 11.11.0 + '@emotion/serialize': 1.1.3 + '@emotion/use-insertion-effect-with-fallbacks': 1.0.1(react@18.3.1) + '@emotion/utils': 1.2.1 + '@emotion/weak-memoize': 0.3.1 + '@types/react': 18.3.1 + hoist-non-react-statics: 3.3.2 + react: 18.3.1 + dev: false + + /@emotion/serialize@1.1.3: + resolution: {integrity: sha512-iD4D6QVZFDhcbH0RAG1uVu1CwVLMWUkCvAqqlewO/rxf8+87yIBAlt4+AxMiiKPLs5hFc0owNk/sLLAOROw3cA==} + dependencies: + '@emotion/hash': 0.9.1 + '@emotion/memoize': 0.8.1 + '@emotion/unitless': 0.8.1 + '@emotion/utils': 1.2.1 + csstype: 3.1.3 + dev: false - '@emotion/serialize@1.1.4': + /@emotion/serialize@1.1.4: resolution: {integrity: sha512-RIN04MBT8g+FnDwgvIUi8czvr1LU1alUMI05LekWB5DGyTm8cCBMCRpq3GqaiyEDRptEXOyXnvZ58GZYu4kBxQ==} + dependencies: + '@emotion/hash': 0.9.1 + '@emotion/memoize': 0.8.1 + '@emotion/unitless': 0.8.1 + '@emotion/utils': 1.2.1 + csstype: 3.1.3 + dev: false - '@emotion/sheet@1.2.2': + /@emotion/sheet@1.2.2: resolution: {integrity: sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==} + dev: false - '@emotion/styled@11.11.5': + /@emotion/styled@11.11.5(@emotion/react@11.11.4)(@types/react@18.3.1)(react@18.3.1): resolution: {integrity: sha512-/ZjjnaNKvuMPxcIiUkf/9SHoG4Q196DRl1w82hQ3WCsjo1IUR8uaGWrC6a87CrYAW0Kb/pK7hk8BnLgLRi9KoQ==} peerDependencies: '@emotion/react': ^11.0.0-rc.0 @@ -876,262 +1753,446 @@ packages: peerDependenciesMeta: '@types/react': optional: true + dependencies: + '@babel/runtime': 7.24.4 + '@emotion/babel-plugin': 11.11.0 + '@emotion/is-prop-valid': 1.2.2 + '@emotion/react': 11.11.4(@types/react@18.3.1)(react@18.3.1) + '@emotion/serialize': 1.1.4 + '@emotion/use-insertion-effect-with-fallbacks': 1.0.1(react@18.3.1) + '@emotion/utils': 1.2.1 + '@types/react': 18.3.1 + react: 18.3.1 + dev: false - '@emotion/unitless@0.8.1': + /@emotion/unitless@0.8.1: resolution: {integrity: sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==} + dev: false - '@emotion/use-insertion-effect-with-fallbacks@1.0.1': + /@emotion/use-insertion-effect-with-fallbacks@1.0.1(react@18.3.1): resolution: {integrity: sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==} peerDependencies: react: '>=16.8.0' + dependencies: + react: 18.3.1 + dev: false - '@emotion/utils@1.2.1': + /@emotion/utils@1.2.1: resolution: {integrity: sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==} + dev: false - '@emotion/weak-memoize@0.3.1': + /@emotion/weak-memoize@0.3.1: resolution: {integrity: sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==} + dev: false - '@esbuild/aix-ppc64@0.20.2': + /@esbuild/aix-ppc64@0.20.2: resolution: {integrity: sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==} engines: {node: '>=12'} cpu: [ppc64] os: [aix] + requiresBuild: true + optional: true - '@esbuild/android-arm64@0.20.2': + /@esbuild/android-arm64@0.20.2: resolution: {integrity: sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==} engines: {node: '>=12'} cpu: [arm64] os: [android] + requiresBuild: true + optional: true - '@esbuild/android-arm@0.20.2': + /@esbuild/android-arm@0.20.2: resolution: {integrity: sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==} engines: {node: '>=12'} cpu: [arm] os: [android] + requiresBuild: true + optional: true - '@esbuild/android-x64@0.20.2': + /@esbuild/android-x64@0.20.2: resolution: {integrity: sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==} engines: {node: '>=12'} cpu: [x64] os: [android] + requiresBuild: true + optional: true - '@esbuild/darwin-arm64@0.20.2': + /@esbuild/darwin-arm64@0.20.2: resolution: {integrity: sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] + requiresBuild: true + optional: true - '@esbuild/darwin-x64@0.20.2': + /@esbuild/darwin-x64@0.20.2: resolution: {integrity: sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==} engines: {node: '>=12'} cpu: [x64] os: [darwin] + requiresBuild: true + optional: true - '@esbuild/freebsd-arm64@0.20.2': + /@esbuild/freebsd-arm64@0.20.2: resolution: {integrity: sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] + requiresBuild: true + optional: true - '@esbuild/freebsd-x64@0.20.2': + /@esbuild/freebsd-x64@0.20.2: resolution: {integrity: sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] + requiresBuild: true + optional: true - '@esbuild/linux-arm64@0.20.2': + /@esbuild/linux-arm64@0.20.2: resolution: {integrity: sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==} engines: {node: '>=12'} cpu: [arm64] os: [linux] + requiresBuild: true + optional: true - '@esbuild/linux-arm@0.20.2': + /@esbuild/linux-arm@0.20.2: resolution: {integrity: sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==} engines: {node: '>=12'} cpu: [arm] os: [linux] + requiresBuild: true + optional: true - '@esbuild/linux-ia32@0.20.2': + /@esbuild/linux-ia32@0.20.2: resolution: {integrity: sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==} engines: {node: '>=12'} cpu: [ia32] os: [linux] + requiresBuild: true + optional: true - '@esbuild/linux-loong64@0.20.2': + /@esbuild/linux-loong64@0.20.2: resolution: {integrity: sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==} engines: {node: '>=12'} cpu: [loong64] os: [linux] + requiresBuild: true + optional: true - '@esbuild/linux-mips64el@0.20.2': + /@esbuild/linux-mips64el@0.20.2: resolution: {integrity: sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] + requiresBuild: true + optional: true - '@esbuild/linux-ppc64@0.20.2': + /@esbuild/linux-ppc64@0.20.2: resolution: {integrity: sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] + requiresBuild: true + optional: true - '@esbuild/linux-riscv64@0.20.2': + /@esbuild/linux-riscv64@0.20.2: resolution: {integrity: sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] + requiresBuild: true + optional: true - '@esbuild/linux-s390x@0.20.2': + /@esbuild/linux-s390x@0.20.2: resolution: {integrity: sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==} engines: {node: '>=12'} cpu: [s390x] os: [linux] + requiresBuild: true + optional: true - '@esbuild/linux-x64@0.20.2': + /@esbuild/linux-x64@0.20.2: resolution: {integrity: sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==} engines: {node: '>=12'} cpu: [x64] os: [linux] + requiresBuild: true + optional: true - '@esbuild/netbsd-x64@0.20.2': + /@esbuild/netbsd-x64@0.20.2: resolution: {integrity: sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] + requiresBuild: true + optional: true - '@esbuild/openbsd-x64@0.20.2': + /@esbuild/openbsd-x64@0.20.2: resolution: {integrity: sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] + requiresBuild: true + optional: true - '@esbuild/sunos-x64@0.20.2': + /@esbuild/sunos-x64@0.20.2: resolution: {integrity: sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==} engines: {node: '>=12'} cpu: [x64] os: [sunos] + requiresBuild: true + optional: true - '@esbuild/win32-arm64@0.20.2': + /@esbuild/win32-arm64@0.20.2: resolution: {integrity: sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==} engines: {node: '>=12'} cpu: [arm64] os: [win32] + requiresBuild: true + optional: true - '@esbuild/win32-ia32@0.20.2': + /@esbuild/win32-ia32@0.20.2: resolution: {integrity: sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==} engines: {node: '>=12'} cpu: [ia32] os: [win32] + requiresBuild: true + optional: true - '@esbuild/win32-x64@0.20.2': + /@esbuild/win32-x64@0.20.2: resolution: {integrity: sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==} engines: {node: '>=12'} cpu: [x64] os: [win32] + requiresBuild: true + optional: true - '@eslint-community/eslint-utils@4.4.0': + /@eslint-community/eslint-utils@4.4.0(eslint@8.57.0): resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + dependencies: + eslint: 8.57.0 + eslint-visitor-keys: 3.4.3 + dev: true - '@eslint-community/regexpp@4.10.0': + /@eslint-community/regexpp@4.10.0: resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + dev: true - '@eslint/eslintrc@2.1.4': + /@eslint/eslintrc@2.1.4: resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + ajv: 6.12.6 + debug: 4.3.4 + espree: 9.6.1 + globals: 13.24.0 + ignore: 5.3.1 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: true - '@eslint/js@8.57.0': + /@eslint/js@8.57.0: resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true - '@fastify/busboy@2.1.1': + /@fastify/busboy@2.1.1: resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} engines: {node: '>=14'} + dev: true - '@floating-ui/core@1.6.1': - resolution: {integrity: sha512-42UH54oPZHPdRHdw6BgoBD6cg/eVTmVrFcgeRDM3jbO7uxSoipVcmcIGFcA5jmOHO5apcyvBhkSKES3fQJnu7A==} + /@floating-ui/core@1.6.0: + resolution: {integrity: sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==} + dependencies: + '@floating-ui/utils': 0.2.1 + dev: false - '@floating-ui/dom@1.6.4': - resolution: {integrity: sha512-0G8R+zOvQsAG1pg2Q99P21jiqxqGBW1iRe/iXHsBRBxnpXKFI8QwbB4x5KmYLggNO5m34IQgOIu9SCRfR/WWiQ==} + /@floating-ui/dom@1.6.3: + resolution: {integrity: sha512-RnDthu3mzPlQ31Ss/BTwQ1zjzIhr3lk1gZB1OC56h/1vEtaXkESrOqL5fQVMfXpwGtRwX+YsZBdyHtJMQnkArw==} + dependencies: + '@floating-ui/core': 1.6.0 + '@floating-ui/utils': 0.2.1 + dev: false - '@floating-ui/react-dom@2.0.9': - resolution: {integrity: sha512-q0umO0+LQK4+p6aGyvzASqKbKOJcAHJ7ycE9CuUvfx3s9zTHWmGJTPOIlM/hmSBfUfg/XfY5YhLBLR/LHwShQQ==} + /@floating-ui/react-dom@2.0.8(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-HOdqOt3R3OGeTKidaLvJKcgg75S6tibQ3Tif4eyd91QnIJWr0NLvoXFpJA/j8HqkFSL68GDca9AuyWEHlhyClw==} peerDependencies: react: '>=16.8.0' react-dom: '>=16.8.0' + dependencies: + '@floating-ui/dom': 1.6.3 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false - '@floating-ui/utils@0.2.2': - resolution: {integrity: sha512-J4yDIIthosAsRZ5CPYP/jQvUAQtlZTTD/4suA08/FEnlxqW3sKS9iAhgsa9VYLZ6vDHn/ixJgIqRQPotoBjxIw==} + /@floating-ui/utils@0.2.1: + resolution: {integrity: sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==} + dev: false - '@fontsource/roboto@5.0.13': + /@fontsource/roboto@5.0.13: resolution: {integrity: sha512-j61DHjsdUCKMXSdNLTOxcG701FWnF0jcqNNQi2iPCDxU8seN/sMxeh62dC++UiagCWq9ghTypX+Pcy7kX+QOeQ==} + dev: false - '@hapi/hoek@9.3.0': + /@hapi/hoek@9.3.0: resolution: {integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==} + dev: true - '@hapi/topo@5.1.0': + /@hapi/topo@5.1.0: resolution: {integrity: sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==} + dependencies: + '@hapi/hoek': 9.3.0 + dev: true - '@hookform/resolvers@3.3.4': + /@hookform/resolvers@3.3.4(react-hook-form@7.51.3): resolution: {integrity: sha512-o5cgpGOuJYrd+iMKvkttOclgwRW86EsWJZZRC23prf0uU2i48Htq4PuT73AVb9ionFyZrwYEITuOFGF+BydEtQ==} peerDependencies: react-hook-form: ^7.0.0 + dependencies: + react-hook-form: 7.51.3(react@18.3.1) + dev: false - '@humanwhocodes/config-array@0.11.14': + /@humanwhocodes/config-array@0.11.14: resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} engines: {node: '>=10.10.0'} + dependencies: + '@humanwhocodes/object-schema': 2.0.2 + debug: 4.3.4 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + dev: true - '@humanwhocodes/module-importer@1.0.1': + /@humanwhocodes/module-importer@1.0.1: resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} + dev: true - '@humanwhocodes/object-schema@2.0.3': - resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} + /@humanwhocodes/object-schema@2.0.2: + resolution: {integrity: sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==} + dev: true - '@inquirer/confirm@2.0.17': + /@inquirer/confirm@2.0.17: resolution: {integrity: sha512-EqzhGryzmGpy2aJf6LxJVhndxYmFs+m8cxXzf8nejb1DE3sabf6mUgBcp4J0jAUEiAcYzqmkqRr7LPFh/WdnXA==} engines: {node: '>=14.18.0'} + dependencies: + '@inquirer/core': 6.0.0 + '@inquirer/type': 1.2.1 + chalk: 4.1.2 + dev: true - '@inquirer/confirm@3.1.6': + /@inquirer/confirm@3.1.6: resolution: {integrity: sha512-Mj4TU29g6Uy+37UtpA8UpEOI2icBfpCwSW1QDtfx60wRhUy90s/kHPif2OXSSvuwDQT1lhAYRWUfkNf9Tecxvg==} engines: {node: '>=18'} + dependencies: + '@inquirer/core': 8.1.0 + '@inquirer/type': 1.3.1 + dev: true - '@inquirer/core@6.0.0': + /@inquirer/core@6.0.0: resolution: {integrity: sha512-fKi63Khkisgda3ohnskNf5uZJj+zXOaBvOllHsOkdsXRA/ubQLJQrZchFFi57NKbZzkTunXiBMdvWOv71alonw==} engines: {node: '>=14.18.0'} + dependencies: + '@inquirer/type': 1.2.1 + '@types/mute-stream': 0.0.4 + '@types/node': 20.12.8 + '@types/wrap-ansi': 3.0.0 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + cli-spinners: 2.9.2 + cli-width: 4.1.0 + figures: 3.2.0 + mute-stream: 1.0.0 + run-async: 3.0.0 + signal-exit: 4.1.0 + strip-ansi: 6.0.1 + wrap-ansi: 6.2.0 + dev: true - '@inquirer/core@8.1.0': + /@inquirer/core@8.1.0: resolution: {integrity: sha512-kfx0SU9nWgGe1f03ao/uXc85SFH1v2w3vQVH7QDGjKxdtJz+7vPitFtG++BTyJMYyYgH8MpXigutcXJeiQwVRw==} engines: {node: '>=18'} + dependencies: + '@inquirer/figures': 1.0.1 + '@inquirer/type': 1.3.1 + '@types/mute-stream': 0.0.4 + '@types/node': 20.12.8 + '@types/wrap-ansi': 3.0.0 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + cli-spinners: 2.9.2 + cli-width: 4.1.0 + mute-stream: 1.0.0 + signal-exit: 4.1.0 + strip-ansi: 6.0.1 + wrap-ansi: 6.2.0 + dev: true - '@inquirer/figures@1.0.1': + /@inquirer/figures@1.0.1: resolution: {integrity: sha512-mtup3wVKia3ZwULPHcbs4Mor8Voi+iIXEWD7wCNbIO6lYR62oPCTQyrddi5OMYVXHzeCSoneZwJuS8sBvlEwDw==} engines: {node: '>=18'} + dev: true + + /@inquirer/type@1.2.1: + resolution: {integrity: sha512-xwMfkPAxeo8Ji/IxfUSqzRi0/+F2GIqJmpc5/thelgMGsjNZcjDDRBO9TLXT1s/hdx/mK5QbVIvgoLIFgXhTMQ==} + engines: {node: '>=18'} + dev: true - '@inquirer/type@1.3.1': + /@inquirer/type@1.3.1: resolution: {integrity: sha512-Pe3PFccjPVJV1vtlfVvm9OnlbxqdnP5QcscFEFEnK5quChf1ufZtM0r8mR5ToWHMxZOh0s8o/qp9ANGRTo/DAw==} engines: {node: '>=18'} + dev: true - '@isaacs/cliui@8.0.2': + /@isaacs/cliui@8.0.2: resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} + dependencies: + string-width: 5.1.2 + string-width-cjs: /string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: /strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: /wrap-ansi@7.0.0 + dev: true - '@istanbuljs/load-nyc-config@1.1.0': + /@istanbuljs/load-nyc-config@1.1.0: resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} engines: {node: '>=8'} + dependencies: + camelcase: 5.3.1 + find-up: 4.1.0 + get-package-type: 0.1.0 + js-yaml: 3.14.1 + resolve-from: 5.0.0 + dev: true - '@istanbuljs/schema@0.1.3': + /@istanbuljs/schema@0.1.3: resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} engines: {node: '>=8'} + dev: true - '@jest/console@29.7.0': + /@jest/console@29.7.0: resolution: {integrity: sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.6.3 + '@types/node': 20.12.8 + chalk: 4.1.2 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + slash: 3.0.0 + dev: true - '@jest/core@29.7.0': + /@jest/core@29.7.0(ts-node@10.9.2): resolution: {integrity: sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -1139,28 +2200,93 @@ packages: peerDependenciesMeta: node-notifier: optional: true - - '@jest/environment@29.7.0': - resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - '@jest/expect-utils@29.7.0': - resolution: {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - '@jest/expect@29.7.0': - resolution: {integrity: sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - '@jest/fake-timers@29.7.0': + dependencies: + '@jest/console': 29.7.0 + '@jest/reporters': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 20.12.8 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + ci-info: 3.9.0 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-changed-files: 29.7.0 + jest-config: 29.7.0(@types/node@20.12.8)(ts-node@10.9.2) + jest-haste-map: 29.7.0 + jest-message-util: 29.7.0 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-resolve-dependencies: 29.7.0 + jest-runner: 29.7.0 + jest-runtime: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + jest-watcher: 29.7.0 + micromatch: 4.0.5 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-ansi: 6.0.1 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + - ts-node + dev: true + + /@jest/environment@29.7.0: + resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/fake-timers': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 20.12.8 + jest-mock: 29.7.0 + dev: true + + /@jest/expect-utils@29.7.0: + resolution: {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + jest-get-type: 29.6.3 + dev: true + + /@jest/expect@29.7.0: + resolution: {integrity: sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + expect: 29.7.0 + jest-snapshot: 29.7.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@jest/fake-timers@29.7.0: resolution: {integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.6.3 + '@sinonjs/fake-timers': 10.3.0 + '@types/node': 20.12.8 + jest-message-util: 29.7.0 + jest-mock: 29.7.0 + jest-util: 29.7.0 + dev: true - '@jest/globals@29.7.0': + /@jest/globals@29.7.0: resolution: {integrity: sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/environment': 29.7.0 + '@jest/expect': 29.7.0 + '@jest/types': 29.6.3 + jest-mock: 29.7.0 + transitivePeerDependencies: + - supports-color + dev: true - '@jest/reporters@29.7.0': + /@jest/reporters@29.7.0: resolution: {integrity: sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -1168,64 +2294,163 @@ packages: peerDependenciesMeta: node-notifier: optional: true + dependencies: + '@bcoe/v8-coverage': 0.2.3 + '@jest/console': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@jridgewell/trace-mapping': 0.3.25 + '@types/node': 20.12.8 + chalk: 4.1.2 + collect-v8-coverage: 1.0.2 + exit: 0.1.2 + glob: 7.2.3 + graceful-fs: 4.2.11 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-instrument: 6.0.2 + istanbul-lib-report: 3.0.1 + istanbul-lib-source-maps: 4.0.1 + istanbul-reports: 3.1.7 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + jest-worker: 29.7.0 + slash: 3.0.0 + string-length: 4.0.2 + strip-ansi: 6.0.1 + v8-to-istanbul: 9.2.0 + transitivePeerDependencies: + - supports-color + dev: true - '@jest/schemas@29.6.3': + /@jest/schemas@29.6.3: resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@sinclair/typebox': 0.27.8 + dev: true - '@jest/source-map@29.6.3': + /@jest/source-map@29.6.3: resolution: {integrity: sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + callsites: 3.1.0 + graceful-fs: 4.2.11 + dev: true - '@jest/test-result@29.7.0': + /@jest/test-result@29.7.0: resolution: {integrity: sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/console': 29.7.0 + '@jest/types': 29.6.3 + '@types/istanbul-lib-coverage': 2.0.6 + collect-v8-coverage: 1.0.2 + dev: true - '@jest/test-sequencer@29.7.0': + /@jest/test-sequencer@29.7.0: resolution: {integrity: sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/test-result': 29.7.0 + graceful-fs: 4.2.11 + jest-haste-map: 29.7.0 + slash: 3.0.0 + dev: true - '@jest/transform@29.7.0': + /@jest/transform@29.7.0: resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@babel/core': 7.24.3 + '@jest/types': 29.6.3 + '@jridgewell/trace-mapping': 0.3.25 + babel-plugin-istanbul: 6.1.1 + chalk: 4.1.2 + convert-source-map: 2.0.0 + fast-json-stable-stringify: 2.1.0 + graceful-fs: 4.2.11 + jest-haste-map: 29.7.0 + jest-regex-util: 29.6.3 + jest-util: 29.7.0 + micromatch: 4.0.5 + pirates: 4.0.6 + slash: 3.0.0 + write-file-atomic: 4.0.2 + transitivePeerDependencies: + - supports-color + dev: true - '@jest/types@29.6.3': + /@jest/types@29.6.3: resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/schemas': 29.6.3 + '@types/istanbul-lib-coverage': 2.0.6 + '@types/istanbul-reports': 3.0.4 + '@types/node': 20.12.8 + '@types/yargs': 17.0.32 + chalk: 4.1.2 + dev: true - '@jridgewell/gen-mapping@0.3.5': + /@jridgewell/gen-mapping@0.3.5: resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.25 - '@jridgewell/resolve-uri@3.1.2': + /@jridgewell/resolve-uri@3.1.2: resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} - '@jridgewell/set-array@1.2.1': + /@jridgewell/set-array@1.2.1: resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} engines: {node: '>=6.0.0'} - '@jridgewell/source-map@0.3.6': + /@jridgewell/source-map@0.3.6: resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + dev: false - '@jridgewell/sourcemap-codec@1.4.15': + /@jridgewell/sourcemap-codec@1.4.15: resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} - '@jridgewell/trace-mapping@0.3.25': + /@jridgewell/trace-mapping@0.3.25: resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 - '@jridgewell/trace-mapping@0.3.9': + /@jridgewell/trace-mapping@0.3.9: resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + dev: true - '@mswjs/cookies@1.1.0': + /@mswjs/cookies@1.1.0: resolution: {integrity: sha512-0ZcCVQxifZmhwNBoQIrystCb+2sWBY2Zw8lpfJBPCHGCA/HWqehITeCRVIv4VMy8MPlaHo2w2pTHFV2pFfqKPw==} engines: {node: '>=18'} + dev: true - '@mswjs/interceptors@0.26.15': + /@mswjs/interceptors@0.26.15: resolution: {integrity: sha512-HM47Lu1YFmnYHKMBynFfjCp0U/yRskHj/8QEJW0CBEPOlw8Gkmjfll+S9b8M7V5CNDw2/ciRxjjnWeaCiblSIQ==} engines: {node: '>=18'} + dependencies: + '@open-draft/deferred-promise': 2.2.0 + '@open-draft/logger': 0.3.0 + '@open-draft/until': 2.1.0 + is-node-process: 1.2.0 + outvariant: 1.4.2 + strict-event-emitter: 0.5.1 + dev: true - '@mui/base@5.0.0-beta.40': + /@mui/base@5.0.0-beta.40(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-I/lGHztkCzvwlXpjD2+SNmvNQvB4227xBXhISPjEaJUXGImOQ9f3D2Yj/T3KasSI/h0MLWy74X0J6clhPmsRbQ==} engines: {node: '>=12.0.0'} peerDependencies: @@ -1235,11 +2460,24 @@ packages: peerDependenciesMeta: '@types/react': optional: true + dependencies: + '@babel/runtime': 7.24.4 + '@floating-ui/react-dom': 2.0.8(react-dom@18.3.1)(react@18.3.1) + '@mui/types': 7.2.14(@types/react@18.3.1) + '@mui/utils': 5.15.14(@types/react@18.3.1)(react@18.3.1) + '@popperjs/core': 2.11.8 + '@types/react': 18.3.1 + clsx: 2.1.0 + prop-types: 15.8.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false - '@mui/core-downloads-tracker@5.15.16': + /@mui/core-downloads-tracker@5.15.16: resolution: {integrity: sha512-PTIbMJs5C/vYMfyJNW8ArOezh4eyHkg2pTeA7bBxh2kLP1Uzs0Nm+krXWbWGJPwTWjM8EhnDrr4aCF26+2oleg==} + dev: false - '@mui/icons-material@5.15.16': + /@mui/icons-material@5.15.16(@mui/material@5.15.16)(@types/react@18.3.1)(react@18.3.1): resolution: {integrity: sha512-s8vYbyACzTNZRKv+20fCfVXJwJqNcVotns2EKnu1wmAga6wv2LAo5kB1d5yqQqZlMFtp34EJvRXf7cy8X0tJVA==} engines: {node: '>=12.0.0'} peerDependencies: @@ -1249,8 +2487,14 @@ packages: peerDependenciesMeta: '@types/react': optional: true + dependencies: + '@babel/runtime': 7.24.4 + '@mui/material': 5.15.16(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) + '@types/react': 18.3.1 + react: 18.3.1 + dev: false - '@mui/material@5.15.16': + /@mui/material@5.15.16(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-ery2hFReewko9gpDBqOr2VmXwQG9ifXofPhGzIx09/b9JqCQC/06kZXZDGGrOTpIddK9HlIf4yrS+G70jPAzUQ==} engines: {node: '>=12.0.0'} peerDependencies: @@ -1266,8 +2510,27 @@ packages: optional: true '@types/react': optional: true + dependencies: + '@babel/runtime': 7.24.4 + '@emotion/react': 11.11.4(@types/react@18.3.1)(react@18.3.1) + '@emotion/styled': 11.11.5(@emotion/react@11.11.4)(@types/react@18.3.1)(react@18.3.1) + '@mui/base': 5.0.0-beta.40(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) + '@mui/core-downloads-tracker': 5.15.16 + '@mui/system': 5.15.15(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.3.1)(react@18.3.1) + '@mui/types': 7.2.14(@types/react@18.3.1) + '@mui/utils': 5.15.14(@types/react@18.3.1)(react@18.3.1) + '@types/react': 18.3.1 + '@types/react-transition-group': 4.4.10 + clsx: 2.1.0 + csstype: 3.1.3 + prop-types: 15.8.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-is: 18.2.0 + react-transition-group: 4.4.5(react-dom@18.3.1)(react@18.3.1) + dev: false - '@mui/private-theming@5.15.14': + /@mui/private-theming@5.15.14(@types/react@18.3.1)(react@18.3.1): resolution: {integrity: sha512-UH0EiZckOWcxiXLX3Jbb0K7rC8mxTr9L9l6QhOZxYc4r8FHUkefltV9VDGLrzCaWh30SQiJvAEd7djX3XXY6Xw==} engines: {node: '>=12.0.0'} peerDependencies: @@ -1276,8 +2539,15 @@ packages: peerDependenciesMeta: '@types/react': optional: true + dependencies: + '@babel/runtime': 7.24.4 + '@mui/utils': 5.15.14(@types/react@18.3.1)(react@18.3.1) + '@types/react': 18.3.1 + prop-types: 15.8.1 + react: 18.3.1 + dev: false - '@mui/styled-engine@5.15.14': + /@mui/styled-engine@5.15.14(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(react@18.3.1): resolution: {integrity: sha512-RILkuVD8gY6PvjZjqnWhz8fu68dVkqhM5+jYWfB5yhlSQKg+2rHkmEwm75XIeAqI3qwOndK6zELK5H6Zxn4NHw==} engines: {node: '>=12.0.0'} peerDependencies: @@ -1289,8 +2559,47 @@ packages: optional: true '@emotion/styled': optional: true + dependencies: + '@babel/runtime': 7.24.4 + '@emotion/cache': 11.11.0 + '@emotion/react': 11.11.4(@types/react@18.3.1)(react@18.3.1) + '@emotion/styled': 11.11.5(@emotion/react@11.11.4)(@types/react@18.3.1)(react@18.3.1) + csstype: 3.1.3 + prop-types: 15.8.1 + react: 18.3.1 + dev: false + + /@mui/system@5.15.14(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-auXLXzUaCSSOLqJXmsAaq7P96VPRXg2Rrz6OHNV7lr+kB8lobUF+/N84Vd9C4G/wvCXYPs5TYuuGBRhcGbiBGg==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@emotion/react': ^11.5.0 + '@emotion/styled': ^11.3.0 + '@types/react': ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@emotion/react': + optional: true + '@emotion/styled': + optional: true + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.24.4 + '@emotion/react': 11.11.4(@types/react@18.3.1)(react@18.3.1) + '@emotion/styled': 11.11.5(@emotion/react@11.11.4)(@types/react@18.3.1)(react@18.3.1) + '@mui/private-theming': 5.15.14(@types/react@18.3.1)(react@18.3.1) + '@mui/styled-engine': 5.15.14(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(react@18.3.1) + '@mui/types': 7.2.14(@types/react@18.3.1) + '@mui/utils': 5.15.14(@types/react@18.3.1)(react@18.3.1) + '@types/react': 18.3.1 + clsx: 2.1.0 + csstype: 3.1.3 + prop-types: 15.8.1 + react: 18.3.1 + dev: false - '@mui/system@5.15.15': + /@mui/system@5.15.15(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.3.1)(react@18.3.1): resolution: {integrity: sha512-aulox6N1dnu5PABsfxVGOZffDVmlxPOVgj56HrUnJE8MCSh8lOvvkd47cebIVQQYAjpwieXQXiDPj5pwM40jTQ==} engines: {node: '>=12.0.0'} peerDependencies: @@ -1305,16 +2614,33 @@ packages: optional: true '@types/react': optional: true + dependencies: + '@babel/runtime': 7.24.4 + '@emotion/react': 11.11.4(@types/react@18.3.1)(react@18.3.1) + '@emotion/styled': 11.11.5(@emotion/react@11.11.4)(@types/react@18.3.1)(react@18.3.1) + '@mui/private-theming': 5.15.14(@types/react@18.3.1)(react@18.3.1) + '@mui/styled-engine': 5.15.14(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(react@18.3.1) + '@mui/types': 7.2.14(@types/react@18.3.1) + '@mui/utils': 5.15.14(@types/react@18.3.1)(react@18.3.1) + '@types/react': 18.3.1 + clsx: 2.1.0 + csstype: 3.1.3 + prop-types: 15.8.1 + react: 18.3.1 + dev: false - '@mui/types@7.2.14': + /@mui/types@7.2.14(@types/react@18.3.1): resolution: {integrity: sha512-MZsBZ4q4HfzBsywtXgM1Ksj6HDThtiwmOKUXH1pKYISI9gAVXCNHNpo7TlGoGrBaYWZTdNoirIN7JsQcQUjmQQ==} peerDependencies: '@types/react': ^17.0.0 || ^18.0.0 peerDependenciesMeta: '@types/react': optional: true + dependencies: + '@types/react': 18.3.1 + dev: false - '@mui/utils@5.15.14': + /@mui/utils@5.15.14(@types/react@18.3.1)(react@18.3.1): resolution: {integrity: sha512-0lF/7Hh/ezDv5X7Pry6enMsbYyGKjADzvHyo3Qrc/SSlTsQ1VkbDMbH0m2t3OR5iIVLwMoxwM7yGd+6FCMtTFA==} engines: {node: '>=12.0.0'} peerDependencies: @@ -1323,8 +2649,16 @@ packages: peerDependenciesMeta: '@types/react': optional: true + dependencies: + '@babel/runtime': 7.24.4 + '@types/prop-types': 15.7.11 + '@types/react': 18.3.1 + prop-types: 15.8.1 + react: 18.3.1 + react-is: 18.2.0 + dev: false - '@mui/x-date-pickers@7.3.2': + /@mui/x-date-pickers@7.3.2(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@mui/material@5.15.16)(@types/react@18.3.1)(dayjs@1.11.11)(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-i7JaDs1eXSZWyJihfszUHVV0t/C2HvtdMv5tHwv3E3enMx5Hup1vkJ64vZAH2fgGrTHQH8mjxvVsmI6jhDXIUg==} engines: {node: '>=14.0.0'} peerDependencies: @@ -1359,45 +2693,83 @@ packages: optional: true moment-jalaali: optional: true + dependencies: + '@babel/runtime': 7.24.4 + '@emotion/react': 11.11.4(@types/react@18.3.1)(react@18.3.1) + '@emotion/styled': 11.11.5(@emotion/react@11.11.4)(@types/react@18.3.1)(react@18.3.1) + '@mui/base': 5.0.0-beta.40(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) + '@mui/material': 5.15.16(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) + '@mui/system': 5.15.14(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.3.1)(react@18.3.1) + '@mui/utils': 5.15.14(@types/react@18.3.1)(react@18.3.1) + '@types/react-transition-group': 4.4.10 + clsx: 2.1.0 + dayjs: 1.11.11 + prop-types: 15.8.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-transition-group: 4.4.5(react-dom@18.3.1)(react@18.3.1) + transitivePeerDependencies: + - '@types/react' + dev: false - '@nodelib/fs.scandir@2.1.5': + /@nodelib/fs.scandir@2.1.5: resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 - '@nodelib/fs.stat@2.0.5': + /@nodelib/fs.stat@2.0.5: resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} engines: {node: '>= 8'} - '@nodelib/fs.walk@1.2.8': + /@nodelib/fs.walk@1.2.8: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.17.1 - '@open-draft/deferred-promise@2.2.0': + /@open-draft/deferred-promise@2.2.0: resolution: {integrity: sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==} + dev: true - '@open-draft/logger@0.3.0': + /@open-draft/logger@0.3.0: resolution: {integrity: sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==} + dependencies: + is-node-process: 1.2.0 + outvariant: 1.4.2 + dev: true - '@open-draft/until@2.1.0': + /@open-draft/until@2.1.0: resolution: {integrity: sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==} + dev: true - '@pkgjs/parseargs@0.11.0': + /@pkgjs/parseargs@0.11.0: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} + requiresBuild: true + dev: true + optional: true - '@pkgr/core@0.1.1': + /@pkgr/core@0.1.1: resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + dev: true - '@playwright/test@1.43.1': + /@playwright/test@1.43.1: resolution: {integrity: sha512-HgtQzFgNEEo4TE22K/X7sYTYNqEMMTZmFS8kTq6m8hXj+m1D8TgwgIbumHddJa9h4yl4GkKb8/bgAl2+g7eDgA==} engines: {node: '>=16'} hasBin: true + dependencies: + playwright: 1.43.1 + dev: true - '@popperjs/core@2.11.8': + /@popperjs/core@2.11.8: resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} + dev: false - '@reduxjs/toolkit@2.2.3': + /@reduxjs/toolkit@2.2.3(react-redux@9.1.2)(react@18.3.1): resolution: {integrity: sha512-76dll9EnJXg4EVcI5YNxZA/9hSAmZsFqzMmNRHvIlzw2WS/twfcVX3ysYrWGJMClwEmChQFC4yRq74tn6fdzRA==} peerDependencies: react: ^16.9.0 || ^17.0.0 || ^18 @@ -1407,12 +2779,21 @@ packages: optional: true react-redux: optional: true + dependencies: + immer: 10.0.4 + react: 18.3.1 + react-redux: 9.1.2(@types/react@18.3.1)(react@18.3.1)(redux@5.0.1) + redux: 5.0.1 + redux-thunk: 3.1.0(redux@5.0.1) + reselect: 5.1.0 + dev: false - '@remix-run/router@1.16.0': + /@remix-run/router@1.16.0: resolution: {integrity: sha512-Quz1KOffeEf/zwkCBM3kBtH4ZoZ+pT3xIXBG4PPW/XFtDP7EGhtTiC2+gpL9GnR7+Qdet5Oa6cYSvwKYg6kN9Q==} engines: {node: '>=14.0.0'} + dev: false - '@rollup/plugin-babel@5.3.1': + /@rollup/plugin-babel@5.3.1(@babel/core@7.24.4)(rollup@2.79.1): resolution: {integrity: sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==} engines: {node: '>= 10.0.0'} peerDependencies: @@ -1422,22 +2803,42 @@ packages: peerDependenciesMeta: '@types/babel__core': optional: true - - '@rollup/plugin-node-resolve@15.2.3': - resolution: {integrity: sha512-j/lym8nf5E21LwBT4Df1VD6hRO2L2iwUeUmP7litikRsVp1H6NWx20NEp0Y7su+7XGc476GnXXc4kFeZNGmaSQ==} + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-module-imports': 7.24.3 + '@rollup/pluginutils': 3.1.0(rollup@2.79.1) + rollup: 2.79.1 + dev: false + + /@rollup/plugin-node-resolve@15.2.3(rollup@2.79.1): + resolution: {integrity: sha512-j/lym8nf5E21LwBT4Df1VD6hRO2L2iwUeUmP7litikRsVp1H6NWx20NEp0Y7su+7XGc476GnXXc4kFeZNGmaSQ==} engines: {node: '>=14.0.0'} peerDependencies: rollup: ^2.78.0||^3.0.0||^4.0.0 peerDependenciesMeta: rollup: optional: true + dependencies: + '@rollup/pluginutils': 5.1.0(rollup@2.79.1) + '@types/resolve': 1.20.2 + deepmerge: 4.3.1 + is-builtin-module: 3.2.1 + is-module: 1.0.0 + resolve: 1.22.8 + rollup: 2.79.1 + dev: false - '@rollup/plugin-replace@2.4.2': + /@rollup/plugin-replace@2.4.2(rollup@2.79.1): resolution: {integrity: sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==} peerDependencies: rollup: ^1.20.0 || ^2.0.0 + dependencies: + '@rollup/pluginutils': 3.1.0(rollup@2.79.1) + magic-string: 0.25.9 + rollup: 2.79.1 + dev: false - '@rollup/plugin-terser@0.4.4': + /@rollup/plugin-terser@0.4.4(rollup@2.79.1): resolution: {integrity: sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==} engines: {node: '>=14.0.0'} peerDependencies: @@ -1445,14 +2846,26 @@ packages: peerDependenciesMeta: rollup: optional: true + dependencies: + rollup: 2.79.1 + serialize-javascript: 6.0.2 + smob: 1.5.0 + terser: 5.30.3 + dev: false - '@rollup/pluginutils@3.1.0': + /@rollup/pluginutils@3.1.0(rollup@2.79.1): resolution: {integrity: sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==} engines: {node: '>= 8.0.0'} peerDependencies: rollup: ^1.20.0||^2.0.0 + dependencies: + '@types/estree': 0.0.39 + estree-walker: 1.0.1 + picomatch: 2.3.1 + rollup: 2.79.1 + dev: false - '@rollup/pluginutils@5.1.0': + /@rollup/pluginutils@5.1.0(rollup@2.79.1): resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==} engines: {node: '>=14.0.0'} peerDependencies: @@ -1460,5235 +2873,606 @@ packages: peerDependenciesMeta: rollup: optional: true + dependencies: + '@types/estree': 1.0.5 + estree-walker: 2.0.2 + picomatch: 2.3.1 + rollup: 2.79.1 + dev: false - '@rollup/rollup-android-arm-eabi@4.17.2': - resolution: {integrity: sha512-NM0jFxY8bB8QLkoKxIQeObCaDlJKewVlIEkuyYKm5An1tdVZ966w2+MPQ2l8LBZLjR+SgyV+nRkTIunzOYBMLQ==} + /@rollup/rollup-android-arm-eabi@4.14.0: + resolution: {integrity: sha512-jwXtxYbRt1V+CdQSy6Z+uZti7JF5irRKF8hlKfEnF/xJpcNGuuiZMBvuoYM+x9sr9iWGnzrlM0+9hvQ1kgkf1w==} cpu: [arm] os: [android] + requiresBuild: true + optional: true - '@rollup/rollup-android-arm64@4.17.2': - resolution: {integrity: sha512-yeX/Usk7daNIVwkq2uGoq2BYJKZY1JfyLTaHO/jaiSwi/lsf8fTFoQW/n6IdAsx5tx+iotu2zCJwz8MxI6D/Bw==} + /@rollup/rollup-android-arm64@4.14.0: + resolution: {integrity: sha512-fI9nduZhCccjzlsA/OuAwtFGWocxA4gqXGTLvOyiF8d+8o0fZUeSztixkYjcGq1fGZY3Tkq4yRvHPFxU+jdZ9Q==} cpu: [arm64] os: [android] + requiresBuild: true + optional: true - '@rollup/rollup-darwin-arm64@4.17.2': - resolution: {integrity: sha512-kcMLpE6uCwls023+kknm71ug7MZOrtXo+y5p/tsg6jltpDtgQY1Eq5sGfHcQfb+lfuKwhBmEURDga9N0ol4YPw==} + /@rollup/rollup-darwin-arm64@4.14.0: + resolution: {integrity: sha512-BcnSPRM76/cD2gQC+rQNGBN6GStBs2pl/FpweW8JYuz5J/IEa0Fr4AtrPv766DB/6b2MZ/AfSIOSGw3nEIP8SA==} cpu: [arm64] os: [darwin] + requiresBuild: true + optional: true - '@rollup/rollup-darwin-x64@4.17.2': - resolution: {integrity: sha512-AtKwD0VEx0zWkL0ZjixEkp5tbNLzX+FCqGG1SvOu993HnSz4qDI6S4kGzubrEJAljpVkhRSlg5bzpV//E6ysTQ==} + /@rollup/rollup-darwin-x64@4.14.0: + resolution: {integrity: sha512-LDyFB9GRolGN7XI6955aFeI3wCdCUszFWumWU0deHA8VpR3nWRrjG6GtGjBrQxQKFevnUTHKCfPR4IvrW3kCgQ==} cpu: [x64] os: [darwin] + requiresBuild: true + optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.17.2': - resolution: {integrity: sha512-3reX2fUHqN7sffBNqmEyMQVj/CKhIHZd4y631duy0hZqI8Qoqf6lTtmAKvJFYa6bhU95B1D0WgzHkmTg33In0A==} - cpu: [arm] - os: [linux] - - '@rollup/rollup-linux-arm-musleabihf@4.17.2': - resolution: {integrity: sha512-uSqpsp91mheRgw96xtyAGP9FW5ChctTFEoXP0r5FAzj/3ZRv3Uxjtc7taRQSaQM/q85KEKjKsZuiZM3GyUivRg==} + /@rollup/rollup-linux-arm-gnueabihf@4.14.0: + resolution: {integrity: sha512-ygrGVhQP47mRh0AAD0zl6QqCbNsf0eTo+vgwkY6LunBcg0f2Jv365GXlDUECIyoXp1kKwL5WW6rsO429DBY/bA==} cpu: [arm] os: [linux] + requiresBuild: true + optional: true - '@rollup/rollup-linux-arm64-gnu@4.17.2': - resolution: {integrity: sha512-EMMPHkiCRtE8Wdk3Qhtciq6BndLtstqZIroHiiGzB3C5LDJmIZcSzVtLRbwuXuUft1Cnv+9fxuDtDxz3k3EW2A==} + /@rollup/rollup-linux-arm64-gnu@4.14.0: + resolution: {integrity: sha512-x+uJ6MAYRlHGe9wi4HQjxpaKHPM3d3JjqqCkeC5gpnnI6OWovLdXTpfa8trjxPLnWKyBsSi5kne+146GAxFt4A==} cpu: [arm64] os: [linux] + requiresBuild: true + optional: true - '@rollup/rollup-linux-arm64-musl@4.17.2': - resolution: {integrity: sha512-NMPylUUZ1i0z/xJUIx6VUhISZDRT+uTWpBcjdv0/zkp7b/bQDF+NfnfdzuTiB1G6HTodgoFa93hp0O1xl+/UbA==} + /@rollup/rollup-linux-arm64-musl@4.14.0: + resolution: {integrity: sha512-nrRw8ZTQKg6+Lttwqo6a2VxR9tOroa2m91XbdQ2sUUzHoedXlsyvY1fN4xWdqz8PKmf4orDwejxXHjh7YBGUCA==} cpu: [arm64] os: [linux] + requiresBuild: true + optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.17.2': - resolution: {integrity: sha512-T19My13y8uYXPw/L/k0JYaX1fJKFT/PWdXiHr8mTbXWxjVF1t+8Xl31DgBBvEKclw+1b00Chg0hxE2O7bTG7GQ==} - cpu: [ppc64] + /@rollup/rollup-linux-powerpc64le-gnu@4.14.0: + resolution: {integrity: sha512-xV0d5jDb4aFu84XKr+lcUJ9y3qpIWhttO3Qev97z8DKLXR62LC3cXT/bMZXrjLF9X+P5oSmJTzAhqwUbY96PnA==} + cpu: [ppc64le] os: [linux] + requiresBuild: true + optional: true - '@rollup/rollup-linux-riscv64-gnu@4.17.2': - resolution: {integrity: sha512-BOaNfthf3X3fOWAB+IJ9kxTgPmMqPPH5f5k2DcCsRrBIbWnaJCgX2ll77dV1TdSy9SaXTR5iDXRL8n7AnoP5cg==} + /@rollup/rollup-linux-riscv64-gnu@4.14.0: + resolution: {integrity: sha512-SDDhBQwZX6LPRoPYjAZWyL27LbcBo7WdBFWJi5PI9RPCzU8ijzkQn7tt8NXiXRiFMJCVpkuMkBf4OxSxVMizAw==} cpu: [riscv64] os: [linux] + requiresBuild: true + optional: true - '@rollup/rollup-linux-s390x-gnu@4.17.2': - resolution: {integrity: sha512-W0UP/x7bnn3xN2eYMql2T/+wpASLE5SjObXILTMPUBDB/Fg/FxC+gX4nvCfPBCbNhz51C+HcqQp2qQ4u25ok6g==} + /@rollup/rollup-linux-s390x-gnu@4.14.0: + resolution: {integrity: sha512-RxB/qez8zIDshNJDufYlTT0ZTVut5eCpAZ3bdXDU9yTxBzui3KhbGjROK2OYTTor7alM7XBhssgoO3CZ0XD3qA==} cpu: [s390x] os: [linux] + requiresBuild: true + optional: true - '@rollup/rollup-linux-x64-gnu@4.17.2': - resolution: {integrity: sha512-Hy7pLwByUOuyaFC6mAr7m+oMC+V7qyifzs/nW2OJfC8H4hbCzOX07Ov0VFk/zP3kBsELWNFi7rJtgbKYsav9QQ==} + /@rollup/rollup-linux-x64-gnu@4.14.0: + resolution: {integrity: sha512-C6y6z2eCNCfhZxT9u+jAM2Fup89ZjiG5pIzZIDycs1IwESviLxwkQcFRGLjnDrP+PT+v5i4YFvlcfAs+LnreXg==} cpu: [x64] os: [linux] + requiresBuild: true + optional: true - '@rollup/rollup-linux-x64-musl@4.17.2': - resolution: {integrity: sha512-h1+yTWeYbRdAyJ/jMiVw0l6fOOm/0D1vNLui9iPuqgRGnXA0u21gAqOyB5iHjlM9MMfNOm9RHCQ7zLIzT0x11Q==} + /@rollup/rollup-linux-x64-musl@4.14.0: + resolution: {integrity: sha512-i0QwbHYfnOMYsBEyjxcwGu5SMIi9sImDVjDg087hpzXqhBSosxkE7gyIYFHgfFl4mr7RrXksIBZ4DoLoP4FhJg==} cpu: [x64] os: [linux] + requiresBuild: true + optional: true - '@rollup/rollup-win32-arm64-msvc@4.17.2': - resolution: {integrity: sha512-tmdtXMfKAjy5+IQsVtDiCfqbynAQE/TQRpWdVataHmhMb9DCoJxp9vLcCBjEQWMiUYxO1QprH/HbY9ragCEFLA==} + /@rollup/rollup-win32-arm64-msvc@4.14.0: + resolution: {integrity: sha512-Fq52EYb0riNHLBTAcL0cun+rRwyZ10S9vKzhGKKgeD+XbwunszSY0rVMco5KbOsTlwovP2rTOkiII/fQ4ih/zQ==} cpu: [arm64] os: [win32] + requiresBuild: true + optional: true - '@rollup/rollup-win32-ia32-msvc@4.17.2': - resolution: {integrity: sha512-7II/QCSTAHuE5vdZaQEwJq2ZACkBpQDOmQsE6D6XUbnBHW8IAhm4eTufL6msLJorzrHDFv3CF8oCA/hSIRuZeQ==} + /@rollup/rollup-win32-ia32-msvc@4.14.0: + resolution: {integrity: sha512-e/PBHxPdJ00O9p5Ui43+vixSgVf4NlLsmV6QneGERJ3lnjIua/kim6PRFe3iDueT1rQcgSkYP8ZBBXa/h4iPvw==} cpu: [ia32] os: [win32] + requiresBuild: true + optional: true - '@rollup/rollup-win32-x64-msvc@4.17.2': - resolution: {integrity: sha512-TGGO7v7qOq4CYmSBVEYpI1Y5xDuCEnbVC5Vth8mOsW0gDSzxNrVERPc790IGHsrT2dQSimgMr9Ub3Y1Jci5/8w==} + /@rollup/rollup-win32-x64-msvc@4.14.0: + resolution: {integrity: sha512-aGg7iToJjdklmxlUlJh/PaPNa4PmqHfyRMLunbL3eaMO0gp656+q1zOKkpJ/CVe9CryJv6tAN1HDoR8cNGzkag==} cpu: [x64] os: [win32] + requiresBuild: true + optional: true - '@sideway/address@4.1.5': + /@sideway/address@4.1.5: resolution: {integrity: sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==} + dependencies: + '@hapi/hoek': 9.3.0 + dev: true - '@sideway/formula@3.0.1': + /@sideway/formula@3.0.1: resolution: {integrity: sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==} + dev: true - '@sideway/pinpoint@2.0.0': + /@sideway/pinpoint@2.0.0: resolution: {integrity: sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==} + dev: true - '@sinclair/typebox@0.27.8': + /@sinclair/typebox@0.27.8: resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + dev: true - '@sinonjs/commons@3.0.1': + /@sinonjs/commons@3.0.1: resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} + dependencies: + type-detect: 4.0.8 + dev: true - '@sinonjs/fake-timers@10.3.0': + /@sinonjs/fake-timers@10.3.0: resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} + dependencies: + '@sinonjs/commons': 3.0.1 + dev: true - '@surma/rollup-plugin-off-main-thread@2.2.3': + /@surma/rollup-plugin-off-main-thread@2.2.3: resolution: {integrity: sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==} + dependencies: + ejs: 3.1.9 + json5: 2.2.3 + magic-string: 0.25.9 + string.prototype.matchall: 4.0.11 + dev: false - '@swc/core-darwin-arm64@1.4.17': - resolution: {integrity: sha512-HVl+W4LezoqHBAYg2JCqR+s9ife9yPfgWSj37iIawLWzOmuuJ7jVdIB7Ee2B75bEisSEKyxRlTl6Y1Oq3owBgw==} + /@swc/core-darwin-arm64@1.4.8: + resolution: {integrity: sha512-hhQCffRTgzpTIbngSnC30vV6IJVTI9FFBF954WEsshsecVoCGFiMwazBbrkLG+RwXENTrMhgeREEFh6R3KRgKQ==} engines: {node: '>=10'} cpu: [arm64] os: [darwin] + requiresBuild: true + dev: true + optional: true - '@swc/core-darwin-x64@1.4.17': - resolution: {integrity: sha512-WYRO9Fdzq4S/he8zjW5I95G1zcvyd9yyD3Tgi4/ic84P5XDlSMpBDpBLbr/dCPjmSg7aUXxNQqKqGkl6dQxYlA==} - engines: {node: '>=10'} - cpu: [x64] - os: [darwin] - - '@swc/core-linux-arm-gnueabihf@1.4.17': - resolution: {integrity: sha512-cgbvpWOvtMH0XFjvwppUCR+Y+nf6QPaGu6AQ5hqCP+5Lv2zO5PG0RfasC4zBIjF53xgwEaaWmGP5/361P30X8Q==} - engines: {node: '>=10'} - cpu: [arm] - os: [linux] - - '@swc/core-linux-arm64-gnu@1.4.17': - resolution: {integrity: sha512-l7zHgaIY24cF9dyQ/FOWbmZDsEj2a9gRFbmgx2u19e3FzOPuOnaopFj0fRYXXKCmtdx+anD750iBIYnTR+pq/Q==} - engines: {node: '>=10'} - cpu: [arm64] - os: [linux] - - '@swc/core-linux-arm64-musl@1.4.17': - resolution: {integrity: sha512-qhH4gr9gAlVk8MBtzXbzTP3BJyqbAfUOATGkyUtohh85fPXQYuzVlbExix3FZXTwFHNidGHY8C+ocscI7uDaYw==} - engines: {node: '>=10'} - cpu: [arm64] - os: [linux] - - '@swc/core-linux-x64-gnu@1.4.17': - resolution: {integrity: sha512-vRDFATL1oN5oZMImkwbgSHEkp8xG1ofEASBypze01W1Tqto8t+yo6gsp69wzCZBlxldsvPpvFZW55Jq0Rn+UnA==} - engines: {node: '>=10'} - cpu: [x64] - os: [linux] - - '@swc/core-linux-x64-musl@1.4.17': - resolution: {integrity: sha512-zQNPXAXn3nmPqv54JVEN8k2JMEcMTQ6veVuU0p5O+A7KscJq+AGle/7ZQXzpXSfUCXlLMX4wvd+rwfGhh3J4cw==} - engines: {node: '>=10'} - cpu: [x64] - os: [linux] - - '@swc/core-win32-arm64-msvc@1.4.17': - resolution: {integrity: sha512-z86n7EhOwyzxwm+DLE5NoLkxCTme2lq7QZlDjbQyfCxOt6isWz8rkW5QowTX8w9Rdmk34ncrjSLvnHOeLY17+w==} - engines: {node: '>=10'} - cpu: [arm64] - os: [win32] - - '@swc/core-win32-ia32-msvc@1.4.17': - resolution: {integrity: sha512-JBwuSTJIgiJJX6wtr4wmXbfvOswHFj223AumUrK544QV69k60FJ9q2adPW9Csk+a8wm1hLxq4HKa2K334UHJ/g==} - engines: {node: '>=10'} - cpu: [ia32] - os: [win32] - - '@swc/core-win32-x64-msvc@1.4.17': - resolution: {integrity: sha512-jFkOnGQamtVDBm3MF5Kq1lgW8vx4Rm1UvJWRUfg+0gx7Uc3Jp3QMFeMNw/rDNQYRDYPG3yunCC+2463ycd5+dg==} - engines: {node: '>=10'} - cpu: [x64] - os: [win32] - - '@swc/core@1.4.17': - resolution: {integrity: sha512-tq+mdWvodMBNBBZbwFIMTVGYHe9N7zvEaycVVjfvAx20k1XozHbHhRv+9pEVFJjwRxLdXmtvFZd3QZHRAOpoNQ==} + /@swc/core-darwin-x64@1.4.8: + resolution: {integrity: sha512-P3ZBw8Jr8rKhY/J8d+6WqWriqngGTgHwtFeJ8MIakQJTbdYbFgXSZxcvDiERg3psbGeFXaUaPI0GO6BXv9k/OQ==} engines: {node: '>=10'} - peerDependencies: - '@swc/helpers': ^0.5.0 - peerDependenciesMeta: - '@swc/helpers': - optional: true - - '@swc/counter@0.1.3': - resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} - - '@swc/types@0.1.6': - resolution: {integrity: sha512-/JLo/l2JsT/LRd80C3HfbmVpxOAJ11FO2RCEslFrgzLltoP9j8XIbsyDcfCt2WWyX+CM96rBoNM+IToAkFOugg==} - - '@testing-library/dom@10.1.0': - resolution: {integrity: sha512-wdsYKy5zupPyLCW2Je5DLHSxSfbIp6h80WoHOQc+RPtmPGA52O9x5MJEkv92Sjonpq+poOAtUKhh1kBGAXBrNA==} - engines: {node: '>=18'} - - '@testing-library/jest-dom@6.4.3': - resolution: {integrity: sha512-d1NUtNEN0hSUB/XWdF1GgdlD5S2tS0huQb2tkFL2usXRatR/EiHS6AhLtDcCb/iD9CS7kRmbAHt2O5JadkKyuA==} - engines: {node: '>=14', npm: '>=6', yarn: '>=1'} - peerDependencies: - '@jest/globals': '>= 28' - '@types/bun': latest - '@types/jest': '>= 28' - jest: '>= 28' - vitest: '>= 0.32' - peerDependenciesMeta: - '@jest/globals': - optional: true - '@types/bun': - optional: true - '@types/jest': - optional: true - jest: - optional: true - vitest: - optional: true - - '@testing-library/react@15.0.6': - resolution: {integrity: sha512-UlbazRtEpQClFOiYp+1BapMT+xyqWMnE+hh9tn5DQ6gmlE7AIZWcGpzZukmDZuFk3By01oiqOf8lRedLS4k6xQ==} - engines: {node: '>=18'} - peerDependencies: - '@types/react': ^18.0.0 - react: ^18.0.0 - react-dom: ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - - '@testing-library/user-event@14.5.2': - resolution: {integrity: sha512-YAh82Wh4TIrxYLmfGcixwD18oIjyC1pFQC2Y01F2lzV2HTMiYrI0nze0FD0ocB//CKS/7jIUgae+adPqxK5yCQ==} - engines: {node: '>=12', npm: '>=6'} - peerDependencies: - '@testing-library/dom': '>=7.21.4' - - '@tootallnate/once@2.0.0': - resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} - engines: {node: '>= 10'} - - '@tsconfig/node10@1.0.11': - resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} - - '@tsconfig/node12@1.0.11': - resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} - - '@tsconfig/node14@1.0.3': - resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} - - '@tsconfig/node16@1.0.4': - resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} - - '@types/aria-query@5.0.4': - resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} - - '@types/babel__core@7.20.5': - resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} - - '@types/babel__generator@7.6.8': - resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} - - '@types/babel__template@7.4.4': - resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} - - '@types/babel__traverse@7.20.5': - resolution: {integrity: sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==} - - '@types/cookie@0.6.0': - resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} - - '@types/estree@0.0.39': - resolution: {integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==} - - '@types/estree@1.0.5': - resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} - - '@types/graceful-fs@4.1.9': - resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} - - '@types/hoist-non-react-statics@3.3.5': - resolution: {integrity: sha512-SbcrWzkKBw2cdwRTwQAswfpB9g9LJWfjtUeW/jvNwbhC8cpmmNYVePa+ncbUe0rGTQ7G3Ff6mYUN2VMfLVr+Sg==} - - '@types/istanbul-lib-coverage@2.0.6': - resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} - - '@types/istanbul-lib-report@3.0.3': - resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} - - '@types/istanbul-reports@3.0.4': - resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} - - '@types/jest@29.5.12': - resolution: {integrity: sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==} - - '@types/jsdom@20.0.1': - resolution: {integrity: sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==} - - '@types/json-schema@7.0.15': - resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - - '@types/json5@0.0.29': - resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - - '@types/lodash.camelcase@4.3.9': - resolution: {integrity: sha512-ys9/hGBfsKxzmFI8hckII40V0ASQ83UM2pxfQRghHAwekhH4/jWtjz/3/9YDy7ZpUd/H0k2STSqmPR28dnj7Zg==} - - '@types/lodash@4.17.0': - resolution: {integrity: sha512-t7dhREVv6dbNj0q17X12j7yDG4bD/DHYX7o5/DbDxobP0HnGPgpRz2Ej77aL7TZT3DSw13fqUTj8J4mMnqa7WA==} - - '@types/mute-stream@0.0.4': - resolution: {integrity: sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow==} - - '@types/node-fetch@2.6.11': - resolution: {integrity: sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==} - - '@types/node@20.12.8': - resolution: {integrity: sha512-NU0rJLJnshZWdE/097cdCBbyW1h4hEg0xpovcoAQYHl8dnEyp/NAOiE45pvc+Bd1Dt+2r94v2eGFpQJ4R7g+2w==} - - '@types/parse-json@4.0.2': - resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} - - '@types/prop-types@15.7.12': - resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} - - '@types/react-dom@18.3.0': - resolution: {integrity: sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==} - - '@types/react-redux@7.1.33': - resolution: {integrity: sha512-NF8m5AjWCkert+fosDsN3hAlHzpjSiXlVy9EgQEmLoBhaNXbmyeGs/aj5dQzKuF+/q+S7JQagorGDW8pJ28Hmg==} - - '@types/react-transition-group@4.4.10': - resolution: {integrity: sha512-hT/+s0VQs2ojCX823m60m5f0sL5idt9SO6Tj6Dg+rdphGPIeJbJ6CxvBYkgkGKrYeDjvIpKTR38UzmtHJOGW3Q==} - - '@types/react@18.3.1': - resolution: {integrity: sha512-V0kuGBX3+prX+DQ/7r2qsv1NsdfnCLnTgnRJ1pYnxykBhGMz+qj+box5lq7XsO5mtZsBqpjwwTu/7wszPfMBcw==} - - '@types/resolve@1.20.2': - resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} - - '@types/semver@7.5.8': - resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} - - '@types/stack-utils@2.0.3': - resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} - - '@types/statuses@2.0.5': - resolution: {integrity: sha512-jmIUGWrAiwu3dZpxntxieC+1n/5c3mjrImkmOSQ2NC5uP6cYO4aAZDdSmRcI5C1oiTmqlZGHC+/NmJrKogbP5A==} - - '@types/tough-cookie@4.0.5': - resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==} - - '@types/triple-beam@1.3.5': - resolution: {integrity: sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==} - - '@types/trusted-types@2.0.7': - resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} - - '@types/use-sync-external-store@0.0.3': - resolution: {integrity: sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA==} - - '@types/wrap-ansi@3.0.0': - resolution: {integrity: sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g==} - - '@types/yargs-parser@21.0.3': - resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} - - '@types/yargs@17.0.32': - resolution: {integrity: sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==} - - '@typescript-eslint/eslint-plugin@7.8.0': - resolution: {integrity: sha512-gFTT+ezJmkwutUPmB0skOj3GZJtlEGnlssems4AjkVweUPGj7jRwwqg0Hhg7++kPGJqKtTYx+R05Ftww372aIg==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - '@typescript-eslint/parser': ^7.0.0 - eslint: ^8.56.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/parser@7.8.0': - resolution: {integrity: sha512-KgKQly1pv0l4ltcftP59uQZCi4HUYswCLbTqVZEJu7uLX8CTLyswqMLqLN+2QFz4jCptqWVV4SB7vdxcH2+0kQ==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - eslint: ^8.56.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/scope-manager@7.8.0': - resolution: {integrity: sha512-viEmZ1LmwsGcnr85gIq+FCYI7nO90DVbE37/ll51hjv9aG+YZMb4WDE2fyWpUR4O/UrhGRpYXK/XajcGTk2B8g==} - engines: {node: ^18.18.0 || >=20.0.0} - - '@typescript-eslint/type-utils@7.8.0': - resolution: {integrity: sha512-H70R3AefQDQpz9mGv13Uhi121FNMh+WEaRqcXTX09YEDky21km4dV1ZXJIp8QjXc4ZaVkXVdohvWDzbnbHDS+A==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - eslint: ^8.56.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/types@7.8.0': - resolution: {integrity: sha512-wf0peJ+ZGlcH+2ZS23aJbOv+ztjeeP8uQ9GgwMJGVLx/Nj9CJt17GWgWWoSmoRVKAX2X+7fzEnAjxdvK2gqCLw==} - engines: {node: ^18.18.0 || >=20.0.0} - - '@typescript-eslint/typescript-estree@7.8.0': - resolution: {integrity: sha512-5pfUCOwK5yjPaJQNy44prjCwtr981dO8Qo9J9PwYXZ0MosgAbfEMB008dJ5sNo3+/BN6ytBPuSvXUg9SAqB0dg==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/utils@7.8.0': - resolution: {integrity: sha512-L0yFqOCflVqXxiZyXrDr80lnahQfSOfc9ELAAZ75sqicqp2i36kEZZGuUymHNFoYOqxRT05up760b4iGsl02nQ==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - eslint: ^8.56.0 - - '@typescript-eslint/visitor-keys@7.8.0': - resolution: {integrity: sha512-q4/gibTNBQNA0lGyYQCmWRS5D15n8rXh4QjK3KV+MBPlTYHpfBUT3D3PaPR/HeNiI9W6R7FvlkcGhNyAoP+caA==} - engines: {node: ^18.18.0 || >=20.0.0} - - '@ungap/structured-clone@1.2.0': - resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} - - '@vitejs/plugin-react-swc@3.6.0': - resolution: {integrity: sha512-XFRbsGgpGxGzEV5i5+vRiro1bwcIaZDIdBRP16qwm+jP68ue/S8FJTBEgOeojtVDYrbSua3XFp71kC8VJE6v+g==} - peerDependencies: - vite: ^4 || ^5 - - JSONStream@1.3.5: - resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} - hasBin: true - - abab@2.0.6: - resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} - deprecated: Use your platform's native atob() and btoa() methods instead - - acorn-globals@7.0.1: - resolution: {integrity: sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==} - - acorn-jsx@5.3.2: - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - - acorn-walk@8.3.2: - resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} - engines: {node: '>=0.4.0'} - - acorn@8.11.3: - resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} - engines: {node: '>=0.4.0'} - hasBin: true - - agent-base@6.0.2: - resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} - engines: {node: '>= 6.0.0'} - - ajv-formats@2.1.1: - resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} - peerDependencies: - ajv: ^8.0.0 - peerDependenciesMeta: - ajv: - optional: true - - ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - - ajv@8.13.0: - resolution: {integrity: sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==} - - ansi-escapes@4.3.2: - resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} - engines: {node: '>=8'} - - ansi-escapes@6.2.1: - resolution: {integrity: sha512-4nJ3yixlEthEJ9Rk4vPcdBRkZvQZlYyu8j4/Mqz5sgIkddmEnH2Yj2ZrnP9S3tQOvSNRUIgVNF/1yPpRAGNRig==} - engines: {node: '>=14.16'} - - ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - - ansi-regex@6.0.1: - resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} - engines: {node: '>=12'} - - ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} - - ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - - ansi-styles@5.2.0: - resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} - engines: {node: '>=10'} - - ansi-styles@6.2.1: - resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} - engines: {node: '>=12'} - - anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - - arch@2.2.0: - resolution: {integrity: sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==} - - arg@4.1.3: - resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} - - argparse@1.0.10: - resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} - - argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - - aria-query@5.3.0: - resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} - - array-buffer-byte-length@1.0.1: - resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} - engines: {node: '>= 0.4'} - - array-find-index@1.0.2: - resolution: {integrity: sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==} - engines: {node: '>=0.10.0'} - - array-includes@3.1.8: - resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} - engines: {node: '>= 0.4'} - - array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} - - array.prototype.findlast@1.2.5: - resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} - engines: {node: '>= 0.4'} - - array.prototype.findlastindex@1.2.5: - resolution: {integrity: sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==} - engines: {node: '>= 0.4'} - - array.prototype.flat@1.3.2: - resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} - engines: {node: '>= 0.4'} - - array.prototype.flatmap@1.3.2: - resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} - engines: {node: '>= 0.4'} - - array.prototype.toreversed@1.1.2: - resolution: {integrity: sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==} - - array.prototype.tosorted@1.1.3: - resolution: {integrity: sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg==} - - arraybuffer.prototype.slice@1.0.3: - resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} - engines: {node: '>= 0.4'} - - async@3.2.5: - resolution: {integrity: sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==} - - asynckit@0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - - at-least-node@1.0.0: - resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} - engines: {node: '>= 4.0.0'} - - atomically@1.7.0: - resolution: {integrity: sha512-Xcz9l0z7y9yQ9rdDaxlmaI4uJHf/T8g9hOEzJcsEqX2SjCj4J20uK7+ldkDHMbpJDK76wF7xEIgxc/vSlsfw5w==} - engines: {node: '>=10.12.0'} - - audit-ci@6.6.1: - resolution: {integrity: sha512-zqZEoYfEC4QwX5yBkDNa0h7YhZC63HWtKtP19BVq+RS0dxRBInfmHogxe4VUeOzoADQjuTLZUI7zp3Pjyl+a5g==} - engines: {node: '>=12.9.0'} - hasBin: true - - autoprefixer@10.4.19: - resolution: {integrity: sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==} - engines: {node: ^10 || ^12 || >=14} - hasBin: true - peerDependencies: - postcss: ^8.1.0 - - available-typed-arrays@1.0.7: - resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} - engines: {node: '>= 0.4'} - - axios@1.6.8: - resolution: {integrity: sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==} - - babel-jest@29.7.0: - resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - '@babel/core': ^7.8.0 - - babel-plugin-istanbul@6.1.1: - resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} - engines: {node: '>=8'} - - babel-plugin-jest-hoist@29.6.3: - resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - babel-plugin-macros@3.1.0: - resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} - engines: {node: '>=10', npm: '>=6'} - - babel-plugin-polyfill-corejs2@0.4.11: - resolution: {integrity: sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - - babel-plugin-polyfill-corejs3@0.10.4: - resolution: {integrity: sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - - babel-plugin-polyfill-regenerator@0.6.2: - resolution: {integrity: sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - - babel-preset-current-node-syntax@1.0.1: - resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} - peerDependencies: - '@babel/core': ^7.0.0 - - babel-preset-jest@29.6.3: - resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - '@babel/core': ^7.0.0 - - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - - bl@4.1.0: - resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} - - brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - - brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} - - braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} - engines: {node: '>=8'} - - browserslist@4.23.0: - resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true - - bs-logger@0.2.6: - resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} - engines: {node: '>= 6'} - - bser@2.1.1: - resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} - - buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - - buffer@5.7.1: - resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} - - builtin-modules@3.3.0: - resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} - engines: {node: '>=6'} - - call-bind@1.0.7: - resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} - engines: {node: '>= 0.4'} - - callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} - - camelcase@5.3.1: - resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} - engines: {node: '>=6'} - - camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} - - caniuse-lite@1.0.30001615: - resolution: {integrity: sha512-1IpazM5G3r38meiae0bHRnPhz+CBQ3ZLqbQMtrg+AsTPKAXgW38JNsXkyZ+v8waCsDmPq87lmfun5Q2AGysNEQ==} - - chalk@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} - - chalk@3.0.0: - resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==} - engines: {node: '>=8'} - - chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - - chalk@5.3.0: - resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - - char-regex@1.0.2: - resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} - engines: {node: '>=10'} - - ci-info@3.9.0: - resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} - engines: {node: '>=8'} - - cjs-module-lexer@1.3.1: - resolution: {integrity: sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q==} - - cli-cursor@3.1.0: - resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} - engines: {node: '>=8'} - - cli-cursor@4.0.0: - resolution: {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - cli-spinners@2.9.2: - resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} - engines: {node: '>=6'} - - cli-truncate@4.0.0: - resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==} - engines: {node: '>=18'} - - cli-width@4.1.0: - resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} - engines: {node: '>= 12'} - - cliui@8.0.1: - resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} - engines: {node: '>=12'} - - clone@1.0.4: - resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} - engines: {node: '>=0.8'} - - clsx@2.1.1: - resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} - engines: {node: '>=6'} - - co@4.6.0: - resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} - engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} - - collect-v8-coverage@1.0.2: - resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} - - color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} - - color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - - color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - - color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - - color-string@1.9.1: - resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} - - color@3.2.1: - resolution: {integrity: sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==} - - colorette@2.0.20: - resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} - - colorspace@1.1.4: - resolution: {integrity: sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==} - - combined-stream@1.0.8: - resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} - engines: {node: '>= 0.8'} - - commander@11.1.0: - resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} - engines: {node: '>=16'} - - commander@12.0.0: - resolution: {integrity: sha512-MwVNWlYjDTtOjX5PiD7o5pK0UrFU/OYgcJfjjK4RaHZETNtjJqrZa9Y9ds88+A+f+d5lv+561eZ+yCKoS3gbAA==} - engines: {node: '>=18'} - - commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - - common-tags@1.8.2: - resolution: {integrity: sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==} - engines: {node: '>=4.0.0'} - - concat-map@0.0.1: - resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=} - - conf@10.2.0: - resolution: {integrity: sha512-8fLl9F04EJqjSqH+QjITQfJF8BrOVaYr1jewVgSRAEWePfxT0sku4w2hrGQ60BC/TNLGQ2pgxNlTbWQmMPFvXg==} - engines: {node: '>=12'} - - convert-source-map@1.9.0: - resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} - - convert-source-map@2.0.0: - resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - - cookie@0.5.0: - resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} - engines: {node: '>= 0.6'} - - core-js-compat@3.37.0: - resolution: {integrity: sha512-vYq4L+T8aS5UuFg4UwDhc7YNRWVeVZwltad9C/jV3R2LgVOpS9BDr7l/WL6BN0dbV3k1XejPTHqqEzJgsa0frA==} - - cosmiconfig@7.1.0: - resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} - engines: {node: '>=10'} - - cosmiconfig@9.0.0: - resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} - engines: {node: '>=14'} - peerDependencies: - typescript: '>=4.9.5' - peerDependenciesMeta: - typescript: - optional: true - - create-jest@29.7.0: - resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true - - create-require@1.1.1: - resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} - - cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} - engines: {node: '>= 8'} - - crypto-random-string@2.0.0: - resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==} - engines: {node: '>=8'} - - css.escape@1.5.1: - resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==} - - cssom@0.3.8: - resolution: {integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==} - - cssom@0.5.0: - resolution: {integrity: sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==} - - cssstyle@2.3.0: - resolution: {integrity: sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==} - engines: {node: '>=8'} - - csstype@3.1.3: - resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} - - csv-parse@5.5.5: - resolution: {integrity: sha512-erCk7tyU3yLWAhk6wvKxnyPtftuy/6Ak622gOO7BCJ05+TYffnPCJF905wmOQm+BpkX54OdAl8pveJwUdpnCXQ==} - - cuint@0.2.2: - resolution: {integrity: sha512-d4ZVpCW31eWwCMe1YT3ur7mUDnTXbgwyzaL320DrcRT45rfjYxkt5QWLrmOJ+/UEAI2+fQgKe/fCjR8l4TpRgw==} - - data-uri-to-buffer@4.0.1: - resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} - engines: {node: '>= 12'} - - data-urls@3.0.2: - resolution: {integrity: sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==} - engines: {node: '>=12'} - - data-view-buffer@1.0.1: - resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} - engines: {node: '>= 0.4'} - - data-view-byte-length@1.0.1: - resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} - engines: {node: '>= 0.4'} - - data-view-byte-offset@1.0.0: - resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} - engines: {node: '>= 0.4'} - - dayjs@1.11.11: - resolution: {integrity: sha512-okzr3f11N6WuqYtZSvm+F776mB41wRZMhKP+hc34YdW+KmtYYK9iqvHSwo2k9FEH3fhGXvOPV6yz2IcSrfRUDg==} - - debounce-fn@4.0.0: - resolution: {integrity: sha512-8pYCQiL9Xdcg0UPSD3d+0KMlOjp+KGU5EPwYddgzQ7DATsg4fuUDjQtsYLmWjnk2obnNHgV3vE2Y4jejSOJVBQ==} - engines: {node: '>=10'} - - debug@3.2.7: - resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - debug@4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - decimal.js@10.4.3: - resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} - - dedent@1.5.3: - resolution: {integrity: sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==} - peerDependencies: - babel-plugin-macros: ^3.1.0 - peerDependenciesMeta: - babel-plugin-macros: - optional: true - - deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - - deepmerge@4.3.1: - resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} - engines: {node: '>=0.10.0'} - - defaults@1.0.4: - resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} - - define-data-property@1.1.4: - resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} - engines: {node: '>= 0.4'} - - define-lazy-prop@2.0.0: - resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} - engines: {node: '>=8'} - - define-properties@1.2.1: - resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} - engines: {node: '>= 0.4'} - - delayed-stream@1.0.0: - resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} - engines: {node: '>=0.4.0'} - - dequal@2.0.3: - resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} - engines: {node: '>=6'} - - detect-newline@3.1.0: - resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} - engines: {node: '>=8'} - - diff-sequences@29.6.3: - resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - diff@4.0.2: - resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} - engines: {node: '>=0.3.1'} - - diff@5.2.0: - resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} - engines: {node: '>=0.3.1'} - - dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} - - doctrine@2.1.0: - resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} - engines: {node: '>=0.10.0'} - - doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} - - dom-accessibility-api@0.5.16: - resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} - - dom-accessibility-api@0.6.3: - resolution: {integrity: sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==} - - dom-helpers@5.2.1: - resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==} - - domexception@4.0.0: - resolution: {integrity: sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==} - engines: {node: '>=12'} - deprecated: Use your platform's native DOMException instead - - dot-prop@6.0.1: - resolution: {integrity: sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==} - engines: {node: '>=10'} - - dotenv-expand@11.0.6: - resolution: {integrity: sha512-8NHi73otpWsZGBSZwwknTXS5pqMOrk9+Ssrna8xCaxkzEpU9OTf9R5ArQGVw03//Zmk9MOwLPng9WwndvpAJ5g==} - engines: {node: '>=12'} - - dotenv@16.4.5: - resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} - engines: {node: '>=12'} - - duplexer@0.1.2: - resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} - - eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - - ejs@3.1.10: - resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} - engines: {node: '>=0.10.0'} - hasBin: true - - electron-to-chromium@1.4.755: - resolution: {integrity: sha512-9nop+3jZxSHIxe1EzEUcjDXzK+3qOv3fY5w0sE88nIZUntbv1aXWmoxGWlklX5XSO4txCpLssWkUSh8RQPovBg==} - - emittery@0.13.1: - resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} - engines: {node: '>=12'} - - emoji-regex@10.3.0: - resolution: {integrity: sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==} - - emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - - emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - - enabled@2.0.0: - resolution: {integrity: sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==} - - enhanced-resolve@5.16.0: - resolution: {integrity: sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA==} - engines: {node: '>=10.13.0'} - - entities@4.5.0: - resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} - engines: {node: '>=0.12'} - - env-paths@2.2.1: - resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} - engines: {node: '>=6'} - - error-ex@1.3.2: - resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} - - es-abstract@1.23.3: - resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==} - engines: {node: '>= 0.4'} - - es-define-property@1.0.0: - resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} - engines: {node: '>= 0.4'} - - es-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} - engines: {node: '>= 0.4'} - - es-iterator-helpers@1.0.19: - resolution: {integrity: sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==} - engines: {node: '>= 0.4'} - - es-object-atoms@1.0.0: - resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} - engines: {node: '>= 0.4'} - - es-set-tostringtag@2.0.3: - resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} - engines: {node: '>= 0.4'} - - es-shim-unscopables@1.0.2: - resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} - - es-to-primitive@1.2.1: - resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} - engines: {node: '>= 0.4'} - - esbuild@0.20.2: - resolution: {integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==} - engines: {node: '>=12'} - hasBin: true - - escalade@3.1.2: - resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} - engines: {node: '>=6'} - - escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} - - escape-string-regexp@2.0.0: - resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} - engines: {node: '>=8'} - - escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - - escodegen@2.1.0: - resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} - engines: {node: '>=6.0'} - hasBin: true - - eslint-compat-utils@0.5.0: - resolution: {integrity: sha512-dc6Y8tzEcSYZMHa+CMPLi/hyo1FzNeonbhJL7Ol0ccuKQkwopJcJBA9YL/xmMTLU1eKigXo9vj9nALElWYSowg==} - engines: {node: '>=12'} - peerDependencies: - eslint: '>=6.0.0' - - eslint-config-prettier@9.1.0: - resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} - hasBin: true - peerDependencies: - eslint: '>=7.0.0' - - eslint-import-resolver-node@0.3.9: - resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} - - eslint-module-utils@2.8.1: - resolution: {integrity: sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: '*' - eslint-import-resolver-node: '*' - eslint-import-resolver-typescript: '*' - eslint-import-resolver-webpack: '*' - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - eslint: - optional: true - eslint-import-resolver-node: - optional: true - eslint-import-resolver-typescript: - optional: true - eslint-import-resolver-webpack: - optional: true - - eslint-plugin-es-x@7.6.0: - resolution: {integrity: sha512-I0AmeNgevgaTR7y2lrVCJmGYF0rjoznpDvqV/kIkZSZbZ8Rw3eu4cGlvBBULScfkSOCzqKbff5LR4CNrV7mZHA==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - eslint: '>=8' - - eslint-plugin-import@2.29.1: - resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - - eslint-plugin-n@17.4.0: - resolution: {integrity: sha512-RtgGgNpYxECwE9dFr+D66RtbN0B8r/fY6ZF8EVsmK2YnZxE8/n9LNQhgnkL9z37UFZjYVmvMuC32qu7fQBsLVQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: '>=8.23.0' - - eslint-plugin-prettier@5.1.3: - resolution: {integrity: sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - '@types/eslint': '>=8.0.0' - eslint: '>=8.0.0' - eslint-config-prettier: '*' - prettier: '>=3.0.0' - peerDependenciesMeta: - '@types/eslint': - optional: true - eslint-config-prettier: - optional: true - - eslint-plugin-promise@6.1.1: - resolution: {integrity: sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - - eslint-plugin-react-hooks@4.6.2: - resolution: {integrity: sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==} - engines: {node: '>=10'} - peerDependencies: - eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 - - eslint-plugin-react@7.34.1: - resolution: {integrity: sha512-N97CxlouPT1AHt8Jn0mhhN2RrADlUAsk1/atcT2KyA/l9Q/E6ll7OIGwNumFmWfZ9skV3XXccYS19h80rHtgkw==} - engines: {node: '>=4'} - peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 - - eslint-scope@7.2.2: - resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - eslint-visitor-keys@3.4.3: - resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - eslint@8.57.0: - resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - hasBin: true - - espree@9.6.1: - resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - esprima@4.0.1: - resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} - engines: {node: '>=4'} - hasBin: true - - esquery@1.5.0: - resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} - engines: {node: '>=0.10'} - - esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} - - estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} - - estree-walker@1.0.1: - resolution: {integrity: sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==} - - estree-walker@2.0.2: - resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} - - esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} - - event-stream@4.0.1: - resolution: {integrity: sha512-qACXdu/9VHPBzcyhdOWR5/IahhGMf0roTeZJfzz077GwylcDd90yOHLouhmv7GJ5XzPi6ekaQWd8AvPP2nOvpA==} - - eventemitter3@5.0.1: - resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} - - execa@5.1.1: - resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} - engines: {node: '>=10'} - - execa@8.0.1: - resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} - engines: {node: '>=16.17'} - - exit@0.1.2: - resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} - engines: {node: '>= 0.8.0'} - - expect@29.7.0: - resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - - fast-diff@1.3.0: - resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} - - fast-glob@3.3.2: - resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} - engines: {node: '>=8.6.0'} - - fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - - fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - - fastq@1.17.1: - resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} - - fb-watchman@2.0.2: - resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} - - fecha@4.2.3: - resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==} - - fetch-blob@3.2.0: - resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} - engines: {node: ^12.20 || >= 14.13} - - figures@3.2.0: - resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} - engines: {node: '>=8'} - - file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} - - filelist@1.0.4: - resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} - - fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} - engines: {node: '>=8'} - - find-root@1.1.0: - resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} - - find-up@3.0.0: - resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} - engines: {node: '>=6'} - - find-up@4.1.0: - resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} - engines: {node: '>=8'} - - find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - - flat-cache@3.2.0: - resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} - engines: {node: ^10.12.0 || >=12.0.0} - - flatted@3.3.1: - resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} - - fn.name@1.1.0: - resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==} - - follow-redirects@1.15.6: - resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} - engines: {node: '>=4.0'} - peerDependencies: - debug: '*' - peerDependenciesMeta: - debug: - optional: true - - for-each@0.3.3: - resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} - - foreground-child@3.1.1: - resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} - engines: {node: '>=14'} - - form-data@4.0.0: - resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} - engines: {node: '>= 6'} - - formdata-polyfill@4.0.10: - resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} - engines: {node: '>=12.20.0'} - - fraction.js@4.3.7: - resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} - - from@0.1.7: - resolution: {integrity: sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==} - - fs-extra@9.1.0: - resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} - engines: {node: '>=10'} - - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - - fsevents@2.3.2: - resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - - fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - - function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - - function.prototype.name@1.1.6: - resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} - engines: {node: '>= 0.4'} - - functions-have-names@1.2.3: - resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - - gensync@1.0.0-beta.2: - resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} - engines: {node: '>=6.9.0'} - - get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - - get-east-asian-width@1.2.0: - resolution: {integrity: sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==} - engines: {node: '>=18'} - - get-intrinsic@1.2.4: - resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} - engines: {node: '>= 0.4'} - - get-own-enumerable-property-symbols@3.0.2: - resolution: {integrity: sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==} - - get-package-type@0.1.0: - resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} - engines: {node: '>=8.0.0'} - - get-stream@6.0.1: - resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} - engines: {node: '>=10'} - - get-stream@8.0.1: - resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} - engines: {node: '>=16'} - - get-symbol-description@1.0.2: - resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} - engines: {node: '>= 0.4'} - - get-tsconfig@4.7.3: - resolution: {integrity: sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg==} - - glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - - glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} - - glob@10.3.12: - resolution: {integrity: sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==} - engines: {node: '>=16 || 14 >=14.17'} - hasBin: true - - glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - - globals@11.12.0: - resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} - engines: {node: '>=4'} - - globals@13.24.0: - resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} - engines: {node: '>=8'} - - globals@15.1.0: - resolution: {integrity: sha512-926gJqg+4mkxwYKiFvoomM4J0kWESfk3qfTvRL2/oc/tK/eTDBbrfcKnSa2KtfdxB5onoL7D3A3qIHQFpd4+UA==} - engines: {node: '>=18'} - - globalthis@1.0.4: - resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} - engines: {node: '>= 0.4'} - - globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} - - gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} - - graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - - graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - - graphql@16.8.1: - resolution: {integrity: sha512-59LZHPdGZVh695Ud9lRzPBVTtlX9ZCV150Er2W43ro37wVof0ctenSaskPPjN7lVTIN8mSZt8PHUNKZuNQUuxw==} - engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} - - harmony-reflect@1.6.2: - resolution: {integrity: sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==} - - has-bigints@1.0.2: - resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} - - has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} - - has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - - has-property-descriptors@1.0.2: - resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} - - has-proto@1.0.3: - resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} - engines: {node: '>= 0.4'} - - has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} - engines: {node: '>= 0.4'} - - has-tostringtag@1.0.2: - resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} - engines: {node: '>= 0.4'} - - hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} - engines: {node: '>= 0.4'} - - headers-polyfill@4.0.3: - resolution: {integrity: sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ==} - - hoist-non-react-statics@3.3.2: - resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} - - html-encoding-sniffer@3.0.0: - resolution: {integrity: sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==} - engines: {node: '>=12'} - - html-escaper@2.0.2: - resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} - - http-proxy-agent@5.0.0: - resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} - engines: {node: '>= 6'} - - https-proxy-agent@5.0.1: - resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} - engines: {node: '>= 6'} - - human-signals@2.1.0: - resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} - engines: {node: '>=10.17.0'} - - human-signals@5.0.0: - resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} - engines: {node: '>=16.17.0'} - - husky@9.0.11: - resolution: {integrity: sha512-AB6lFlbwwyIqMdHYhwPe+kjOC3Oc5P3nThEoW/AaO2BX3vJDjWPFxYLxokUZOo6RNX20He3AaT8sESs9NJcmEw==} - engines: {node: '>=18'} - hasBin: true - - iconv-lite@0.6.3: - resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} - engines: {node: '>=0.10.0'} - - idb@7.1.1: - resolution: {integrity: sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==} - - identity-obj-proxy@3.0.0: - resolution: {integrity: sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA==} - engines: {node: '>=4'} - - ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - - ignore@5.3.1: - resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} - engines: {node: '>= 4'} - - immer@10.1.1: - resolution: {integrity: sha512-s2MPrmjovJcoMaHtx6K11Ra7oD05NT97w1IC5zpMkT6Atjr7H8LjaDd81iIxUYpMKSRRNMJE703M1Fhr/TctHw==} - - import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} - engines: {node: '>=6'} - - import-local@3.1.0: - resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==} - engines: {node: '>=8'} - hasBin: true - - imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} - - indent-string@4.0.0: - resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} - engines: {node: '>=8'} - - inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - internal-slot@1.0.7: - resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} - engines: {node: '>= 0.4'} - - is-array-buffer@3.0.4: - resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} - engines: {node: '>= 0.4'} - - is-arrayish@0.2.1: - resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - - is-arrayish@0.3.2: - resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} - - is-async-function@2.0.0: - resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==} - engines: {node: '>= 0.4'} - - is-bigint@1.0.4: - resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} - - is-boolean-object@1.1.2: - resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} - engines: {node: '>= 0.4'} - - is-builtin-module@3.2.1: - resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} - engines: {node: '>=6'} - - is-callable@1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} - - is-core-module@2.13.1: - resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} - - is-data-view@1.0.1: - resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} - engines: {node: '>= 0.4'} - - is-date-object@1.0.5: - resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} - engines: {node: '>= 0.4'} - - is-docker@2.2.1: - resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} - engines: {node: '>=8'} - hasBin: true - - is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - - is-finalizationregistry@1.0.2: - resolution: {integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==} - - is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - - is-fullwidth-code-point@4.0.0: - resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} - engines: {node: '>=12'} - - is-fullwidth-code-point@5.0.0: - resolution: {integrity: sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==} - engines: {node: '>=18'} - - is-generator-fn@2.1.0: - resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} - engines: {node: '>=6'} - - is-generator-function@1.0.10: - resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} - engines: {node: '>= 0.4'} - - is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - - is-interactive@1.0.0: - resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} - engines: {node: '>=8'} - - is-map@2.0.3: - resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} - engines: {node: '>= 0.4'} - - is-module@1.0.0: - resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} - - is-negative-zero@2.0.3: - resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} - engines: {node: '>= 0.4'} - - is-node-process@1.2.0: - resolution: {integrity: sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==} - - is-number-object@1.0.7: - resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} - engines: {node: '>= 0.4'} - - is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - - is-obj@1.0.1: - resolution: {integrity: sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==} - engines: {node: '>=0.10.0'} - - is-obj@2.0.0: - resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} - engines: {node: '>=8'} - - is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} - - is-potential-custom-element-name@1.0.1: - resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} - - is-regex@1.1.4: - resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} - engines: {node: '>= 0.4'} - - is-regexp@1.0.0: - resolution: {integrity: sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==} - engines: {node: '>=0.10.0'} - - is-set@2.0.3: - resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} - engines: {node: '>= 0.4'} - - is-shared-array-buffer@1.0.3: - resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} - engines: {node: '>= 0.4'} - - is-stream@2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} - - is-stream@3.0.0: - resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - is-string@1.0.7: - resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} - engines: {node: '>= 0.4'} - - is-symbol@1.0.4: - resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} - engines: {node: '>= 0.4'} - - is-typed-array@1.1.13: - resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} - engines: {node: '>= 0.4'} - - is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} - - is-weakmap@2.0.2: - resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} - engines: {node: '>= 0.4'} - - is-weakref@1.0.2: - resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} - - is-weakset@2.0.3: - resolution: {integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==} - engines: {node: '>= 0.4'} - - is-wsl@2.2.0: - resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} - engines: {node: '>=8'} - - isarray@2.0.5: - resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} - - isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - - isexe@3.1.1: - resolution: {integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==} - engines: {node: '>=16'} - - istanbul-lib-coverage@3.2.2: - resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} - engines: {node: '>=8'} - - istanbul-lib-instrument@5.2.1: - resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} - engines: {node: '>=8'} - - istanbul-lib-instrument@6.0.2: - resolution: {integrity: sha512-1WUsZ9R1lA0HtBSohTkm39WTPlNKSJ5iFk7UwqXkBLoHQT+hfqPsfsTDVuZdKGaBwn7din9bS7SsnoAr943hvw==} - engines: {node: '>=10'} - - istanbul-lib-report@3.0.1: - resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} - engines: {node: '>=10'} - - istanbul-lib-source-maps@4.0.1: - resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} - engines: {node: '>=10'} - - istanbul-reports@3.1.7: - resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} - engines: {node: '>=8'} - - iterator.prototype@1.1.2: - resolution: {integrity: sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==} - - jackspeak@2.3.6: - resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} - engines: {node: '>=14'} - - jake@10.8.7: - resolution: {integrity: sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==} - engines: {node: '>=10'} - hasBin: true - - jest-changed-files@29.7.0: - resolution: {integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-circus@29.7.0: - resolution: {integrity: sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-cli@29.7.0: - resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - - jest-config@29.7.0: - resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - '@types/node': '*' - ts-node: '>=9.0.0' - peerDependenciesMeta: - '@types/node': - optional: true - ts-node: - optional: true - - jest-diff@29.7.0: - resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-docblock@29.7.0: - resolution: {integrity: sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-each@29.7.0: - resolution: {integrity: sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-environment-jsdom@29.7.0: - resolution: {integrity: sha512-k9iQbsf9OyOfdzWH8HDmrRT0gSIcX+FLNW7IQq94tFX0gynPwqDTW0Ho6iMVNjGz/nb+l/vW3dWM2bbLLpkbXA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - canvas: ^2.5.0 - peerDependenciesMeta: - canvas: - optional: true - - jest-environment-node@29.7.0: - resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-get-type@29.6.3: - resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-haste-map@29.7.0: - resolution: {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-leak-detector@29.7.0: - resolution: {integrity: sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-matcher-utils@29.7.0: - resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-message-util@29.7.0: - resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-mock@29.7.0: - resolution: {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-pnp-resolver@1.2.3: - resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} - engines: {node: '>=6'} - peerDependencies: - jest-resolve: '*' - peerDependenciesMeta: - jest-resolve: - optional: true - - jest-regex-util@29.6.3: - resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-resolve-dependencies@29.7.0: - resolution: {integrity: sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-resolve@29.7.0: - resolution: {integrity: sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-runner@29.7.0: - resolution: {integrity: sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-runtime@29.7.0: - resolution: {integrity: sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-snapshot@29.7.0: - resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-util@29.7.0: - resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-validate@29.7.0: - resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-watcher@29.7.0: - resolution: {integrity: sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-worker@29.7.0: - resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest@29.7.0: - resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - - jju@1.4.0: - resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} - - joi@17.12.3: - resolution: {integrity: sha512-2RRziagf555owrm9IRVtdKynOBeITiDpuZqIpgwqXShPncPKNiRQoiGsl/T8SQdq+8ugRzH2LqY67irr2y/d+g==} - - js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - - js-yaml@3.14.1: - resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} - hasBin: true - - js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - - jsdom@20.0.3: - resolution: {integrity: sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==} - engines: {node: '>=14'} - peerDependencies: - canvas: ^2.5.0 - peerDependenciesMeta: - canvas: - optional: true - - jsesc@0.5.0: - resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} - hasBin: true - - jsesc@2.5.2: - resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} - engines: {node: '>=4'} - hasBin: true - - json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - - json-parse-even-better-errors@2.3.1: - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - - json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - - json-schema-traverse@1.0.0: - resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} - - json-schema-typed@7.0.3: - resolution: {integrity: sha512-7DE8mpG+/fVw+dTpjbxnx47TaMnDfOI1jwft9g1VybltZCduyRQPJPvc+zzKY9WPHxhPWczyFuYa6I8Mw4iU5A==} - - json-schema@0.4.0: - resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} - - json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - - json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} - hasBin: true - - json5@2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} - engines: {node: '>=6'} - hasBin: true - - jsonfile@6.1.0: - resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} - - jsonparse@1.3.1: - resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} - engines: {'0': node >= 0.2.0} - - jsonpointer@5.0.1: - resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==} - engines: {node: '>=0.10.0'} - - jsx-ast-utils@3.3.5: - resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} - engines: {node: '>=4.0'} - - keyv@4.5.4: - resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - - kleur@3.0.3: - resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} - engines: {node: '>=6'} - - kuler@2.0.0: - resolution: {integrity: sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==} - - leven@3.1.0: - resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} - engines: {node: '>=6'} - - levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} - - license-compliance@3.0.0: - resolution: {integrity: sha512-0kXEr7JSdP+jPSTSEnAiyGvpOoFnkiVXqmTFhXx22+tCay7shTN1mVM7Z+p2F3YNeIhx0tmADglrp5ddWGyHnQ==} - engines: {node: '>=18.20.1'} - hasBin: true - - lilconfig@3.0.0: - resolution: {integrity: sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==} - engines: {node: '>=14'} - - lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - - lint-staged@15.2.2: - resolution: {integrity: sha512-TiTt93OPh1OZOsb5B7k96A/ATl2AjIZo+vnzFZ6oHK5FuTk63ByDtxGQpHm+kFETjEWqgkF95M8FRXKR/LEBcw==} - engines: {node: '>=18.12.0'} - hasBin: true - - listr2@8.0.1: - resolution: {integrity: sha512-ovJXBXkKGfq+CwmKTjluEqFi3p4h8xvkxGQQAQan22YCgef4KZ1mKGjzfGh6PL6AW5Csw0QiQPNuQyH+6Xk3hA==} - engines: {node: '>=18.0.0'} - - locate-path@3.0.0: - resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} - engines: {node: '>=6'} - - locate-path@5.0.0: - resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} - engines: {node: '>=8'} - - locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - - lodash.camelcase@4.3.0: - resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} - - lodash.debounce@4.0.8: - resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} - - lodash.memoize@4.1.2: - resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} - - lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - - lodash.sortby@4.7.0: - resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} - - lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - - log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} - - log-update@6.0.0: - resolution: {integrity: sha512-niTvB4gqvtof056rRIrTZvjNYE4rCUzO6X/X+kYjd7WFxXeJ0NwEFnRxX6ehkvv3jTwrXnNdtAak5XYZuIyPFw==} - engines: {node: '>=18'} - - logform@2.6.0: - resolution: {integrity: sha512-1ulHeNPp6k/LD8H91o7VYFBng5i1BDE7HoKxVbZiGFidS1Rj65qcywLxX+pVfAPoQJEjRdvKcusKwOupHCVOVQ==} - engines: {node: '>= 12.0.0'} - - loose-envify@1.4.0: - resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} - hasBin: true - - lru-cache@10.2.2: - resolution: {integrity: sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==} - engines: {node: 14 || >=16.14} - - lru-cache@5.1.1: - resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} - - lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} - - lz-string@1.5.0: - resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} - hasBin: true - - magic-string@0.25.9: - resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} - - make-dir@4.0.0: - resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} - engines: {node: '>=10'} - - make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - - makeerror@1.0.12: - resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} - - map-stream@0.0.7: - resolution: {integrity: sha512-C0X0KQmGm3N2ftbTGBhSyuydQ+vV1LC3f3zPvT3RXHXNZrvfPZcoXp/N5DOa8vedX/rTMm2CjTtivFg2STJMRQ==} - - merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} - - merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - - micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} - engines: {node: '>=8.6'} - - mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} - - mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} - - mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} - - mimic-fn@3.1.0: - resolution: {integrity: sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==} - engines: {node: '>=8'} - - mimic-fn@4.0.0: - resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} - engines: {node: '>=12'} - - min-indent@1.0.1: - resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} - engines: {node: '>=4'} - - minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - - minimatch@5.1.6: - resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} - engines: {node: '>=10'} - - minimatch@9.0.4: - resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} - engines: {node: '>=16 || 14 >=14.17'} - - minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - - minipass@7.0.4: - resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} - engines: {node: '>=16 || 14 >=14.17'} - - ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - - ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - - msw@2.2.14: - resolution: {integrity: sha512-64i8rNCa1xzDK8ZYsTrVMli05D687jty8+Th+PU5VTbJ2/4P7fkQFVyDQ6ZFT5FrNR8z2BHhbY47fKNvfHrumA==} - engines: {node: '>=18'} - hasBin: true - peerDependencies: - typescript: '>= 4.7.x' - peerDependenciesMeta: - typescript: - optional: true - - mute-stream@1.0.0: - resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - - nanoid@3.3.7: - resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - - natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - - node-domexception@1.0.0: - resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} - engines: {node: '>=10.5.0'} - - node-fetch@3.3.2: - resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - node-int64@0.4.0: - resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} - - node-releases@2.0.14: - resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} - - normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - - normalize-range@0.1.2: - resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} - engines: {node: '>=0.10.0'} - - npm-run-path@4.0.1: - resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} - engines: {node: '>=8'} - - npm-run-path@5.3.0: - resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - nwsapi@2.2.9: - resolution: {integrity: sha512-2f3F0SEEer8bBu0dsNCFF50N0cTThV1nWFYcEYFZttdW0lDAoybv9cQoK7X7/68Z89S7FoRrVjP1LPX4XRf9vg==} - - object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} - - object-inspect@1.13.1: - resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} - - object-keys@1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} - - object-treeify@1.1.33: - resolution: {integrity: sha512-EFVjAYfzWqWsBMRHPMAXLCDIJnpMhdWAqR7xG6M6a2cs6PMFpl/+Z20w9zDW4vkxOFfddegBKq9Rehd0bxWE7A==} - engines: {node: '>= 10'} - - object.assign@4.1.5: - resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} - engines: {node: '>= 0.4'} - - object.entries@1.1.8: - resolution: {integrity: sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==} - engines: {node: '>= 0.4'} - - object.fromentries@2.0.8: - resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} - engines: {node: '>= 0.4'} - - object.groupby@1.0.3: - resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} - engines: {node: '>= 0.4'} - - object.hasown@1.1.4: - resolution: {integrity: sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg==} - engines: {node: '>= 0.4'} - - object.values@1.2.0: - resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==} - engines: {node: '>= 0.4'} - - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - - one-time@1.0.0: - resolution: {integrity: sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==} - - onetime@5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} - - onetime@6.0.0: - resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} - engines: {node: '>=12'} - - open@8.4.2: - resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} - engines: {node: '>=12'} - - optionator@0.9.4: - resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} - engines: {node: '>= 0.8.0'} - - ora@5.4.1: - resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} - engines: {node: '>=10'} - - outvariant@1.4.2: - resolution: {integrity: sha512-Ou3dJ6bA/UJ5GVHxah4LnqDwZRwAmWxrG3wtrHrbGnP4RnLCtA64A4F+ae7Y8ww660JaddSoArUR5HjipWSHAQ==} - - p-limit@2.3.0: - resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} - engines: {node: '>=6'} - - p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - - p-locate@3.0.0: - resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} - engines: {node: '>=6'} - - p-locate@4.1.0: - resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} - engines: {node: '>=8'} - - p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - - p-try@2.2.0: - resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} - engines: {node: '>=6'} - - parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} - - parse-json@5.2.0: - resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} - engines: {node: '>=8'} - - parse5@7.1.2: - resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} - - path-exists@3.0.0: - resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} - engines: {node: '>=4'} - - path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - - path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - - path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} - - path-key@4.0.0: - resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} - engines: {node: '>=12'} - - path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - - path-scurry@1.10.2: - resolution: {integrity: sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==} - engines: {node: '>=16 || 14 >=14.17'} - - path-to-regexp@6.2.2: - resolution: {integrity: sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==} - - path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} - - pause-stream@0.0.11: - resolution: {integrity: sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==} - - picocolors@1.0.0: - resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} - - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - - pidtree@0.6.0: - resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} - engines: {node: '>=0.10'} - hasBin: true - - pirates@4.0.6: - resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} - engines: {node: '>= 6'} - - pkg-dir@4.2.0: - resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} - engines: {node: '>=8'} - - pkg-up@3.1.0: - resolution: {integrity: sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==} - engines: {node: '>=8'} - - playwright-core@1.43.1: - resolution: {integrity: sha512-EI36Mto2Vrx6VF7rm708qSnesVQKbxEWvPrfA1IPY6HgczBplDx7ENtx+K2n4kJ41sLLkuGfmb0ZLSSXlDhqPg==} - engines: {node: '>=16'} - hasBin: true - - playwright@1.43.1: - resolution: {integrity: sha512-V7SoH0ai2kNt1Md9E3Gwas5B9m8KR2GVvwZnAI6Pg0m3sh7UvgiYhRrhsziCmqMJNouPckiOhk8T+9bSAK0VIA==} - engines: {node: '>=16'} - hasBin: true - - possible-typed-array-names@1.0.0: - resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} - engines: {node: '>= 0.4'} - - postcss-value-parser@4.2.0: - resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - - postcss@8.4.38: - resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} - engines: {node: ^10 || ^12 || >=14} - - prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} - - prettier-linter-helpers@1.0.0: - resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} - engines: {node: '>=6.0.0'} - - prettier-plugin-sort-imports@1.8.5: - resolution: {integrity: sha512-PkizzuO2S8h3kJeWHytnMZXqvv/fD6g+en/dhv4y5QjoiMm1wq3FWzFiFT7c/BilX95l0ZIqJTlMsXYs8z/WQQ==} - peerDependencies: - typescript: '>4.0.0' - - prettier@3.2.5: - resolution: {integrity: sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==} - engines: {node: '>=14'} - hasBin: true - - pretty-bytes@5.6.0: - resolution: {integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==} - engines: {node: '>=6'} - - pretty-bytes@6.1.1: - resolution: {integrity: sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==} - engines: {node: ^14.13.1 || >=16.0.0} - - pretty-format@27.5.1: - resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - - pretty-format@29.7.0: - resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - prompts@2.4.2: - resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} - engines: {node: '>= 6'} - - prop-types@15.8.1: - resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} - - property-expr@2.0.6: - resolution: {integrity: sha512-SVtmxhRE/CGkn3eZY1T6pC8Nln6Fr/lu1mKSgRud0eC73whjGfoAogbn78LkD8aFL0zz3bAFerKSnOl7NlErBA==} - - proxy-from-env@1.1.0: - resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} - - psl@1.9.0: - resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} - - punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} - engines: {node: '>=6'} - - pure-rand@6.1.0: - resolution: {integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==} - - querystringify@2.2.0: - resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} - - queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - - randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - - react-dom@18.3.1: - resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} - peerDependencies: - react: ^18.3.1 - - react-error-boundary@4.0.13: - resolution: {integrity: sha512-b6PwbdSv8XeOSYvjt8LpgpKrZ0yGdtZokYwkwV2wlcZbxgopHX/hgPl5VgpnoVOWd868n1hktM8Qm4b+02MiLQ==} - peerDependencies: - react: '>=16.13.1' - - react-hook-form@7.51.3: - resolution: {integrity: sha512-cvJ/wbHdhYx8aviSWh28w9ImjmVsb5Y05n1+FW786vEZQJV5STNM0pW6ujS+oiBecb0ARBxJFyAnXj9+GHXACQ==} - engines: {node: '>=12.22.0'} - peerDependencies: - react: ^16.8.0 || ^17 || ^18 - - react-is@16.13.1: - resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} - - react-is@17.0.2: - resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} - - react-is@18.3.1: - resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} - - react-redux@9.1.2: - resolution: {integrity: sha512-0OA4dhM1W48l3uzmv6B7TXPCGmokUU4p1M44DGN2/D9a1FjVPukVjER1PcPX97jIg6aUeLq1XJo1IpfbgULn0w==} - peerDependencies: - '@types/react': ^18.2.25 - react: ^18.0 - redux: ^5.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - redux: - optional: true - - react-router-dom@6.23.0: - resolution: {integrity: sha512-Q9YaSYvubwgbal2c9DJKfx6hTNoBp3iJDsl+Duva/DwxoJH+OTXkxGpql4iUK2sla/8z4RpjAm6EWx1qUDuopQ==} - engines: {node: '>=14.0.0'} - peerDependencies: - react: '>=16.8' - react-dom: '>=16.8' - - react-router@6.23.0: - resolution: {integrity: sha512-wPMZ8S2TuPadH0sF5irFGjkNLIcRvOSaEe7v+JER8508dyJumm6XZB1u5kztlX0RVq6AzRVndzqcUh6sFIauzA==} - engines: {node: '>=14.0.0'} - peerDependencies: - react: '>=16.8' - - react-transition-group@4.4.5: - resolution: {integrity: sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==} - peerDependencies: - react: '>=16.6.0' - react-dom: '>=16.6.0' - - react@18.3.1: - resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} - engines: {node: '>=0.10.0'} - - readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} - - readline-transform@1.0.0: - resolution: {integrity: sha512-7KA6+N9IGat52d83dvxnApAWN+MtVb1MiVuMR/cf1O4kYsJG+g/Aav0AHcHKsb6StinayfPLne0+fMX2sOzAKg==} - engines: {node: '>=6'} - - redent@3.0.0: - resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} - engines: {node: '>=8'} - - redux-thunk@3.1.0: - resolution: {integrity: sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw==} - peerDependencies: - redux: ^5.0.0 - - redux@4.2.1: - resolution: {integrity: sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==} - - redux@5.0.1: - resolution: {integrity: sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==} - - reflect.getprototypeof@1.0.6: - resolution: {integrity: sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==} - engines: {node: '>= 0.4'} - - regenerate-unicode-properties@10.1.1: - resolution: {integrity: sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==} - engines: {node: '>=4'} - - regenerate@1.4.2: - resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} - - regenerator-runtime@0.14.1: - resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} - - regenerator-transform@0.15.2: - resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} - - regexp.prototype.flags@1.5.2: - resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} - engines: {node: '>= 0.4'} - - regexpu-core@5.3.2: - resolution: {integrity: sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==} - engines: {node: '>=4'} - - regjsparser@0.9.1: - resolution: {integrity: sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==} - hasBin: true - - require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - - require-from-string@2.0.2: - resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} - engines: {node: '>=0.10.0'} - - requires-port@1.0.0: - resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} - - reselect@5.1.0: - resolution: {integrity: sha512-aw7jcGLDpSgNDyWBQLv2cedml85qd95/iszJjN988zX1t7AVRJi19d9kto5+W7oCfQ94gyo40dVbT6g2k4/kXg==} - - resolve-cwd@3.0.0: - resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} - engines: {node: '>=8'} - - resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} - - resolve-from@5.0.0: - resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} - engines: {node: '>=8'} - - resolve-pkg-maps@1.0.0: - resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - - resolve.exports@2.0.2: - resolution: {integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==} - engines: {node: '>=10'} - - resolve@1.22.8: - resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} - hasBin: true - - resolve@2.0.0-next.5: - resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} - hasBin: true - - restore-cursor@3.1.0: - resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} - engines: {node: '>=8'} - - restore-cursor@4.0.0: - resolution: {integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - - rfdc@1.3.1: - resolution: {integrity: sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==} - - rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - hasBin: true - - rollup@2.79.1: - resolution: {integrity: sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==} - engines: {node: '>=10.0.0'} - hasBin: true - - rollup@4.17.2: - resolution: {integrity: sha512-/9ClTJPByC0U4zNLowV1tMBe8yMEAxewtR3cUNX5BoEpGH3dQEWpJLr6CLp0fPdYRF/fzVOgvDb1zXuakwF5kQ==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} - hasBin: true - - run-async@3.0.0: - resolution: {integrity: sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==} - engines: {node: '>=0.12.0'} - - run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - - safe-array-concat@1.1.2: - resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} - engines: {node: '>=0.4'} - - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - - safe-regex-test@1.0.3: - resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} - engines: {node: '>= 0.4'} - - safe-stable-stringify@2.4.3: - resolution: {integrity: sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==} - engines: {node: '>=10'} - - safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - - saxes@6.0.0: - resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} - engines: {node: '>=v12.22.7'} - - scheduler@0.23.2: - resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} - - semver@6.3.1: - resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} - hasBin: true - - semver@7.6.0: - resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} - engines: {node: '>=10'} - hasBin: true - - serialize-javascript@6.0.2: - resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} - - set-function-length@1.2.2: - resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} - engines: {node: '>= 0.4'} - - set-function-name@2.0.2: - resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} - engines: {node: '>= 0.4'} - - shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} - - shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} - - side-channel@1.0.6: - resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} - engines: {node: '>= 0.4'} - - signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - - signal-exit@4.1.0: - resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} - engines: {node: '>=14'} - - simple-swizzle@0.2.2: - resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} - - sisteransi@1.0.5: - resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} - - slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} - - slice-ansi@5.0.0: - resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} - engines: {node: '>=12'} - - slice-ansi@7.1.0: - resolution: {integrity: sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==} - engines: {node: '>=18'} - - smob@1.5.0: - resolution: {integrity: sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==} - - source-map-js@1.2.0: - resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} - engines: {node: '>=0.10.0'} - - source-map-support@0.5.13: - resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} - - source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - - source-map@0.5.7: - resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} - engines: {node: '>=0.10.0'} - - source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - - source-map@0.8.0-beta.0: - resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} - engines: {node: '>= 8'} - - sourcemap-codec@1.4.8: - resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} - deprecated: Please use @jridgewell/sourcemap-codec instead - - spdx-compare@1.0.0: - resolution: {integrity: sha512-C1mDZOX0hnu0ep9dfmuoi03+eOdDoz2yvK79RxbcrVEG1NO1Ph35yW102DHWKN4pk80nwCgeMmSY5L25VE4D9A==} - - spdx-exceptions@2.5.0: - resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} - - spdx-expression-parse@3.0.1: - resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} - - spdx-expression-parse@4.0.0: - resolution: {integrity: sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==} - - spdx-license-ids@3.0.17: - resolution: {integrity: sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==} - - spdx-ranges@2.1.1: - resolution: {integrity: sha512-mcdpQFV7UDAgLpXEE/jOMqvK4LBoO0uTQg0uvXUewmEFhpiZx5yJSZITHB8w1ZahKdhfZqP5GPEOKLyEq5p8XA==} - - spdx-satisfies@5.0.1: - resolution: {integrity: sha512-Nwor6W6gzFp8XX4neaKQ7ChV4wmpSh2sSDemMFSzHxpTw460jxFYeOn+jq4ybnSSw/5sc3pjka9MQPouksQNpw==} - - split@1.0.1: - resolution: {integrity: sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==} - - sprintf-js@1.0.3: - resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - - stack-trace@0.0.10: - resolution: {integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==} - - stack-utils@2.0.6: - resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} - engines: {node: '>=10'} - - statuses@2.0.1: - resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} - engines: {node: '>= 0.8'} - - stream-combiner@0.2.2: - resolution: {integrity: sha512-6yHMqgLYDzQDcAkL+tjJDC5nSNuNIx0vZtRZeiPh7Saef7VHX9H5Ijn9l2VIol2zaNYlYEX6KyuT/237A58qEQ==} - - strict-event-emitter@0.5.1: - resolution: {integrity: sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==} - - string-argv@0.3.2: - resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} - engines: {node: '>=0.6.19'} - - string-length@4.0.2: - resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} - engines: {node: '>=10'} - - string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - - string-width@5.1.2: - resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} - engines: {node: '>=12'} - - string-width@7.1.0: - resolution: {integrity: sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==} - engines: {node: '>=18'} - - string.prototype.matchall@4.0.11: - resolution: {integrity: sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==} - engines: {node: '>= 0.4'} - - string.prototype.trim@1.2.9: - resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} - engines: {node: '>= 0.4'} - - string.prototype.trimend@1.0.8: - resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} - - string.prototype.trimstart@1.0.8: - resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} - engines: {node: '>= 0.4'} - - string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} - - stringify-object@3.3.0: - resolution: {integrity: sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==} - engines: {node: '>=4'} - - strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - - strip-ansi@7.1.0: - resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} - engines: {node: '>=12'} - - strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - - strip-bom@4.0.0: - resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} - engines: {node: '>=8'} - - strip-comments@2.0.1: - resolution: {integrity: sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==} - engines: {node: '>=10'} - - strip-final-newline@2.0.0: - resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} - engines: {node: '>=6'} - - strip-final-newline@3.0.0: - resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} - engines: {node: '>=12'} - - strip-indent@3.0.0: - resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} - engines: {node: '>=8'} - - strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - - stylis@4.2.0: - resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==} - - supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} - - supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - - supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} - - supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} - - symbol-tree@3.2.4: - resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} - - synckit@0.8.8: - resolution: {integrity: sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==} - engines: {node: ^14.18.0 || >=16.0.0} - - tapable@2.2.1: - resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} - engines: {node: '>=6'} - - temp-dir@2.0.0: - resolution: {integrity: sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==} - engines: {node: '>=8'} - - tempy@0.6.0: - resolution: {integrity: sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==} - engines: {node: '>=10'} - - terser@5.31.0: - resolution: {integrity: sha512-Q1JFAoUKE5IMfI4Z/lkE/E6+SwgzO+x4tq4v1AyBLRj8VSYvRO6A/rQrPg1yud4g0En9EKI1TvFRF2tQFcoUkg==} - engines: {node: '>=10'} - hasBin: true - - test-exclude@6.0.0: - resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} - engines: {node: '>=8'} - - text-hex@1.0.0: - resolution: {integrity: sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==} - - text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - - through@2.3.8: - resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} - - tiny-case@1.0.3: - resolution: {integrity: sha512-Eet/eeMhkO6TX8mnUteS9zgPbUMQa4I6Kkp5ORiBD5476/m+PIRiumP5tmh5ioJpH7k51Kehawy2UDfsnxxY8Q==} - - tmpl@1.0.5: - resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} - - to-fast-properties@2.0.0: - resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} - engines: {node: '>=4'} - - to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - - toposort@2.0.2: - resolution: {integrity: sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg==} - - tough-cookie@4.1.4: - resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==} - engines: {node: '>=6'} - - tr46@1.0.1: - resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} - - tr46@3.0.0: - resolution: {integrity: sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==} - engines: {node: '>=12'} - - triple-beam@1.4.1: - resolution: {integrity: sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==} - engines: {node: '>= 14.0.0'} - - ts-api-utils@1.3.0: - resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} - engines: {node: '>=16'} - peerDependencies: - typescript: '>=4.2.0' - - ts-jest@29.1.2: - resolution: {integrity: sha512-br6GJoH/WUX4pu7FbZXuWGKGNDuU7b8Uj77g/Sp7puZV6EXzuByl6JrECvm0MzVzSTkSHWTihsXt+5XYER5b+g==} - engines: {node: ^16.10.0 || ^18.0.0 || >=20.0.0} - hasBin: true - peerDependencies: - '@babel/core': '>=7.0.0-beta.0 <8' - '@jest/types': ^29.0.0 - babel-jest: ^29.0.0 - esbuild: '*' - jest: ^29.0.0 - typescript: '>=4.3 <6' - peerDependenciesMeta: - '@babel/core': - optional: true - '@jest/types': - optional: true - babel-jest: - optional: true - esbuild: - optional: true - - ts-node@10.9.2: - resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} - hasBin: true - peerDependencies: - '@swc/core': '>=1.2.50' - '@swc/wasm': '>=1.2.50' - '@types/node': '*' - typescript: '>=2.7' - peerDependenciesMeta: - '@swc/core': - optional: true - '@swc/wasm': - optional: true - - tsc-files@1.1.4: - resolution: {integrity: sha512-RePsRsOLru3BPpnf237y1Xe1oCGta8rmSYzM76kYo5tLGsv5R2r3s64yapYorGTPuuLyfS9NVbh9ydzmvNie2w==} - hasBin: true - peerDependencies: - typescript: '>=3' - - tsconfig-paths@3.15.0: - resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} - - tslib@2.6.2: - resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} - - type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} - - type-detect@4.0.8: - resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} - engines: {node: '>=4'} - - type-fest@0.16.0: - resolution: {integrity: sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==} - engines: {node: '>=10'} - - type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} - - type-fest@0.21.3: - resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} - engines: {node: '>=10'} - - type-fest@2.19.0: - resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} - engines: {node: '>=12.20'} - - type-fest@4.18.1: - resolution: {integrity: sha512-qXhgeNsX15bM63h5aapNFcQid9jRF/l3ojDoDFmekDQEUufZ9U4ErVt6SjDxnHp48Ltrw616R8yNc3giJ3KvVQ==} - engines: {node: '>=16'} - - typed-array-buffer@1.0.2: - resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} - engines: {node: '>= 0.4'} - - typed-array-byte-length@1.0.1: - resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} - engines: {node: '>= 0.4'} - - typed-array-byte-offset@1.0.2: - resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} - engines: {node: '>= 0.4'} - - typed-array-length@1.0.6: - resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} - engines: {node: '>= 0.4'} - - typescript@5.4.5: - resolution: {integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==} - engines: {node: '>=14.17'} - hasBin: true - - unbox-primitive@1.0.2: - resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} - - undici-types@5.26.5: - resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} - - undici@5.28.4: - resolution: {integrity: sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==} - engines: {node: '>=14.0'} - - undici@6.15.0: - resolution: {integrity: sha512-VviMt2tlMg1BvQ0FKXxrz1eJuyrcISrL2sPfBf7ZskX/FCEc/7LeThQaoygsMJpNqrATWQIsRVx+1Dpe4jaYuQ==} - engines: {node: '>=18.17'} - - unicode-canonical-property-names-ecmascript@2.0.0: - resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==} - engines: {node: '>=4'} - - unicode-match-property-ecmascript@2.0.0: - resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} - engines: {node: '>=4'} - - unicode-match-property-value-ecmascript@2.1.0: - resolution: {integrity: sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==} - engines: {node: '>=4'} - - unicode-property-aliases-ecmascript@2.1.0: - resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} - engines: {node: '>=4'} - - unique-string@2.0.0: - resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==} - engines: {node: '>=8'} - - universalify@0.2.0: - resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} - engines: {node: '>= 4.0.0'} - - universalify@2.0.1: - resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} - engines: {node: '>= 10.0.0'} - - upath@1.2.0: - resolution: {integrity: sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==} - engines: {node: '>=4'} - - update-browserslist-db@1.0.14: - resolution: {integrity: sha512-JixKH8GR2pWYshIPUg/NujK3JO7JiqEEUiNArE86NQyrgUuZeTlZQN3xuS/yiV5Kb48ev9K6RqNkaJjXsdg7Jw==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' - - uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - - url-parse@1.5.10: - resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} - - use-sync-external-store@1.2.2: - resolution: {integrity: sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - - util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - - v8-compile-cache-lib@3.0.1: - resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} - - v8-to-istanbul@9.2.0: - resolution: {integrity: sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==} - engines: {node: '>=10.12.0'} - - vite-plugin-pwa@0.20.0: - resolution: {integrity: sha512-/kDZyqF8KqoXRpMUQtR5Atri/7BWayW8Gp7Kz/4bfstsV6zSFTxjREbXZYL7zSuRL40HGA+o2hvUAFRmC+bL7g==} - engines: {node: '>=16.0.0'} - peerDependencies: - '@vite-pwa/assets-generator': ^0.2.4 - vite: ^3.1.0 || ^4.0.0 || ^5.0.0 - workbox-build: ^7.1.0 - workbox-window: ^7.1.0 - peerDependenciesMeta: - '@vite-pwa/assets-generator': - optional: true - - vite@5.2.11: - resolution: {integrity: sha512-HndV31LWW05i1BLPMUCE1B9E9GFbOu1MbenhS58FuK6owSO5qHm7GiCotrNY1YE5rMeQSFBGmT5ZaLEjFizgiQ==} - engines: {node: ^18.0.0 || >=20.0.0} - hasBin: true - peerDependencies: - '@types/node': ^18.0.0 || >=20.0.0 - less: '*' - lightningcss: ^1.21.0 - sass: '*' - stylus: '*' - sugarss: '*' - terser: ^5.4.0 - peerDependenciesMeta: - '@types/node': - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - - w3c-xmlserializer@4.0.0: - resolution: {integrity: sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==} - engines: {node: '>=14'} - - walker@1.0.8: - resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} - - wcwidth@1.0.1: - resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} - - web-streams-polyfill@3.3.3: - resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} - engines: {node: '>= 8'} - - web-streams-polyfill@4.0.0: - resolution: {integrity: sha512-0zJXHRAYEjM2tUfZ2DiSOHAa2aw1tisnnhU3ufD57R8iefL+DcdJyRBRyJpG+NUimDgbTI/lH+gAE1PAvV3Cgw==} - engines: {node: '>= 8'} - - webidl-conversions@4.0.2: - resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} - - webidl-conversions@7.0.0: - resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} - engines: {node: '>=12'} - - whatwg-encoding@2.0.0: - resolution: {integrity: sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==} - engines: {node: '>=12'} - - whatwg-mimetype@3.0.0: - resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==} - engines: {node: '>=12'} - - whatwg-url@11.0.0: - resolution: {integrity: sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==} - engines: {node: '>=12'} - - whatwg-url@7.1.0: - resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} - - which-boxed-primitive@1.0.2: - resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} - - which-builtin-type@1.1.3: - resolution: {integrity: sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==} - engines: {node: '>= 0.4'} - - which-collection@1.0.2: - resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} - engines: {node: '>= 0.4'} - - which-typed-array@1.1.15: - resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} - engines: {node: '>= 0.4'} - - which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - - which@4.0.0: - resolution: {integrity: sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==} - engines: {node: ^16.13.0 || >=18.0.0} - hasBin: true - - winston-transport@4.7.0: - resolution: {integrity: sha512-ajBj65K5I7denzer2IYW6+2bNIVqLGDHqDw3Ow8Ohh+vdW+rv4MZ6eiDvHoKhfJFZ2auyN8byXieDDJ96ViONg==} - engines: {node: '>= 12.0.0'} - - winston@3.13.0: - resolution: {integrity: sha512-rwidmA1w3SE4j0E5MuIufFhyJPBDG7Nu71RkZor1p2+qHvJSZ9GYDA81AyleQcZbh/+V6HjeBdfnTZJm9rSeQQ==} - engines: {node: '>= 12.0.0'} - - word-wrap@1.2.5: - resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} - engines: {node: '>=0.10.0'} - - workbox-background-sync@7.1.0: - resolution: {integrity: sha512-rMbgrzueVWDFcEq1610YyDW71z0oAXLfdRHRQcKw4SGihkfOK0JUEvqWHFwA6rJ+6TClnMIn7KQI5PNN1XQXwQ==} - - workbox-broadcast-update@7.1.0: - resolution: {integrity: sha512-O36hIfhjej/c5ar95pO67k1GQw0/bw5tKP7CERNgK+JdxBANQhDmIuOXZTNvwb2IHBx9hj2kxvcDyRIh5nzOgQ==} - - workbox-build@7.1.0: - resolution: {integrity: sha512-F6R94XAxjB2j4ETMkP1EXKfjECOtDmyvt0vz3BzgWJMI68TNSXIVNkgatwUKBlPGOfy9n2F/4voYRNAhEvPJNg==} - engines: {node: '>=16.0.0'} - - workbox-cacheable-response@7.1.0: - resolution: {integrity: sha512-iwsLBll8Hvua3xCuBB9h92+/e0wdsmSVgR2ZlvcfjepZWwhd3osumQB3x9o7flj+FehtWM2VHbZn8UJeBXXo6Q==} - - workbox-core@7.1.0: - resolution: {integrity: sha512-5KB4KOY8rtL31nEF7BfvU7FMzKT4B5TkbYa2tzkS+Peqj0gayMT9SytSFtNzlrvMaWgv6y/yvP9C0IbpFjV30Q==} - - workbox-expiration@7.1.0: - resolution: {integrity: sha512-m5DcMY+A63rJlPTbbBNtpJ20i3enkyOtSgYfv/l8h+D6YbbNiA0zKEkCUaMsdDlxggla1oOfRkyqTvl5Ni5KQQ==} - - workbox-google-analytics@7.1.0: - resolution: {integrity: sha512-FvE53kBQHfVTcZyczeBVRexhh7JTkyQ8HAvbVY6mXd2n2A7Oyz/9fIwnY406ZcDhvE4NFfKGjW56N4gBiqkrew==} - - workbox-navigation-preload@7.1.0: - resolution: {integrity: sha512-4wyAbo0vNI/X0uWNJhCMKxnPanNyhybsReMGN9QUpaePLTiDpKxPqFxl4oUmBNddPwIXug01eTSLVIFXimRG/A==} - - workbox-precaching@7.1.0: - resolution: {integrity: sha512-LyxzQts+UEpgtmfnolo0hHdNjoB7EoRWcF7EDslt+lQGd0lW4iTvvSe3v5JiIckQSB5KTW5xiCqjFviRKPj1zA==} - - workbox-range-requests@7.1.0: - resolution: {integrity: sha512-m7+O4EHolNs5yb/79CrnwPR/g/PRzMFYEdo01LqwixVnc/sbzNSvKz0d04OE3aMRel1CwAAZQheRsqGDwATgPQ==} - - workbox-recipes@7.1.0: - resolution: {integrity: sha512-NRrk4ycFN9BHXJB6WrKiRX3W3w75YNrNrzSX9cEZgFB5ubeGoO8s/SDmOYVrFYp9HMw6sh1Pm3eAY/1gVS8YLg==} - - workbox-routing@7.1.0: - resolution: {integrity: sha512-oOYk+kLriUY2QyHkIilxUlVcFqwduLJB7oRZIENbqPGeBP/3TWHYNNdmGNhz1dvKuw7aqvJ7CQxn27/jprlTdg==} - - workbox-strategies@7.1.0: - resolution: {integrity: sha512-/UracPiGhUNehGjRm/tLUQ+9PtWmCbRufWtV0tNrALuf+HZ4F7cmObSEK+E4/Bx1p8Syx2tM+pkIrvtyetdlew==} - - workbox-streams@7.1.0: - resolution: {integrity: sha512-WyHAVxRXBMfysM8ORwiZnI98wvGWTVAq/lOyBjf00pXFvG0mNaVz4Ji+u+fKa/mf1i2SnTfikoYKto4ihHeS6w==} - - workbox-sw@7.1.0: - resolution: {integrity: sha512-Hml/9+/njUXBglv3dtZ9WBKHI235AQJyLBV1G7EFmh4/mUdSQuXui80RtjDeVRrXnm/6QWgRUEHG3/YBVbxtsA==} - - workbox-window@7.1.0: - resolution: {integrity: sha512-ZHeROyqR+AS5UPzholQRDttLFqGMwP0Np8MKWAdyxsDETxq3qOAyXvqessc3GniohG6e0mAqSQyKOHmT8zPF7g==} - - wrap-ansi@6.2.0: - resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} - engines: {node: '>=8'} - - wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - - wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} - - wrap-ansi@9.0.0: - resolution: {integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==} - engines: {node: '>=18'} - - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - - write-file-atomic@4.0.2: - resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - - ws@8.17.0: - resolution: {integrity: sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - xml-name-validator@4.0.0: - resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} - engines: {node: '>=12'} - - xmlbuilder@15.1.1: - resolution: {integrity: sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==} - engines: {node: '>=8.0'} - - xmlchars@2.2.0: - resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} - - xxhashjs@0.2.2: - resolution: {integrity: sha512-AkTuIuVTET12tpsVIQo+ZU6f/qDmKuRUcjaqR+OIvm+aCBsZ95i7UVY5WJ9TMsSaZ0DA2WxoZ4acu0sPH+OKAw==} - - y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - - yallist@3.1.1: - resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - - yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - - yaml@1.10.2: - resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} - engines: {node: '>= 6'} - - yaml@2.3.4: - resolution: {integrity: sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==} - engines: {node: '>= 14'} - - yargs-parser@21.1.1: - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} - engines: {node: '>=12'} - - yargs@17.7.2: - resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} - engines: {node: '>=12'} - - yn@3.1.1: - resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} - engines: {node: '>=6'} - - yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - - yup@1.4.0: - resolution: {integrity: sha512-wPbgkJRCqIf+OHyiTBQoJiP5PFuAXaWiJK6AmYkzQAh5/c2K9hzSApBZG5wV9KoKSePF7sAxmNSvh/13YHkFDg==} - -snapshots: - - '@adobe/css-tools@4.3.3': {} - - '@ampproject/remapping@2.3.0': - dependencies: - '@jridgewell/gen-mapping': 0.3.5 - '@jridgewell/trace-mapping': 0.3.25 - - '@apideck/better-ajv-errors@0.3.6(ajv@8.13.0)': - dependencies: - ajv: 8.13.0 - json-schema: 0.4.0 - jsonpointer: 5.0.1 - leven: 3.1.0 - - '@babel/code-frame@7.24.2': - dependencies: - '@babel/highlight': 7.24.5 - picocolors: 1.0.0 - - '@babel/compat-data@7.24.4': {} - - '@babel/core@7.24.5': - dependencies: - '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.24.2 - '@babel/generator': 7.24.5 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-module-transforms': 7.24.5(@babel/core@7.24.5) - '@babel/helpers': 7.24.5 - '@babel/parser': 7.24.5 - '@babel/template': 7.24.0 - '@babel/traverse': 7.24.5 - '@babel/types': 7.24.5 - convert-source-map: 2.0.0 - debug: 4.3.4 - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - '@babel/generator@7.24.5': - dependencies: - '@babel/types': 7.24.5 - '@jridgewell/gen-mapping': 0.3.5 - '@jridgewell/trace-mapping': 0.3.25 - jsesc: 2.5.2 - - '@babel/helper-annotate-as-pure@7.22.5': - dependencies: - '@babel/types': 7.24.5 - - '@babel/helper-builder-binary-assignment-operator-visitor@7.22.15': - dependencies: - '@babel/types': 7.24.5 - - '@babel/helper-compilation-targets@7.23.6': - dependencies: - '@babel/compat-data': 7.24.4 - '@babel/helper-validator-option': 7.23.5 - browserslist: 4.23.0 - lru-cache: 5.1.1 - semver: 6.3.1 - - '@babel/helper-create-class-features-plugin@7.24.5(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-member-expression-to-functions': 7.24.5 - '@babel/helper-optimise-call-expression': 7.22.5 - '@babel/helper-replace-supers': 7.24.1(@babel/core@7.24.5) - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/helper-split-export-declaration': 7.24.5 - semver: 6.3.1 - - '@babel/helper-create-regexp-features-plugin@7.22.15(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-annotate-as-pure': 7.22.5 - regexpu-core: 5.3.2 - semver: 6.3.1 - - '@babel/helper-define-polyfill-provider@0.6.2(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-plugin-utils': 7.24.5 - debug: 4.3.4 - lodash.debounce: 4.0.8 - resolve: 1.22.8 - transitivePeerDependencies: - - supports-color - - '@babel/helper-environment-visitor@7.22.20': {} - - '@babel/helper-function-name@7.23.0': - dependencies: - '@babel/template': 7.24.0 - '@babel/types': 7.24.5 - - '@babel/helper-hoist-variables@7.22.5': - dependencies: - '@babel/types': 7.24.5 - - '@babel/helper-member-expression-to-functions@7.24.5': - dependencies: - '@babel/types': 7.24.5 - - '@babel/helper-module-imports@7.24.3': - dependencies: - '@babel/types': 7.24.5 - - '@babel/helper-module-transforms@7.24.5(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-module-imports': 7.24.3 - '@babel/helper-simple-access': 7.24.5 - '@babel/helper-split-export-declaration': 7.24.5 - '@babel/helper-validator-identifier': 7.24.5 - - '@babel/helper-optimise-call-expression@7.22.5': - dependencies: - '@babel/types': 7.24.5 - - '@babel/helper-plugin-utils@7.24.5': {} - - '@babel/helper-remap-async-to-generator@7.22.20(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-wrap-function': 7.24.5 - - '@babel/helper-replace-supers@7.24.1(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-member-expression-to-functions': 7.24.5 - '@babel/helper-optimise-call-expression': 7.22.5 - - '@babel/helper-simple-access@7.24.5': - dependencies: - '@babel/types': 7.24.5 - - '@babel/helper-skip-transparent-expression-wrappers@7.22.5': - dependencies: - '@babel/types': 7.24.5 - - '@babel/helper-split-export-declaration@7.24.5': - dependencies: - '@babel/types': 7.24.5 - - '@babel/helper-string-parser@7.24.1': {} - - '@babel/helper-validator-identifier@7.24.5': {} - - '@babel/helper-validator-option@7.23.5': {} - - '@babel/helper-wrap-function@7.24.5': - dependencies: - '@babel/helper-function-name': 7.23.0 - '@babel/template': 7.24.0 - '@babel/types': 7.24.5 - - '@babel/helpers@7.24.5': - dependencies: - '@babel/template': 7.24.0 - '@babel/traverse': 7.24.5 - '@babel/types': 7.24.5 - transitivePeerDependencies: - - supports-color - - '@babel/highlight@7.24.5': - dependencies: - '@babel/helper-validator-identifier': 7.24.5 - chalk: 2.4.2 - js-tokens: 4.0.0 - picocolors: 1.0.0 - - '@babel/parser@7.24.5': - dependencies: - '@babel/types': 7.24.5 - - '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.24.5(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-plugin-utils': 7.24.5 - - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.24.1(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.24.1(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-transform-optional-chaining': 7.24.5(@babel/core@7.24.5) - - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.24.1(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-plugin-utils': 7.24.5 - - '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - - '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - - '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - - '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - - '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - - '@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - - '@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - - '@babel/plugin-syntax-import-assertions@7.24.1(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - - '@babel/plugin-syntax-import-attributes@7.24.1(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - - '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - - '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - - '@babel/plugin-syntax-jsx@7.24.1(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - - '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - - '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - - '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - - '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - - '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - - '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - - '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - - '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - - '@babel/plugin-syntax-typescript@7.24.1(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - - '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 - - '@babel/plugin-transform-arrow-functions@7.24.1(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - - '@babel/plugin-transform-async-generator-functions@7.24.3(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.24.5) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.5) - - '@babel/plugin-transform-async-to-generator@7.24.1(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-module-imports': 7.24.3 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.24.5) - - '@babel/plugin-transform-block-scoped-functions@7.24.1(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - - '@babel/plugin-transform-block-scoping@7.24.5(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - - '@babel/plugin-transform-class-properties@7.24.1(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-create-class-features-plugin': 7.24.5(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 - - '@babel/plugin-transform-class-static-block@7.24.4(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-create-class-features-plugin': 7.24.5(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.24.5) - - '@babel/plugin-transform-classes@7.24.5(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/helper-replace-supers': 7.24.1(@babel/core@7.24.5) - '@babel/helper-split-export-declaration': 7.24.5 - globals: 11.12.0 - - '@babel/plugin-transform-computed-properties@7.24.1(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/template': 7.24.0 - - '@babel/plugin-transform-destructuring@7.24.5(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - - '@babel/plugin-transform-dotall-regex@7.24.1(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 - - '@babel/plugin-transform-duplicate-keys@7.24.1(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - - '@babel/plugin-transform-dynamic-import@7.24.1(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.24.5) - - '@babel/plugin-transform-exponentiation-operator@7.24.1(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-builder-binary-assignment-operator-visitor': 7.22.15 - '@babel/helper-plugin-utils': 7.24.5 - - '@babel/plugin-transform-export-namespace-from@7.24.1(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.24.5) - - '@babel/plugin-transform-for-of@7.24.1(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - - '@babel/plugin-transform-function-name@7.24.1(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-plugin-utils': 7.24.5 - - '@babel/plugin-transform-json-strings@7.24.1(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.5) - - '@babel/plugin-transform-literals@7.24.1(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - - '@babel/plugin-transform-logical-assignment-operators@7.24.1(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.5) - - '@babel/plugin-transform-member-expression-literals@7.24.1(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - - '@babel/plugin-transform-modules-amd@7.24.1(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-module-transforms': 7.24.5(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 - - '@babel/plugin-transform-modules-commonjs@7.24.1(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-module-transforms': 7.24.5(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 - '@babel/helper-simple-access': 7.24.5 - - '@babel/plugin-transform-modules-systemjs@7.24.1(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-module-transforms': 7.24.5(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 - '@babel/helper-validator-identifier': 7.24.5 - - '@babel/plugin-transform-modules-umd@7.24.1(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-module-transforms': 7.24.5(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 - - '@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 - - '@babel/plugin-transform-new-target@7.24.1(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - - '@babel/plugin-transform-nullish-coalescing-operator@7.24.1(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.5) - - '@babel/plugin-transform-numeric-separator@7.24.1(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.5) - - '@babel/plugin-transform-object-rest-spread@7.24.5(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.5) - '@babel/plugin-transform-parameters': 7.24.5(@babel/core@7.24.5) - - '@babel/plugin-transform-object-super@7.24.1(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/helper-replace-supers': 7.24.1(@babel/core@7.24.5) - - '@babel/plugin-transform-optional-catch-binding@7.24.1(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.5) - - '@babel/plugin-transform-optional-chaining@7.24.5(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.5) - - '@babel/plugin-transform-parameters@7.24.5(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - - '@babel/plugin-transform-private-methods@7.24.1(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-create-class-features-plugin': 7.24.5(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 - - '@babel/plugin-transform-private-property-in-object@7.24.5(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-create-class-features-plugin': 7.24.5(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.24.5) - - '@babel/plugin-transform-property-literals@7.24.1(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - - '@babel/plugin-transform-regenerator@7.24.1(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - regenerator-transform: 0.15.2 - - '@babel/plugin-transform-reserved-words@7.24.1(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - - '@babel/plugin-transform-shorthand-properties@7.24.1(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - - '@babel/plugin-transform-spread@7.24.1(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - - '@babel/plugin-transform-sticky-regex@7.24.1(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - - '@babel/plugin-transform-template-literals@7.24.1(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - - '@babel/plugin-transform-typeof-symbol@7.24.5(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - - '@babel/plugin-transform-unicode-escapes@7.24.1(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - - '@babel/plugin-transform-unicode-property-regex@7.24.1(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 - - '@babel/plugin-transform-unicode-regex@7.24.1(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 - - '@babel/plugin-transform-unicode-sets-regex@7.24.1(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 - - '@babel/preset-env@7.24.5(@babel/core@7.24.5)': - dependencies: - '@babel/compat-data': 7.24.4 - '@babel/core': 7.24.5 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/helper-validator-option': 7.23.5 - '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.24.5) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.5) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.24.5) - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.24.5) - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.24.5) - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.24.5) - '@babel/plugin-syntax-import-assertions': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-syntax-import-attributes': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.24.5) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.5) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.5) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.5) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.5) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.5) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.5) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.5) - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.24.5) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.24.5) - '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.24.5) - '@babel/plugin-transform-arrow-functions': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-async-generator-functions': 7.24.3(@babel/core@7.24.5) - '@babel/plugin-transform-async-to-generator': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-block-scoped-functions': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-block-scoping': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-transform-class-properties': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-class-static-block': 7.24.4(@babel/core@7.24.5) - '@babel/plugin-transform-classes': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-transform-computed-properties': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-destructuring': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-transform-dotall-regex': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-duplicate-keys': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-dynamic-import': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-exponentiation-operator': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-export-namespace-from': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-for-of': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-function-name': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-json-strings': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-literals': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-logical-assignment-operators': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-member-expression-literals': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-modules-amd': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-modules-commonjs': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-modules-systemjs': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-modules-umd': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.24.5) - '@babel/plugin-transform-new-target': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-nullish-coalescing-operator': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-numeric-separator': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-object-rest-spread': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-transform-object-super': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-optional-catch-binding': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-optional-chaining': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-transform-parameters': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-transform-private-methods': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-private-property-in-object': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-transform-property-literals': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-regenerator': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-reserved-words': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-shorthand-properties': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-spread': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-sticky-regex': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-template-literals': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-typeof-symbol': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-transform-unicode-escapes': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-unicode-property-regex': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-unicode-regex': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-unicode-sets-regex': 7.24.1(@babel/core@7.24.5) - '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.24.5) - babel-plugin-polyfill-corejs2: 0.4.11(@babel/core@7.24.5) - babel-plugin-polyfill-corejs3: 0.10.4(@babel/core@7.24.5) - babel-plugin-polyfill-regenerator: 0.6.2(@babel/core@7.24.5) - core-js-compat: 3.37.0 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/types': 7.24.5 - esutils: 2.0.3 - - '@babel/regjsgen@0.8.0': {} - - '@babel/runtime@7.24.5': - dependencies: - regenerator-runtime: 0.14.1 - - '@babel/template@7.24.0': - dependencies: - '@babel/code-frame': 7.24.2 - '@babel/parser': 7.24.5 - '@babel/types': 7.24.5 - - '@babel/traverse@7.24.5': - dependencies: - '@babel/code-frame': 7.24.2 - '@babel/generator': 7.24.5 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-split-export-declaration': 7.24.5 - '@babel/parser': 7.24.5 - '@babel/types': 7.24.5 - debug: 4.3.4 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - - '@babel/types@7.24.5': - dependencies: - '@babel/helper-string-parser': 7.24.1 - '@babel/helper-validator-identifier': 7.24.5 - to-fast-properties: 2.0.0 - - '@bcoe/v8-coverage@0.2.3': {} - - '@bundled-es-modules/cookie@2.0.0': - dependencies: - cookie: 0.5.0 - - '@bundled-es-modules/statuses@1.0.1': - dependencies: - statuses: 2.0.1 - - '@colors/colors@1.6.0': {} - - '@cspotcode/source-map-support@0.8.1': - dependencies: - '@jridgewell/trace-mapping': 0.3.9 - - '@dabh/diagnostics@2.0.3': - dependencies: - colorspace: 1.1.4 - enabled: 2.0.0 - kuler: 2.0.0 - - '@dotenvx/dotenvx@0.37.1': - dependencies: - '@inquirer/confirm': 2.0.17 - arch: 2.2.0 - chalk: 4.1.2 - commander: 11.1.0 - conf: 10.2.0 - diff: 5.2.0 - dotenv: 16.4.5 - dotenv-expand: 11.0.6 - execa: 5.1.1 - glob: 10.3.12 - ignore: 5.3.1 - is-wsl: 2.2.0 - object-treeify: 1.1.33 - open: 8.4.2 - ora: 5.4.1 - semver: 7.6.0 - undici: 5.28.4 - which: 4.0.0 - winston: 3.13.0 - xxhashjs: 0.2.2 - - '@emotion/babel-plugin@11.11.0': - dependencies: - '@babel/helper-module-imports': 7.24.3 - '@babel/runtime': 7.24.5 - '@emotion/hash': 0.9.1 - '@emotion/memoize': 0.8.1 - '@emotion/serialize': 1.1.4 - babel-plugin-macros: 3.1.0 - convert-source-map: 1.9.0 - escape-string-regexp: 4.0.0 - find-root: 1.1.0 - source-map: 0.5.7 - stylis: 4.2.0 - - '@emotion/cache@11.11.0': - dependencies: - '@emotion/memoize': 0.8.1 - '@emotion/sheet': 1.2.2 - '@emotion/utils': 1.2.1 - '@emotion/weak-memoize': 0.3.1 - stylis: 4.2.0 - - '@emotion/hash@0.9.1': {} - - '@emotion/is-prop-valid@1.2.2': - dependencies: - '@emotion/memoize': 0.8.1 - - '@emotion/memoize@0.8.1': {} - - '@emotion/react@11.11.4(@types/react@18.3.1)(react@18.3.1)': - dependencies: - '@babel/runtime': 7.24.5 - '@emotion/babel-plugin': 11.11.0 - '@emotion/cache': 11.11.0 - '@emotion/serialize': 1.1.4 - '@emotion/use-insertion-effect-with-fallbacks': 1.0.1(react@18.3.1) - '@emotion/utils': 1.2.1 - '@emotion/weak-memoize': 0.3.1 - hoist-non-react-statics: 3.3.2 - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.1 - - '@emotion/serialize@1.1.4': - dependencies: - '@emotion/hash': 0.9.1 - '@emotion/memoize': 0.8.1 - '@emotion/unitless': 0.8.1 - '@emotion/utils': 1.2.1 - csstype: 3.1.3 - - '@emotion/sheet@1.2.2': {} - - '@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.1)(react@18.3.1))(@types/react@18.3.1)(react@18.3.1)': - dependencies: - '@babel/runtime': 7.24.5 - '@emotion/babel-plugin': 11.11.0 - '@emotion/is-prop-valid': 1.2.2 - '@emotion/react': 11.11.4(@types/react@18.3.1)(react@18.3.1) - '@emotion/serialize': 1.1.4 - '@emotion/use-insertion-effect-with-fallbacks': 1.0.1(react@18.3.1) - '@emotion/utils': 1.2.1 - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.1 - - '@emotion/unitless@0.8.1': {} - - '@emotion/use-insertion-effect-with-fallbacks@1.0.1(react@18.3.1)': - dependencies: - react: 18.3.1 - - '@emotion/utils@1.2.1': {} - - '@emotion/weak-memoize@0.3.1': {} - - '@esbuild/aix-ppc64@0.20.2': - optional: true - - '@esbuild/android-arm64@0.20.2': - optional: true - - '@esbuild/android-arm@0.20.2': - optional: true - - '@esbuild/android-x64@0.20.2': - optional: true - - '@esbuild/darwin-arm64@0.20.2': - optional: true - - '@esbuild/darwin-x64@0.20.2': - optional: true - - '@esbuild/freebsd-arm64@0.20.2': - optional: true - - '@esbuild/freebsd-x64@0.20.2': - optional: true - - '@esbuild/linux-arm64@0.20.2': - optional: true - - '@esbuild/linux-arm@0.20.2': - optional: true - - '@esbuild/linux-ia32@0.20.2': - optional: true - - '@esbuild/linux-loong64@0.20.2': - optional: true - - '@esbuild/linux-mips64el@0.20.2': - optional: true - - '@esbuild/linux-ppc64@0.20.2': - optional: true - - '@esbuild/linux-riscv64@0.20.2': - optional: true - - '@esbuild/linux-s390x@0.20.2': - optional: true - - '@esbuild/linux-x64@0.20.2': - optional: true - - '@esbuild/netbsd-x64@0.20.2': - optional: true - - '@esbuild/openbsd-x64@0.20.2': - optional: true - - '@esbuild/sunos-x64@0.20.2': - optional: true - - '@esbuild/win32-arm64@0.20.2': - optional: true - - '@esbuild/win32-ia32@0.20.2': - optional: true - - '@esbuild/win32-x64@0.20.2': - optional: true - - '@eslint-community/eslint-utils@4.4.0(eslint@8.57.0)': - dependencies: - eslint: 8.57.0 - eslint-visitor-keys: 3.4.3 - - '@eslint-community/regexpp@4.10.0': {} - - '@eslint/eslintrc@2.1.4': - dependencies: - ajv: 6.12.6 - debug: 4.3.4 - espree: 9.6.1 - globals: 13.24.0 - ignore: 5.3.1 - import-fresh: 3.3.0 - js-yaml: 4.1.0 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color - - '@eslint/js@8.57.0': {} - - '@fastify/busboy@2.1.1': {} - - '@floating-ui/core@1.6.1': - dependencies: - '@floating-ui/utils': 0.2.2 - - '@floating-ui/dom@1.6.4': - dependencies: - '@floating-ui/core': 1.6.1 - '@floating-ui/utils': 0.2.2 - - '@floating-ui/react-dom@2.0.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@floating-ui/dom': 1.6.4 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - '@floating-ui/utils@0.2.2': {} - - '@fontsource/roboto@5.0.13': {} - - '@hapi/hoek@9.3.0': {} - - '@hapi/topo@5.1.0': - dependencies: - '@hapi/hoek': 9.3.0 - - '@hookform/resolvers@3.3.4(react-hook-form@7.51.3(react@18.3.1))': - dependencies: - react-hook-form: 7.51.3(react@18.3.1) - - '@humanwhocodes/config-array@0.11.14': - dependencies: - '@humanwhocodes/object-schema': 2.0.3 - debug: 4.3.4 - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color - - '@humanwhocodes/module-importer@1.0.1': {} - - '@humanwhocodes/object-schema@2.0.3': {} - - '@inquirer/confirm@2.0.17': - dependencies: - '@inquirer/core': 6.0.0 - '@inquirer/type': 1.3.1 - chalk: 4.1.2 - - '@inquirer/confirm@3.1.6': - dependencies: - '@inquirer/core': 8.1.0 - '@inquirer/type': 1.3.1 - - '@inquirer/core@6.0.0': - dependencies: - '@inquirer/type': 1.3.1 - '@types/mute-stream': 0.0.4 - '@types/node': 20.12.8 - '@types/wrap-ansi': 3.0.0 - ansi-escapes: 4.3.2 - chalk: 4.1.2 - cli-spinners: 2.9.2 - cli-width: 4.1.0 - figures: 3.2.0 - mute-stream: 1.0.0 - run-async: 3.0.0 - signal-exit: 4.1.0 - strip-ansi: 6.0.1 - wrap-ansi: 6.2.0 - - '@inquirer/core@8.1.0': - dependencies: - '@inquirer/figures': 1.0.1 - '@inquirer/type': 1.3.1 - '@types/mute-stream': 0.0.4 - '@types/node': 20.12.8 - '@types/wrap-ansi': 3.0.0 - ansi-escapes: 4.3.2 - chalk: 4.1.2 - cli-spinners: 2.9.2 - cli-width: 4.1.0 - mute-stream: 1.0.0 - signal-exit: 4.1.0 - strip-ansi: 6.0.1 - wrap-ansi: 6.2.0 - - '@inquirer/figures@1.0.1': {} - - '@inquirer/type@1.3.1': {} - - '@isaacs/cliui@8.0.2': - dependencies: - string-width: 5.1.2 - string-width-cjs: string-width@4.2.3 - strip-ansi: 7.1.0 - strip-ansi-cjs: strip-ansi@6.0.1 - wrap-ansi: 8.1.0 - wrap-ansi-cjs: wrap-ansi@7.0.0 - - '@istanbuljs/load-nyc-config@1.1.0': - dependencies: - camelcase: 5.3.1 - find-up: 4.1.0 - get-package-type: 0.1.0 - js-yaml: 3.14.1 - resolve-from: 5.0.0 - - '@istanbuljs/schema@0.1.3': {} - - '@jest/console@29.7.0': - dependencies: - '@jest/types': 29.6.3 - '@types/node': 20.12.8 - chalk: 4.1.2 - jest-message-util: 29.7.0 - jest-util: 29.7.0 - slash: 3.0.0 - - '@jest/core@29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.4.17)(@types/node@20.12.8)(typescript@5.4.5))': - dependencies: - '@jest/console': 29.7.0 - '@jest/reporters': 29.7.0 - '@jest/test-result': 29.7.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 20.12.8 - ansi-escapes: 4.3.2 - chalk: 4.1.2 - ci-info: 3.9.0 - exit: 0.1.2 - graceful-fs: 4.2.11 - jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@20.12.8)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.4.17)(@types/node@20.12.8)(typescript@5.4.5)) - jest-haste-map: 29.7.0 - jest-message-util: 29.7.0 - jest-regex-util: 29.6.3 - jest-resolve: 29.7.0 - jest-resolve-dependencies: 29.7.0 - jest-runner: 29.7.0 - jest-runtime: 29.7.0 - jest-snapshot: 29.7.0 - jest-util: 29.7.0 - jest-validate: 29.7.0 - jest-watcher: 29.7.0 - micromatch: 4.0.5 - pretty-format: 29.7.0 - slash: 3.0.0 - strip-ansi: 6.0.1 - transitivePeerDependencies: - - babel-plugin-macros - - supports-color - - ts-node - - '@jest/environment@29.7.0': - dependencies: - '@jest/fake-timers': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 20.12.8 - jest-mock: 29.7.0 - - '@jest/expect-utils@29.7.0': - dependencies: - jest-get-type: 29.6.3 - - '@jest/expect@29.7.0': - dependencies: - expect: 29.7.0 - jest-snapshot: 29.7.0 - transitivePeerDependencies: - - supports-color - - '@jest/fake-timers@29.7.0': - dependencies: - '@jest/types': 29.6.3 - '@sinonjs/fake-timers': 10.3.0 - '@types/node': 20.12.8 - jest-message-util: 29.7.0 - jest-mock: 29.7.0 - jest-util: 29.7.0 - - '@jest/globals@29.7.0': - dependencies: - '@jest/environment': 29.7.0 - '@jest/expect': 29.7.0 - '@jest/types': 29.6.3 - jest-mock: 29.7.0 - transitivePeerDependencies: - - supports-color - - '@jest/reporters@29.7.0': - dependencies: - '@bcoe/v8-coverage': 0.2.3 - '@jest/console': 29.7.0 - '@jest/test-result': 29.7.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - '@jridgewell/trace-mapping': 0.3.25 - '@types/node': 20.12.8 - chalk: 4.1.2 - collect-v8-coverage: 1.0.2 - exit: 0.1.2 - glob: 7.2.3 - graceful-fs: 4.2.11 - istanbul-lib-coverage: 3.2.2 - istanbul-lib-instrument: 6.0.2 - istanbul-lib-report: 3.0.1 - istanbul-lib-source-maps: 4.0.1 - istanbul-reports: 3.1.7 - jest-message-util: 29.7.0 - jest-util: 29.7.0 - jest-worker: 29.7.0 - slash: 3.0.0 - string-length: 4.0.2 - strip-ansi: 6.0.1 - v8-to-istanbul: 9.2.0 - transitivePeerDependencies: - - supports-color - - '@jest/schemas@29.6.3': - dependencies: - '@sinclair/typebox': 0.27.8 - - '@jest/source-map@29.6.3': - dependencies: - '@jridgewell/trace-mapping': 0.3.25 - callsites: 3.1.0 - graceful-fs: 4.2.11 - - '@jest/test-result@29.7.0': - dependencies: - '@jest/console': 29.7.0 - '@jest/types': 29.6.3 - '@types/istanbul-lib-coverage': 2.0.6 - collect-v8-coverage: 1.0.2 - - '@jest/test-sequencer@29.7.0': - dependencies: - '@jest/test-result': 29.7.0 - graceful-fs: 4.2.11 - jest-haste-map: 29.7.0 - slash: 3.0.0 - - '@jest/transform@29.7.0': - dependencies: - '@babel/core': 7.24.5 - '@jest/types': 29.6.3 - '@jridgewell/trace-mapping': 0.3.25 - babel-plugin-istanbul: 6.1.1 - chalk: 4.1.2 - convert-source-map: 2.0.0 - fast-json-stable-stringify: 2.1.0 - graceful-fs: 4.2.11 - jest-haste-map: 29.7.0 - jest-regex-util: 29.6.3 - jest-util: 29.7.0 - micromatch: 4.0.5 - pirates: 4.0.6 - slash: 3.0.0 - write-file-atomic: 4.0.2 - transitivePeerDependencies: - - supports-color - - '@jest/types@29.6.3': - dependencies: - '@jest/schemas': 29.6.3 - '@types/istanbul-lib-coverage': 2.0.6 - '@types/istanbul-reports': 3.0.4 - '@types/node': 20.12.8 - '@types/yargs': 17.0.32 - chalk: 4.1.2 - - '@jridgewell/gen-mapping@0.3.5': - dependencies: - '@jridgewell/set-array': 1.2.1 - '@jridgewell/sourcemap-codec': 1.4.15 - '@jridgewell/trace-mapping': 0.3.25 - - '@jridgewell/resolve-uri@3.1.2': {} - - '@jridgewell/set-array@1.2.1': {} - - '@jridgewell/source-map@0.3.6': - dependencies: - '@jridgewell/gen-mapping': 0.3.5 - '@jridgewell/trace-mapping': 0.3.25 - - '@jridgewell/sourcemap-codec@1.4.15': {} - - '@jridgewell/trace-mapping@0.3.25': - dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.4.15 - - '@jridgewell/trace-mapping@0.3.9': - dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.4.15 - - '@mswjs/cookies@1.1.0': {} - - '@mswjs/interceptors@0.26.15': - dependencies: - '@open-draft/deferred-promise': 2.2.0 - '@open-draft/logger': 0.3.0 - '@open-draft/until': 2.1.0 - is-node-process: 1.2.0 - outvariant: 1.4.2 - strict-event-emitter: 0.5.1 - - '@mui/base@5.0.0-beta.40(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@babel/runtime': 7.24.5 - '@floating-ui/react-dom': 2.0.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@mui/types': 7.2.14(@types/react@18.3.1) - '@mui/utils': 5.15.14(@types/react@18.3.1)(react@18.3.1) - '@popperjs/core': 2.11.8 - clsx: 2.1.1 - prop-types: 15.8.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.1 - - '@mui/core-downloads-tracker@5.15.16': {} - - '@mui/icons-material@5.15.16(@mui/material@5.15.16(@emotion/react@11.11.4(@types/react@18.3.1)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.1)(react@18.3.1))(@types/react@18.3.1)(react@18.3.1))(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.1)(react@18.3.1)': - dependencies: - '@babel/runtime': 7.24.5 - '@mui/material': 5.15.16(@emotion/react@11.11.4(@types/react@18.3.1)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.1)(react@18.3.1))(@types/react@18.3.1)(react@18.3.1))(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.1 - - '@mui/material@5.15.16(@emotion/react@11.11.4(@types/react@18.3.1)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.1)(react@18.3.1))(@types/react@18.3.1)(react@18.3.1))(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@babel/runtime': 7.24.5 - '@mui/base': 5.0.0-beta.40(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@mui/core-downloads-tracker': 5.15.16 - '@mui/system': 5.15.15(@emotion/react@11.11.4(@types/react@18.3.1)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.1)(react@18.3.1))(@types/react@18.3.1)(react@18.3.1))(@types/react@18.3.1)(react@18.3.1) - '@mui/types': 7.2.14(@types/react@18.3.1) - '@mui/utils': 5.15.14(@types/react@18.3.1)(react@18.3.1) - '@types/react-transition-group': 4.4.10 - clsx: 2.1.1 - csstype: 3.1.3 - prop-types: 15.8.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - react-is: 18.3.1 - react-transition-group: 4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - optionalDependencies: - '@emotion/react': 11.11.4(@types/react@18.3.1)(react@18.3.1) - '@emotion/styled': 11.11.5(@emotion/react@11.11.4(@types/react@18.3.1)(react@18.3.1))(@types/react@18.3.1)(react@18.3.1) - '@types/react': 18.3.1 - - '@mui/private-theming@5.15.14(@types/react@18.3.1)(react@18.3.1)': - dependencies: - '@babel/runtime': 7.24.5 - '@mui/utils': 5.15.14(@types/react@18.3.1)(react@18.3.1) - prop-types: 15.8.1 - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.1 - - '@mui/styled-engine@5.15.14(@emotion/react@11.11.4(@types/react@18.3.1)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.1)(react@18.3.1))(@types/react@18.3.1)(react@18.3.1))(react@18.3.1)': - dependencies: - '@babel/runtime': 7.24.5 - '@emotion/cache': 11.11.0 - csstype: 3.1.3 - prop-types: 15.8.1 - react: 18.3.1 - optionalDependencies: - '@emotion/react': 11.11.4(@types/react@18.3.1)(react@18.3.1) - '@emotion/styled': 11.11.5(@emotion/react@11.11.4(@types/react@18.3.1)(react@18.3.1))(@types/react@18.3.1)(react@18.3.1) - - '@mui/system@5.15.15(@emotion/react@11.11.4(@types/react@18.3.1)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.1)(react@18.3.1))(@types/react@18.3.1)(react@18.3.1))(@types/react@18.3.1)(react@18.3.1)': - dependencies: - '@babel/runtime': 7.24.5 - '@mui/private-theming': 5.15.14(@types/react@18.3.1)(react@18.3.1) - '@mui/styled-engine': 5.15.14(@emotion/react@11.11.4(@types/react@18.3.1)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.1)(react@18.3.1))(@types/react@18.3.1)(react@18.3.1))(react@18.3.1) - '@mui/types': 7.2.14(@types/react@18.3.1) - '@mui/utils': 5.15.14(@types/react@18.3.1)(react@18.3.1) - clsx: 2.1.1 - csstype: 3.1.3 - prop-types: 15.8.1 - react: 18.3.1 - optionalDependencies: - '@emotion/react': 11.11.4(@types/react@18.3.1)(react@18.3.1) - '@emotion/styled': 11.11.5(@emotion/react@11.11.4(@types/react@18.3.1)(react@18.3.1))(@types/react@18.3.1)(react@18.3.1) - '@types/react': 18.3.1 - - '@mui/types@7.2.14(@types/react@18.3.1)': - optionalDependencies: - '@types/react': 18.3.1 - - '@mui/utils@5.15.14(@types/react@18.3.1)(react@18.3.1)': - dependencies: - '@babel/runtime': 7.24.5 - '@types/prop-types': 15.7.12 - prop-types: 15.8.1 - react: 18.3.1 - react-is: 18.3.1 - optionalDependencies: - '@types/react': 18.3.1 - - '@mui/x-date-pickers@7.3.2(@emotion/react@11.11.4(@types/react@18.3.1)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.1)(react@18.3.1))(@types/react@18.3.1)(react@18.3.1))(@mui/material@5.15.16(@emotion/react@11.11.4(@types/react@18.3.1)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.1)(react@18.3.1))(@types/react@18.3.1)(react@18.3.1))(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.1)(dayjs@1.11.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@babel/runtime': 7.24.5 - '@mui/base': 5.0.0-beta.40(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@mui/material': 5.15.16(@emotion/react@11.11.4(@types/react@18.3.1)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.1)(react@18.3.1))(@types/react@18.3.1)(react@18.3.1))(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@mui/system': 5.15.15(@emotion/react@11.11.4(@types/react@18.3.1)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.1)(react@18.3.1))(@types/react@18.3.1)(react@18.3.1))(@types/react@18.3.1)(react@18.3.1) - '@mui/utils': 5.15.14(@types/react@18.3.1)(react@18.3.1) - '@types/react-transition-group': 4.4.10 - clsx: 2.1.1 - prop-types: 15.8.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - react-transition-group: 4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - optionalDependencies: - '@emotion/react': 11.11.4(@types/react@18.3.1)(react@18.3.1) - '@emotion/styled': 11.11.5(@emotion/react@11.11.4(@types/react@18.3.1)(react@18.3.1))(@types/react@18.3.1)(react@18.3.1) - dayjs: 1.11.11 - transitivePeerDependencies: - - '@types/react' - - '@nodelib/fs.scandir@2.1.5': - dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 - - '@nodelib/fs.stat@2.0.5': {} - - '@nodelib/fs.walk@1.2.8': - dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.17.1 - - '@open-draft/deferred-promise@2.2.0': {} - - '@open-draft/logger@0.3.0': - dependencies: - is-node-process: 1.2.0 - outvariant: 1.4.2 - - '@open-draft/until@2.1.0': {} - - '@pkgjs/parseargs@0.11.0': - optional: true - - '@pkgr/core@0.1.1': {} - - '@playwright/test@1.43.1': - dependencies: - playwright: 1.43.1 - - '@popperjs/core@2.11.8': {} - - '@reduxjs/toolkit@2.2.3(react-redux@9.1.2(@types/react@18.3.1)(react@18.3.1)(redux@5.0.1))(react@18.3.1)': - dependencies: - immer: 10.1.1 - redux: 5.0.1 - redux-thunk: 3.1.0(redux@5.0.1) - reselect: 5.1.0 - optionalDependencies: - react: 18.3.1 - react-redux: 9.1.2(@types/react@18.3.1)(react@18.3.1)(redux@5.0.1) - - '@remix-run/router@1.16.0': {} - - '@rollup/plugin-babel@5.3.1(@babel/core@7.24.5)(@types/babel__core@7.20.5)(rollup@2.79.1)': - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-module-imports': 7.24.3 - '@rollup/pluginutils': 3.1.0(rollup@2.79.1) - rollup: 2.79.1 - optionalDependencies: - '@types/babel__core': 7.20.5 - - '@rollup/plugin-node-resolve@15.2.3(rollup@2.79.1)': - dependencies: - '@rollup/pluginutils': 5.1.0(rollup@2.79.1) - '@types/resolve': 1.20.2 - deepmerge: 4.3.1 - is-builtin-module: 3.2.1 - is-module: 1.0.0 - resolve: 1.22.8 - optionalDependencies: - rollup: 2.79.1 - - '@rollup/plugin-replace@2.4.2(rollup@2.79.1)': - dependencies: - '@rollup/pluginutils': 3.1.0(rollup@2.79.1) - magic-string: 0.25.9 - rollup: 2.79.1 - - '@rollup/plugin-terser@0.4.4(rollup@2.79.1)': - dependencies: - serialize-javascript: 6.0.2 - smob: 1.5.0 - terser: 5.31.0 - optionalDependencies: - rollup: 2.79.1 - - '@rollup/pluginutils@3.1.0(rollup@2.79.1)': - dependencies: - '@types/estree': 0.0.39 - estree-walker: 1.0.1 - picomatch: 2.3.1 - rollup: 2.79.1 - - '@rollup/pluginutils@5.1.0(rollup@2.79.1)': - dependencies: - '@types/estree': 1.0.5 - estree-walker: 2.0.2 - picomatch: 2.3.1 - optionalDependencies: - rollup: 2.79.1 - - '@rollup/rollup-android-arm-eabi@4.17.2': - optional: true - - '@rollup/rollup-android-arm64@4.17.2': - optional: true - - '@rollup/rollup-darwin-arm64@4.17.2': - optional: true - - '@rollup/rollup-darwin-x64@4.17.2': - optional: true - - '@rollup/rollup-linux-arm-gnueabihf@4.17.2': - optional: true - - '@rollup/rollup-linux-arm-musleabihf@4.17.2': - optional: true - - '@rollup/rollup-linux-arm64-gnu@4.17.2': - optional: true - - '@rollup/rollup-linux-arm64-musl@4.17.2': - optional: true - - '@rollup/rollup-linux-powerpc64le-gnu@4.17.2': - optional: true - - '@rollup/rollup-linux-riscv64-gnu@4.17.2': - optional: true - - '@rollup/rollup-linux-s390x-gnu@4.17.2': - optional: true - - '@rollup/rollup-linux-x64-gnu@4.17.2': - optional: true - - '@rollup/rollup-linux-x64-musl@4.17.2': - optional: true - - '@rollup/rollup-win32-arm64-msvc@4.17.2': - optional: true - - '@rollup/rollup-win32-ia32-msvc@4.17.2': - optional: true - - '@rollup/rollup-win32-x64-msvc@4.17.2': - optional: true - - '@sideway/address@4.1.5': - dependencies: - '@hapi/hoek': 9.3.0 - - '@sideway/formula@3.0.1': {} - - '@sideway/pinpoint@2.0.0': {} - - '@sinclair/typebox@0.27.8': {} - - '@sinonjs/commons@3.0.1': - dependencies: - type-detect: 4.0.8 - - '@sinonjs/fake-timers@10.3.0': - dependencies: - '@sinonjs/commons': 3.0.1 - - '@surma/rollup-plugin-off-main-thread@2.2.3': - dependencies: - ejs: 3.1.10 - json5: 2.2.3 - magic-string: 0.25.9 - string.prototype.matchall: 4.0.11 - - '@swc/core-darwin-arm64@1.4.17': - optional: true - - '@swc/core-darwin-x64@1.4.17': + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true optional: true - '@swc/core-linux-arm-gnueabihf@1.4.17': + /@swc/core-linux-arm-gnueabihf@1.4.8: + resolution: {integrity: sha512-PP9JIJt19bUWhAGcQW6qMwTjZOcMyzkvZa0/LWSlDm0ORYVLmDXUoeQbGD3e0Zju9UiZxyulnpjEN0ZihJgPTA==} + engines: {node: '>=10'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true optional: true - '@swc/core-linux-arm64-gnu@1.4.17': + /@swc/core-linux-arm64-gnu@1.4.8: + resolution: {integrity: sha512-HvEWnwKHkoVUr5iftWirTApFJ13hGzhAY2CMw4lz9lur2m+zhPviRRED0FCI6T95Knpv7+8eUOr98Z7ctrG6DQ==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true optional: true - '@swc/core-linux-arm64-musl@1.4.17': + /@swc/core-linux-arm64-musl@1.4.8: + resolution: {integrity: sha512-kY8+qa7k/dEeBq9p0Hrta18QnJPpsiJvDQSLNaTIFpdM3aEM9zbkshWz8gaX5VVGUEALowCBUWqmzO4VaqM+2w==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true optional: true - '@swc/core-linux-x64-gnu@1.4.17': + /@swc/core-linux-x64-gnu@1.4.8: + resolution: {integrity: sha512-0WWyIw432wpO/zeGblwq4f2YWam4pn8Z/Ig4KzHMgthR/KmiLU3f0Z7eo45eVmq5vcU7Os1zi/Zb65OOt09q/w==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true optional: true - '@swc/core-linux-x64-musl@1.4.17': + /@swc/core-linux-x64-musl@1.4.8: + resolution: {integrity: sha512-p4yxvVS05rBNCrBaSTa20KK88vOwtg8ifTW7ec/yoab0bD5EwzzB8KbDmLLxE6uziFa0sdjF0dfRDwSZPex37Q==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true optional: true - '@swc/core-win32-arm64-msvc@1.4.17': + /@swc/core-win32-arm64-msvc@1.4.8: + resolution: {integrity: sha512-jKuXihxAaqUnbFfvPxtmxjdJfs87F1GdBf33il+VUmSyWCP4BE6vW+/ReDAe8sRNsKyrZ3UH1vI5q1n64csBUA==} + engines: {node: '>=10'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true optional: true - '@swc/core-win32-ia32-msvc@1.4.17': + /@swc/core-win32-ia32-msvc@1.4.8: + resolution: {integrity: sha512-O0wT4AGHrX8aBeH6c2ADMHgagAJc5Kf6W48U5moyYDAkkVnKvtSc4kGhjWhe1Yl0sI0cpYh2In2FxvYsb44eWw==} + engines: {node: '>=10'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true optional: true - '@swc/core-win32-x64-msvc@1.4.17': + /@swc/core-win32-x64-msvc@1.4.8: + resolution: {integrity: sha512-C2AYc3A2o+ECciqsJWRgIpp83Vk5EaRzHe7ed/xOWzVd0MsWR+fweEsyOjlmzHfpUxJSi46Ak3/BIZJlhZbXbg==} + engines: {node: '>=10'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true optional: true - '@swc/core@1.4.17': + /@swc/core@1.4.8: + resolution: {integrity: sha512-uY2RSJcFPgNOEg12RQZL197LZX+MunGiKxsbxmh22VfVxrOYGRvh4mPANFlrD1yb38CgmW1wI6YgIi8LkIwmWg==} + engines: {node: '>=10'} + requiresBuild: true + peerDependencies: + '@swc/helpers': ^0.5.0 + peerDependenciesMeta: + '@swc/helpers': + optional: true dependencies: '@swc/counter': 0.1.3 '@swc/types': 0.1.6 optionalDependencies: - '@swc/core-darwin-arm64': 1.4.17 - '@swc/core-darwin-x64': 1.4.17 - '@swc/core-linux-arm-gnueabihf': 1.4.17 - '@swc/core-linux-arm64-gnu': 1.4.17 - '@swc/core-linux-arm64-musl': 1.4.17 - '@swc/core-linux-x64-gnu': 1.4.17 - '@swc/core-linux-x64-musl': 1.4.17 - '@swc/core-win32-arm64-msvc': 1.4.17 - '@swc/core-win32-ia32-msvc': 1.4.17 - '@swc/core-win32-x64-msvc': 1.4.17 - - '@swc/counter@0.1.3': {} + '@swc/core-darwin-arm64': 1.4.8 + '@swc/core-darwin-x64': 1.4.8 + '@swc/core-linux-arm-gnueabihf': 1.4.8 + '@swc/core-linux-arm64-gnu': 1.4.8 + '@swc/core-linux-arm64-musl': 1.4.8 + '@swc/core-linux-x64-gnu': 1.4.8 + '@swc/core-linux-x64-musl': 1.4.8 + '@swc/core-win32-arm64-msvc': 1.4.8 + '@swc/core-win32-ia32-msvc': 1.4.8 + '@swc/core-win32-x64-msvc': 1.4.8 + dev: true + + /@swc/counter@0.1.3: + resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} + dev: true - '@swc/types@0.1.6': + /@swc/types@0.1.6: + resolution: {integrity: sha512-/JLo/l2JsT/LRd80C3HfbmVpxOAJ11FO2RCEslFrgzLltoP9j8XIbsyDcfCt2WWyX+CM96rBoNM+IToAkFOugg==} dependencies: '@swc/counter': 0.1.3 + dev: true - '@testing-library/dom@10.1.0': + /@testing-library/dom@10.1.0: + resolution: {integrity: sha512-wdsYKy5zupPyLCW2Je5DLHSxSfbIp6h80WoHOQc+RPtmPGA52O9x5MJEkv92Sjonpq+poOAtUKhh1kBGAXBrNA==} + engines: {node: '>=18'} dependencies: '@babel/code-frame': 7.24.2 - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.24.4 '@types/aria-query': 5.0.4 aria-query: 5.3.0 chalk: 4.1.2 dom-accessibility-api: 0.5.16 lz-string: 1.5.0 pretty-format: 27.5.1 + dev: true + + /@testing-library/dom@9.3.4: + resolution: {integrity: sha512-FlS4ZWlp97iiNWig0Muq8p+3rVDjRiYE+YKGbAqXOu9nwJFFOdL00kFpz42M+4huzYi86vAK1sOOfyOG45muIQ==} + engines: {node: '>=14'} + dependencies: + '@babel/code-frame': 7.24.2 + '@babel/runtime': 7.24.4 + '@types/aria-query': 5.0.4 + aria-query: 5.1.3 + chalk: 4.1.2 + dom-accessibility-api: 0.5.16 + lz-string: 1.5.0 + pretty-format: 27.5.1 + dev: true - '@testing-library/jest-dom@6.4.3(@jest/globals@29.7.0)(@types/jest@29.5.12)(jest@29.7.0(@types/node@20.12.8)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.4.17)(@types/node@20.12.8)(typescript@5.4.5)))': + /@testing-library/jest-dom@6.4.5(@types/jest@29.5.12)(jest@29.7.0): + resolution: {integrity: sha512-AguB9yvTXmCnySBP1lWjfNNUwpbElsaQ567lt2VdGqAdHtpieLgjmcVyv1q7PMIvLbgpDdkWV5Ydv3FEejyp2A==} + engines: {node: '>=14', npm: '>=6', yarn: '>=1'} + peerDependencies: + '@jest/globals': '>= 28' + '@types/bun': latest + '@types/jest': '>= 28' + jest: '>= 28' + vitest: '>= 0.32' + peerDependenciesMeta: + '@jest/globals': + optional: true + '@types/bun': + optional: true + '@types/jest': + optional: true + jest: + optional: true + vitest: + optional: true dependencies: '@adobe/css-tools': 4.3.3 - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.24.4 + '@types/jest': 29.5.12 aria-query: 5.3.0 chalk: 3.0.0 css.escape: 1.5.1 dom-accessibility-api: 0.6.3 + jest: 29.7.0(@types/node@20.12.8)(ts-node@10.9.2) lodash: 4.17.21 redent: 3.0.0 - optionalDependencies: - '@jest/globals': 29.7.0 - '@types/jest': 29.5.12 - jest: 29.7.0(@types/node@20.12.8)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.4.17)(@types/node@20.12.8)(typescript@5.4.5)) + dev: true - '@testing-library/react@15.0.6(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + /@testing-library/react@15.0.6(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-UlbazRtEpQClFOiYp+1BapMT+xyqWMnE+hh9tn5DQ6gmlE7AIZWcGpzZukmDZuFk3By01oiqOf8lRedLS4k6xQ==} + engines: {node: '>=18'} + peerDependencies: + '@types/react': ^18.0.0 + react: ^18.0.0 + react-dom: ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.24.4 '@testing-library/dom': 10.1.0 + '@types/react': 18.3.1 '@types/react-dom': 18.3.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.1 + dev: true - '@testing-library/user-event@14.5.2(@testing-library/dom@10.1.0)': + /@testing-library/user-event@14.5.2(@testing-library/dom@9.3.4): + resolution: {integrity: sha512-YAh82Wh4TIrxYLmfGcixwD18oIjyC1pFQC2Y01F2lzV2HTMiYrI0nze0FD0ocB//CKS/7jIUgae+adPqxK5yCQ==} + engines: {node: '>=12', npm: '>=6'} + peerDependencies: + '@testing-library/dom': '>=7.21.4' dependencies: - '@testing-library/dom': 10.1.0 + '@testing-library/dom': 9.3.4 + dev: true - '@tootallnate/once@2.0.0': {} + /@tootallnate/once@2.0.0: + resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} + engines: {node: '>= 10'} + dev: true - '@tsconfig/node10@1.0.11': {} + /@tsconfig/node10@1.0.9: + resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} + dev: true - '@tsconfig/node12@1.0.11': {} + /@tsconfig/node12@1.0.11: + resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + dev: true - '@tsconfig/node14@1.0.3': {} + /@tsconfig/node14@1.0.3: + resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + dev: true - '@tsconfig/node16@1.0.4': {} + /@tsconfig/node16@1.0.4: + resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + dev: true - '@types/aria-query@5.0.4': {} + /@types/aria-query@5.0.4: + resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} + dev: true - '@types/babel__core@7.20.5': + /@types/babel__core@7.20.5: + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} dependencies: - '@babel/parser': 7.24.5 - '@babel/types': 7.24.5 + '@babel/parser': 7.24.1 + '@babel/types': 7.24.0 '@types/babel__generator': 7.6.8 '@types/babel__template': 7.4.4 '@types/babel__traverse': 7.20.5 + dev: true - '@types/babel__generator@7.6.8': + /@types/babel__generator@7.6.8: + resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} dependencies: - '@babel/types': 7.24.5 + '@babel/types': 7.24.0 + dev: true - '@types/babel__template@7.4.4': + /@types/babel__template@7.4.4: + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} dependencies: - '@babel/parser': 7.24.5 - '@babel/types': 7.24.5 + '@babel/parser': 7.24.1 + '@babel/types': 7.24.0 + dev: true - '@types/babel__traverse@7.20.5': + /@types/babel__traverse@7.20.5: + resolution: {integrity: sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==} dependencies: - '@babel/types': 7.24.5 + '@babel/types': 7.24.0 + dev: true - '@types/cookie@0.6.0': {} + /@types/cookie@0.6.0: + resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} + dev: true - '@types/estree@0.0.39': {} + /@types/estree@0.0.39: + resolution: {integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==} + dev: false - '@types/estree@1.0.5': {} + /@types/estree@1.0.5: + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} - '@types/graceful-fs@4.1.9': + /@types/graceful-fs@4.1.9: + resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} dependencies: '@types/node': 20.12.8 + dev: true - '@types/hoist-non-react-statics@3.3.5': + /@types/hoist-non-react-statics@3.3.5: + resolution: {integrity: sha512-SbcrWzkKBw2cdwRTwQAswfpB9g9LJWfjtUeW/jvNwbhC8cpmmNYVePa+ncbUe0rGTQ7G3Ff6mYUN2VMfLVr+Sg==} dependencies: '@types/react': 18.3.1 hoist-non-react-statics: 3.3.2 + dev: true - '@types/istanbul-lib-coverage@2.0.6': {} + /@types/istanbul-lib-coverage@2.0.6: + resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} + dev: true - '@types/istanbul-lib-report@3.0.3': + /@types/istanbul-lib-report@3.0.3: + resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} dependencies: '@types/istanbul-lib-coverage': 2.0.6 + dev: true - '@types/istanbul-reports@3.0.4': + /@types/istanbul-reports@3.0.4: + resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} dependencies: '@types/istanbul-lib-report': 3.0.3 + dev: true - '@types/jest@29.5.12': + /@types/jest@29.5.12: + resolution: {integrity: sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==} dependencies: expect: 29.7.0 pretty-format: 29.7.0 + dev: true - '@types/jsdom@20.0.1': + /@types/jsdom@20.0.1: + resolution: {integrity: sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==} dependencies: '@types/node': 20.12.8 '@types/tough-cookie': 4.0.5 parse5: 7.1.2 + dev: true - '@types/json-schema@7.0.15': {} + /@types/json-schema@7.0.15: + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + dev: true - '@types/json5@0.0.29': {} + /@types/json5@0.0.29: + resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + dev: true - '@types/lodash.camelcase@4.3.9': + /@types/lodash.camelcase@4.3.9: + resolution: {integrity: sha512-ys9/hGBfsKxzmFI8hckII40V0ASQ83UM2pxfQRghHAwekhH4/jWtjz/3/9YDy7ZpUd/H0k2STSqmPR28dnj7Zg==} dependencies: '@types/lodash': 4.17.0 + dev: true - '@types/lodash@4.17.0': {} + /@types/lodash@4.17.0: + resolution: {integrity: sha512-t7dhREVv6dbNj0q17X12j7yDG4bD/DHYX7o5/DbDxobP0HnGPgpRz2Ej77aL7TZT3DSw13fqUTj8J4mMnqa7WA==} + dev: true - '@types/mute-stream@0.0.4': + /@types/mute-stream@0.0.4: + resolution: {integrity: sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow==} dependencies: '@types/node': 20.12.8 + dev: true - '@types/node-fetch@2.6.11': + /@types/node-fetch@2.6.11: + resolution: {integrity: sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==} dependencies: '@types/node': 20.12.8 form-data: 4.0.0 + dev: true - '@types/node@20.12.8': + /@types/node@20.12.8: + resolution: {integrity: sha512-NU0rJLJnshZWdE/097cdCBbyW1h4hEg0xpovcoAQYHl8dnEyp/NAOiE45pvc+Bd1Dt+2r94v2eGFpQJ4R7g+2w==} dependencies: undici-types: 5.26.5 - '@types/parse-json@4.0.2': {} + /@types/parse-json@4.0.2: + resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} + dev: false - '@types/prop-types@15.7.12': {} + /@types/prop-types@15.7.11: + resolution: {integrity: sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==} - '@types/react-dom@18.3.0': + /@types/react-dom@18.3.0: + resolution: {integrity: sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==} dependencies: '@types/react': 18.3.1 + dev: true - '@types/react-redux@7.1.33': + /@types/react-redux@7.1.33: + resolution: {integrity: sha512-NF8m5AjWCkert+fosDsN3hAlHzpjSiXlVy9EgQEmLoBhaNXbmyeGs/aj5dQzKuF+/q+S7JQagorGDW8pJ28Hmg==} dependencies: '@types/hoist-non-react-statics': 3.3.5 '@types/react': 18.3.1 hoist-non-react-statics: 3.3.2 redux: 4.2.1 + dev: true - '@types/react-transition-group@4.4.10': + /@types/react-transition-group@4.4.10: + resolution: {integrity: sha512-hT/+s0VQs2ojCX823m60m5f0sL5idt9SO6Tj6Dg+rdphGPIeJbJ6CxvBYkgkGKrYeDjvIpKTR38UzmtHJOGW3Q==} dependencies: '@types/react': 18.3.1 + dev: false - '@types/react@18.3.1': + /@types/react@18.3.1: + resolution: {integrity: sha512-V0kuGBX3+prX+DQ/7r2qsv1NsdfnCLnTgnRJ1pYnxykBhGMz+qj+box5lq7XsO5mtZsBqpjwwTu/7wszPfMBcw==} dependencies: - '@types/prop-types': 15.7.12 + '@types/prop-types': 15.7.11 csstype: 3.1.3 - '@types/resolve@1.20.2': {} + /@types/resolve@1.20.2: + resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} + dev: false - '@types/semver@7.5.8': {} + /@types/semver@7.5.8: + resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} + dev: true - '@types/stack-utils@2.0.3': {} + /@types/stack-utils@2.0.3: + resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} + dev: true - '@types/statuses@2.0.5': {} + /@types/statuses@2.0.5: + resolution: {integrity: sha512-jmIUGWrAiwu3dZpxntxieC+1n/5c3mjrImkmOSQ2NC5uP6cYO4aAZDdSmRcI5C1oiTmqlZGHC+/NmJrKogbP5A==} + dev: true - '@types/tough-cookie@4.0.5': {} + /@types/tough-cookie@4.0.5: + resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==} + dev: true - '@types/triple-beam@1.3.5': {} + /@types/triple-beam@1.3.5: + resolution: {integrity: sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==} + dev: true - '@types/trusted-types@2.0.7': {} + /@types/trusted-types@2.0.7: + resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} + dev: false - '@types/use-sync-external-store@0.0.3': {} + /@types/use-sync-external-store@0.0.3: + resolution: {integrity: sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA==} + dev: false - '@types/wrap-ansi@3.0.0': {} + /@types/wrap-ansi@3.0.0: + resolution: {integrity: sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g==} + dev: true - '@types/yargs-parser@21.0.3': {} + /@types/yargs-parser@21.0.3: + resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} + dev: true - '@types/yargs@17.0.32': + /@types/yargs@17.0.32: + resolution: {integrity: sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==} dependencies: '@types/yargs-parser': 21.0.3 + dev: true - '@typescript-eslint/eslint-plugin@7.8.0(@typescript-eslint/parser@7.8.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5)': + /@typescript-eslint/eslint-plugin@7.8.0(@typescript-eslint/parser@7.8.0)(eslint@8.57.0)(typescript@5.4.5): + resolution: {integrity: sha512-gFTT+ezJmkwutUPmB0skOj3GZJtlEGnlssems4AjkVweUPGj7jRwwqg0Hhg7++kPGJqKtTYx+R05Ftww372aIg==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + '@typescript-eslint/parser': ^7.0.0 + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true dependencies: '@eslint-community/regexpp': 4.10.0 '@typescript-eslint/parser': 7.8.0(eslint@8.57.0)(typescript@5.4.5) @@ -6703,12 +3487,20 @@ snapshots: natural-compare: 1.4.0 semver: 7.6.0 ts-api-utils: 1.3.0(typescript@5.4.5) - optionalDependencies: typescript: 5.4.5 transitivePeerDependencies: - supports-color + dev: true - '@typescript-eslint/parser@7.8.0(eslint@8.57.0)(typescript@5.4.5)': + /@typescript-eslint/parser@7.8.0(eslint@8.57.0)(typescript@5.4.5): + resolution: {integrity: sha512-KgKQly1pv0l4ltcftP59uQZCi4HUYswCLbTqVZEJu7uLX8CTLyswqMLqLN+2QFz4jCptqWVV4SB7vdxcH2+0kQ==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true dependencies: '@typescript-eslint/scope-manager': 7.8.0 '@typescript-eslint/types': 7.8.0 @@ -6716,31 +3508,52 @@ snapshots: '@typescript-eslint/visitor-keys': 7.8.0 debug: 4.3.4 eslint: 8.57.0 - optionalDependencies: typescript: 5.4.5 transitivePeerDependencies: - supports-color + dev: true - '@typescript-eslint/scope-manager@7.8.0': + /@typescript-eslint/scope-manager@7.8.0: + resolution: {integrity: sha512-viEmZ1LmwsGcnr85gIq+FCYI7nO90DVbE37/ll51hjv9aG+YZMb4WDE2fyWpUR4O/UrhGRpYXK/XajcGTk2B8g==} + engines: {node: ^18.18.0 || >=20.0.0} dependencies: '@typescript-eslint/types': 7.8.0 '@typescript-eslint/visitor-keys': 7.8.0 + dev: true - '@typescript-eslint/type-utils@7.8.0(eslint@8.57.0)(typescript@5.4.5)': + /@typescript-eslint/type-utils@7.8.0(eslint@8.57.0)(typescript@5.4.5): + resolution: {integrity: sha512-H70R3AefQDQpz9mGv13Uhi121FNMh+WEaRqcXTX09YEDky21km4dV1ZXJIp8QjXc4ZaVkXVdohvWDzbnbHDS+A==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true dependencies: '@typescript-eslint/typescript-estree': 7.8.0(typescript@5.4.5) '@typescript-eslint/utils': 7.8.0(eslint@8.57.0)(typescript@5.4.5) debug: 4.3.4 eslint: 8.57.0 ts-api-utils: 1.3.0(typescript@5.4.5) - optionalDependencies: typescript: 5.4.5 transitivePeerDependencies: - supports-color + dev: true - '@typescript-eslint/types@7.8.0': {} + /@typescript-eslint/types@7.8.0: + resolution: {integrity: sha512-wf0peJ+ZGlcH+2ZS23aJbOv+ztjeeP8uQ9GgwMJGVLx/Nj9CJt17GWgWWoSmoRVKAX2X+7fzEnAjxdvK2gqCLw==} + engines: {node: ^18.18.0 || >=20.0.0} + dev: true - '@typescript-eslint/typescript-estree@7.8.0(typescript@5.4.5)': + /@typescript-eslint/typescript-estree@7.8.0(typescript@5.4.5): + resolution: {integrity: sha512-5pfUCOwK5yjPaJQNy44prjCwtr981dO8Qo9J9PwYXZ0MosgAbfEMB008dJ5sNo3+/BN6ytBPuSvXUg9SAqB0dg==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true dependencies: '@typescript-eslint/types': 7.8.0 '@typescript-eslint/visitor-keys': 7.8.0 @@ -6750,12 +3563,16 @@ snapshots: minimatch: 9.0.4 semver: 7.6.0 ts-api-utils: 1.3.0(typescript@5.4.5) - optionalDependencies: typescript: 5.4.5 transitivePeerDependencies: - supports-color + dev: true - '@typescript-eslint/utils@7.8.0(eslint@8.57.0)(typescript@5.4.5)': + /@typescript-eslint/utils@7.8.0(eslint@8.57.0)(typescript@5.4.5): + resolution: {integrity: sha512-L0yFqOCflVqXxiZyXrDr80lnahQfSOfc9ELAAZ75sqicqp2i36kEZZGuUymHNFoYOqxRT05up760b4iGsl02nQ==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) '@types/json-schema': 7.0.15 @@ -6768,191 +3585,314 @@ snapshots: transitivePeerDependencies: - supports-color - typescript + dev: true - '@typescript-eslint/visitor-keys@7.8.0': + /@typescript-eslint/visitor-keys@7.8.0: + resolution: {integrity: sha512-q4/gibTNBQNA0lGyYQCmWRS5D15n8rXh4QjK3KV+MBPlTYHpfBUT3D3PaPR/HeNiI9W6R7FvlkcGhNyAoP+caA==} + engines: {node: ^18.18.0 || >=20.0.0} dependencies: '@typescript-eslint/types': 7.8.0 eslint-visitor-keys: 3.4.3 + dev: true - '@ungap/structured-clone@1.2.0': {} + /@ungap/structured-clone@1.2.0: + resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + dev: true - '@vitejs/plugin-react-swc@3.6.0(vite@5.2.11(@types/node@20.12.8)(terser@5.31.0))': + /@vitejs/plugin-react-swc@3.6.0(vite@5.2.11): + resolution: {integrity: sha512-XFRbsGgpGxGzEV5i5+vRiro1bwcIaZDIdBRP16qwm+jP68ue/S8FJTBEgOeojtVDYrbSua3XFp71kC8VJE6v+g==} + peerDependencies: + vite: ^4 || ^5 dependencies: - '@swc/core': 1.4.17 - vite: 5.2.11(@types/node@20.12.8)(terser@5.31.0) + '@swc/core': 1.4.8 + vite: 5.2.11(@types/node@20.12.8) transitivePeerDependencies: - '@swc/helpers' + dev: true - JSONStream@1.3.5: + /JSONStream@1.3.5: + resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} + hasBin: true dependencies: jsonparse: 1.3.1 through: 2.3.8 + dev: true - abab@2.0.6: {} + /abab@2.0.6: + resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} + deprecated: Use your platform's native atob() and btoa() methods instead + dev: true - acorn-globals@7.0.1: + /acorn-globals@7.0.1: + resolution: {integrity: sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==} dependencies: acorn: 8.11.3 acorn-walk: 8.3.2 + dev: true - acorn-jsx@5.3.2(acorn@8.11.3): + /acorn-jsx@5.3.2(acorn@8.11.3): + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: acorn: 8.11.3 + dev: true - acorn-walk@8.3.2: {} + /acorn-walk@8.3.2: + resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} + engines: {node: '>=0.4.0'} + dev: true - acorn@8.11.3: {} + /acorn@8.11.3: + resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} + engines: {node: '>=0.4.0'} + hasBin: true - agent-base@6.0.2: + /agent-base@6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} dependencies: debug: 4.3.4 transitivePeerDependencies: - supports-color + dev: true - ajv-formats@2.1.1(ajv@8.13.0): - optionalDependencies: - ajv: 8.13.0 + /ajv-formats@2.1.1(ajv@8.12.0): + resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + dependencies: + ajv: 8.12.0 + dev: true - ajv@6.12.6: + /ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} dependencies: fast-deep-equal: 3.1.3 fast-json-stable-stringify: 2.1.0 json-schema-traverse: 0.4.1 uri-js: 4.4.1 + dev: true - ajv@8.13.0: + /ajv@8.12.0: + resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} dependencies: fast-deep-equal: 3.1.3 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 uri-js: 4.4.1 - ansi-escapes@4.3.2: + /ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} dependencies: type-fest: 0.21.3 + dev: true - ansi-escapes@6.2.1: {} + /ansi-escapes@6.2.0: + resolution: {integrity: sha512-kzRaCqXnpzWs+3z5ABPQiVke+iq0KXkHo8xiWV4RPTi5Yli0l97BEQuhXV1s7+aSU/fu1kUuxgS4MsQ0fRuygw==} + engines: {node: '>=14.16'} + dependencies: + type-fest: 3.13.1 + dev: true - ansi-regex@5.0.1: {} + /ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + dev: true - ansi-regex@6.0.1: {} + /ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + dev: true - ansi-styles@3.2.1: + /ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} dependencies: color-convert: 1.9.3 - ansi-styles@4.3.0: + /ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} dependencies: color-convert: 2.0.1 - ansi-styles@5.2.0: {} + /ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + dev: true - ansi-styles@6.2.1: {} + /ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + dev: true - anymatch@3.1.3: + /anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} dependencies: normalize-path: 3.0.0 picomatch: 2.3.1 + dev: true - arch@2.2.0: {} + /arch@2.2.0: + resolution: {integrity: sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==} + dev: true - arg@4.1.3: {} + /arg@4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + dev: true - argparse@1.0.10: + /argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} dependencies: sprintf-js: 1.0.3 + dev: true + + /argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + dev: true - argparse@2.0.1: {} + /aria-query@5.1.3: + resolution: {integrity: sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==} + dependencies: + deep-equal: 2.2.3 + dev: true - aria-query@5.3.0: + /aria-query@5.3.0: + resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} dependencies: dequal: 2.0.3 + dev: true - array-buffer-byte-length@1.0.1: + /array-buffer-byte-length@1.0.1: + resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 is-array-buffer: 3.0.4 - array-find-index@1.0.2: {} + /array-find-index@1.0.2: + resolution: {integrity: sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==} + engines: {node: '>=0.10.0'} + dev: true - array-includes@3.1.8: + /array-includes@3.1.7: + resolution: {integrity: sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.23.3 - es-object-atoms: 1.0.0 + es-abstract: 1.22.5 get-intrinsic: 1.2.4 is-string: 1.0.7 + dev: true - array-union@2.1.0: {} + /array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + dev: true - array.prototype.findlast@1.2.5: + /array.prototype.findlast@1.2.5: + resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.23.2 es-errors: 1.3.0 es-object-atoms: 1.0.0 es-shim-unscopables: 1.0.2 + dev: true - array.prototype.findlastindex@1.2.5: + /array.prototype.findlastindex@1.2.5: + resolution: {integrity: sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.23.2 es-errors: 1.3.0 es-object-atoms: 1.0.0 es-shim-unscopables: 1.0.2 + dev: true - array.prototype.flat@1.3.2: + /array.prototype.flat@1.3.2: + resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.22.5 es-shim-unscopables: 1.0.2 + dev: true - array.prototype.flatmap@1.3.2: + /array.prototype.flatmap@1.3.2: + resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.22.5 es-shim-unscopables: 1.0.2 + dev: true - array.prototype.toreversed@1.1.2: + /array.prototype.toreversed@1.1.2: + resolution: {integrity: sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==} dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.22.5 es-shim-unscopables: 1.0.2 + dev: true - array.prototype.tosorted@1.1.3: + /array.prototype.tosorted@1.1.3: + resolution: {integrity: sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg==} dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.22.5 es-errors: 1.3.0 es-shim-unscopables: 1.0.2 + dev: true - arraybuffer.prototype.slice@1.0.3: + /arraybuffer.prototype.slice@1.0.3: + resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} + engines: {node: '>= 0.4'} dependencies: array-buffer-byte-length: 1.0.1 call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.22.5 es-errors: 1.3.0 get-intrinsic: 1.2.4 is-array-buffer: 3.0.4 is-shared-array-buffer: 1.0.3 - async@3.2.5: {} + /async@3.2.5: + resolution: {integrity: sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==} - asynckit@0.4.0: {} + /asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - at-least-node@1.0.0: {} + /at-least-node@1.0.0: + resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} + engines: {node: '>= 4.0.0'} + dev: false - atomically@1.7.0: {} + /atomically@1.7.0: + resolution: {integrity: sha512-Xcz9l0z7y9yQ9rdDaxlmaI4uJHf/T8g9hOEzJcsEqX2SjCj4J20uK7+ldkDHMbpJDK76wF7xEIgxc/vSlsfw5w==} + engines: {node: '>=10.12.0'} + dev: true - audit-ci@6.6.1: + /audit-ci@6.6.1: + resolution: {integrity: sha512-zqZEoYfEC4QwX5yBkDNa0h7YhZC63HWtKtP19BVq+RS0dxRBInfmHogxe4VUeOzoADQjuTLZUI7zp3Pjyl+a5g==} + engines: {node: '>=12.9.0'} + hasBin: true dependencies: JSONStream: 1.3.5 cross-spawn: 7.0.3 @@ -6962,159 +3902,230 @@ snapshots: readline-transform: 1.0.0 semver: 7.6.0 yargs: 17.7.2 + dev: true - autoprefixer@10.4.19(postcss@8.4.38): + /autoprefixer@10.4.19(postcss@8.4.38): + resolution: {integrity: sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 dependencies: browserslist: 4.23.0 - caniuse-lite: 1.0.30001615 + caniuse-lite: 1.0.30001599 fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.0.0 postcss: 8.4.38 postcss-value-parser: 4.2.0 + dev: true - available-typed-arrays@1.0.7: + /available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} dependencies: possible-typed-array-names: 1.0.0 - axios@1.6.8: + /axios@1.6.8: + resolution: {integrity: sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==} dependencies: follow-redirects: 1.15.6 form-data: 4.0.0 proxy-from-env: 1.1.0 transitivePeerDependencies: - debug + dev: false - babel-jest@29.7.0(@babel/core@7.24.5): + /babel-jest@29.7.0(@babel/core@7.24.3): + resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@babel/core': ^7.8.0 dependencies: - '@babel/core': 7.24.5 + '@babel/core': 7.24.3 '@jest/transform': 29.7.0 '@types/babel__core': 7.20.5 babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 29.6.3(@babel/core@7.24.5) + babel-preset-jest: 29.6.3(@babel/core@7.24.3) chalk: 4.1.2 graceful-fs: 4.2.11 slash: 3.0.0 transitivePeerDependencies: - supports-color + dev: true - babel-plugin-istanbul@6.1.1: + /babel-plugin-istanbul@6.1.1: + resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} + engines: {node: '>=8'} dependencies: - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.0 '@istanbuljs/load-nyc-config': 1.1.0 '@istanbuljs/schema': 0.1.3 istanbul-lib-instrument: 5.2.1 test-exclude: 6.0.0 transitivePeerDependencies: - supports-color + dev: true - babel-plugin-jest-hoist@29.6.3: + /babel-plugin-jest-hoist@29.6.3: + resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@babel/template': 7.24.0 - '@babel/types': 7.24.5 + '@babel/types': 7.24.0 '@types/babel__core': 7.20.5 '@types/babel__traverse': 7.20.5 + dev: true - babel-plugin-macros@3.1.0: + /babel-plugin-macros@3.1.0: + resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} + engines: {node: '>=10', npm: '>=6'} dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.24.1 cosmiconfig: 7.1.0 resolve: 1.22.8 + dev: false - babel-plugin-polyfill-corejs2@0.4.11(@babel/core@7.24.5): + /babel-plugin-polyfill-corejs2@0.4.10(@babel/core@7.24.4): + resolution: {integrity: sha512-rpIuu//y5OX6jVU+a5BCn1R5RSZYWAl2Nar76iwaOdycqb6JPxediskWFMMl7stfwNJR4b7eiQvh5fB5TEQJTQ==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: '@babel/compat-data': 7.24.4 - '@babel/core': 7.24.5 - '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.24.5) + '@babel/core': 7.24.4 + '@babel/helper-define-polyfill-provider': 0.6.1(@babel/core@7.24.4) semver: 6.3.1 transitivePeerDependencies: - supports-color + dev: false - babel-plugin-polyfill-corejs3@0.10.4(@babel/core@7.24.5): + /babel-plugin-polyfill-corejs3@0.10.4(@babel/core@7.24.4): + resolution: {integrity: sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: - '@babel/core': 7.24.5 - '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.24.5) - core-js-compat: 3.37.0 + '@babel/core': 7.24.4 + '@babel/helper-define-polyfill-provider': 0.6.1(@babel/core@7.24.4) + core-js-compat: 3.36.1 transitivePeerDependencies: - supports-color + dev: false - babel-plugin-polyfill-regenerator@0.6.2(@babel/core@7.24.5): + /babel-plugin-polyfill-regenerator@0.6.1(@babel/core@7.24.4): + resolution: {integrity: sha512-JfTApdE++cgcTWjsiCQlLyFBMbTUft9ja17saCc93lgV33h4tuCVj7tlvu//qpLwaG+3yEz7/KhahGrUMkVq9g==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: - '@babel/core': 7.24.5 - '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.24.5) + '@babel/core': 7.24.4 + '@babel/helper-define-polyfill-provider': 0.6.1(@babel/core@7.24.4) transitivePeerDependencies: - supports-color + dev: false - babel-preset-current-node-syntax@1.0.1(@babel/core@7.24.5): - dependencies: - '@babel/core': 7.24.5 - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.5) - '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.24.5) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.24.5) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.24.5) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.5) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.5) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.5) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.5) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.5) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.5) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.5) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.24.5) - - babel-preset-jest@29.6.3(@babel/core@7.24.5): - dependencies: - '@babel/core': 7.24.5 + /babel-preset-current-node-syntax@1.0.1(@babel/core@7.24.3): + resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.24.3 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.3) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.24.3) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.24.3) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.24.3) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.3) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.3) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.3) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.3) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.3) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.3) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.3) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.24.3) + dev: true + + /babel-preset-jest@29.6.3(@babel/core@7.24.3): + resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.24.3 babel-plugin-jest-hoist: 29.6.3 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.24.5) + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.24.3) + dev: true - balanced-match@1.0.2: {} + /balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - base64-js@1.5.1: {} + /base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + dev: true - bl@4.1.0: + /bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} dependencies: buffer: 5.7.1 inherits: 2.0.4 readable-stream: 3.6.2 + dev: true - brace-expansion@1.1.11: + /brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 - brace-expansion@2.0.1: + /brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} dependencies: balanced-match: 1.0.2 - braces@3.0.2: + /braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} dependencies: fill-range: 7.0.1 - browserslist@4.23.0: + /browserslist@4.23.0: + resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true dependencies: - caniuse-lite: 1.0.30001615 - electron-to-chromium: 1.4.755 + caniuse-lite: 1.0.30001599 + electron-to-chromium: 1.4.711 node-releases: 2.0.14 - update-browserslist-db: 1.0.14(browserslist@4.23.0) + update-browserslist-db: 1.0.13(browserslist@4.23.0) - bs-logger@0.2.6: + /bs-logger@0.2.6: + resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} + engines: {node: '>= 6'} dependencies: fast-json-stable-stringify: 2.1.0 + dev: true - bser@2.1.1: + /bser@2.1.1: + resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} dependencies: node-int64: 0.4.0 + dev: true - buffer-from@1.1.2: {} + /buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - buffer@5.7.1: + /buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} dependencies: base64-js: 1.5.1 ieee754: 1.2.1 + dev: true - builtin-modules@3.3.0: {} + /builtin-modules@3.3.0: + resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} + engines: {node: '>=6'} + dev: false - call-bind@1.0.7: + /call-bind@1.0.7: + resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} + engines: {node: '>= 0.4'} dependencies: es-define-property: 1.0.0 es-errors: 1.3.0 @@ -7122,116 +4133,201 @@ snapshots: get-intrinsic: 1.2.4 set-function-length: 1.2.2 - callsites@3.1.0: {} + /callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} - camelcase@5.3.1: {} + /camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + dev: true - camelcase@6.3.0: {} + /camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + dev: true - caniuse-lite@1.0.30001615: {} + /caniuse-lite@1.0.30001599: + resolution: {integrity: sha512-LRAQHZ4yT1+f9LemSMeqdMpMxZcc4RMWdj4tiFe3G8tNkWK+E58g+/tzotb5cU6TbcVJLr4fySiAW7XmxQvZQA==} - chalk@2.4.2: + /chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} dependencies: ansi-styles: 3.2.1 escape-string-regexp: 1.0.5 supports-color: 5.5.0 - chalk@3.0.0: + /chalk@3.0.0: + resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==} + engines: {node: '>=8'} dependencies: ansi-styles: 4.3.0 supports-color: 7.2.0 + dev: true - chalk@4.1.2: + /chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} dependencies: ansi-styles: 4.3.0 supports-color: 7.2.0 - chalk@5.3.0: {} + /chalk@5.3.0: + resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + dev: true - char-regex@1.0.2: {} + /char-regex@1.0.2: + resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} + engines: {node: '>=10'} + dev: true - ci-info@3.9.0: {} + /ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} + dev: true - cjs-module-lexer@1.3.1: {} + /cjs-module-lexer@1.2.3: + resolution: {integrity: sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==} + dev: true - cli-cursor@3.1.0: + /cli-cursor@3.1.0: + resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} + engines: {node: '>=8'} dependencies: restore-cursor: 3.1.0 + dev: true - cli-cursor@4.0.0: + /cli-cursor@4.0.0: + resolution: {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: restore-cursor: 4.0.0 + dev: true - cli-spinners@2.9.2: {} + /cli-spinners@2.9.2: + resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} + engines: {node: '>=6'} + dev: true - cli-truncate@4.0.0: + /cli-truncate@4.0.0: + resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==} + engines: {node: '>=18'} dependencies: slice-ansi: 5.0.0 string-width: 7.1.0 + dev: true - cli-width@4.1.0: {} + /cli-width@4.1.0: + resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} + engines: {node: '>= 12'} + dev: true - cliui@8.0.1: + /cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} dependencies: string-width: 4.2.3 strip-ansi: 6.0.1 wrap-ansi: 7.0.0 + dev: true - clone@1.0.4: {} + /clone@1.0.4: + resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} + engines: {node: '>=0.8'} + dev: true - clsx@2.1.1: {} + /clsx@2.1.0: + resolution: {integrity: sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==} + engines: {node: '>=6'} + dev: false - co@4.6.0: {} + /co@4.6.0: + resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} + engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + dev: true - collect-v8-coverage@1.0.2: {} + /collect-v8-coverage@1.0.2: + resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} + dev: true - color-convert@1.9.3: + /color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} dependencies: color-name: 1.1.3 - color-convert@2.0.1: + /color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} dependencies: color-name: 1.1.4 - color-name@1.1.3: {} + /color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - color-name@1.1.4: {} + /color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - color-string@1.9.1: + /color-string@1.9.1: + resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} dependencies: color-name: 1.1.4 simple-swizzle: 0.2.2 + dev: true - color@3.2.1: + /color@3.2.1: + resolution: {integrity: sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==} dependencies: color-convert: 1.9.3 color-string: 1.9.1 + dev: true - colorette@2.0.20: {} + /colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + dev: true - colorspace@1.1.4: + /colorspace@1.1.4: + resolution: {integrity: sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==} dependencies: color: 3.2.1 text-hex: 1.0.0 + dev: true - combined-stream@1.0.8: + /combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} dependencies: delayed-stream: 1.0.0 - commander@11.1.0: {} + /commander@11.1.0: + resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} + engines: {node: '>=16'} + dev: true - commander@12.0.0: {} + /commander@12.0.0: + resolution: {integrity: sha512-MwVNWlYjDTtOjX5PiD7o5pK0UrFU/OYgcJfjjK4RaHZETNtjJqrZa9Y9ds88+A+f+d5lv+561eZ+yCKoS3gbAA==} + engines: {node: '>=18'} + dev: true - commander@2.20.3: {} + /commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + dev: false - common-tags@1.8.2: {} + /common-tags@1.8.2: + resolution: {integrity: sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==} + engines: {node: '>=4.0.0'} + dev: false - concat-map@0.0.1: {} + /concat-map@0.0.1: + resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=} - conf@10.2.0: + /conf@10.2.0: + resolution: {integrity: sha512-8fLl9F04EJqjSqH+QjITQfJF8BrOVaYr1jewVgSRAEWePfxT0sku4w2hrGQ60BC/TNLGQ2pgxNlTbWQmMPFvXg==} + engines: {node: '>=12'} dependencies: - ajv: 8.13.0 - ajv-formats: 2.1.1(ajv@8.13.0) + ajv: 8.12.0 + ajv-formats: 2.1.1(ajv@8.12.0) atomically: 1.7.0 debounce-fn: 4.0.0 dot-prop: 6.0.1 @@ -7240,41 +4336,63 @@ snapshots: onetime: 5.1.2 pkg-up: 3.1.0 semver: 7.6.0 + dev: true - convert-source-map@1.9.0: {} + /convert-source-map@1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + dev: false - convert-source-map@2.0.0: {} + /convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - cookie@0.5.0: {} + /cookie@0.5.0: + resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} + engines: {node: '>= 0.6'} + dev: true - core-js-compat@3.37.0: + /core-js-compat@3.36.1: + resolution: {integrity: sha512-Dk997v9ZCt3X/npqzyGdTlq6t7lDBhZwGvV94PKzDArjp7BTRm7WlDAXYd/OWdeFHO8OChQYRJNJvUCqCbrtKA==} dependencies: browserslist: 4.23.0 + dev: false - cosmiconfig@7.1.0: + /cosmiconfig@7.1.0: + resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} + engines: {node: '>=10'} dependencies: '@types/parse-json': 4.0.2 import-fresh: 3.3.0 parse-json: 5.2.0 path-type: 4.0.0 yaml: 1.10.2 + dev: false - cosmiconfig@9.0.0(typescript@5.4.5): + /cosmiconfig@9.0.0(typescript@5.4.5): + resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true dependencies: env-paths: 2.2.1 import-fresh: 3.3.0 js-yaml: 4.1.0 parse-json: 5.2.0 - optionalDependencies: typescript: 5.4.5 + dev: true - create-jest@29.7.0(@types/node@20.12.8)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.4.17)(@types/node@20.12.8)(typescript@5.4.5)): + /create-jest@29.7.0(@types/node@20.12.8)(ts-node@10.9.2): + resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@20.12.8)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.4.17)(@types/node@20.12.8)(typescript@5.4.5)) + jest-config: 29.7.0(@types/node@20.12.8)(ts-node@10.9.2) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -7282,182 +4400,403 @@ snapshots: - babel-plugin-macros - supports-color - ts-node + dev: true - create-require@1.1.1: {} + /create-require@1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + dev: true - cross-spawn@7.0.3: + /cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} dependencies: path-key: 3.1.1 shebang-command: 2.0.0 which: 2.0.2 + dev: true - crypto-random-string@2.0.0: {} + /crypto-random-string@2.0.0: + resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==} + engines: {node: '>=8'} + dev: false - css.escape@1.5.1: {} + /css.escape@1.5.1: + resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==} + dev: true - cssom@0.3.8: {} + /cssom@0.3.8: + resolution: {integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==} + dev: true - cssom@0.5.0: {} + /cssom@0.5.0: + resolution: {integrity: sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==} + dev: true - cssstyle@2.3.0: + /cssstyle@2.3.0: + resolution: {integrity: sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==} + engines: {node: '>=8'} dependencies: cssom: 0.3.8 + dev: true - csstype@3.1.3: {} + /csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} - csv-parse@5.5.5: {} + /csv-parse@5.5.5: + resolution: {integrity: sha512-erCk7tyU3yLWAhk6wvKxnyPtftuy/6Ak622gOO7BCJ05+TYffnPCJF905wmOQm+BpkX54OdAl8pveJwUdpnCXQ==} + dev: true - cuint@0.2.2: {} + /cuint@0.2.2: + resolution: {integrity: sha512-d4ZVpCW31eWwCMe1YT3ur7mUDnTXbgwyzaL320DrcRT45rfjYxkt5QWLrmOJ+/UEAI2+fQgKe/fCjR8l4TpRgw==} + dev: true - data-uri-to-buffer@4.0.1: {} + /data-uri-to-buffer@4.0.1: + resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} + engines: {node: '>= 12'} + dev: true - data-urls@3.0.2: + /data-urls@3.0.2: + resolution: {integrity: sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==} + engines: {node: '>=12'} dependencies: abab: 2.0.6 whatwg-mimetype: 3.0.0 whatwg-url: 11.0.0 + dev: true - data-view-buffer@1.0.1: + /data-view-buffer@1.0.1: + resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 es-errors: 1.3.0 is-data-view: 1.0.1 - data-view-byte-length@1.0.1: + /data-view-byte-length@1.0.1: + resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 es-errors: 1.3.0 is-data-view: 1.0.1 - data-view-byte-offset@1.0.0: + /data-view-byte-offset@1.0.0: + resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 es-errors: 1.3.0 is-data-view: 1.0.1 - dayjs@1.11.11: {} + /dayjs@1.11.11: + resolution: {integrity: sha512-okzr3f11N6WuqYtZSvm+F776mB41wRZMhKP+hc34YdW+KmtYYK9iqvHSwo2k9FEH3fhGXvOPV6yz2IcSrfRUDg==} + dev: false - debounce-fn@4.0.0: + /debounce-fn@4.0.0: + resolution: {integrity: sha512-8pYCQiL9Xdcg0UPSD3d+0KMlOjp+KGU5EPwYddgzQ7DATsg4fuUDjQtsYLmWjnk2obnNHgV3vE2Y4jejSOJVBQ==} + engines: {node: '>=10'} dependencies: mimic-fn: 3.1.0 + dev: true - debug@3.2.7: + /debug@3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true dependencies: ms: 2.1.3 + dev: true - debug@4.3.4: + /debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true dependencies: ms: 2.1.2 - decimal.js@10.4.3: {} + /decimal.js@10.4.3: + resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} + dev: true - dedent@1.5.3(babel-plugin-macros@3.1.0): - optionalDependencies: - babel-plugin-macros: 3.1.0 + /dedent@1.5.1: + resolution: {integrity: sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==} + peerDependencies: + babel-plugin-macros: ^3.1.0 + peerDependenciesMeta: + babel-plugin-macros: + optional: true + dev: true + + /deep-equal@2.2.3: + resolution: {integrity: sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==} + engines: {node: '>= 0.4'} + dependencies: + array-buffer-byte-length: 1.0.1 + call-bind: 1.0.7 + es-get-iterator: 1.1.3 + get-intrinsic: 1.2.4 + is-arguments: 1.1.1 + is-array-buffer: 3.0.4 + is-date-object: 1.0.5 + is-regex: 1.1.4 + is-shared-array-buffer: 1.0.3 + isarray: 2.0.5 + object-is: 1.1.6 + object-keys: 1.1.1 + object.assign: 4.1.5 + regexp.prototype.flags: 1.5.2 + side-channel: 1.0.6 + which-boxed-primitive: 1.0.2 + which-collection: 1.0.2 + which-typed-array: 1.1.15 + dev: true - deep-is@0.1.4: {} + /deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + dev: true - deepmerge@4.3.1: {} + /deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} - defaults@1.0.4: + /defaults@1.0.4: + resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} dependencies: clone: 1.0.4 + dev: true - define-data-property@1.1.4: + /define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} dependencies: es-define-property: 1.0.0 es-errors: 1.3.0 gopd: 1.0.1 - define-lazy-prop@2.0.0: {} + /define-lazy-prop@2.0.0: + resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} + engines: {node: '>=8'} + dev: true - define-properties@1.2.1: + /define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} dependencies: define-data-property: 1.1.4 has-property-descriptors: 1.0.2 object-keys: 1.1.1 - delayed-stream@1.0.0: {} + /delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} - dequal@2.0.3: {} + /dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + dev: true - detect-newline@3.1.0: {} + /detect-newline@3.1.0: + resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} + engines: {node: '>=8'} + dev: true - diff-sequences@29.6.3: {} + /diff-sequences@29.6.3: + resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dev: true - diff@4.0.2: {} + /diff@4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} + dev: true - diff@5.2.0: {} + /diff@5.2.0: + resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} + engines: {node: '>=0.3.1'} + dev: true - dir-glob@3.0.1: + /dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} dependencies: path-type: 4.0.0 + dev: true - doctrine@2.1.0: + /doctrine@2.1.0: + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} + engines: {node: '>=0.10.0'} dependencies: esutils: 2.0.3 + dev: true - doctrine@3.0.0: + /doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} dependencies: esutils: 2.0.3 + dev: true - dom-accessibility-api@0.5.16: {} + /dom-accessibility-api@0.5.16: + resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} + dev: true - dom-accessibility-api@0.6.3: {} + /dom-accessibility-api@0.6.3: + resolution: {integrity: sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==} + dev: true - dom-helpers@5.2.1: + /dom-helpers@5.2.1: + resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==} dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.24.4 csstype: 3.1.3 + dev: false - domexception@4.0.0: + /domexception@4.0.0: + resolution: {integrity: sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==} + engines: {node: '>=12'} + deprecated: Use your platform's native DOMException instead dependencies: webidl-conversions: 7.0.0 + dev: true - dot-prop@6.0.1: + /dot-prop@6.0.1: + resolution: {integrity: sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==} + engines: {node: '>=10'} dependencies: is-obj: 2.0.0 + dev: true - dotenv-expand@11.0.6: + /dotenv-expand@11.0.6: + resolution: {integrity: sha512-8NHi73otpWsZGBSZwwknTXS5pqMOrk9+Ssrna8xCaxkzEpU9OTf9R5ArQGVw03//Zmk9MOwLPng9WwndvpAJ5g==} + engines: {node: '>=12'} dependencies: dotenv: 16.4.5 + dev: true - dotenv@16.4.5: {} + /dotenv@16.4.5: + resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} + engines: {node: '>=12'} + dev: true - duplexer@0.1.2: {} + /duplexer@0.1.2: + resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} + dev: true - eastasianwidth@0.2.0: {} + /eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + dev: true - ejs@3.1.10: + /ejs@3.1.9: + resolution: {integrity: sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==} + engines: {node: '>=0.10.0'} + hasBin: true dependencies: jake: 10.8.7 + dev: false - electron-to-chromium@1.4.755: {} + /electron-to-chromium@1.4.711: + resolution: {integrity: sha512-hRg81qzvUEibX2lDxnFlVCHACa+LtrCPIsWAxo161LDYIB3jauf57RGsMZV9mvGwE98yGH06icj3zBEoOkxd/w==} - emittery@0.13.1: {} + /emittery@0.13.1: + resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} + engines: {node: '>=12'} + dev: true - emoji-regex@10.3.0: {} + /emoji-regex@10.3.0: + resolution: {integrity: sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==} + dev: true - emoji-regex@8.0.0: {} + /emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + dev: true - emoji-regex@9.2.2: {} + /emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + dev: true - enabled@2.0.0: {} + /enabled@2.0.0: + resolution: {integrity: sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==} + dev: true - enhanced-resolve@5.16.0: + /enhanced-resolve@5.16.0: + resolution: {integrity: sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA==} + engines: {node: '>=10.13.0'} dependencies: graceful-fs: 4.2.11 tapable: 2.2.1 + dev: true - entities@4.5.0: {} + /entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + dev: true - env-paths@2.2.1: {} + /env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + dev: true - error-ex@1.3.2: + /error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} dependencies: is-arrayish: 0.2.1 - es-abstract@1.23.3: + /es-abstract@1.22.5: + resolution: {integrity: sha512-oW69R+4q2wG+Hc3KZePPZxOiisRIqfKBVo/HLx94QcJeWGU/8sZhCvc829rd1kS366vlJbzBfXf9yWwf0+Ko7w==} + engines: {node: '>= 0.4'} + dependencies: + array-buffer-byte-length: 1.0.1 + arraybuffer.prototype.slice: 1.0.3 + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 + es-define-property: 1.0.0 + es-errors: 1.3.0 + es-set-tostringtag: 2.0.3 + es-to-primitive: 1.2.1 + function.prototype.name: 1.1.6 + get-intrinsic: 1.2.4 + get-symbol-description: 1.0.2 + globalthis: 1.0.3 + gopd: 1.0.1 + has-property-descriptors: 1.0.2 + has-proto: 1.0.3 + has-symbols: 1.0.3 + hasown: 2.0.2 + internal-slot: 1.0.7 + is-array-buffer: 3.0.4 + is-callable: 1.2.7 + is-negative-zero: 2.0.3 + is-regex: 1.1.4 + is-shared-array-buffer: 1.0.3 + is-string: 1.0.7 + is-typed-array: 1.1.13 + is-weakref: 1.0.2 + object-inspect: 1.13.1 + object-keys: 1.1.1 + object.assign: 4.1.5 + regexp.prototype.flags: 1.5.2 + safe-array-concat: 1.1.2 + safe-regex-test: 1.0.3 + string.prototype.trim: 1.2.9 + string.prototype.trimend: 1.0.8 + string.prototype.trimstart: 1.0.7 + typed-array-buffer: 1.0.2 + typed-array-byte-length: 1.0.1 + typed-array-byte-offset: 1.0.2 + typed-array-length: 1.0.5 + unbox-primitive: 1.0.2 + which-typed-array: 1.1.15 + + /es-abstract@1.23.2: + resolution: {integrity: sha512-60s3Xv2T2p1ICykc7c+DNDPLDMm9t4QxCOUU0K9JxiLjM3C1zB9YVdN7tjxrFd4+AkZ8CdX1ovUga4P2+1e+/w==} + engines: {node: '>= 0.4'} dependencies: array-buffer-byte-length: 1.0.1 arraybuffer.prototype.slice: 1.0.3 @@ -7474,7 +4813,7 @@ snapshots: function.prototype.name: 1.1.6 get-intrinsic: 1.2.4 get-symbol-description: 1.0.2 - globalthis: 1.0.4 + globalthis: 1.0.3 gopd: 1.0.1 has-property-descriptors: 1.0.2 has-proto: 1.0.3 @@ -7498,58 +4837,91 @@ snapshots: safe-regex-test: 1.0.3 string.prototype.trim: 1.2.9 string.prototype.trimend: 1.0.8 - string.prototype.trimstart: 1.0.8 + string.prototype.trimstart: 1.0.7 typed-array-buffer: 1.0.2 typed-array-byte-length: 1.0.1 typed-array-byte-offset: 1.0.2 - typed-array-length: 1.0.6 + typed-array-length: 1.0.5 unbox-primitive: 1.0.2 which-typed-array: 1.1.15 - es-define-property@1.0.0: + /es-define-property@1.0.0: + resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} + engines: {node: '>= 0.4'} dependencies: get-intrinsic: 1.2.4 - es-errors@1.3.0: {} + /es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + /es-get-iterator@1.1.3: + resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==} + dependencies: + call-bind: 1.0.7 + get-intrinsic: 1.2.4 + has-symbols: 1.0.3 + is-arguments: 1.1.1 + is-map: 2.0.3 + is-set: 2.0.3 + is-string: 1.0.7 + isarray: 2.0.5 + stop-iteration-iterator: 1.0.0 + dev: true - es-iterator-helpers@1.0.19: + /es-iterator-helpers@1.0.18: + resolution: {integrity: sha512-scxAJaewsahbqTYrGKJihhViaM6DDZDDoucfvzNbK0pOren1g/daDQ3IAhzn+1G14rBG7w+i5N+qul60++zlKA==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.23.2 es-errors: 1.3.0 es-set-tostringtag: 2.0.3 function-bind: 1.1.2 get-intrinsic: 1.2.4 - globalthis: 1.0.4 + globalthis: 1.0.3 has-property-descriptors: 1.0.2 has-proto: 1.0.3 has-symbols: 1.0.3 internal-slot: 1.0.7 iterator.prototype: 1.1.2 safe-array-concat: 1.1.2 + dev: true - es-object-atoms@1.0.0: + /es-object-atoms@1.0.0: + resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} + engines: {node: '>= 0.4'} dependencies: es-errors: 1.3.0 - es-set-tostringtag@2.0.3: + /es-set-tostringtag@2.0.3: + resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} + engines: {node: '>= 0.4'} dependencies: get-intrinsic: 1.2.4 has-tostringtag: 1.0.2 hasown: 2.0.2 - es-shim-unscopables@1.0.2: + /es-shim-unscopables@1.0.2: + resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} dependencies: hasown: 2.0.2 + dev: true - es-to-primitive@1.2.1: + /es-to-primitive@1.2.1: + resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} + engines: {node: '>= 0.4'} dependencies: is-callable: 1.2.7 is-date-object: 1.0.5 is-symbol: 1.0.4 - esbuild@0.20.2: + /esbuild@0.20.2: + resolution: {integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true optionalDependencies: '@esbuild/aix-ppc64': 0.20.2 '@esbuild/android-arm': 0.20.2 @@ -7575,59 +4947,116 @@ snapshots: '@esbuild/win32-ia32': 0.20.2 '@esbuild/win32-x64': 0.20.2 - escalade@3.1.2: {} + /escalade@3.1.2: + resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} + engines: {node: '>=6'} - escape-string-regexp@1.0.5: {} + /escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} - escape-string-regexp@2.0.0: {} + /escape-string-regexp@2.0.0: + resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} + engines: {node: '>=8'} + dev: true - escape-string-regexp@4.0.0: {} + /escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} - escodegen@2.1.0: + /escodegen@2.1.0: + resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} + engines: {node: '>=6.0'} + hasBin: true dependencies: esprima: 4.0.1 estraverse: 5.3.0 esutils: 2.0.3 optionalDependencies: source-map: 0.6.1 + dev: true - eslint-compat-utils@0.5.0(eslint@8.57.0): + /eslint-compat-utils@0.1.2(eslint@8.57.0): + resolution: {integrity: sha512-Jia4JDldWnFNIru1Ehx1H5s9/yxiRHY/TimCuUc0jNexew3cF1gI6CYZil1ociakfWO3rRqFjl1mskBblB3RYg==} + engines: {node: '>=12'} + peerDependencies: + eslint: '>=6.0.0' dependencies: eslint: 8.57.0 - semver: 7.6.0 + dev: true - eslint-config-prettier@9.1.0(eslint@8.57.0): + /eslint-config-prettier@9.1.0(eslint@8.57.0): + resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' dependencies: eslint: 8.57.0 + dev: true - eslint-import-resolver-node@0.3.9: + /eslint-import-resolver-node@0.3.9: + resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} dependencies: debug: 3.2.7 is-core-module: 2.13.1 resolve: 1.22.8 transitivePeerDependencies: - supports-color + dev: true - eslint-module-utils@2.8.1(@typescript-eslint/parser@7.8.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint@8.57.0): + /eslint-module-utils@2.8.1(@typescript-eslint/parser@7.8.0)(eslint-import-resolver-node@0.3.9)(eslint@8.57.0): + resolution: {integrity: sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint: + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true dependencies: - debug: 3.2.7 - optionalDependencies: '@typescript-eslint/parser': 7.8.0(eslint@8.57.0)(typescript@5.4.5) + debug: 3.2.7 eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: - supports-color + dev: true - eslint-plugin-es-x@7.6.0(eslint@8.57.0): + /eslint-plugin-es-x@7.5.0(eslint@8.57.0): + resolution: {integrity: sha512-ODswlDSO0HJDzXU0XvgZ3lF3lS3XAZEossh15Q2UHjwrJggWeBoKqqEsLTZLXl+dh5eOAozG0zRcYtuE35oTuQ==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + eslint: '>=8' dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) '@eslint-community/regexpp': 4.10.0 eslint: 8.57.0 - eslint-compat-utils: 0.5.0(eslint@8.57.0) + eslint-compat-utils: 0.1.2(eslint@8.57.0) + dev: true - eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.8.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0): + /eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.8.0)(eslint@8.57.0): + resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true dependencies: - array-includes: 3.1.8 + '@typescript-eslint/parser': 7.8.0(eslint@8.57.0)(typescript@5.4.5) + array-includes: 3.1.7 array.prototype.findlastindex: 1.2.5 array.prototype.flat: 1.3.2 array.prototype.flatmap: 1.3.2 @@ -7635,7 +5064,7 @@ snapshots: doctrine: 2.1.0 eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.8.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint@8.57.0) + eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.8.0)(eslint-import-resolver-node@0.3.9)(eslint@8.57.0) hasown: 2.0.2 is-core-module: 2.13.1 is-glob: 4.0.3 @@ -7645,72 +5074,112 @@ snapshots: object.values: 1.2.0 semver: 6.3.1 tsconfig-paths: 3.15.0 - optionalDependencies: - '@typescript-eslint/parser': 7.8.0(eslint@8.57.0)(typescript@5.4.5) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color + dev: true - eslint-plugin-n@17.4.0(eslint@8.57.0): + /eslint-plugin-n@17.4.0(eslint@8.57.0): + resolution: {integrity: sha512-RtgGgNpYxECwE9dFr+D66RtbN0B8r/fY6ZF8EVsmK2YnZxE8/n9LNQhgnkL9z37UFZjYVmvMuC32qu7fQBsLVQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: '>=8.23.0' dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) enhanced-resolve: 5.16.0 eslint: 8.57.0 - eslint-plugin-es-x: 7.6.0(eslint@8.57.0) + eslint-plugin-es-x: 7.5.0(eslint@8.57.0) get-tsconfig: 4.7.3 globals: 15.1.0 ignore: 5.3.1 - minimatch: 9.0.4 + minimatch: 9.0.3 semver: 7.6.0 + dev: true - eslint-plugin-prettier@5.1.3(eslint-config-prettier@9.1.0(eslint@8.57.0))(eslint@8.57.0)(prettier@3.2.5): + /eslint-plugin-prettier@5.1.3(eslint-config-prettier@9.1.0)(eslint@8.57.0)(prettier@3.2.5): + resolution: {integrity: sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + '@types/eslint': '>=8.0.0' + eslint: '>=8.0.0' + eslint-config-prettier: '*' + prettier: '>=3.0.0' + peerDependenciesMeta: + '@types/eslint': + optional: true + eslint-config-prettier: + optional: true dependencies: eslint: 8.57.0 + eslint-config-prettier: 9.1.0(eslint@8.57.0) prettier: 3.2.5 prettier-linter-helpers: 1.0.0 synckit: 0.8.8 - optionalDependencies: - eslint-config-prettier: 9.1.0(eslint@8.57.0) + dev: true - eslint-plugin-promise@6.1.1(eslint@8.57.0): + /eslint-plugin-promise@6.1.1(eslint@8.57.0): + resolution: {integrity: sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 dependencies: eslint: 8.57.0 + dev: true - eslint-plugin-react-hooks@4.6.2(eslint@8.57.0): + /eslint-plugin-react-hooks@4.6.2(eslint@8.57.0): + resolution: {integrity: sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==} + engines: {node: '>=10'} + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 dependencies: eslint: 8.57.0 + dev: true - eslint-plugin-react@7.34.1(eslint@8.57.0): + /eslint-plugin-react@7.34.1(eslint@8.57.0): + resolution: {integrity: sha512-N97CxlouPT1AHt8Jn0mhhN2RrADlUAsk1/atcT2KyA/l9Q/E6ll7OIGwNumFmWfZ9skV3XXccYS19h80rHtgkw==} + engines: {node: '>=4'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 dependencies: - array-includes: 3.1.8 + array-includes: 3.1.7 array.prototype.findlast: 1.2.5 array.prototype.flatmap: 1.3.2 array.prototype.toreversed: 1.1.2 array.prototype.tosorted: 1.1.3 doctrine: 2.1.0 - es-iterator-helpers: 1.0.19 + es-iterator-helpers: 1.0.18 eslint: 8.57.0 estraverse: 5.3.0 jsx-ast-utils: 3.3.5 minimatch: 3.1.2 object.entries: 1.1.8 object.fromentries: 2.0.8 - object.hasown: 1.1.4 + object.hasown: 1.1.3 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 + dev: true - eslint-scope@7.2.2: + /eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 + dev: true - eslint-visitor-keys@3.4.3: {} + /eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true - eslint@8.57.0: + /eslint@8.57.0: + resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) '@eslint-community/regexpp': 4.10.0 @@ -7747,37 +5216,61 @@ snapshots: lodash.merge: 4.6.2 minimatch: 3.1.2 natural-compare: 1.4.0 - optionator: 0.9.4 + optionator: 0.9.3 strip-ansi: 6.0.1 text-table: 0.2.0 transitivePeerDependencies: - supports-color + dev: true - espree@9.6.1: + /espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: acorn: 8.11.3 acorn-jsx: 5.3.2(acorn@8.11.3) eslint-visitor-keys: 3.4.3 + dev: true - esprima@4.0.1: {} + /esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + dev: true - esquery@1.5.0: + /esquery@1.5.0: + resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + engines: {node: '>=0.10'} dependencies: estraverse: 5.3.0 + dev: true - esrecurse@4.3.0: + /esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} dependencies: estraverse: 5.3.0 + dev: true - estraverse@5.3.0: {} + /estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + dev: true - estree-walker@1.0.1: {} + /estree-walker@1.0.1: + resolution: {integrity: sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==} + dev: false - estree-walker@2.0.2: {} + /estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + dev: false - esutils@2.0.3: {} + /esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} - event-stream@4.0.1: + /event-stream@4.0.1: + resolution: {integrity: sha512-qACXdu/9VHPBzcyhdOWR5/IahhGMf0roTeZJfzz077GwylcDd90yOHLouhmv7GJ5XzPi6ekaQWd8AvPP2nOvpA==} dependencies: duplexer: 0.1.2 from: 0.1.7 @@ -7786,10 +5279,15 @@ snapshots: split: 1.0.1 stream-combiner: 0.2.2 through: 2.3.8 + dev: true - eventemitter3@5.0.1: {} + /eventemitter3@5.0.1: + resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + dev: true - execa@5.1.1: + /execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} dependencies: cross-spawn: 7.0.3 get-stream: 6.0.1 @@ -7800,8 +5298,11 @@ snapshots: onetime: 5.1.2 signal-exit: 3.0.7 strip-final-newline: 2.0.0 + dev: true - execa@8.0.1: + /execa@8.0.1: + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} + engines: {node: '>=16.17'} dependencies: cross-spawn: 7.0.3 get-stream: 8.0.1 @@ -7812,22 +5313,34 @@ snapshots: onetime: 6.0.0 signal-exit: 4.1.0 strip-final-newline: 3.0.0 + dev: true - exit@0.1.2: {} + /exit@0.1.2: + resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} + engines: {node: '>= 0.8.0'} + dev: true - expect@29.7.0: + /expect@29.7.0: + resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/expect-utils': 29.7.0 jest-get-type: 29.6.3 jest-matcher-utils: 29.7.0 jest-message-util: 29.7.0 jest-util: 29.7.0 + dev: true - fast-deep-equal@3.1.3: {} + /fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - fast-diff@1.3.0: {} + /fast-diff@1.3.0: + resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} + dev: true - fast-glob@3.3.2: + /fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} dependencies: '@nodelib/fs.stat': 2.0.5 '@nodelib/fs.walk': 1.2.8 @@ -7835,125 +5348,212 @@ snapshots: merge2: 1.4.1 micromatch: 4.0.5 - fast-json-stable-stringify@2.1.0: {} + /fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - fast-levenshtein@2.0.6: {} + /fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + dev: true - fastq@1.17.1: + /fastq@1.17.1: + resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} dependencies: reusify: 1.0.4 - fb-watchman@2.0.2: + /fb-watchman@2.0.2: + resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} dependencies: bser: 2.1.1 + dev: true - fecha@4.2.3: {} + /fecha@4.2.3: + resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==} + dev: true - fetch-blob@3.2.0: + /fetch-blob@3.2.0: + resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} + engines: {node: ^12.20 || >= 14.13} dependencies: node-domexception: 1.0.0 web-streams-polyfill: 3.3.3 + dev: true - figures@3.2.0: + /figures@3.2.0: + resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} + engines: {node: '>=8'} dependencies: escape-string-regexp: 1.0.5 + dev: true - file-entry-cache@6.0.1: + /file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} dependencies: flat-cache: 3.2.0 + dev: true - filelist@1.0.4: + /filelist@1.0.4: + resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} dependencies: minimatch: 5.1.6 + dev: false - fill-range@7.0.1: + /fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} dependencies: to-regex-range: 5.0.1 - find-root@1.1.0: {} + /find-root@1.1.0: + resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} + dev: false - find-up@3.0.0: + /find-up@3.0.0: + resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} + engines: {node: '>=6'} dependencies: locate-path: 3.0.0 + dev: true - find-up@4.1.0: + /find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} dependencies: locate-path: 5.0.0 path-exists: 4.0.0 + dev: true - find-up@5.0.0: + /find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} dependencies: locate-path: 6.0.0 path-exists: 4.0.0 + dev: true - flat-cache@3.2.0: + /flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} dependencies: flatted: 3.3.1 keyv: 4.5.4 rimraf: 3.0.2 + dev: true - flatted@3.3.1: {} + /flatted@3.3.1: + resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} + dev: true - fn.name@1.1.0: {} + /fn.name@1.1.0: + resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==} + dev: true - follow-redirects@1.15.6: {} + /follow-redirects@1.15.6: + resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + dev: false - for-each@0.3.3: + /for-each@0.3.3: + resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} dependencies: is-callable: 1.2.7 - foreground-child@3.1.1: + /foreground-child@3.1.1: + resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} + engines: {node: '>=14'} dependencies: cross-spawn: 7.0.3 signal-exit: 4.1.0 + dev: true - form-data@4.0.0: + /form-data@4.0.0: + resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + engines: {node: '>= 6'} dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 mime-types: 2.1.35 - formdata-polyfill@4.0.10: + /formdata-polyfill@4.0.10: + resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} + engines: {node: '>=12.20.0'} dependencies: fetch-blob: 3.2.0 + dev: true - fraction.js@4.3.7: {} + /fraction.js@4.3.7: + resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} + dev: true - from@0.1.7: {} + /from@0.1.7: + resolution: {integrity: sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==} + dev: true - fs-extra@9.1.0: + /fs-extra@9.1.0: + resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} + engines: {node: '>=10'} dependencies: at-least-node: 1.0.0 graceful-fs: 4.2.11 jsonfile: 6.1.0 universalify: 2.0.1 + dev: false - fs.realpath@1.0.0: {} + /fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - fsevents@2.3.2: + /fsevents@2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: true optional: true - fsevents@2.3.3: + /fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true optional: true - function-bind@1.1.2: {} + /function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - function.prototype.name@1.1.6: + /function.prototype.name@1.1.6: + resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.22.5 functions-have-names: 1.2.3 - functions-have-names@1.2.3: {} + /functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - gensync@1.0.0-beta.2: {} + /gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} - get-caller-file@2.0.5: {} + /get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + dev: true - get-east-asian-width@1.2.0: {} + /get-east-asian-width@1.2.0: + resolution: {integrity: sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==} + engines: {node: '>=18'} + dev: true - get-intrinsic@1.2.4: + /get-intrinsic@1.2.4: + resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} + engines: {node: '>= 0.4'} dependencies: es-errors: 1.3.0 function-bind: 1.1.2 @@ -7961,41 +5561,66 @@ snapshots: has-symbols: 1.0.3 hasown: 2.0.2 - get-own-enumerable-property-symbols@3.0.2: {} + /get-own-enumerable-property-symbols@3.0.2: + resolution: {integrity: sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==} + dev: false - get-package-type@0.1.0: {} + /get-package-type@0.1.0: + resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} + engines: {node: '>=8.0.0'} + dev: true - get-stream@6.0.1: {} + /get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + dev: true - get-stream@8.0.1: {} + /get-stream@8.0.1: + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + engines: {node: '>=16'} + dev: true - get-symbol-description@1.0.2: + /get-symbol-description@1.0.2: + resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 es-errors: 1.3.0 get-intrinsic: 1.2.4 - get-tsconfig@4.7.3: + /get-tsconfig@4.7.3: + resolution: {integrity: sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg==} dependencies: resolve-pkg-maps: 1.0.0 + dev: true - glob-parent@5.1.2: + /glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} dependencies: is-glob: 4.0.3 - glob-parent@6.0.2: + /glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} dependencies: is-glob: 4.0.3 + dev: true - glob@10.3.12: + /glob@10.3.10: + resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true dependencies: foreground-child: 3.1.1 jackspeak: 2.3.6 - minimatch: 9.0.4 + minimatch: 9.0.3 minipass: 7.0.4 - path-scurry: 1.10.2 + path-scurry: 1.10.1 + dev: true - glob@7.2.3: + /glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 @@ -8004,20 +5629,31 @@ snapshots: once: 1.4.0 path-is-absolute: 1.0.1 - globals@11.12.0: {} + /globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} - globals@13.24.0: + /globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} dependencies: type-fest: 0.20.2 + dev: true - globals@15.1.0: {} + /globals@15.1.0: + resolution: {integrity: sha512-926gJqg+4mkxwYKiFvoomM4J0kWESfk3qfTvRL2/oc/tK/eTDBbrfcKnSa2KtfdxB5onoL7D3A3qIHQFpd4+UA==} + engines: {node: '>=18'} + dev: true - globalthis@1.0.4: + /globalthis@1.0.3: + resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} + engines: {node: '>= 0.4'} dependencies: define-properties: 1.2.1 - gopd: 1.0.1 - globby@11.1.0: + /globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} dependencies: array-union: 2.1.0 dir-glob: 3.0.1 @@ -8025,328 +5661,560 @@ snapshots: ignore: 5.3.1 merge2: 1.4.1 slash: 3.0.0 + dev: true - gopd@1.0.1: + /gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} dependencies: get-intrinsic: 1.2.4 - graceful-fs@4.2.11: {} + /graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - graphemer@1.4.0: {} + /graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + dev: true - graphql@16.8.1: {} + /graphql@16.8.1: + resolution: {integrity: sha512-59LZHPdGZVh695Ud9lRzPBVTtlX9ZCV150Er2W43ro37wVof0ctenSaskPPjN7lVTIN8mSZt8PHUNKZuNQUuxw==} + engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} + dev: true - harmony-reflect@1.6.2: {} + /harmony-reflect@1.6.2: + resolution: {integrity: sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==} + dev: true - has-bigints@1.0.2: {} + /has-bigints@1.0.2: + resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} - has-flag@3.0.0: {} + /has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} - has-flag@4.0.0: {} + /has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} - has-property-descriptors@1.0.2: + /has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} dependencies: es-define-property: 1.0.0 - has-proto@1.0.3: {} + /has-proto@1.0.3: + resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} + engines: {node: '>= 0.4'} - has-symbols@1.0.3: {} + /has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} - has-tostringtag@1.0.2: + /has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} dependencies: has-symbols: 1.0.3 - hasown@2.0.2: + /hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} dependencies: function-bind: 1.1.2 - headers-polyfill@4.0.3: {} + /headers-polyfill@4.0.3: + resolution: {integrity: sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ==} + dev: true - hoist-non-react-statics@3.3.2: + /hoist-non-react-statics@3.3.2: + resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} dependencies: react-is: 16.13.1 - html-encoding-sniffer@3.0.0: + /html-encoding-sniffer@3.0.0: + resolution: {integrity: sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==} + engines: {node: '>=12'} dependencies: whatwg-encoding: 2.0.0 + dev: true - html-escaper@2.0.2: {} + /html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + dev: true - http-proxy-agent@5.0.0: + /http-proxy-agent@5.0.0: + resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} + engines: {node: '>= 6'} dependencies: '@tootallnate/once': 2.0.0 agent-base: 6.0.2 debug: 4.3.4 transitivePeerDependencies: - supports-color + dev: true - https-proxy-agent@5.0.1: + /https-proxy-agent@5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} dependencies: agent-base: 6.0.2 debug: 4.3.4 transitivePeerDependencies: - supports-color + dev: true - human-signals@2.1.0: {} + /human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + dev: true - human-signals@5.0.0: {} + /human-signals@5.0.0: + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} + engines: {node: '>=16.17.0'} + dev: true - husky@9.0.11: {} + /husky@9.0.11: + resolution: {integrity: sha512-AB6lFlbwwyIqMdHYhwPe+kjOC3Oc5P3nThEoW/AaO2BX3vJDjWPFxYLxokUZOo6RNX20He3AaT8sESs9NJcmEw==} + engines: {node: '>=18'} + hasBin: true + dev: true - iconv-lite@0.6.3: + /iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} dependencies: safer-buffer: 2.1.2 + dev: true - idb@7.1.1: {} + /idb@7.1.1: + resolution: {integrity: sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==} + dev: false - identity-obj-proxy@3.0.0: + /identity-obj-proxy@3.0.0: + resolution: {integrity: sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA==} + engines: {node: '>=4'} dependencies: harmony-reflect: 1.6.2 + dev: true - ieee754@1.2.1: {} + /ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + dev: true - ignore@5.3.1: {} + /ignore@5.3.1: + resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} + engines: {node: '>= 4'} + dev: true - immer@10.1.1: {} + /immer@10.0.4: + resolution: {integrity: sha512-cuBuGK40P/sk5IzWa9QPUaAdvPHjkk1c+xYsd9oZw+YQQEV+10G0P5uMpGctZZKnyQ+ibRO08bD25nWLmYi2pw==} + dev: false - import-fresh@3.3.0: + /import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} dependencies: parent-module: 1.0.1 resolve-from: 4.0.0 - import-local@3.1.0: + /import-local@3.1.0: + resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==} + engines: {node: '>=8'} + hasBin: true dependencies: pkg-dir: 4.2.0 resolve-cwd: 3.0.0 + dev: true - imurmurhash@0.1.4: {} + /imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + dev: true - indent-string@4.0.0: {} + /indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + dev: true - inflight@1.0.6: + /inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} dependencies: once: 1.4.0 wrappy: 1.0.2 - inherits@2.0.4: {} + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - internal-slot@1.0.7: + /internal-slot@1.0.7: + resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} + engines: {node: '>= 0.4'} dependencies: es-errors: 1.3.0 hasown: 2.0.2 side-channel: 1.0.6 - is-array-buffer@3.0.4: + /is-arguments@1.1.1: + resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + has-tostringtag: 1.0.2 + dev: true + + /is-array-buffer@3.0.4: + resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 get-intrinsic: 1.2.4 - is-arrayish@0.2.1: {} + /is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - is-arrayish@0.3.2: {} + /is-arrayish@0.3.2: + resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} + dev: true - is-async-function@2.0.0: + /is-async-function@2.0.0: + resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==} + engines: {node: '>= 0.4'} dependencies: has-tostringtag: 1.0.2 + dev: true - is-bigint@1.0.4: + /is-bigint@1.0.4: + resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} dependencies: has-bigints: 1.0.2 - is-boolean-object@1.1.2: + /is-boolean-object@1.1.2: + resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 has-tostringtag: 1.0.2 - is-builtin-module@3.2.1: + /is-builtin-module@3.2.1: + resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} + engines: {node: '>=6'} dependencies: builtin-modules: 3.3.0 + dev: false - is-callable@1.2.7: {} + /is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} - is-core-module@2.13.1: + /is-core-module@2.13.1: + resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} dependencies: hasown: 2.0.2 - is-data-view@1.0.1: + /is-data-view@1.0.1: + resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} + engines: {node: '>= 0.4'} dependencies: is-typed-array: 1.1.13 - is-date-object@1.0.5: + /is-date-object@1.0.5: + resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} + engines: {node: '>= 0.4'} dependencies: has-tostringtag: 1.0.2 - is-docker@2.2.1: {} + /is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + dev: true - is-extglob@2.1.1: {} + /is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} - is-finalizationregistry@1.0.2: + /is-finalizationregistry@1.0.2: + resolution: {integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==} dependencies: call-bind: 1.0.7 + dev: true - is-fullwidth-code-point@3.0.0: {} + /is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + dev: true - is-fullwidth-code-point@4.0.0: {} + /is-fullwidth-code-point@4.0.0: + resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} + engines: {node: '>=12'} + dev: true - is-fullwidth-code-point@5.0.0: + /is-fullwidth-code-point@5.0.0: + resolution: {integrity: sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==} + engines: {node: '>=18'} dependencies: get-east-asian-width: 1.2.0 + dev: true - is-generator-fn@2.1.0: {} + /is-generator-fn@2.1.0: + resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} + engines: {node: '>=6'} + dev: true - is-generator-function@1.0.10: + /is-generator-function@1.0.10: + resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} + engines: {node: '>= 0.4'} dependencies: has-tostringtag: 1.0.2 + dev: true - is-glob@4.0.3: + /is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} dependencies: is-extglob: 2.1.1 - is-interactive@1.0.0: {} + /is-interactive@1.0.0: + resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} + engines: {node: '>=8'} + dev: true - is-map@2.0.3: {} + /is-map@2.0.3: + resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} + engines: {node: '>= 0.4'} + dev: true - is-module@1.0.0: {} + /is-module@1.0.0: + resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} + dev: false - is-negative-zero@2.0.3: {} + /is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + engines: {node: '>= 0.4'} - is-node-process@1.2.0: {} + /is-node-process@1.2.0: + resolution: {integrity: sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==} + dev: true - is-number-object@1.0.7: + /is-number-object@1.0.7: + resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} + engines: {node: '>= 0.4'} dependencies: has-tostringtag: 1.0.2 - is-number@7.0.0: {} + /is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} - is-obj@1.0.1: {} + /is-obj@1.0.1: + resolution: {integrity: sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==} + engines: {node: '>=0.10.0'} + dev: false - is-obj@2.0.0: {} + /is-obj@2.0.0: + resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} + engines: {node: '>=8'} + dev: true - is-path-inside@3.0.3: {} + /is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + dev: true - is-potential-custom-element-name@1.0.1: {} + /is-potential-custom-element-name@1.0.1: + resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} + dev: true - is-regex@1.1.4: + /is-regex@1.1.4: + resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 has-tostringtag: 1.0.2 - is-regexp@1.0.0: {} + /is-regexp@1.0.0: + resolution: {integrity: sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==} + engines: {node: '>=0.10.0'} + dev: false - is-set@2.0.3: {} + /is-set@2.0.3: + resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} + engines: {node: '>= 0.4'} + dev: true - is-shared-array-buffer@1.0.3: + /is-shared-array-buffer@1.0.3: + resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 - is-stream@2.0.1: {} + /is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} - is-stream@3.0.0: {} + /is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true - is-string@1.0.7: + /is-string@1.0.7: + resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} + engines: {node: '>= 0.4'} dependencies: has-tostringtag: 1.0.2 - is-symbol@1.0.4: + /is-symbol@1.0.4: + resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} + engines: {node: '>= 0.4'} dependencies: has-symbols: 1.0.3 - is-typed-array@1.1.13: + /is-typed-array@1.1.13: + resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} + engines: {node: '>= 0.4'} dependencies: which-typed-array: 1.1.15 - is-unicode-supported@0.1.0: {} + /is-unicode-supported@0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + engines: {node: '>=10'} + dev: true - is-weakmap@2.0.2: {} + /is-weakmap@2.0.2: + resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} + engines: {node: '>= 0.4'} + dev: true - is-weakref@1.0.2: + /is-weakref@1.0.2: + resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} dependencies: call-bind: 1.0.7 - is-weakset@2.0.3: + /is-weakset@2.0.3: + resolution: {integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 get-intrinsic: 1.2.4 + dev: true - is-wsl@2.2.0: + /is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} dependencies: is-docker: 2.2.1 + dev: true - isarray@2.0.5: {} + /isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} - isexe@2.0.0: {} + /isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + dev: true - isexe@3.1.1: {} + /isexe@3.1.1: + resolution: {integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==} + engines: {node: '>=16'} + dev: true - istanbul-lib-coverage@3.2.2: {} + /istanbul-lib-coverage@3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} + engines: {node: '>=8'} + dev: true - istanbul-lib-instrument@5.2.1: + /istanbul-lib-instrument@5.2.1: + resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} + engines: {node: '>=8'} dependencies: - '@babel/core': 7.24.5 - '@babel/parser': 7.24.5 + '@babel/core': 7.24.3 + '@babel/parser': 7.24.1 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 semver: 6.3.1 transitivePeerDependencies: - supports-color + dev: true - istanbul-lib-instrument@6.0.2: + /istanbul-lib-instrument@6.0.2: + resolution: {integrity: sha512-1WUsZ9R1lA0HtBSohTkm39WTPlNKSJ5iFk7UwqXkBLoHQT+hfqPsfsTDVuZdKGaBwn7din9bS7SsnoAr943hvw==} + engines: {node: '>=10'} dependencies: - '@babel/core': 7.24.5 - '@babel/parser': 7.24.5 + '@babel/core': 7.24.3 + '@babel/parser': 7.24.1 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 semver: 7.6.0 transitivePeerDependencies: - supports-color + dev: true - istanbul-lib-report@3.0.1: + /istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} dependencies: istanbul-lib-coverage: 3.2.2 make-dir: 4.0.0 supports-color: 7.2.0 + dev: true - istanbul-lib-source-maps@4.0.1: + /istanbul-lib-source-maps@4.0.1: + resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} + engines: {node: '>=10'} dependencies: debug: 4.3.4 istanbul-lib-coverage: 3.2.2 source-map: 0.6.1 transitivePeerDependencies: - supports-color + dev: true - istanbul-reports@3.1.7: + /istanbul-reports@3.1.7: + resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} + engines: {node: '>=8'} dependencies: html-escaper: 2.0.2 istanbul-lib-report: 3.0.1 + dev: true - iterator.prototype@1.1.2: + /iterator.prototype@1.1.2: + resolution: {integrity: sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==} dependencies: define-properties: 1.2.1 get-intrinsic: 1.2.4 has-symbols: 1.0.3 reflect.getprototypeof: 1.0.6 set-function-name: 2.0.2 + dev: true - jackspeak@2.3.6: + /jackspeak@2.3.6: + resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} + engines: {node: '>=14'} dependencies: '@isaacs/cliui': 8.0.2 optionalDependencies: '@pkgjs/parseargs': 0.11.0 + dev: true - jake@10.8.7: + /jake@10.8.7: + resolution: {integrity: sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==} + engines: {node: '>=10'} + hasBin: true dependencies: async: 3.2.5 chalk: 4.1.2 filelist: 1.0.4 minimatch: 3.1.2 + dev: false - jest-changed-files@29.7.0: + /jest-changed-files@29.7.0: + resolution: {integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: execa: 5.1.1 jest-util: 29.7.0 p-limit: 3.1.0 + dev: true - jest-circus@29.7.0(babel-plugin-macros@3.1.0): + /jest-circus@29.7.0: + resolution: {integrity: sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/environment': 29.7.0 '@jest/expect': 29.7.0 @@ -8355,7 +6223,7 @@ snapshots: '@types/node': 20.12.8 chalk: 4.1.2 co: 4.6.0 - dedent: 1.5.3(babel-plugin-macros@3.1.0) + dedent: 1.5.1 is-generator-fn: 2.1.0 jest-each: 29.7.0 jest-matcher-utils: 29.7.0 @@ -8365,23 +6233,32 @@ snapshots: jest-util: 29.7.0 p-limit: 3.1.0 pretty-format: 29.7.0 - pure-rand: 6.1.0 + pure-rand: 6.0.4 slash: 3.0.0 stack-utils: 2.0.6 transitivePeerDependencies: - babel-plugin-macros - supports-color + dev: true - jest-cli@29.7.0(@types/node@20.12.8)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.4.17)(@types/node@20.12.8)(typescript@5.4.5)): + /jest-cli@29.7.0(@types/node@20.12.8)(ts-node@10.9.2): + resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true dependencies: - '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.4.17)(@types/node@20.12.8)(typescript@5.4.5)) + '@jest/core': 29.7.0(ts-node@10.9.2) '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@20.12.8)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.4.17)(@types/node@20.12.8)(typescript@5.4.5)) + create-jest: 29.7.0(@types/node@20.12.8)(ts-node@10.9.2) exit: 0.1.2 import-local: 3.1.0 - jest-config: 29.7.0(@types/node@20.12.8)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.4.17)(@types/node@20.12.8)(typescript@5.4.5)) + jest-config: 29.7.0(@types/node@20.12.8)(ts-node@10.9.2) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -8390,19 +6267,31 @@ snapshots: - babel-plugin-macros - supports-color - ts-node + dev: true - jest-config@29.7.0(@types/node@20.12.8)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.4.17)(@types/node@20.12.8)(typescript@5.4.5)): + /jest-config@29.7.0(@types/node@20.12.8)(ts-node@10.9.2): + resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@types/node': '*' + ts-node: '>=9.0.0' + peerDependenciesMeta: + '@types/node': + optional: true + ts-node: + optional: true dependencies: - '@babel/core': 7.24.5 + '@babel/core': 7.24.3 '@jest/test-sequencer': 29.7.0 '@jest/types': 29.6.3 - babel-jest: 29.7.0(@babel/core@7.24.5) + '@types/node': 20.12.8 + babel-jest: 29.7.0(@babel/core@7.24.3) chalk: 4.1.2 ci-info: 3.9.0 deepmerge: 4.3.1 glob: 7.2.3 graceful-fs: 4.2.11 - jest-circus: 29.7.0(babel-plugin-macros@3.1.0) + jest-circus: 29.7.0 jest-environment-node: 29.7.0 jest-get-type: 29.6.3 jest-regex-util: 29.6.3 @@ -8415,33 +6304,48 @@ snapshots: pretty-format: 29.7.0 slash: 3.0.0 strip-json-comments: 3.1.1 - optionalDependencies: - '@types/node': 20.12.8 - ts-node: 10.9.2(@swc/core@1.4.17)(@types/node@20.12.8)(typescript@5.4.5) + ts-node: 10.9.2(@types/node@20.12.8)(typescript@5.4.5) transitivePeerDependencies: - babel-plugin-macros - supports-color + dev: true - jest-diff@29.7.0: + /jest-diff@29.7.0: + resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: chalk: 4.1.2 diff-sequences: 29.6.3 jest-get-type: 29.6.3 pretty-format: 29.7.0 + dev: true - jest-docblock@29.7.0: + /jest-docblock@29.7.0: + resolution: {integrity: sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: detect-newline: 3.1.0 + dev: true - jest-each@29.7.0: + /jest-each@29.7.0: + resolution: {integrity: sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 jest-get-type: 29.6.3 jest-util: 29.7.0 pretty-format: 29.7.0 + dev: true - jest-environment-jsdom@29.7.0: + /jest-environment-jsdom@29.7.0: + resolution: {integrity: sha512-k9iQbsf9OyOfdzWH8HDmrRT0gSIcX+FLNW7IQq94tFX0gynPwqDTW0Ho6iMVNjGz/nb+l/vW3dWM2bbLLpkbXA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + canvas: ^2.5.0 + peerDependenciesMeta: + canvas: + optional: true dependencies: '@jest/environment': 29.7.0 '@jest/fake-timers': 29.7.0 @@ -8455,8 +6359,11 @@ snapshots: - bufferutil - supports-color - utf-8-validate + dev: true - jest-environment-node@29.7.0: + /jest-environment-node@29.7.0: + resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/environment': 29.7.0 '@jest/fake-timers': 29.7.0 @@ -8464,10 +6371,16 @@ snapshots: '@types/node': 20.12.8 jest-mock: 29.7.0 jest-util: 29.7.0 + dev: true - jest-get-type@29.6.3: {} + /jest-get-type@29.6.3: + resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dev: true - jest-haste-map@29.7.0: + /jest-haste-map@29.7.0: + resolution: {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 '@types/graceful-fs': 4.1.9 @@ -8482,20 +6395,29 @@ snapshots: walker: 1.0.8 optionalDependencies: fsevents: 2.3.3 + dev: true - jest-leak-detector@29.7.0: + /jest-leak-detector@29.7.0: + resolution: {integrity: sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: jest-get-type: 29.6.3 pretty-format: 29.7.0 + dev: true - jest-matcher-utils@29.7.0: + /jest-matcher-utils@29.7.0: + resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: chalk: 4.1.2 jest-diff: 29.7.0 jest-get-type: 29.6.3 pretty-format: 29.7.0 + dev: true - jest-message-util@29.7.0: + /jest-message-util@29.7.0: + resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@babel/code-frame': 7.24.2 '@jest/types': 29.6.3 @@ -8506,27 +6428,47 @@ snapshots: pretty-format: 29.7.0 slash: 3.0.0 stack-utils: 2.0.6 + dev: true - jest-mock@29.7.0: + /jest-mock@29.7.0: + resolution: {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 '@types/node': 20.12.8 jest-util: 29.7.0 + dev: true - jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): - optionalDependencies: + /jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): + resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} + engines: {node: '>=6'} + peerDependencies: + jest-resolve: '*' + peerDependenciesMeta: + jest-resolve: + optional: true + dependencies: jest-resolve: 29.7.0 + dev: true - jest-regex-util@29.6.3: {} + /jest-regex-util@29.6.3: + resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dev: true - jest-resolve-dependencies@29.7.0: + /jest-resolve-dependencies@29.7.0: + resolution: {integrity: sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: jest-regex-util: 29.6.3 jest-snapshot: 29.7.0 transitivePeerDependencies: - supports-color + dev: true - jest-resolve@29.7.0: + /jest-resolve@29.7.0: + resolution: {integrity: sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: chalk: 4.1.2 graceful-fs: 4.2.11 @@ -8537,8 +6479,11 @@ snapshots: resolve: 1.22.8 resolve.exports: 2.0.2 slash: 3.0.0 + dev: true - jest-runner@29.7.0: + /jest-runner@29.7.0: + resolution: {integrity: sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/console': 29.7.0 '@jest/environment': 29.7.0 @@ -8563,8 +6508,11 @@ snapshots: source-map-support: 0.5.13 transitivePeerDependencies: - supports-color + dev: true - jest-runtime@29.7.0: + /jest-runtime@29.7.0: + resolution: {integrity: sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/environment': 29.7.0 '@jest/fake-timers': 29.7.0 @@ -8575,7 +6523,7 @@ snapshots: '@jest/types': 29.6.3 '@types/node': 20.12.8 chalk: 4.1.2 - cjs-module-lexer: 1.3.1 + cjs-module-lexer: 1.2.3 collect-v8-coverage: 1.0.2 glob: 7.2.3 graceful-fs: 4.2.11 @@ -8590,18 +6538,21 @@ snapshots: strip-bom: 4.0.0 transitivePeerDependencies: - supports-color + dev: true - jest-snapshot@29.7.0: + /jest-snapshot@29.7.0: + resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/core': 7.24.5 - '@babel/generator': 7.24.5 - '@babel/plugin-syntax-jsx': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-syntax-typescript': 7.24.1(@babel/core@7.24.5) - '@babel/types': 7.24.5 + '@babel/core': 7.24.3 + '@babel/generator': 7.24.1 + '@babel/plugin-syntax-jsx': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-syntax-typescript': 7.24.1(@babel/core@7.24.3) + '@babel/types': 7.24.0 '@jest/expect-utils': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.24.5) + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.24.3) chalk: 4.1.2 expect: 29.7.0 graceful-fs: 4.2.11 @@ -8615,8 +6566,11 @@ snapshots: semver: 7.6.0 transitivePeerDependencies: - supports-color + dev: true - jest-util@29.7.0: + /jest-util@29.7.0: + resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 '@types/node': 20.12.8 @@ -8624,8 +6578,11 @@ snapshots: ci-info: 3.9.0 graceful-fs: 4.2.11 picomatch: 2.3.1 + dev: true - jest-validate@29.7.0: + /jest-validate@29.7.0: + resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 camelcase: 6.3.0 @@ -8633,8 +6590,11 @@ snapshots: jest-get-type: 29.6.3 leven: 3.1.0 pretty-format: 29.7.0 + dev: true - jest-watcher@29.7.0: + /jest-watcher@29.7.0: + resolution: {integrity: sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 @@ -8644,48 +6604,79 @@ snapshots: emittery: 0.13.1 jest-util: 29.7.0 string-length: 4.0.2 + dev: true - jest-worker@29.7.0: + /jest-worker@29.7.0: + resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@types/node': 20.12.8 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 + dev: true - jest@29.7.0(@types/node@20.12.8)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.4.17)(@types/node@20.12.8)(typescript@5.4.5)): + /jest@29.7.0(@types/node@20.12.8)(ts-node@10.9.2): + resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true dependencies: - '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.4.17)(@types/node@20.12.8)(typescript@5.4.5)) + '@jest/core': 29.7.0(ts-node@10.9.2) '@jest/types': 29.6.3 import-local: 3.1.0 - jest-cli: 29.7.0(@types/node@20.12.8)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.4.17)(@types/node@20.12.8)(typescript@5.4.5)) + jest-cli: 29.7.0(@types/node@20.12.8)(ts-node@10.9.2) transitivePeerDependencies: - '@types/node' - babel-plugin-macros - supports-color - ts-node + dev: true - jju@1.4.0: {} + /jju@1.4.0: + resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} + dev: true - joi@17.12.3: + /joi@17.12.3: + resolution: {integrity: sha512-2RRziagf555owrm9IRVtdKynOBeITiDpuZqIpgwqXShPncPKNiRQoiGsl/T8SQdq+8ugRzH2LqY67irr2y/d+g==} dependencies: '@hapi/hoek': 9.3.0 '@hapi/topo': 5.1.0 '@sideway/address': 4.1.5 '@sideway/formula': 3.0.1 '@sideway/pinpoint': 2.0.0 + dev: true - js-tokens@4.0.0: {} + /js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - js-yaml@3.14.1: + /js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true dependencies: argparse: 1.0.10 esprima: 4.0.1 + dev: true - js-yaml@4.1.0: + /js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true dependencies: argparse: 2.0.1 + dev: true - jsdom@20.0.3: + /jsdom@20.0.3: + resolution: {integrity: sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==} + engines: {node: '>=14'} + peerDependencies: + canvas: ^2.5.0 + peerDependenciesMeta: + canvas: + optional: true dependencies: abab: 2.0.6 acorn: 8.11.3 @@ -8701,80 +6692,131 @@ snapshots: http-proxy-agent: 5.0.0 https-proxy-agent: 5.0.1 is-potential-custom-element-name: 1.0.1 - nwsapi: 2.2.9 + nwsapi: 2.2.7 parse5: 7.1.2 saxes: 6.0.0 symbol-tree: 3.2.4 - tough-cookie: 4.1.4 + tough-cookie: 4.1.3 w3c-xmlserializer: 4.0.0 webidl-conversions: 7.0.0 whatwg-encoding: 2.0.0 whatwg-mimetype: 3.0.0 whatwg-url: 11.0.0 - ws: 8.17.0 + ws: 8.16.0 xml-name-validator: 4.0.0 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate + dev: true - jsesc@0.5.0: {} + /jsesc@0.5.0: + resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} + hasBin: true + dev: false - jsesc@2.5.2: {} + /jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true - json-buffer@3.0.1: {} + /json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + dev: true - json-parse-even-better-errors@2.3.1: {} + /json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - json-schema-traverse@0.4.1: {} + /json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + dev: true - json-schema-traverse@1.0.0: {} + /json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} - json-schema-typed@7.0.3: {} + /json-schema-typed@7.0.3: + resolution: {integrity: sha512-7DE8mpG+/fVw+dTpjbxnx47TaMnDfOI1jwft9g1VybltZCduyRQPJPvc+zzKY9WPHxhPWczyFuYa6I8Mw4iU5A==} + dev: true - json-schema@0.4.0: {} + /json-schema@0.4.0: + resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} + dev: false - json-stable-stringify-without-jsonify@1.0.1: {} + /json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + dev: true - json5@1.0.2: + /json5@1.0.2: + resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} + hasBin: true dependencies: minimist: 1.2.8 + dev: true - json5@2.2.3: {} + /json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true - jsonfile@6.1.0: + /jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} dependencies: universalify: 2.0.1 optionalDependencies: graceful-fs: 4.2.11 + dev: false - jsonparse@1.3.1: {} + /jsonparse@1.3.1: + resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} + engines: {'0': node >= 0.2.0} + dev: true - jsonpointer@5.0.1: {} + /jsonpointer@5.0.1: + resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==} + engines: {node: '>=0.10.0'} + dev: false - jsx-ast-utils@3.3.5: + /jsx-ast-utils@3.3.5: + resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} + engines: {node: '>=4.0'} dependencies: - array-includes: 3.1.8 + array-includes: 3.1.7 array.prototype.flat: 1.3.2 object.assign: 4.1.5 object.values: 1.2.0 + dev: true - keyv@4.5.4: + /keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} dependencies: json-buffer: 3.0.1 + dev: true - kleur@3.0.3: {} + /kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + dev: true - kuler@2.0.0: {} + /kuler@2.0.0: + resolution: {integrity: sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==} + dev: true - leven@3.1.0: {} + /leven@3.1.0: + resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} + engines: {node: '>=6'} - levn@0.4.1: + /levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} dependencies: prelude-ls: 1.2.1 type-check: 0.4.0 + dev: true - license-compliance@3.0.0(typescript@5.4.5): + /license-compliance@3.0.0(typescript@5.4.5): + resolution: {integrity: sha512-0kXEr7JSdP+jPSTSEnAiyGvpOoFnkiVXqmTFhXx22+tCay7shTN1mVM7Z+p2F3YNeIhx0tmADglrp5ddWGyHnQ==} + engines: {node: '>=18.20.1'} + hasBin: true dependencies: chalk: 4.1.2 commander: 12.0.0 @@ -8788,12 +6830,20 @@ snapshots: transitivePeerDependencies: - supports-color - typescript + dev: true - lilconfig@3.0.0: {} + /lilconfig@3.0.0: + resolution: {integrity: sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==} + engines: {node: '>=14'} + dev: true - lines-and-columns@1.2.4: {} + /lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - lint-staged@15.2.2: + /lint-staged@15.2.2: + resolution: {integrity: sha512-TiTt93OPh1OZOsb5B7k96A/ATl2AjIZo+vnzFZ6oHK5FuTk63ByDtxGQpHm+kFETjEWqgkF95M8FRXKR/LEBcw==} + engines: {node: '>=18.12.0'} + hasBin: true dependencies: chalk: 5.3.0 commander: 11.1.0 @@ -8807,8 +6857,11 @@ snapshots: yaml: 2.3.4 transitivePeerDependencies: - supports-color + dev: true - listr2@8.0.1: + /listr2@8.0.1: + resolution: {integrity: sha512-ovJXBXkKGfq+CwmKTjluEqFi3p4h8xvkxGQQAQan22YCgef4KZ1mKGjzfGh6PL6AW5Csw0QiQPNuQyH+6Xk3hA==} + engines: {node: '>=18.0.0'} dependencies: cli-truncate: 4.0.0 colorette: 2.0.20 @@ -8816,46 +6869,75 @@ snapshots: log-update: 6.0.0 rfdc: 1.3.1 wrap-ansi: 9.0.0 + dev: true - locate-path@3.0.0: + /locate-path@3.0.0: + resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} + engines: {node: '>=6'} dependencies: p-locate: 3.0.0 path-exists: 3.0.0 + dev: true - locate-path@5.0.0: + /locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} dependencies: p-locate: 4.1.0 + dev: true - locate-path@6.0.0: + /locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} dependencies: p-locate: 5.0.0 + dev: true - lodash.camelcase@4.3.0: {} + /lodash.camelcase@4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + dev: false - lodash.debounce@4.0.8: {} + /lodash.debounce@4.0.8: + resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + dev: false - lodash.memoize@4.1.2: {} + /lodash.memoize@4.1.2: + resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} + dev: true - lodash.merge@4.6.2: {} + /lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + dev: true - lodash.sortby@4.7.0: {} + /lodash.sortby@4.7.0: + resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} + dev: false - lodash@4.17.21: {} + /lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - log-symbols@4.1.0: + /log-symbols@4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} dependencies: chalk: 4.1.2 is-unicode-supported: 0.1.0 + dev: true - log-update@6.0.0: + /log-update@6.0.0: + resolution: {integrity: sha512-niTvB4gqvtof056rRIrTZvjNYE4rCUzO6X/X+kYjd7WFxXeJ0NwEFnRxX6ehkvv3jTwrXnNdtAak5XYZuIyPFw==} + engines: {node: '>=18'} dependencies: - ansi-escapes: 6.2.1 + ansi-escapes: 6.2.0 cli-cursor: 4.0.0 slice-ansi: 7.1.0 strip-ansi: 7.1.0 wrap-ansi: 9.0.0 + dev: true - logform@2.6.0: + /logform@2.6.0: + resolution: {integrity: sha512-1ulHeNPp6k/LD8H91o7VYFBng5i1BDE7HoKxVbZiGFidS1Rj65qcywLxX+pVfAPoQJEjRdvKcusKwOupHCVOVQ==} + engines: {node: '>= 12.0.0'} dependencies: '@colors/colors': 1.6.0 '@types/triple-beam': 1.3.5 @@ -8863,83 +6945,160 @@ snapshots: ms: 2.1.3 safe-stable-stringify: 2.4.3 triple-beam: 1.4.1 + dev: true - loose-envify@1.4.0: + /loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true dependencies: js-tokens: 4.0.0 - lru-cache@10.2.2: {} + /lru-cache@10.2.0: + resolution: {integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==} + engines: {node: 14 || >=16.14} + dev: true - lru-cache@5.1.1: + /lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} dependencies: yallist: 3.1.1 - lru-cache@6.0.0: + /lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} dependencies: yallist: 4.0.0 + dev: true - lz-string@1.5.0: {} + /lz-string@1.5.0: + resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} + hasBin: true + dev: true - magic-string@0.25.9: + /magic-string@0.25.9: + resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} dependencies: sourcemap-codec: 1.4.8 + dev: false - make-dir@4.0.0: + /make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} dependencies: semver: 7.6.0 + dev: true - make-error@1.3.6: {} + /make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + dev: true - makeerror@1.0.12: + /makeerror@1.0.12: + resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} dependencies: tmpl: 1.0.5 + dev: true - map-stream@0.0.7: {} + /map-stream@0.0.7: + resolution: {integrity: sha512-C0X0KQmGm3N2ftbTGBhSyuydQ+vV1LC3f3zPvT3RXHXNZrvfPZcoXp/N5DOa8vedX/rTMm2CjTtivFg2STJMRQ==} + dev: true - merge-stream@2.0.0: {} + /merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + dev: true - merge2@1.4.1: {} + /merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} - micromatch@4.0.5: + /micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} dependencies: braces: 3.0.2 picomatch: 2.3.1 - mime-db@1.52.0: {} + /mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} - mime-types@2.1.35: + /mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} dependencies: mime-db: 1.52.0 - mimic-fn@2.1.0: {} + /mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + dev: true - mimic-fn@3.1.0: {} + /mimic-fn@3.1.0: + resolution: {integrity: sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==} + engines: {node: '>=8'} + dev: true - mimic-fn@4.0.0: {} + /mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + dev: true - min-indent@1.0.1: {} + /min-indent@1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + dev: true - minimatch@3.1.2: + /minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} dependencies: brace-expansion: 1.1.11 - minimatch@5.1.6: + /minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + dependencies: + brace-expansion: 2.0.1 + dev: false + + /minimatch@9.0.3: + resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} + engines: {node: '>=16 || 14 >=14.17'} dependencies: brace-expansion: 2.0.1 + dev: true - minimatch@9.0.4: + /minimatch@9.0.4: + resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} + engines: {node: '>=16 || 14 >=14.17'} dependencies: brace-expansion: 2.0.1 + dev: true - minimist@1.2.8: {} + /minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + dev: true - minipass@7.0.4: {} + /minipass@7.0.4: + resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} + engines: {node: '>=16 || 14 >=14.17'} + dev: true - ms@2.1.2: {} + /ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - ms@2.1.3: {} + /ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + dev: true - msw@2.2.14(typescript@5.4.5): + /msw@2.2.14(typescript@5.4.5): + resolution: {integrity: sha512-64i8rNCa1xzDK8ZYsTrVMli05D687jty8+Th+PU5VTbJ2/4P7fkQFVyDQ6ZFT5FrNR8z2BHhbY47fKNvfHrumA==} + engines: {node: '>=18'} + hasBin: true + requiresBuild: true + peerDependencies: + typescript: '>= 4.7.x' + peerDependenciesMeta: + typescript: + optional: true dependencies: '@bundled-es-modules/cookie': 2.0.0 '@bundled-es-modules/statuses': 1.0.1 @@ -8954,123 +7113,202 @@ snapshots: headers-polyfill: 4.0.3 is-node-process: 1.2.0 outvariant: 1.4.2 - path-to-regexp: 6.2.2 + path-to-regexp: 6.2.1 strict-event-emitter: 0.5.1 type-fest: 4.18.1 - yargs: 17.7.2 - optionalDependencies: typescript: 5.4.5 + yargs: 17.7.2 + dev: true - mute-stream@1.0.0: {} + /mute-stream@1.0.0: + resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: true - nanoid@3.3.7: {} + /nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true - natural-compare@1.4.0: {} + /natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + dev: true - node-domexception@1.0.0: {} + /node-domexception@1.0.0: + resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} + engines: {node: '>=10.5.0'} + dev: true - node-fetch@3.3.2: + /node-fetch@3.3.2: + resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: data-uri-to-buffer: 4.0.1 fetch-blob: 3.2.0 formdata-polyfill: 4.0.10 + dev: true - node-int64@0.4.0: {} + /node-int64@0.4.0: + resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} + dev: true - node-releases@2.0.14: {} + /node-releases@2.0.14: + resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} - normalize-path@3.0.0: {} + /normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + dev: true - normalize-range@0.1.2: {} + /normalize-range@0.1.2: + resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} + engines: {node: '>=0.10.0'} + dev: true - npm-run-path@4.0.1: + /npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} dependencies: path-key: 3.1.1 + dev: true - npm-run-path@5.3.0: + /npm-run-path@5.3.0: + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: path-key: 4.0.0 + dev: true + + /nwsapi@2.2.7: + resolution: {integrity: sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==} + dev: true - nwsapi@2.2.9: {} + /object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} - object-assign@4.1.1: {} + /object-inspect@1.13.1: + resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} - object-inspect@1.13.1: {} + /object-is@1.1.6: + resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + dev: true - object-keys@1.1.1: {} + /object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} - object-treeify@1.1.33: {} + /object-treeify@1.1.33: + resolution: {integrity: sha512-EFVjAYfzWqWsBMRHPMAXLCDIJnpMhdWAqR7xG6M6a2cs6PMFpl/+Z20w9zDW4vkxOFfddegBKq9Rehd0bxWE7A==} + engines: {node: '>= 10'} + dev: true - object.assign@4.1.5: + /object.assign@4.1.5: + resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 define-properties: 1.2.1 has-symbols: 1.0.3 object-keys: 1.1.1 - object.entries@1.1.8: + /object.entries@1.1.8: + resolution: {integrity: sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-object-atoms: 1.0.0 + dev: true - object.fromentries@2.0.8: + /object.fromentries@2.0.8: + resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.23.2 es-object-atoms: 1.0.0 + dev: true - object.groupby@1.0.3: + /object.groupby@1.0.3: + resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.23.2 + dev: true - object.hasown@1.1.4: + /object.hasown@1.1.3: + resolution: {integrity: sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==} dependencies: define-properties: 1.2.1 - es-abstract: 1.23.3 - es-object-atoms: 1.0.0 + es-abstract: 1.22.5 + dev: true - object.values@1.2.0: + /object.values@1.2.0: + resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-object-atoms: 1.0.0 + dev: true - once@1.4.0: + /once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} dependencies: wrappy: 1.0.2 - one-time@1.0.0: + /one-time@1.0.0: + resolution: {integrity: sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==} dependencies: fn.name: 1.1.0 + dev: true - onetime@5.1.2: + /onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} dependencies: mimic-fn: 2.1.0 + dev: true - onetime@6.0.0: + /onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} dependencies: mimic-fn: 4.0.0 + dev: true - open@8.4.2: + /open@8.4.2: + resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} + engines: {node: '>=12'} dependencies: define-lazy-prop: 2.0.0 is-docker: 2.2.1 is-wsl: 2.2.0 + dev: true - optionator@0.9.4: + /optionator@0.9.3: + resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} + engines: {node: '>= 0.8.0'} dependencies: + '@aashutoshrathi/word-wrap': 1.2.6 deep-is: 0.1.4 fast-levenshtein: 2.0.6 levn: 0.4.1 prelude-ls: 1.2.1 type-check: 0.4.0 - word-wrap: 1.2.5 + dev: true - ora@5.4.1: + /ora@5.4.1: + resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} + engines: {node: '>=10'} dependencies: bl: 4.1.0 chalk: 4.1.2 @@ -9081,271 +7319,473 @@ snapshots: log-symbols: 4.1.0 strip-ansi: 6.0.1 wcwidth: 1.0.1 + dev: true - outvariant@1.4.2: {} + /outvariant@1.4.2: + resolution: {integrity: sha512-Ou3dJ6bA/UJ5GVHxah4LnqDwZRwAmWxrG3wtrHrbGnP4RnLCtA64A4F+ae7Y8ww660JaddSoArUR5HjipWSHAQ==} + dev: true - p-limit@2.3.0: + /p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} dependencies: p-try: 2.2.0 + dev: true - p-limit@3.1.0: + /p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} dependencies: yocto-queue: 0.1.0 + dev: true - p-locate@3.0.0: + /p-locate@3.0.0: + resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} + engines: {node: '>=6'} dependencies: p-limit: 2.3.0 + dev: true - p-locate@4.1.0: + /p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} dependencies: p-limit: 2.3.0 + dev: true - p-locate@5.0.0: + /p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} dependencies: p-limit: 3.1.0 + dev: true - p-try@2.2.0: {} + /p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + dev: true - parent-module@1.0.1: + /parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} dependencies: callsites: 3.1.0 - parse-json@5.2.0: + /parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} dependencies: '@babel/code-frame': 7.24.2 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 - parse5@7.1.2: + /parse5@7.1.2: + resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} dependencies: entities: 4.5.0 + dev: true - path-exists@3.0.0: {} + /path-exists@3.0.0: + resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} + engines: {node: '>=4'} + dev: true - path-exists@4.0.0: {} + /path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + dev: true - path-is-absolute@1.0.1: {} + /path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} - path-key@3.1.1: {} + /path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + dev: true - path-key@4.0.0: {} + /path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + dev: true - path-parse@1.0.7: {} + /path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - path-scurry@1.10.2: + /path-scurry@1.10.1: + resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} + engines: {node: '>=16 || 14 >=14.17'} dependencies: - lru-cache: 10.2.2 + lru-cache: 10.2.0 minipass: 7.0.4 + dev: true - path-to-regexp@6.2.2: {} + /path-to-regexp@6.2.1: + resolution: {integrity: sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==} + dev: true - path-type@4.0.0: {} + /path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} - pause-stream@0.0.11: + /pause-stream@0.0.11: + resolution: {integrity: sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==} dependencies: through: 2.3.8 + dev: true - picocolors@1.0.0: {} + /picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} - picomatch@2.3.1: {} + /picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} - pidtree@0.6.0: {} + /pidtree@0.6.0: + resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} + engines: {node: '>=0.10'} + hasBin: true + dev: true - pirates@4.0.6: {} + /pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} + dev: true - pkg-dir@4.2.0: + /pkg-dir@4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} dependencies: find-up: 4.1.0 + dev: true - pkg-up@3.1.0: + /pkg-up@3.1.0: + resolution: {integrity: sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==} + engines: {node: '>=8'} dependencies: find-up: 3.0.0 + dev: true - playwright-core@1.43.1: {} + /playwright-core@1.43.1: + resolution: {integrity: sha512-EI36Mto2Vrx6VF7rm708qSnesVQKbxEWvPrfA1IPY6HgczBplDx7ENtx+K2n4kJ41sLLkuGfmb0ZLSSXlDhqPg==} + engines: {node: '>=16'} + hasBin: true + dev: true - playwright@1.43.1: + /playwright@1.43.1: + resolution: {integrity: sha512-V7SoH0ai2kNt1Md9E3Gwas5B9m8KR2GVvwZnAI6Pg0m3sh7UvgiYhRrhsziCmqMJNouPckiOhk8T+9bSAK0VIA==} + engines: {node: '>=16'} + hasBin: true dependencies: playwright-core: 1.43.1 optionalDependencies: fsevents: 2.3.2 + dev: true - possible-typed-array-names@1.0.0: {} + /possible-typed-array-names@1.0.0: + resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} + engines: {node: '>= 0.4'} - postcss-value-parser@4.2.0: {} + /postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + dev: true - postcss@8.4.38: + /postcss@8.4.38: + resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} + engines: {node: ^10 || ^12 || >=14} dependencies: nanoid: 3.3.7 picocolors: 1.0.0 source-map-js: 1.2.0 - prelude-ls@1.2.1: {} + /prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + dev: true - prettier-linter-helpers@1.0.0: + /prettier-linter-helpers@1.0.0: + resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} + engines: {node: '>=6.0.0'} dependencies: fast-diff: 1.3.0 + dev: true - prettier-plugin-sort-imports@1.8.5(typescript@5.4.5): + /prettier-plugin-sort-imports@1.8.5(typescript@5.4.5): + resolution: {integrity: sha512-PkizzuO2S8h3kJeWHytnMZXqvv/fD6g+en/dhv4y5QjoiMm1wq3FWzFiFT7c/BilX95l0ZIqJTlMsXYs8z/WQQ==} + peerDependencies: + typescript: '>4.0.0' dependencies: prettier: 3.2.5 typescript: 5.4.5 + dev: true - prettier@3.2.5: {} + /prettier@3.2.5: + resolution: {integrity: sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==} + engines: {node: '>=14'} + hasBin: true + dev: true - pretty-bytes@5.6.0: {} + /pretty-bytes@5.6.0: + resolution: {integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==} + engines: {node: '>=6'} + dev: false - pretty-bytes@6.1.1: {} + /pretty-bytes@6.1.1: + resolution: {integrity: sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==} + engines: {node: ^14.13.1 || >=16.0.0} + dev: false - pretty-format@27.5.1: + /pretty-format@27.5.1: + resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: ansi-regex: 5.0.1 ansi-styles: 5.2.0 react-is: 17.0.2 + dev: true - pretty-format@29.7.0: + /pretty-format@29.7.0: + resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/schemas': 29.6.3 ansi-styles: 5.2.0 - react-is: 18.3.1 + react-is: 18.2.0 + dev: true - prompts@2.4.2: + /prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} dependencies: kleur: 3.0.3 sisteransi: 1.0.5 + dev: true - prop-types@15.8.1: + /prop-types@15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} dependencies: loose-envify: 1.4.0 object-assign: 4.1.1 react-is: 16.13.1 - property-expr@2.0.6: {} + /property-expr@2.0.6: + resolution: {integrity: sha512-SVtmxhRE/CGkn3eZY1T6pC8Nln6Fr/lu1mKSgRud0eC73whjGfoAogbn78LkD8aFL0zz3bAFerKSnOl7NlErBA==} + dev: false - proxy-from-env@1.1.0: {} + /proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + dev: false - psl@1.9.0: {} + /psl@1.9.0: + resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} + dev: true - punycode@2.3.1: {} + /punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} - pure-rand@6.1.0: {} + /pure-rand@6.0.4: + resolution: {integrity: sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA==} + dev: true - querystringify@2.2.0: {} + /querystringify@2.2.0: + resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} + dev: true - queue-microtask@1.2.3: {} + /queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - randombytes@2.1.0: + /randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} dependencies: safe-buffer: 5.2.1 + dev: false - react-dom@18.3.1(react@18.3.1): + /react-dom@18.3.1(react@18.3.1): + resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} + peerDependencies: + react: ^18.3.1 dependencies: loose-envify: 1.4.0 react: 18.3.1 scheduler: 0.23.2 - react-error-boundary@4.0.13(react@18.3.1): + /react-error-boundary@4.0.13(react@18.3.1): + resolution: {integrity: sha512-b6PwbdSv8XeOSYvjt8LpgpKrZ0yGdtZokYwkwV2wlcZbxgopHX/hgPl5VgpnoVOWd868n1hktM8Qm4b+02MiLQ==} + peerDependencies: + react: '>=16.13.1' dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.24.1 react: 18.3.1 + dev: false - react-hook-form@7.51.3(react@18.3.1): + /react-hook-form@7.51.3(react@18.3.1): + resolution: {integrity: sha512-cvJ/wbHdhYx8aviSWh28w9ImjmVsb5Y05n1+FW786vEZQJV5STNM0pW6ujS+oiBecb0ARBxJFyAnXj9+GHXACQ==} + engines: {node: '>=12.22.0'} + peerDependencies: + react: ^16.8.0 || ^17 || ^18 dependencies: react: 18.3.1 + dev: false - react-is@16.13.1: {} + /react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} - react-is@17.0.2: {} + /react-is@17.0.2: + resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + dev: true - react-is@18.3.1: {} + /react-is@18.2.0: + resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} - react-redux@9.1.2(@types/react@18.3.1)(react@18.3.1)(redux@5.0.1): + /react-redux@9.1.2(@types/react@18.3.1)(react@18.3.1)(redux@5.0.1): + resolution: {integrity: sha512-0OA4dhM1W48l3uzmv6B7TXPCGmokUU4p1M44DGN2/D9a1FjVPukVjER1PcPX97jIg6aUeLq1XJo1IpfbgULn0w==} + peerDependencies: + '@types/react': ^18.2.25 + react: ^18.0 + redux: ^5.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + redux: + optional: true dependencies: + '@types/react': 18.3.1 '@types/use-sync-external-store': 0.0.3 react: 18.3.1 - use-sync-external-store: 1.2.2(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.1 redux: 5.0.1 + use-sync-external-store: 1.2.0(react@18.3.1) + dev: false - react-router-dom@6.23.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + /react-router-dom@6.23.0(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-Q9YaSYvubwgbal2c9DJKfx6hTNoBp3iJDsl+Duva/DwxoJH+OTXkxGpql4iUK2sla/8z4RpjAm6EWx1qUDuopQ==} + engines: {node: '>=14.0.0'} + peerDependencies: + react: '>=16.8' + react-dom: '>=16.8' dependencies: '@remix-run/router': 1.16.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) react-router: 6.23.0(react@18.3.1) + dev: false - react-router@6.23.0(react@18.3.1): + /react-router@6.23.0(react@18.3.1): + resolution: {integrity: sha512-wPMZ8S2TuPadH0sF5irFGjkNLIcRvOSaEe7v+JER8508dyJumm6XZB1u5kztlX0RVq6AzRVndzqcUh6sFIauzA==} + engines: {node: '>=14.0.0'} + peerDependencies: + react: '>=16.8' dependencies: '@remix-run/router': 1.16.0 react: 18.3.1 + dev: false - react-transition-group@4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + /react-transition-group@4.4.5(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==} + peerDependencies: + react: '>=16.6.0' + react-dom: '>=16.6.0' dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.24.4 dom-helpers: 5.2.1 loose-envify: 1.4.0 prop-types: 15.8.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) + dev: false - react@18.3.1: + /react@18.3.1: + resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} + engines: {node: '>=0.10.0'} dependencies: loose-envify: 1.4.0 - readable-stream@3.6.2: + /readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} dependencies: inherits: 2.0.4 string_decoder: 1.3.0 util-deprecate: 1.0.2 + dev: true - readline-transform@1.0.0: {} + /readline-transform@1.0.0: + resolution: {integrity: sha512-7KA6+N9IGat52d83dvxnApAWN+MtVb1MiVuMR/cf1O4kYsJG+g/Aav0AHcHKsb6StinayfPLne0+fMX2sOzAKg==} + engines: {node: '>=6'} + dev: true - redent@3.0.0: + /redent@3.0.0: + resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} + engines: {node: '>=8'} dependencies: indent-string: 4.0.0 strip-indent: 3.0.0 + dev: true - redux-thunk@3.1.0(redux@5.0.1): + /redux-thunk@3.1.0(redux@5.0.1): + resolution: {integrity: sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw==} + peerDependencies: + redux: ^5.0.0 dependencies: redux: 5.0.1 + dev: false - redux@4.2.1: + /redux@4.2.1: + resolution: {integrity: sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==} dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.24.4 + dev: true - redux@5.0.1: {} + /redux@5.0.1: + resolution: {integrity: sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==} + dev: false - reflect.getprototypeof@1.0.6: + /reflect.getprototypeof@1.0.6: + resolution: {integrity: sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.23.2 es-errors: 1.3.0 get-intrinsic: 1.2.4 - globalthis: 1.0.4 + globalthis: 1.0.3 which-builtin-type: 1.1.3 + dev: true - regenerate-unicode-properties@10.1.1: + /regenerate-unicode-properties@10.1.1: + resolution: {integrity: sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==} + engines: {node: '>=4'} dependencies: regenerate: 1.4.2 + dev: false - regenerate@1.4.2: {} + /regenerate@1.4.2: + resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} + dev: false - regenerator-runtime@0.14.1: {} + /regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} - regenerator-transform@0.15.2: + /regenerator-transform@0.15.2: + resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.24.4 + dev: false - regexp.prototype.flags@1.5.2: + /regexp.prototype.flags@1.5.2: + resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-errors: 1.3.0 set-function-name: 2.0.2 - regexpu-core@5.3.2: + /regexpu-core@5.3.2: + resolution: {integrity: sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==} + engines: {node: '>=4'} dependencies: '@babel/regjsgen': 0.8.0 regenerate: 1.4.2 @@ -9353,131 +7793,209 @@ snapshots: regjsparser: 0.9.1 unicode-match-property-ecmascript: 2.0.0 unicode-match-property-value-ecmascript: 2.1.0 + dev: false - regjsparser@0.9.1: + /regjsparser@0.9.1: + resolution: {integrity: sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==} + hasBin: true dependencies: jsesc: 0.5.0 + dev: false - require-directory@2.1.1: {} + /require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + dev: true - require-from-string@2.0.2: {} + /require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} - requires-port@1.0.0: {} + /requires-port@1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + dev: true - reselect@5.1.0: {} + /reselect@5.1.0: + resolution: {integrity: sha512-aw7jcGLDpSgNDyWBQLv2cedml85qd95/iszJjN988zX1t7AVRJi19d9kto5+W7oCfQ94gyo40dVbT6g2k4/kXg==} + dev: false - resolve-cwd@3.0.0: + /resolve-cwd@3.0.0: + resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} + engines: {node: '>=8'} dependencies: resolve-from: 5.0.0 + dev: true - resolve-from@4.0.0: {} + /resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} - resolve-from@5.0.0: {} + /resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + dev: true - resolve-pkg-maps@1.0.0: {} + /resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + dev: true - resolve.exports@2.0.2: {} + /resolve.exports@2.0.2: + resolution: {integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==} + engines: {node: '>=10'} + dev: true - resolve@1.22.8: + /resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true dependencies: is-core-module: 2.13.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - resolve@2.0.0-next.5: + /resolve@2.0.0-next.5: + resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} + hasBin: true dependencies: is-core-module: 2.13.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 + dev: true - restore-cursor@3.1.0: + /restore-cursor@3.1.0: + resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} + engines: {node: '>=8'} dependencies: onetime: 5.1.2 signal-exit: 3.0.7 + dev: true - restore-cursor@4.0.0: + /restore-cursor@4.0.0: + resolution: {integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: onetime: 5.1.2 signal-exit: 3.0.7 + dev: true - reusify@1.0.4: {} + /reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - rfdc@1.3.1: {} + /rfdc@1.3.1: + resolution: {integrity: sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==} + dev: true - rimraf@3.0.2: + /rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true dependencies: glob: 7.2.3 + dev: true - rollup@2.79.1: + /rollup@2.79.1: + resolution: {integrity: sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==} + engines: {node: '>=10.0.0'} + hasBin: true optionalDependencies: fsevents: 2.3.3 + dev: false - rollup@4.17.2: + /rollup@4.14.0: + resolution: {integrity: sha512-Qe7w62TyawbDzB4yt32R0+AbIo6m1/sqO7UPzFS8Z/ksL5mrfhA0v4CavfdmFav3D+ub4QeAgsGEe84DoWe/nQ==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true dependencies: '@types/estree': 1.0.5 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.17.2 - '@rollup/rollup-android-arm64': 4.17.2 - '@rollup/rollup-darwin-arm64': 4.17.2 - '@rollup/rollup-darwin-x64': 4.17.2 - '@rollup/rollup-linux-arm-gnueabihf': 4.17.2 - '@rollup/rollup-linux-arm-musleabihf': 4.17.2 - '@rollup/rollup-linux-arm64-gnu': 4.17.2 - '@rollup/rollup-linux-arm64-musl': 4.17.2 - '@rollup/rollup-linux-powerpc64le-gnu': 4.17.2 - '@rollup/rollup-linux-riscv64-gnu': 4.17.2 - '@rollup/rollup-linux-s390x-gnu': 4.17.2 - '@rollup/rollup-linux-x64-gnu': 4.17.2 - '@rollup/rollup-linux-x64-musl': 4.17.2 - '@rollup/rollup-win32-arm64-msvc': 4.17.2 - '@rollup/rollup-win32-ia32-msvc': 4.17.2 - '@rollup/rollup-win32-x64-msvc': 4.17.2 + '@rollup/rollup-android-arm-eabi': 4.14.0 + '@rollup/rollup-android-arm64': 4.14.0 + '@rollup/rollup-darwin-arm64': 4.14.0 + '@rollup/rollup-darwin-x64': 4.14.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.14.0 + '@rollup/rollup-linux-arm64-gnu': 4.14.0 + '@rollup/rollup-linux-arm64-musl': 4.14.0 + '@rollup/rollup-linux-powerpc64le-gnu': 4.14.0 + '@rollup/rollup-linux-riscv64-gnu': 4.14.0 + '@rollup/rollup-linux-s390x-gnu': 4.14.0 + '@rollup/rollup-linux-x64-gnu': 4.14.0 + '@rollup/rollup-linux-x64-musl': 4.14.0 + '@rollup/rollup-win32-arm64-msvc': 4.14.0 + '@rollup/rollup-win32-ia32-msvc': 4.14.0 + '@rollup/rollup-win32-x64-msvc': 4.14.0 fsevents: 2.3.3 - run-async@3.0.0: {} + /run-async@3.0.0: + resolution: {integrity: sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==} + engines: {node: '>=0.12.0'} + dev: true - run-parallel@1.2.0: + /run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} dependencies: queue-microtask: 1.2.3 - safe-array-concat@1.1.2: + /safe-array-concat@1.1.2: + resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} + engines: {node: '>=0.4'} dependencies: call-bind: 1.0.7 get-intrinsic: 1.2.4 has-symbols: 1.0.3 isarray: 2.0.5 - safe-buffer@5.2.1: {} + /safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - safe-regex-test@1.0.3: + /safe-regex-test@1.0.3: + resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 es-errors: 1.3.0 is-regex: 1.1.4 - safe-stable-stringify@2.4.3: {} + /safe-stable-stringify@2.4.3: + resolution: {integrity: sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==} + engines: {node: '>=10'} + dev: true - safer-buffer@2.1.2: {} + /safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + dev: true - saxes@6.0.0: + /saxes@6.0.0: + resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} + engines: {node: '>=v12.22.7'} dependencies: xmlchars: 2.2.0 + dev: true - scheduler@0.23.2: + /scheduler@0.23.2: + resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} dependencies: loose-envify: 1.4.0 - semver@6.3.1: {} + /semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true - semver@7.6.0: + /semver@7.6.0: + resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} + engines: {node: '>=10'} + hasBin: true dependencies: lru-cache: 6.0.0 + dev: true - serialize-javascript@6.0.2: + /serialize-javascript@6.0.2: + resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} dependencies: randombytes: 2.1.0 + dev: false - set-function-length@1.2.2: + /set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} dependencies: define-data-property: 1.1.4 es-errors: 1.3.0 @@ -9486,151 +8004,252 @@ snapshots: gopd: 1.0.1 has-property-descriptors: 1.0.2 - set-function-name@2.0.2: + /set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} dependencies: define-data-property: 1.1.4 es-errors: 1.3.0 functions-have-names: 1.2.3 has-property-descriptors: 1.0.2 - shebang-command@2.0.0: + /shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} dependencies: shebang-regex: 3.0.0 + dev: true - shebang-regex@3.0.0: {} + /shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + dev: true - side-channel@1.0.6: + /side-channel@1.0.6: + resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 es-errors: 1.3.0 get-intrinsic: 1.2.4 object-inspect: 1.13.1 - signal-exit@3.0.7: {} + /signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + dev: true - signal-exit@4.1.0: {} + /signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + dev: true - simple-swizzle@0.2.2: + /simple-swizzle@0.2.2: + resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} dependencies: is-arrayish: 0.3.2 + dev: true - sisteransi@1.0.5: {} + /sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + dev: true - slash@3.0.0: {} + /slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + dev: true - slice-ansi@5.0.0: + /slice-ansi@5.0.0: + resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} + engines: {node: '>=12'} dependencies: ansi-styles: 6.2.1 is-fullwidth-code-point: 4.0.0 + dev: true - slice-ansi@7.1.0: + /slice-ansi@7.1.0: + resolution: {integrity: sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==} + engines: {node: '>=18'} dependencies: ansi-styles: 6.2.1 is-fullwidth-code-point: 5.0.0 + dev: true - smob@1.5.0: {} + /smob@1.5.0: + resolution: {integrity: sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==} + dev: false - source-map-js@1.2.0: {} + /source-map-js@1.2.0: + resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} + engines: {node: '>=0.10.0'} - source-map-support@0.5.13: + /source-map-support@0.5.13: + resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} dependencies: buffer-from: 1.1.2 source-map: 0.6.1 + dev: true - source-map-support@0.5.21: + /source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} dependencies: buffer-from: 1.1.2 source-map: 0.6.1 + dev: false - source-map@0.5.7: {} + /source-map@0.5.7: + resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} + engines: {node: '>=0.10.0'} + dev: false - source-map@0.6.1: {} + /source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} - source-map@0.8.0-beta.0: + /source-map@0.8.0-beta.0: + resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} + engines: {node: '>= 8'} dependencies: whatwg-url: 7.1.0 + dev: false - sourcemap-codec@1.4.8: {} + /sourcemap-codec@1.4.8: + resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} + deprecated: Please use @jridgewell/sourcemap-codec instead + dev: false - spdx-compare@1.0.0: + /spdx-compare@1.0.0: + resolution: {integrity: sha512-C1mDZOX0hnu0ep9dfmuoi03+eOdDoz2yvK79RxbcrVEG1NO1Ph35yW102DHWKN4pk80nwCgeMmSY5L25VE4D9A==} dependencies: array-find-index: 1.0.2 spdx-expression-parse: 3.0.1 spdx-ranges: 2.1.1 + dev: true - spdx-exceptions@2.5.0: {} + /spdx-exceptions@2.5.0: + resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} + dev: true - spdx-expression-parse@3.0.1: + /spdx-expression-parse@3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} dependencies: spdx-exceptions: 2.5.0 spdx-license-ids: 3.0.17 + dev: true - spdx-expression-parse@4.0.0: + /spdx-expression-parse@4.0.0: + resolution: {integrity: sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==} dependencies: spdx-exceptions: 2.5.0 spdx-license-ids: 3.0.17 + dev: true - spdx-license-ids@3.0.17: {} + /spdx-license-ids@3.0.17: + resolution: {integrity: sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==} + dev: true - spdx-ranges@2.1.1: {} + /spdx-ranges@2.1.1: + resolution: {integrity: sha512-mcdpQFV7UDAgLpXEE/jOMqvK4LBoO0uTQg0uvXUewmEFhpiZx5yJSZITHB8w1ZahKdhfZqP5GPEOKLyEq5p8XA==} + dev: true - spdx-satisfies@5.0.1: + /spdx-satisfies@5.0.1: + resolution: {integrity: sha512-Nwor6W6gzFp8XX4neaKQ7ChV4wmpSh2sSDemMFSzHxpTw460jxFYeOn+jq4ybnSSw/5sc3pjka9MQPouksQNpw==} dependencies: spdx-compare: 1.0.0 spdx-expression-parse: 3.0.1 spdx-ranges: 2.1.1 + dev: true - split@1.0.1: + /split@1.0.1: + resolution: {integrity: sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==} dependencies: through: 2.3.8 + dev: true - sprintf-js@1.0.3: {} + /sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + dev: true - stack-trace@0.0.10: {} + /stack-trace@0.0.10: + resolution: {integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==} + dev: true - stack-utils@2.0.6: + /stack-utils@2.0.6: + resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} + engines: {node: '>=10'} dependencies: escape-string-regexp: 2.0.0 + dev: true + + /statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + dev: true - statuses@2.0.1: {} + /stop-iteration-iterator@1.0.0: + resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==} + engines: {node: '>= 0.4'} + dependencies: + internal-slot: 1.0.7 + dev: true - stream-combiner@0.2.2: + /stream-combiner@0.2.2: + resolution: {integrity: sha512-6yHMqgLYDzQDcAkL+tjJDC5nSNuNIx0vZtRZeiPh7Saef7VHX9H5Ijn9l2VIol2zaNYlYEX6KyuT/237A58qEQ==} dependencies: duplexer: 0.1.2 through: 2.3.8 + dev: true - strict-event-emitter@0.5.1: {} + /strict-event-emitter@0.5.1: + resolution: {integrity: sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==} + dev: true - string-argv@0.3.2: {} + /string-argv@0.3.2: + resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} + engines: {node: '>=0.6.19'} + dev: true - string-length@4.0.2: + /string-length@4.0.2: + resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} + engines: {node: '>=10'} dependencies: char-regex: 1.0.2 strip-ansi: 6.0.1 + dev: true - string-width@4.2.3: + /string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} dependencies: emoji-regex: 8.0.0 is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 + dev: true - string-width@5.1.2: + /string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} dependencies: eastasianwidth: 0.2.0 emoji-regex: 9.2.2 strip-ansi: 7.1.0 + dev: true - string-width@7.1.0: + /string-width@7.1.0: + resolution: {integrity: sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==} + engines: {node: '>=18'} dependencies: emoji-regex: 10.3.0 get-east-asian-width: 1.2.0 strip-ansi: 7.1.0 + dev: true - string.prototype.matchall@4.0.11: + /string.prototype.matchall@4.0.11: + resolution: {integrity: sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.23.2 es-errors: 1.3.0 es-object-atoms: 1.0.0 get-intrinsic: 1.2.4 @@ -9641,150 +8260,270 @@ snapshots: set-function-name: 2.0.2 side-channel: 1.0.6 - string.prototype.trim@1.2.9: + /string.prototype.trim@1.2.9: + resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.23.2 es-object-atoms: 1.0.0 - string.prototype.trimend@1.0.8: + /string.prototype.trimend@1.0.8: + resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-object-atoms: 1.0.0 - string.prototype.trimstart@1.0.8: + /string.prototype.trimstart@1.0.7: + resolution: {integrity: sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==} dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-object-atoms: 1.0.0 + es-abstract: 1.22.5 - string_decoder@1.3.0: + /string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} dependencies: safe-buffer: 5.2.1 + dev: true - stringify-object@3.3.0: + /stringify-object@3.3.0: + resolution: {integrity: sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==} + engines: {node: '>=4'} dependencies: get-own-enumerable-property-symbols: 3.0.2 is-obj: 1.0.1 is-regexp: 1.0.0 + dev: false - strip-ansi@6.0.1: + /strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} dependencies: ansi-regex: 5.0.1 + dev: true - strip-ansi@7.1.0: + /strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} dependencies: ansi-regex: 6.0.1 + dev: true - strip-bom@3.0.0: {} + /strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + dev: true - strip-bom@4.0.0: {} + /strip-bom@4.0.0: + resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} + engines: {node: '>=8'} + dev: true - strip-comments@2.0.1: {} + /strip-comments@2.0.1: + resolution: {integrity: sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==} + engines: {node: '>=10'} + dev: false - strip-final-newline@2.0.0: {} + /strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + dev: true - strip-final-newline@3.0.0: {} + /strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + dev: true - strip-indent@3.0.0: + /strip-indent@3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} dependencies: min-indent: 1.0.1 + dev: true - strip-json-comments@3.1.1: {} + /strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + dev: true - stylis@4.2.0: {} + /stylis@4.2.0: + resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==} + dev: false - supports-color@5.5.0: + /supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} dependencies: has-flag: 3.0.0 - supports-color@7.2.0: + /supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} dependencies: has-flag: 4.0.0 - supports-color@8.1.1: + /supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} dependencies: has-flag: 4.0.0 + dev: true - supports-preserve-symlinks-flag@1.0.0: {} + /supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} - symbol-tree@3.2.4: {} + /symbol-tree@3.2.4: + resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + dev: true - synckit@0.8.8: + /synckit@0.8.8: + resolution: {integrity: sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==} + engines: {node: ^14.18.0 || >=16.0.0} dependencies: '@pkgr/core': 0.1.1 tslib: 2.6.2 + dev: true - tapable@2.2.1: {} + /tapable@2.2.1: + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + engines: {node: '>=6'} + dev: true - temp-dir@2.0.0: {} + /temp-dir@2.0.0: + resolution: {integrity: sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==} + engines: {node: '>=8'} + dev: false - tempy@0.6.0: + /tempy@0.6.0: + resolution: {integrity: sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==} + engines: {node: '>=10'} dependencies: is-stream: 2.0.1 temp-dir: 2.0.0 type-fest: 0.16.0 unique-string: 2.0.0 + dev: false - terser@5.31.0: + /terser@5.30.3: + resolution: {integrity: sha512-STdUgOUx8rLbMGO9IOwHLpCqolkDITFFQSMYYwKE1N2lY6MVSaeoi10z/EhWxRc6ybqoVmKSkhKYH/XUpl7vSA==} + engines: {node: '>=10'} + hasBin: true dependencies: '@jridgewell/source-map': 0.3.6 acorn: 8.11.3 commander: 2.20.3 source-map-support: 0.5.21 + dev: false - test-exclude@6.0.0: + /test-exclude@6.0.0: + resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} + engines: {node: '>=8'} dependencies: '@istanbuljs/schema': 0.1.3 glob: 7.2.3 minimatch: 3.1.2 + dev: true - text-hex@1.0.0: {} + /text-hex@1.0.0: + resolution: {integrity: sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==} + dev: true - text-table@0.2.0: {} + /text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + dev: true - through@2.3.8: {} + /through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + dev: true - tiny-case@1.0.3: {} + /tiny-case@1.0.3: + resolution: {integrity: sha512-Eet/eeMhkO6TX8mnUteS9zgPbUMQa4I6Kkp5ORiBD5476/m+PIRiumP5tmh5ioJpH7k51Kehawy2UDfsnxxY8Q==} + dev: false - tmpl@1.0.5: {} + /tmpl@1.0.5: + resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} + dev: true - to-fast-properties@2.0.0: {} + /to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} - to-regex-range@5.0.1: + /to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} dependencies: is-number: 7.0.0 - toposort@2.0.2: {} + /toposort@2.0.2: + resolution: {integrity: sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg==} + dev: false - tough-cookie@4.1.4: + /tough-cookie@4.1.3: + resolution: {integrity: sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==} + engines: {node: '>=6'} dependencies: psl: 1.9.0 punycode: 2.3.1 universalify: 0.2.0 url-parse: 1.5.10 + dev: true - tr46@1.0.1: + /tr46@1.0.1: + resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} dependencies: punycode: 2.3.1 + dev: false - tr46@3.0.0: + /tr46@3.0.0: + resolution: {integrity: sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==} + engines: {node: '>=12'} dependencies: punycode: 2.3.1 + dev: true - triple-beam@1.4.1: {} + /triple-beam@1.4.1: + resolution: {integrity: sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==} + engines: {node: '>= 14.0.0'} + dev: true - ts-api-utils@1.3.0(typescript@5.4.5): + /ts-api-utils@1.3.0(typescript@5.4.5): + resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} + engines: {node: '>=16'} + peerDependencies: + typescript: '>=4.2.0' dependencies: typescript: 5.4.5 + dev: true - ts-jest@29.1.2(@babel/core@7.24.5)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.24.5))(jest@29.7.0(@types/node@20.12.8)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.4.17)(@types/node@20.12.8)(typescript@5.4.5)))(typescript@5.4.5): + /ts-jest@29.1.2(@babel/core@7.24.3)(jest@29.7.0)(typescript@5.4.5): + resolution: {integrity: sha512-br6GJoH/WUX4pu7FbZXuWGKGNDuU7b8Uj77g/Sp7puZV6EXzuByl6JrECvm0MzVzSTkSHWTihsXt+5XYER5b+g==} + engines: {node: ^16.10.0 || ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@babel/core': '>=7.0.0-beta.0 <8' + '@jest/types': ^29.0.0 + babel-jest: ^29.0.0 + esbuild: '*' + jest: ^29.0.0 + typescript: '>=4.3 <6' + peerDependenciesMeta: + '@babel/core': + optional: true + '@jest/types': + optional: true + babel-jest: + optional: true + esbuild: + optional: true dependencies: + '@babel/core': 7.24.3 bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@20.12.8)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.4.17)(@types/node@20.12.8)(typescript@5.4.5)) + jest: 29.7.0(@types/node@20.12.8)(ts-node@10.9.2) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -9792,15 +8531,24 @@ snapshots: semver: 7.6.0 typescript: 5.4.5 yargs-parser: 21.1.1 - optionalDependencies: - '@babel/core': 7.24.5 - '@jest/types': 29.6.3 - babel-jest: 29.7.0(@babel/core@7.24.5) + dev: true - ts-node@10.9.2(@swc/core@1.4.17)(@types/node@20.12.8)(typescript@5.4.5): + /ts-node@10.9.2(@types/node@20.12.8)(typescript@5.4.5): + resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true dependencies: '@cspotcode/source-map-support': 0.8.1 - '@tsconfig/node10': 1.0.11 + '@tsconfig/node10': 1.0.9 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 @@ -9814,45 +8562,83 @@ snapshots: typescript: 5.4.5 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 - optionalDependencies: - '@swc/core': 1.4.17 + dev: true - tsc-files@1.1.4(typescript@5.4.5): + /tsc-files@1.1.4(typescript@5.4.5): + resolution: {integrity: sha512-RePsRsOLru3BPpnf237y1Xe1oCGta8rmSYzM76kYo5tLGsv5R2r3s64yapYorGTPuuLyfS9NVbh9ydzmvNie2w==} + hasBin: true + peerDependencies: + typescript: '>=3' dependencies: typescript: 5.4.5 + dev: true - tsconfig-paths@3.15.0: + /tsconfig-paths@3.15.0: + resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} dependencies: '@types/json5': 0.0.29 json5: 1.0.2 minimist: 1.2.8 strip-bom: 3.0.0 + dev: true - tslib@2.6.2: {} + /tslib@2.6.2: + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + dev: true - type-check@0.4.0: + /type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} dependencies: prelude-ls: 1.2.1 + dev: true + + /type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + dev: true - type-detect@4.0.8: {} + /type-fest@0.16.0: + resolution: {integrity: sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==} + engines: {node: '>=10'} + dev: false - type-fest@0.16.0: {} + /type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + dev: true - type-fest@0.20.2: {} + /type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + dev: true - type-fest@0.21.3: {} + /type-fest@2.19.0: + resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} + engines: {node: '>=12.20'} + dev: false - type-fest@2.19.0: {} + /type-fest@3.13.1: + resolution: {integrity: sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==} + engines: {node: '>=14.16'} + dev: true - type-fest@4.18.1: {} + /type-fest@4.18.1: + resolution: {integrity: sha512-qXhgeNsX15bM63h5aapNFcQid9jRF/l3ojDoDFmekDQEUufZ9U4ErVt6SjDxnHp48Ltrw616R8yNc3giJ3KvVQ==} + engines: {node: '>=16'} + dev: true - typed-array-buffer@1.0.2: + /typed-array-buffer@1.0.2: + resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 es-errors: 1.3.0 is-typed-array: 1.1.13 - typed-array-byte-length@1.0.1: + /typed-array-byte-length@1.0.1: + resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 for-each: 0.3.3 @@ -9860,7 +8646,9 @@ snapshots: has-proto: 1.0.3 is-typed-array: 1.1.13 - typed-array-byte-offset@1.0.2: + /typed-array-byte-offset@1.0.2: + resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} + engines: {node: '>= 0.4'} dependencies: available-typed-arrays: 1.0.7 call-bind: 1.0.7 @@ -9869,7 +8657,9 @@ snapshots: has-proto: 1.0.3 is-typed-array: 1.1.13 - typed-array-length@1.0.6: + /typed-array-length@1.0.5: + resolution: {integrity: sha512-yMi0PlwuznKHxKmcpoOdeLwxBoVPkqZxd7q2FgMkmD3bNwvF5VW0+UlUQ1k1vmktTu4Yu13Q0RIxEP8+B+wloA==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 for-each: 0.3.3 @@ -9878,132 +8668,251 @@ snapshots: is-typed-array: 1.1.13 possible-typed-array-names: 1.0.0 - typescript@5.4.5: {} + /typescript@5.4.5: + resolution: {integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==} + engines: {node: '>=14.17'} + hasBin: true - unbox-primitive@1.0.2: + /unbox-primitive@1.0.2: + resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} dependencies: call-bind: 1.0.7 has-bigints: 1.0.2 has-symbols: 1.0.3 which-boxed-primitive: 1.0.2 - undici-types@5.26.5: {} + /undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} - undici@5.28.4: + /undici@5.28.4: + resolution: {integrity: sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==} + engines: {node: '>=14.0'} dependencies: '@fastify/busboy': 2.1.1 + dev: true - undici@6.15.0: {} + /undici@6.15.0: + resolution: {integrity: sha512-VviMt2tlMg1BvQ0FKXxrz1eJuyrcISrL2sPfBf7ZskX/FCEc/7LeThQaoygsMJpNqrATWQIsRVx+1Dpe4jaYuQ==} + engines: {node: '>=18.17'} + dev: true - unicode-canonical-property-names-ecmascript@2.0.0: {} + /unicode-canonical-property-names-ecmascript@2.0.0: + resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==} + engines: {node: '>=4'} + dev: false - unicode-match-property-ecmascript@2.0.0: + /unicode-match-property-ecmascript@2.0.0: + resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} + engines: {node: '>=4'} dependencies: unicode-canonical-property-names-ecmascript: 2.0.0 unicode-property-aliases-ecmascript: 2.1.0 + dev: false - unicode-match-property-value-ecmascript@2.1.0: {} + /unicode-match-property-value-ecmascript@2.1.0: + resolution: {integrity: sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==} + engines: {node: '>=4'} + dev: false - unicode-property-aliases-ecmascript@2.1.0: {} + /unicode-property-aliases-ecmascript@2.1.0: + resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} + engines: {node: '>=4'} + dev: false - unique-string@2.0.0: + /unique-string@2.0.0: + resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==} + engines: {node: '>=8'} dependencies: crypto-random-string: 2.0.0 + dev: false - universalify@0.2.0: {} + /universalify@0.2.0: + resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} + engines: {node: '>= 4.0.0'} + dev: true - universalify@2.0.1: {} + /universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + dev: false - upath@1.2.0: {} + /upath@1.2.0: + resolution: {integrity: sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==} + engines: {node: '>=4'} + dev: false - update-browserslist-db@1.0.14(browserslist@4.23.0): + /update-browserslist-db@1.0.13(browserslist@4.23.0): + resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' dependencies: browserslist: 4.23.0 escalade: 3.1.2 picocolors: 1.0.0 - uri-js@4.4.1: + /uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} dependencies: punycode: 2.3.1 - url-parse@1.5.10: + /url-parse@1.5.10: + resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} dependencies: querystringify: 2.2.0 requires-port: 1.0.0 + dev: true - use-sync-external-store@1.2.2(react@18.3.1): + /use-sync-external-store@1.2.0(react@18.3.1): + resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 dependencies: react: 18.3.1 + dev: false - util-deprecate@1.0.2: {} + /util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + dev: true - v8-compile-cache-lib@3.0.1: {} + /v8-compile-cache-lib@3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + dev: true - v8-to-istanbul@9.2.0: + /v8-to-istanbul@9.2.0: + resolution: {integrity: sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==} + engines: {node: '>=10.12.0'} dependencies: '@jridgewell/trace-mapping': 0.3.25 '@types/istanbul-lib-coverage': 2.0.6 convert-source-map: 2.0.0 + dev: true - vite-plugin-pwa@0.20.0(vite@5.2.11(@types/node@20.12.8)(terser@5.31.0))(workbox-build@7.1.0(@types/babel__core@7.20.5))(workbox-window@7.1.0): + /vite-plugin-pwa@0.20.0(vite@5.2.11)(workbox-build@7.1.0)(workbox-window@7.1.0): + resolution: {integrity: sha512-/kDZyqF8KqoXRpMUQtR5Atri/7BWayW8Gp7Kz/4bfstsV6zSFTxjREbXZYL7zSuRL40HGA+o2hvUAFRmC+bL7g==} + engines: {node: '>=16.0.0'} + peerDependencies: + '@vite-pwa/assets-generator': ^0.2.4 + vite: ^3.1.0 || ^4.0.0 || ^5.0.0 + workbox-build: ^7.1.0 + workbox-window: ^7.1.0 + peerDependenciesMeta: + '@vite-pwa/assets-generator': + optional: true dependencies: debug: 4.3.4 fast-glob: 3.3.2 pretty-bytes: 6.1.1 - vite: 5.2.11(@types/node@20.12.8)(terser@5.31.0) - workbox-build: 7.1.0(@types/babel__core@7.20.5) + vite: 5.2.11(@types/node@20.12.8) + workbox-build: 7.1.0 workbox-window: 7.1.0 transitivePeerDependencies: - supports-color + dev: false - vite@5.2.11(@types/node@20.12.8)(terser@5.31.0): + /vite@5.2.11(@types/node@20.12.8): + resolution: {integrity: sha512-HndV31LWW05i1BLPMUCE1B9E9GFbOu1MbenhS58FuK6owSO5qHm7GiCotrNY1YE5rMeQSFBGmT5ZaLEjFizgiQ==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true dependencies: + '@types/node': 20.12.8 esbuild: 0.20.2 postcss: 8.4.38 - rollup: 4.17.2 + rollup: 4.14.0 optionalDependencies: - '@types/node': 20.12.8 fsevents: 2.3.3 - terser: 5.31.0 - w3c-xmlserializer@4.0.0: + /w3c-xmlserializer@4.0.0: + resolution: {integrity: sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==} + engines: {node: '>=14'} dependencies: xml-name-validator: 4.0.0 + dev: true - walker@1.0.8: + /walker@1.0.8: + resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} dependencies: makeerror: 1.0.12 + dev: true - wcwidth@1.0.1: + /wcwidth@1.0.1: + resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} dependencies: defaults: 1.0.4 + dev: true - web-streams-polyfill@3.3.3: {} + /web-streams-polyfill@3.3.3: + resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} + engines: {node: '>= 8'} + dev: true - web-streams-polyfill@4.0.0: {} + /web-streams-polyfill@4.0.0: + resolution: {integrity: sha512-0zJXHRAYEjM2tUfZ2DiSOHAa2aw1tisnnhU3ufD57R8iefL+DcdJyRBRyJpG+NUimDgbTI/lH+gAE1PAvV3Cgw==} + engines: {node: '>= 8'} + dev: true - webidl-conversions@4.0.2: {} + /webidl-conversions@4.0.2: + resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} + dev: false - webidl-conversions@7.0.0: {} + /webidl-conversions@7.0.0: + resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} + engines: {node: '>=12'} + dev: true - whatwg-encoding@2.0.0: + /whatwg-encoding@2.0.0: + resolution: {integrity: sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==} + engines: {node: '>=12'} dependencies: iconv-lite: 0.6.3 + dev: true - whatwg-mimetype@3.0.0: {} + /whatwg-mimetype@3.0.0: + resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==} + engines: {node: '>=12'} + dev: true - whatwg-url@11.0.0: + /whatwg-url@11.0.0: + resolution: {integrity: sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==} + engines: {node: '>=12'} dependencies: tr46: 3.0.0 webidl-conversions: 7.0.0 + dev: true - whatwg-url@7.1.0: + /whatwg-url@7.1.0: + resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} dependencies: lodash.sortby: 4.7.0 tr46: 1.0.1 webidl-conversions: 4.0.2 + dev: false - which-boxed-primitive@1.0.2: + /which-boxed-primitive@1.0.2: + resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} dependencies: is-bigint: 1.0.4 is-boolean-object: 1.1.2 @@ -10011,7 +8920,9 @@ snapshots: is-string: 1.0.7 is-symbol: 1.0.4 - which-builtin-type@1.1.3: + /which-builtin-type@1.1.3: + resolution: {integrity: sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==} + engines: {node: '>= 0.4'} dependencies: function.prototype.name: 1.1.6 has-tostringtag: 1.0.2 @@ -10025,15 +8936,21 @@ snapshots: which-boxed-primitive: 1.0.2 which-collection: 1.0.2 which-typed-array: 1.1.15 + dev: true - which-collection@1.0.2: + /which-collection@1.0.2: + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} + engines: {node: '>= 0.4'} dependencies: is-map: 2.0.3 is-set: 2.0.3 is-weakmap: 2.0.2 is-weakset: 2.0.3 + dev: true - which-typed-array@1.1.15: + /which-typed-array@1.1.15: + resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} + engines: {node: '>= 0.4'} dependencies: available-typed-arrays: 1.0.7 call-bind: 1.0.7 @@ -10041,21 +8958,34 @@ snapshots: gopd: 1.0.1 has-tostringtag: 1.0.2 - which@2.0.2: + /which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true dependencies: isexe: 2.0.0 + dev: true - which@4.0.0: + /which@4.0.0: + resolution: {integrity: sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==} + engines: {node: ^16.13.0 || >=18.0.0} + hasBin: true dependencies: isexe: 3.1.1 + dev: true - winston-transport@4.7.0: + /winston-transport@4.7.0: + resolution: {integrity: sha512-ajBj65K5I7denzer2IYW6+2bNIVqLGDHqDw3Ow8Ohh+vdW+rv4MZ6eiDvHoKhfJFZ2auyN8byXieDDJ96ViONg==} + engines: {node: '>= 12.0.0'} dependencies: logform: 2.6.0 readable-stream: 3.6.2 triple-beam: 1.4.1 + dev: true - winston@3.13.0: + /winston@3.12.0: + resolution: {integrity: sha512-OwbxKaOlESDi01mC9rkM0dQqQt2I8DAUMRLZ/HpbwvDXm85IryEHgoogy5fziQy38PntgZsLlhAYHz//UPHZ5w==} + engines: {node: '>= 12.0.0'} dependencies: '@colors/colors': 1.6.0 '@dabh/diagnostics': 2.0.3 @@ -10068,30 +8998,35 @@ snapshots: stack-trace: 0.0.10 triple-beam: 1.4.1 winston-transport: 4.7.0 + dev: true - word-wrap@1.2.5: {} - - workbox-background-sync@7.1.0: + /workbox-background-sync@7.1.0: + resolution: {integrity: sha512-rMbgrzueVWDFcEq1610YyDW71z0oAXLfdRHRQcKw4SGihkfOK0JUEvqWHFwA6rJ+6TClnMIn7KQI5PNN1XQXwQ==} dependencies: idb: 7.1.1 workbox-core: 7.1.0 + dev: false - workbox-broadcast-update@7.1.0: + /workbox-broadcast-update@7.1.0: + resolution: {integrity: sha512-O36hIfhjej/c5ar95pO67k1GQw0/bw5tKP7CERNgK+JdxBANQhDmIuOXZTNvwb2IHBx9hj2kxvcDyRIh5nzOgQ==} dependencies: workbox-core: 7.1.0 + dev: false - workbox-build@7.1.0(@types/babel__core@7.20.5): + /workbox-build@7.1.0: + resolution: {integrity: sha512-F6R94XAxjB2j4ETMkP1EXKfjECOtDmyvt0vz3BzgWJMI68TNSXIVNkgatwUKBlPGOfy9n2F/4voYRNAhEvPJNg==} + engines: {node: '>=16.0.0'} dependencies: - '@apideck/better-ajv-errors': 0.3.6(ajv@8.13.0) - '@babel/core': 7.24.5 - '@babel/preset-env': 7.24.5(@babel/core@7.24.5) - '@babel/runtime': 7.24.5 - '@rollup/plugin-babel': 5.3.1(@babel/core@7.24.5)(@types/babel__core@7.20.5)(rollup@2.79.1) + '@apideck/better-ajv-errors': 0.3.6(ajv@8.12.0) + '@babel/core': 7.24.4 + '@babel/preset-env': 7.24.4(@babel/core@7.24.4) + '@babel/runtime': 7.24.4 + '@rollup/plugin-babel': 5.3.1(@babel/core@7.24.4)(rollup@2.79.1) '@rollup/plugin-node-resolve': 15.2.3(rollup@2.79.1) '@rollup/plugin-replace': 2.4.2(rollup@2.79.1) '@rollup/plugin-terser': 0.4.4(rollup@2.79.1) '@surma/rollup-plugin-off-main-thread': 2.2.3 - ajv: 8.13.0 + ajv: 8.12.0 common-tags: 1.8.2 fast-json-stable-stringify: 2.1.0 fs-extra: 9.1.0 @@ -10122,40 +9057,56 @@ snapshots: transitivePeerDependencies: - '@types/babel__core' - supports-color + dev: false - workbox-cacheable-response@7.1.0: + /workbox-cacheable-response@7.1.0: + resolution: {integrity: sha512-iwsLBll8Hvua3xCuBB9h92+/e0wdsmSVgR2ZlvcfjepZWwhd3osumQB3x9o7flj+FehtWM2VHbZn8UJeBXXo6Q==} dependencies: workbox-core: 7.1.0 + dev: false - workbox-core@7.1.0: {} + /workbox-core@7.1.0: + resolution: {integrity: sha512-5KB4KOY8rtL31nEF7BfvU7FMzKT4B5TkbYa2tzkS+Peqj0gayMT9SytSFtNzlrvMaWgv6y/yvP9C0IbpFjV30Q==} + dev: false - workbox-expiration@7.1.0: + /workbox-expiration@7.1.0: + resolution: {integrity: sha512-m5DcMY+A63rJlPTbbBNtpJ20i3enkyOtSgYfv/l8h+D6YbbNiA0zKEkCUaMsdDlxggla1oOfRkyqTvl5Ni5KQQ==} dependencies: idb: 7.1.1 workbox-core: 7.1.0 + dev: false - workbox-google-analytics@7.1.0: + /workbox-google-analytics@7.1.0: + resolution: {integrity: sha512-FvE53kBQHfVTcZyczeBVRexhh7JTkyQ8HAvbVY6mXd2n2A7Oyz/9fIwnY406ZcDhvE4NFfKGjW56N4gBiqkrew==} dependencies: workbox-background-sync: 7.1.0 workbox-core: 7.1.0 workbox-routing: 7.1.0 workbox-strategies: 7.1.0 + dev: false - workbox-navigation-preload@7.1.0: + /workbox-navigation-preload@7.1.0: + resolution: {integrity: sha512-4wyAbo0vNI/X0uWNJhCMKxnPanNyhybsReMGN9QUpaePLTiDpKxPqFxl4oUmBNddPwIXug01eTSLVIFXimRG/A==} dependencies: workbox-core: 7.1.0 + dev: false - workbox-precaching@7.1.0: + /workbox-precaching@7.1.0: + resolution: {integrity: sha512-LyxzQts+UEpgtmfnolo0hHdNjoB7EoRWcF7EDslt+lQGd0lW4iTvvSe3v5JiIckQSB5KTW5xiCqjFviRKPj1zA==} dependencies: workbox-core: 7.1.0 workbox-routing: 7.1.0 workbox-strategies: 7.1.0 + dev: false - workbox-range-requests@7.1.0: + /workbox-range-requests@7.1.0: + resolution: {integrity: sha512-m7+O4EHolNs5yb/79CrnwPR/g/PRzMFYEdo01LqwixVnc/sbzNSvKz0d04OE3aMRel1CwAAZQheRsqGDwATgPQ==} dependencies: workbox-core: 7.1.0 + dev: false - workbox-recipes@7.1.0: + /workbox-recipes@7.1.0: + resolution: {integrity: sha512-NRrk4ycFN9BHXJB6WrKiRX3W3w75YNrNrzSX9cEZgFB5ubeGoO8s/SDmOYVrFYp9HMw6sh1Pm3eAY/1gVS8YLg==} dependencies: workbox-cacheable-response: 7.1.0 workbox-core: 7.1.0 @@ -10163,83 +9114,148 @@ snapshots: workbox-precaching: 7.1.0 workbox-routing: 7.1.0 workbox-strategies: 7.1.0 + dev: false - workbox-routing@7.1.0: + /workbox-routing@7.1.0: + resolution: {integrity: sha512-oOYk+kLriUY2QyHkIilxUlVcFqwduLJB7oRZIENbqPGeBP/3TWHYNNdmGNhz1dvKuw7aqvJ7CQxn27/jprlTdg==} dependencies: workbox-core: 7.1.0 + dev: false - workbox-strategies@7.1.0: + /workbox-strategies@7.1.0: + resolution: {integrity: sha512-/UracPiGhUNehGjRm/tLUQ+9PtWmCbRufWtV0tNrALuf+HZ4F7cmObSEK+E4/Bx1p8Syx2tM+pkIrvtyetdlew==} dependencies: workbox-core: 7.1.0 + dev: false - workbox-streams@7.1.0: + /workbox-streams@7.1.0: + resolution: {integrity: sha512-WyHAVxRXBMfysM8ORwiZnI98wvGWTVAq/lOyBjf00pXFvG0mNaVz4Ji+u+fKa/mf1i2SnTfikoYKto4ihHeS6w==} dependencies: workbox-core: 7.1.0 workbox-routing: 7.1.0 + dev: false - workbox-sw@7.1.0: {} + /workbox-sw@7.1.0: + resolution: {integrity: sha512-Hml/9+/njUXBglv3dtZ9WBKHI235AQJyLBV1G7EFmh4/mUdSQuXui80RtjDeVRrXnm/6QWgRUEHG3/YBVbxtsA==} + dev: false - workbox-window@7.1.0: + /workbox-window@7.1.0: + resolution: {integrity: sha512-ZHeROyqR+AS5UPzholQRDttLFqGMwP0Np8MKWAdyxsDETxq3qOAyXvqessc3GniohG6e0mAqSQyKOHmT8zPF7g==} dependencies: '@types/trusted-types': 2.0.7 workbox-core: 7.1.0 + dev: false - wrap-ansi@6.2.0: + /wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} dependencies: ansi-styles: 4.3.0 string-width: 4.2.3 strip-ansi: 6.0.1 + dev: true - wrap-ansi@7.0.0: + /wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} dependencies: ansi-styles: 4.3.0 string-width: 4.2.3 strip-ansi: 6.0.1 + dev: true - wrap-ansi@8.1.0: + /wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} dependencies: ansi-styles: 6.2.1 string-width: 5.1.2 strip-ansi: 7.1.0 + dev: true - wrap-ansi@9.0.0: + /wrap-ansi@9.0.0: + resolution: {integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==} + engines: {node: '>=18'} dependencies: ansi-styles: 6.2.1 string-width: 7.1.0 strip-ansi: 7.1.0 + dev: true - wrappy@1.0.2: {} + /wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - write-file-atomic@4.0.2: + /write-file-atomic@4.0.2: + resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} dependencies: imurmurhash: 0.1.4 signal-exit: 3.0.7 + dev: true - ws@8.17.0: {} + /ws@8.16.0: + resolution: {integrity: sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dev: true - xml-name-validator@4.0.0: {} + /xml-name-validator@4.0.0: + resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} + engines: {node: '>=12'} + dev: true - xmlbuilder@15.1.1: {} + /xmlbuilder@15.1.1: + resolution: {integrity: sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==} + engines: {node: '>=8.0'} + dev: true - xmlchars@2.2.0: {} + /xmlchars@2.2.0: + resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + dev: true - xxhashjs@0.2.2: + /xxhashjs@0.2.2: + resolution: {integrity: sha512-AkTuIuVTET12tpsVIQo+ZU6f/qDmKuRUcjaqR+OIvm+aCBsZ95i7UVY5WJ9TMsSaZ0DA2WxoZ4acu0sPH+OKAw==} dependencies: cuint: 0.2.2 + dev: true - y18n@5.0.8: {} + /y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + dev: true - yallist@3.1.1: {} + /yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - yallist@4.0.0: {} + /yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + dev: true - yaml@1.10.2: {} + /yaml@1.10.2: + resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} + engines: {node: '>= 6'} + dev: false - yaml@2.3.4: {} + /yaml@2.3.4: + resolution: {integrity: sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==} + engines: {node: '>= 14'} + dev: true - yargs-parser@21.1.1: {} + /yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + dev: true - yargs@17.7.2: + /yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} dependencies: cliui: 8.0.1 escalade: 3.1.2 @@ -10248,14 +9264,23 @@ snapshots: string-width: 4.2.3 y18n: 5.0.8 yargs-parser: 21.1.1 + dev: true - yn@3.1.1: {} + /yn@3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} + dev: true - yocto-queue@0.1.0: {} + /yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + dev: true - yup@1.4.0: + /yup@1.4.0: + resolution: {integrity: sha512-wPbgkJRCqIf+OHyiTBQoJiP5PFuAXaWiJK6AmYkzQAh5/c2K9hzSApBZG5wV9KoKSePF7sAxmNSvh/13YHkFDg==} dependencies: property-expr: 2.0.6 tiny-case: 1.0.3 toposort: 2.0.2 type-fest: 2.19.0 + dev: false diff --git a/frontend/src/containers/ConfigStep/DateRangePicker/DateRangePicker.tsx b/frontend/src/containers/ConfigStep/DateRangePicker/DateRangePicker.tsx index 9dae32ca9b..06e694e416 100644 --- a/frontend/src/containers/ConfigStep/DateRangePicker/DateRangePicker.tsx +++ b/frontend/src/containers/ConfigStep/DateRangePicker/DateRangePicker.tsx @@ -44,8 +44,8 @@ export const DateRangePicker = ({ onRemove, rangeList, }: IRangePickerProps) => { - const isShowRemoveButton = rangeList && rangeList.length > 1; - const dateRangeGroupExcludeSelf = rangeList!.filter(({ sortIndex }: { sortIndex: number }) => sortIndex !== index); + const isShowRemoveButton = rangeList.length > 1; + const dateRangeGroupExcludeSelf = rangeList.filter(({ sortIndex }: { sortIndex: number }) => sortIndex !== index); const shouldStartDateDisableDate = isDateDisabled.bind(null, dateRangeGroupExcludeSelf); const shouldEndDateDisableDate = isDateDisabled.bind(null, dateRangeGroupExcludeSelf); const startDateFieldName = `dateRange[${index}].startDate`; @@ -76,15 +76,15 @@ export const DateRangePicker = ({ if (isNull(validationError)) { if (isNull(value)) { - onError?.('startDateError', BASIC_INFO_ERROR_MESSAGE.dateRange.startDate.required, index); + onError('startDateError', BASIC_INFO_ERROR_MESSAGE.dateRange.startDate.required, index); } setValue(startDateFieldName, result.startDate, { shouldValidate: true }); setValue(endDateFieldName, result.endDate, { shouldValidate: true }); - onChange?.(result, index); } else { setValue(startDateFieldName, AGGREGATED_DATE_ERROR_REASON, { shouldValidate: true }); - onError?.('startDateError', validationError, index); + onError('startDateError', validationError, index); } + onChange(result, index); }; const changeEndDate = (value: Nullable, { validationError }: { validationError: DateValidationError }) => { @@ -100,20 +100,18 @@ export const DateRangePicker = ({ if (isNull(validationError)) { if (isNull(value)) { - onError?.('endDateError', BASIC_INFO_ERROR_MESSAGE.dateRange.endDate.required, index); + onError('endDateError', BASIC_INFO_ERROR_MESSAGE.dateRange.endDate.required, index); } setValue(startDateFieldName, result.startDate, { shouldValidate: true }); setValue(endDateFieldName, result.endDate, { shouldValidate: true }); - onChange?.(result, index); } else { setValue(endDateFieldName, AGGREGATED_DATE_ERROR_REASON, { shouldValidate: true }); - onError?.('endDateError', validationError, index); + onError('endDateError', validationError, index); } + onChange(result, index); }; - const removeSelfHandler = () => { - onRemove?.(index); - }; + const removeSelfHandler = () => onRemove(index); return ( diff --git a/frontend/src/containers/ConfigStep/DateRangePicker/DateRangePickerGroup.tsx b/frontend/src/containers/ConfigStep/DateRangePicker/DateRangePickerGroup.tsx index 08dfc6cfe8..74558ed5d9 100644 --- a/frontend/src/containers/ConfigStep/DateRangePicker/DateRangePickerGroup.tsx +++ b/frontend/src/containers/ConfigStep/DateRangePicker/DateRangePickerGroup.tsx @@ -1,10 +1,10 @@ +import { SortedDateRangeType, sortFn, TProps, TSortErrorTypes } from '@src/containers/ConfigStep/DateRangePicker/types'; import { updateShouldGetBoardConfig, updateShouldGetPipelineConfig } from '@src/context/Metrics/metricsSlice'; -import { Props, SortedDateRangeType, sortFn } from '@src/containers/ConfigStep/DateRangePicker/types'; +import { selectDateRange, selectDateRangeSortType, updateDateRange } from '@src/context/config/configSlice'; import { DateRangePickerGroupContainer } from '@src/containers/ConfigStep/DateRangePicker/style'; import { DateRangePicker } from '@src/containers/ConfigStep/DateRangePicker/DateRangePicker'; import { ADD_TIME_RANGE_BUTTON_TEXT, MAX_TIME_RANGE_AMOUNT } from '@src/constants/resources'; import { BASIC_INFO_ERROR_MESSAGE } from '@src/containers/ConfigStep/Form/literal'; -import { selectDateRange, updateDateRange } from '@src/context/config/configSlice'; import { LocalizationProvider } from '@mui/x-date-pickers/LocalizationProvider'; import { useAppDispatch, useAppSelector } from '@src/hooks/useAppDispatch'; import { AddButton } from '@src/components/Common/AddButtonOneLine'; @@ -14,13 +14,11 @@ import { useFormContext } from 'react-hook-form'; import { Nullable } from '@src/utils/types'; import { useEffect, useState } from 'react'; import sortBy from 'lodash/sortBy'; -import remove from 'lodash/remove'; import isNull from 'lodash/isNull'; import get from 'lodash/get'; const deriveErrorMessageByDate = (date: Nullable, message: string) => (isNull(date) ? message : null); - -const fillDateRangeGroup = ( +const enhanceRangeWithMeta = ( item: { startDate: string | null; endDate: string | null; @@ -33,25 +31,29 @@ const fillDateRangeGroup = ( sortIndex: index, }); -export const DateRangePickerGroup = ({ sortType, onError }: Props) => { +export const DateRangePickerGroup = ({ onError }: TProps) => { const dispatch = useAppDispatch(); const dateRangeGroup = useAppSelector(selectDateRange); + const sortType = useAppSelector(selectDateRangeSortType); const isAddButtonDisabled = dateRangeGroup.length === MAX_TIME_RANGE_AMOUNT; - const [sortedDateRangeList, setSortedDateRangeList] = useState( - dateRangeGroup.map(fillDateRangeGroup), + const [rangeListWithMeta, setRangeListWithMeta] = useState( + dateRangeGroup.map(enhanceRangeWithMeta), ); const { setValue } = useFormContext(); useEffect(() => { - const rangeListWithErrors = sortedDateRangeList.filter( + const rangeListWithErrors = rangeListWithMeta.filter( ({ startDateError, endDateError }) => startDateError || endDateError, ); onError?.(rangeListWithErrors); - }, [onError, sortedDateRangeList]); + }, [onError, rangeListWithMeta]); - const handleError = (type: string, error: DateValidationError | string, index: number) => { - const newList = sortedDateRangeList.map((item) => ({ ...item, [type]: item.sortIndex === index ? error : null })); - setSortedDateRangeList(newList); + const handleError = (type: TSortErrorTypes, error: DateValidationError | string, index: number) => { + const newList = rangeListWithMeta.map((item) => ({ + ...item, + [type]: item.sortIndex === index ? error : item[type], + })); + setRangeListWithMeta(newList); }; const dispatchUpdateConfig = () => { @@ -60,8 +62,8 @@ export const DateRangePickerGroup = ({ sortType, onError }: Props) => { }; const addRangeHandler = () => { - const result = [...sortedDateRangeList, { startDate: null, endDate: null }]; - setSortedDateRangeList(result.map(fillDateRangeGroup)); + const result = [...rangeListWithMeta, { startDate: null, endDate: null }]; + setRangeListWithMeta(result.map(enhanceRangeWithMeta)); setValue( `dateRange`, result.map(({ startDate, endDate }) => ({ startDate, endDate })), @@ -74,7 +76,7 @@ export const DateRangePickerGroup = ({ sortType, onError }: Props) => { { startDate, endDate }: { startDate: string | null; endDate: string | null }, index: number, ) => { - const result = sortedDateRangeList.map((item) => + const result = rangeListWithMeta.map((item) => item.sortIndex === index ? { ...item, @@ -83,22 +85,23 @@ export const DateRangePickerGroup = ({ sortType, onError }: Props) => { startDateError: deriveErrorMessageByDate(startDate, BASIC_INFO_ERROR_MESSAGE.dateRange.startDate.required), endDateError: deriveErrorMessageByDate(endDate, BASIC_INFO_ERROR_MESSAGE.dateRange.endDate.required), } - : item, + : { ...item }, ); - setSortedDateRangeList(result); + setRangeListWithMeta(result); dispatchUpdateConfig(); dispatch(updateDateRange(result.map(({ startDate, endDate }) => ({ startDate, endDate })))); }; const handleRemove = (index: number) => { - const result = [...sortedDateRangeList]; - remove(result, ({ sortIndex }) => sortIndex === index); + const result = [...rangeListWithMeta] + .filter(({ sortIndex }) => sortIndex !== index) + .map((item, index) => ({ ...item, sortIndex: index })); setValue( `dateRange`, result.map(({ startDate, endDate }) => ({ startDate, endDate })), { shouldValidate: true }, ); - setSortedDateRangeList(result); + setRangeListWithMeta(result); dispatchUpdateConfig(); dispatch(updateDateRange(result.map(({ startDate, endDate }) => ({ startDate, endDate })))); }; @@ -106,7 +109,7 @@ export const DateRangePickerGroup = ({ sortType, onError }: Props) => { return ( - {sortBy(sortedDateRangeList, get(sortFn, sortType)).map(({ startDate, endDate, sortIndex }, index) => ( + {sortBy(rangeListWithMeta, get(sortFn, sortType)).map(({ startDate, endDate, sortIndex }, index) => ( { onChange={handleChange} onError={handleError} onRemove={handleRemove} - rangeList={sortedDateRangeList} + rangeList={rangeListWithMeta} /> ))} void; - sortType: SortType; + disabled: boolean; }; -export const SortingDateRange = ({ onChange, sortType }: Props) => { +export const SortingDateRange = ({ disabled }: Props) => { const dispatch = useAppDispatch(); - const [dateRangeSortType, setDateRangeSortType] = useState(sortType); + const currentSortType = useAppSelector(selectDateRangeSortType); const handleChangeSort = () => { - const totalSortTypes = Object.values(SortType).length; - const currentIndex = Object.values(SortType).indexOf(dateRangeSortType); + const sortTypes = Object.values(SortType); + const totalSortTypes = sortTypes.length; + const currentIndex = sortTypes.indexOf(currentSortType); const newIndex = (currentIndex + 1) % totalSortTypes; - const newSortType = Object.values(SortType)[newIndex]; + const newSortType = sortTypes[newIndex]; - setDateRangeSortType(newSortType); dispatch(updateDateRangeSortType(newSortType)); - onChange?.(newSortType); }; return ( - {SORTING_DATE_RANGE_TEXT[dateRangeSortType]} - - {dateRangeSortType === SortType.ASCENDING ? ( - + {SORTING_DATE_RANGE_TEXT[currentSortType]} + + {currentSortType === SortType.ASCENDING ? ( + ) : ( )} - {dateRangeSortType === SortType.DESCENDING ? ( - + {currentSortType === SortType.DESCENDING ? ( + ) : ( )} diff --git a/frontend/src/containers/ConfigStep/DateRangePicker/index.tsx b/frontend/src/containers/ConfigStep/DateRangePicker/index.tsx index c569792c4f..5e54fda6a3 100644 --- a/frontend/src/containers/ConfigStep/DateRangePicker/index.tsx +++ b/frontend/src/containers/ConfigStep/DateRangePicker/index.tsx @@ -1,29 +1,16 @@ import { DateRangePickerGroup } from '@src/containers/ConfigStep/DateRangePicker/DateRangePickerGroup'; -import { SortedDateRangeType, SortType } from '@src/containers/ConfigStep/DateRangePicker/types'; import { SortingDateRange } from '@src/containers/ConfigStep/DateRangePicker/SortingDateRange'; -import { selectDateRange, selectDateRangeSortType } from '@src/context/config/configSlice'; +import { SortedDateRangeType } from '@src/containers/ConfigStep/DateRangePicker/types'; import SectionTitleWithTooltip from '@src/components/Common/SectionTitleWithTooltip'; import { TitleContainer } from '@src/containers/ConfigStep/DateRangePicker/style'; +import { selectDateRange } from '@src/context/config/configSlice'; import { TIME_RANGE_TITLE, TIPS } from '@src/constants/resources'; import { useAppSelector } from '@src/hooks/useAppDispatch'; -import { useMemo, useState } from 'react'; +import { useState } from 'react'; export const DateRangePickerSection = () => { const dateRangeGroup = useAppSelector(selectDateRange); - const dateRangeGroupSortType = useAppSelector(selectDateRangeSortType); - const [sortType, setSortType] = useState(dateRangeGroupSortType); - const [hasError, setHasError] = useState(false); - const isDateRangeValid = useMemo(() => { - return dateRangeGroup.every((dateRange) => { - return dateRange.startDate && dateRange.endDate; - }); - }, [dateRangeGroup]); - - const handleSortTypeChange = (type: SortType) => { - setSortType(type); - }; - const handleError = (err: SortedDateRangeType[]) => { setHasError(!!err.length); }; @@ -38,11 +25,9 @@ export const DateRangePickerSection = () => { margin: '1rem 0', }} /> - {dateRangeGroup.length > 1 && isDateRangeValid && !hasError && ( - - )} + {dateRangeGroup.length > 1 && } - + ); }; diff --git a/frontend/src/containers/ConfigStep/DateRangePicker/style.tsx b/frontend/src/containers/ConfigStep/DateRangePicker/style.tsx index 66ec6ba7ae..f666b92e53 100644 --- a/frontend/src/containers/ConfigStep/DateRangePicker/style.tsx +++ b/frontend/src/containers/ConfigStep/DateRangePicker/style.tsx @@ -5,6 +5,10 @@ import { DatePicker } from '@mui/x-date-pickers'; import { styled } from '@mui/material/styles'; import { theme } from '@src/theme'; +type IconProps = { + disabled: boolean; +}; + export const DateRangePickerGroupContainer = styled('div')({ border: `${theme.main.cardBorder}`, borderRadius: '0.25rem', @@ -88,10 +92,12 @@ export const SortingButtoningContainer = styled('div')({ display: 'flex', }); -export const AscendingIcon = styled(ArrowDropUp)({ - color: theme.main.backgroundColor, -}); +export const AscendingIcon = styled(ArrowDropUp)(({ theme, disabled }) => ({ + color: disabled ? theme.main.button.disabled.color : theme.main.backgroundColor, + fontSize: 'inherit', +})); -export const DescendingIcon = styled(ArrowDropDown)({ - color: theme.main.backgroundColor, -}); +export const DescendingIcon = styled(ArrowDropDown)(({ theme, disabled }) => ({ + color: disabled ? theme.main.button.disabled.color : theme.main.backgroundColor, + fontSize: 'inherit', +})); diff --git a/frontend/src/containers/ConfigStep/DateRangePicker/types.ts b/frontend/src/containers/ConfigStep/DateRangePicker/types.ts index 31bad4a649..44185769c3 100644 --- a/frontend/src/containers/ConfigStep/DateRangePicker/types.ts +++ b/frontend/src/containers/ConfigStep/DateRangePicker/types.ts @@ -1,6 +1,8 @@ import { DateValidationError } from '@mui/x-date-pickers'; import dayjs from 'dayjs'; +export type TSortErrorTypes = 'startDateError' | 'endDateError'; + export type SortedDateRangeType = { startDate: string | null; endDate: string | null; @@ -14,10 +16,10 @@ export interface IRangePickerProps { endDate: string | null; index: number; key?: string | number; - onError?: (type: string, error: DateValidationError | string, index: number) => void; - onChange?: (data: { startDate: string | null; endDate: string | null }, index: number) => void; - onRemove?: (index: number) => void; - rangeList?: SortedDateRangeType[]; + onError: (type: TSortErrorTypes, error: DateValidationError | string, index: number) => void; + onChange: (data: { startDate: string | null; endDate: string | null }, index: number) => void; + onRemove: (index: number) => void; + rangeList: SortedDateRangeType[]; } export enum SortType { @@ -31,8 +33,7 @@ export const sortFn = { DESCENDING: ({ startDate }: SortedDateRangeType) => -dayjs(startDate).unix(), ASCENDING: ({ startDate }: SortedDateRangeType) => dayjs(startDate).unix(), }; -export type Props = { - sortType: SortType; +export type TProps = { onChange?: (data: SortedDateRangeType[]) => void; onError?: (data: SortedDateRangeType[]) => void; }; diff --git a/frontend/src/containers/MetricsStepper/index.tsx b/frontend/src/containers/MetricsStepper/index.tsx index 2b5de424c2..6cfd93f7c0 100644 --- a/frontend/src/containers/MetricsStepper/index.tsx +++ b/frontend/src/containers/MetricsStepper/index.tsx @@ -91,11 +91,6 @@ const MetricsStepper = () => { mode: 'onChange', }); - useEffect(() => { - basicInfoMethods.trigger(); - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []); - const { isValid: isBasicInfoValid } = basicInfoMethods.formState; const { isValid: isBoardConfigValid, isSubmitSuccessful: isBoardConfigSubmitSuccessful } = boardConfigMethods.formState; diff --git a/frontend/src/context/config/configSlice.ts b/frontend/src/context/config/configSlice.ts index 0cf6021d40..dc2e5370db 100644 --- a/frontend/src/context/config/configSlice.ts +++ b/frontend/src/context/config/configSlice.ts @@ -86,6 +86,8 @@ const getMetricsInfo = (metrics: string[]) => { }; }; +const isSortType = (value: string): value is SortType => Object.values(SortType).includes(value as SortType); + export const configSlice = createSlice({ name: 'config', initialState: { @@ -130,6 +132,8 @@ export const configSlice = createSlice({ Array.isArray(importedDateRanges) && importedDateRanges.length > MAX_TIME_RANGE_AMOUNT ? importedDateRanges.slice(0, MAX_TIME_RANGE_AMOUNT) : importedDateRanges; + const importedSortType = action.payload.sortType; + action.payload.sortType = isSortType(importedSortType) ? importedSortType : SortType.DEFAULT; state.basic.metrics = metrics; state.board.isShow = shouldBoardShow; state.pipelineTool.isShow = shouldPipelineToolShow; @@ -141,7 +145,8 @@ export const configSlice = createSlice({ isArray(importedDateRanges) && importedDateRanges.length > 0 && importedDateRanges.length <= 6 && - metrics.length > 0 + metrics.length > 0 && + ((importedDateRanges.length === 1 && !importedSortType) || isSortType(importedSortType)) ? null : MESSAGE.CONFIG_PAGE_VERIFY_IMPORT_ERROR; } From 63d4e328f3486aa9e3b994cf5908b5077dd8f5d7 Mon Sep 17 00:00:00 2001 From: Leiqiuhong <141199516+Leiqiuhong@users.noreply.github.com> Date: Mon, 6 May 2024 15:32:35 +0800 Subject: [PATCH 65/81] Adm-897 [frontend]: hide retry button (#1429) * ADM-879-hide-retry feat: hide retry button * ADM-879-hide-retry feat: add image into trivyignore --- .trivyignore | 1 + .../ReportStep/BoardMetrics/BoardMetrics.tsx | 34 ------------------- .../ReportStep/BoardMetrics/index.tsx | 16 ++++----- .../ReportStep/BoardMetrics/style.tsx | 30 ++++++++++++++++ .../ReportStep/DoraMetrics/index.tsx | 2 +- frontend/src/containers/ReportStep/index.tsx | 14 ++++---- frontend/src/hooks/useGenerateReportEffect.ts | 16 ++++----- 7 files changed, 55 insertions(+), 58 deletions(-) delete mode 100644 frontend/src/containers/ReportStep/BoardMetrics/BoardMetrics.tsx diff --git a/.trivyignore b/.trivyignore index 73db827c33..1c8434795d 100644 --- a/.trivyignore +++ b/.trivyignore @@ -16,5 +16,6 @@ CVE-2024-22259 CVE-2024-28085 CVE-2024-22262 CVE-2024-2961 +CVE-2024-33599 CVE-2019-10744 CVE-2024-33599 \ No newline at end of file diff --git a/frontend/src/containers/ReportStep/BoardMetrics/BoardMetrics.tsx b/frontend/src/containers/ReportStep/BoardMetrics/BoardMetrics.tsx deleted file mode 100644 index dcdafd59a7..0000000000 --- a/frontend/src/containers/ReportStep/BoardMetrics/BoardMetrics.tsx +++ /dev/null @@ -1,34 +0,0 @@ -import { styled } from '@mui/material/styles'; -import { theme } from '@src/theme'; - -export const StyledMetricsSection = styled('div')({ - marginTop: '2rem', -}); - -export const StyledTitleWrapper = styled('div')({ - display: 'flex', - alignItems: 'center', - marginBottom: '1rem', - position: 'relative', -}); - -export const StyledShowMore = styled('div')({ - marginLeft: '0.5rem', - fontSize: '0.8rem', - textDecoration: 'none', - color: theme.main.alert.info.iconColor, - cursor: 'pointer', -}); - -export const StyledLoading = styled('div')({ - position: 'relative', - left: '1rem', -}); - -export const StyledRetry = styled('div')({ - marginLeft: '0.5rem', - fontSize: '0.8rem', - textDecoration: 'none', - color: theme.main.alert.info.iconColor, - cursor: 'pointer', -}); diff --git a/frontend/src/containers/ReportStep/BoardMetrics/index.tsx b/frontend/src/containers/ReportStep/BoardMetrics/index.tsx index 3836b326cd..d72d48927b 100644 --- a/frontend/src/containers/ReportStep/BoardMetrics/index.tsx +++ b/frontend/src/containers/ReportStep/BoardMetrics/index.tsx @@ -1,3 +1,11 @@ +import { + GridContainer, + StyledLoading, + StyledMetricsSection, + StyledRetry, + StyledShowMore, + StyledTitleWrapper, +} from '@src/containers/ReportStep/BoardMetrics/style'; import { BOARD_METRICS, BOARD_METRICS_MAPPING, @@ -8,14 +16,6 @@ import { RETRY, SHOW_MORE, } from '@src/constants/resources'; -import { - StyledLoading, - StyledMetricsSection, - StyledRetry, - StyledShowMore, - StyledTitleWrapper, -} from '@src/containers/ReportStep/BoardMetrics/BoardMetrics'; -import { GridContainer } from '@src/containers/ReportStep/BoardMetrics/style'; import { ReportTitle } from '@src/components/Common/ReportGrid/ReportTitle'; import { selectMetricsContent } from '@src/context/Metrics/metricsSlice'; import { ReportResponseDTO } from '@src/clients/report/dto/response'; diff --git a/frontend/src/containers/ReportStep/BoardMetrics/style.tsx b/frontend/src/containers/ReportStep/BoardMetrics/style.tsx index a76fbca15c..adb5abd181 100644 --- a/frontend/src/containers/ReportStep/BoardMetrics/style.tsx +++ b/frontend/src/containers/ReportStep/BoardMetrics/style.tsx @@ -1,7 +1,37 @@ import { styled } from '@mui/material/styles'; +import { theme } from '@src/theme'; export const GridContainer = styled('div')({ display: 'flex', flexDirection: 'column', gap: '1rem', }); +export const StyledMetricsSection = styled('div')({ + marginTop: '2rem', +}); +export const StyledTitleWrapper = styled('div')({ + display: 'flex', + alignItems: 'center', + marginBottom: '1rem', + position: 'relative', +}); +export const StyledShowMore = styled('div')({ + marginLeft: '0.5rem', + fontSize: '0.8rem', + textDecoration: 'none', + color: theme.main.alert.info.iconColor, + cursor: 'pointer', +}); +export const StyledLoading = styled('div')({ + position: 'relative', + left: '1rem', +}); +export const StyledRetry = styled('div')({ + // todo: update retry logic + display: 'none', + marginLeft: '0.5rem', + fontSize: '0.8rem', + textDecoration: 'none', + color: theme.main.alert.info.iconColor, + cursor: 'pointer', +}); diff --git a/frontend/src/containers/ReportStep/DoraMetrics/index.tsx b/frontend/src/containers/ReportStep/DoraMetrics/index.tsx index 1879bb6b41..116ef2d3a4 100644 --- a/frontend/src/containers/ReportStep/DoraMetrics/index.tsx +++ b/frontend/src/containers/ReportStep/DoraMetrics/index.tsx @@ -12,11 +12,11 @@ import { import { StyledMetricsSection, StyledShowMore, StyledTitleWrapper } from '@src/containers/ReportStep/DoraMetrics/style'; import { formatMillisecondsToHours, formatMinToHours } from '@src/utils/util'; import { ReportTitle } from '@src/components/Common/ReportGrid/ReportTitle'; +import { StyledRetry } from '@src/containers/ReportStep/BoardMetrics/style'; import { ReportResponseDTO } from '@src/clients/report/dto/response'; import { StyledSpacing } from '@src/containers/ReportStep/style'; import { ReportGrid } from '@src/components/Common/ReportGrid'; import { selectConfig } from '@src/context/config/configSlice'; -import { StyledRetry } from '../BoardMetrics/BoardMetrics'; import { useAppSelector } from '@src/hooks'; import React from 'react'; import _ from 'lodash'; diff --git a/frontend/src/containers/ReportStep/index.tsx b/frontend/src/containers/ReportStep/index.tsx index 3f201a9398..72af57d453 100644 --- a/frontend/src/containers/ReportStep/index.tsx +++ b/frontend/src/containers/ReportStep/index.tsx @@ -83,7 +83,7 @@ const ReportStep = ({ handleSave }: ReportStepProps) => { const [pageType, setPageType] = useState(REPORT_PAGE_TYPE.SUMMARY); const [isCsvFileGeneratedAtEnd, setIsCsvFileGeneratedAtEnd] = useState(false); const [notifications4SummaryPage, setNotifications4SummaryPage] = useState[]>([]); - const [notificationIds, setNotificationIds] = useState([]); + const [errorNotificationIds, setErrorNotificationIds] = useState([]); const csvTimeStamp = useAppSelector(selectTimeStamp); const { @@ -234,10 +234,10 @@ const ReportStep = ({ handleSave }: ReportStepProps) => { }, [reportInfos, selectedDateRange]); useEffect(() => { - notificationIds.forEach((notificationId) => { + errorNotificationIds.forEach((notificationId) => { dispatch(closeNotification(notificationId)); }); - setNotificationIds([]); + setErrorNotificationIds([]); // eslint-disable-next-line react-hooks/exhaustive-deps }, [selectedDateRange]); @@ -310,7 +310,7 @@ const ReportStep = ({ handleSave }: ReportStepProps) => { if (!currentDataInfo.shouldShowBoardMetricsError) return; if (currentDataInfo.reportData?.reportMetricsError.boardMetricsError) { const notificationId = uniqueId(); - setNotificationIds((pre) => [...pre, notificationId]); + setErrorNotificationIds((pre) => [...pre, notificationId]); setNotifications4SummaryPage((prevState) => [ ...prevState, { @@ -328,7 +328,7 @@ const ReportStep = ({ handleSave }: ReportStepProps) => { if (!currentDataInfo.shouldShowPipelineMetricsError) return; if (currentDataInfo.reportData?.reportMetricsError.pipelineMetricsError) { const notificationId = uniqueId(); - setNotificationIds((pre) => [...pre, notificationId]); + setErrorNotificationIds((pre) => [...pre, notificationId]); setNotifications4SummaryPage((prevState) => [ ...prevState, { @@ -346,7 +346,7 @@ const ReportStep = ({ handleSave }: ReportStepProps) => { if (!currentDataInfo.shouldShowSourceControlMetricsError) return; if (currentDataInfo.reportData?.reportMetricsError.sourceControlMetricsError) { const notificationId = uniqueId(); - setNotificationIds((pre) => [...pre, notificationId]); + setErrorNotificationIds((pre) => [...pre, notificationId]); setNotifications4SummaryPage((prevState) => [ ...prevState, { @@ -421,7 +421,7 @@ const ReportStep = ({ handleSave }: ReportStepProps) => { if (!currentDataInfo[errorKey].shouldShow) return; if (currentDataInfo[errorKey].message) { const notificationId = uniqueId(); - setNotificationIds((pre) => [...pre, notificationId]); + setErrorNotificationIds((pre) => [...pre, notificationId]); setNotifications4SummaryPage((prevState) => [ ...prevState, { diff --git a/frontend/src/hooks/useGenerateReportEffect.ts b/frontend/src/hooks/useGenerateReportEffect.ts index ba03c492d9..85db63ff39 100644 --- a/frontend/src/hooks/useGenerateReportEffect.ts +++ b/frontend/src/hooks/useGenerateReportEffect.ts @@ -269,7 +269,7 @@ export const useGenerateReportEffect = (): IUseGenerateReportEffect => { }); }; - const shutReportInfosErrorStatus = (id: string, errorKey: string) => { + const closeReportInfosErrorStatus = (id: string, errorKey: string) => { setReportInfos((preReportInfos) => { return preReportInfos.map((reportInfo) => { if (reportInfo.id === id) { @@ -281,7 +281,7 @@ export const useGenerateReportEffect = (): IUseGenerateReportEffect => { }); }; - const shutBoardMetricsError = (id: string) => { + const closeBoardMetricsError = (id: string) => { setReportInfos((preReportInfos) => { return preReportInfos.map((reportInfo) => { if (reportInfo.id === id) { @@ -292,7 +292,7 @@ export const useGenerateReportEffect = (): IUseGenerateReportEffect => { }); }; - const shutPipelineMetricsError = (id: string) => { + const closePipelineMetricsError = (id: string) => { setReportInfos((preReportInfos) => { return preReportInfos.map((reportInfo) => { if (reportInfo.id === id) { @@ -303,7 +303,7 @@ export const useGenerateReportEffect = (): IUseGenerateReportEffect => { }); }; - const shutSourceControlMetricsError = (id: string) => { + const closeSourceControlMetricsError = (id: string) => { setReportInfos((preReportInfos) => { return preReportInfos.map((reportInfo) => { if (reportInfo.id === id) { @@ -318,10 +318,10 @@ export const useGenerateReportEffect = (): IUseGenerateReportEffect => { startToRequestData, stopPollingReports, reportInfos, - closeReportInfosErrorStatus: shutReportInfosErrorStatus, - closeBoardMetricsError: shutBoardMetricsError, - closePipelineMetricsError: shutPipelineMetricsError, - closeSourceControlMetricsError: shutSourceControlMetricsError, + closeReportInfosErrorStatus, + closeBoardMetricsError, + closePipelineMetricsError, + closeSourceControlMetricsError, hasPollingStarted, }; }; From 679b4c8760482b844f6f795826f48cf4c4d258cd Mon Sep 17 00:00:00 2001 From: guzhongren Date: Mon, 6 May 2024 22:55:01 +0800 Subject: [PATCH 66/81] fix(security): fix security issue --- ops/infra/cloudformation.yml | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/ops/infra/cloudformation.yml b/ops/infra/cloudformation.yml index e5357992db..0baaaa2ba3 100644 --- a/ops/infra/cloudformation.yml +++ b/ops/infra/cloudformation.yml @@ -64,11 +64,8 @@ Resources: - Action: - ecr:GetAuthorizationToken - ecr:BatchCheckLayerAvailability - - ecr:GetDownloadUrlForLayer - - ecr:GetRepositoryPolicy - - ecr:DescribeRepositories - - ecr:ListImages - ecr:BatchGetImage + - ecr:GetDownloadUrlForLayer Effect: Allow Resource: "*" Version: "2012-10-17" From 77d4dc8cb1d8c912d4c26fe6b8289eb12aad7ce0 Mon Sep 17 00:00:00 2001 From: Chao <89126516+mrcuriosity-tw@users.noreply.github.com> Date: Tue, 7 May 2024 10:40:06 +0800 Subject: [PATCH 67/81] [ADM-931] feat: disable the sort button given invalid date (#1431) --- .../DateRangePicker/DateRangePicker.tsx | 64 +++++++++++-------- .../DateRangePicker/DateRangePickerGroup.tsx | 26 +++----- .../ConfigStep/DateRangePicker/types.ts | 13 ++-- 3 files changed, 54 insertions(+), 49 deletions(-) diff --git a/frontend/src/containers/ConfigStep/DateRangePicker/DateRangePicker.tsx b/frontend/src/containers/ConfigStep/DateRangePicker/DateRangePicker.tsx index 06e694e416..583397156d 100644 --- a/frontend/src/containers/ConfigStep/DateRangePicker/DateRangePicker.tsx +++ b/frontend/src/containers/ConfigStep/DateRangePicker/DateRangePicker.tsx @@ -7,7 +7,7 @@ import { import { DEFAULT_SPRINT_INTERVAL_OFFSET_DAYS, REMOVE_BUTTON_TEXT, DATE_RANGE_FORMAT } from '@src/constants/resources'; import { isDateDisabled, calculateLastAvailableDate } from '@src/containers/ConfigStep/DateRangePicker/validation'; import { BASIC_INFO_ERROR_MESSAGE, AGGREGATED_DATE_ERROR_REASON } from '@src/containers/ConfigStep/Form/literal'; -import { IRangePickerProps } from '@src/containers/ConfigStep/DateRangePicker/types'; +import { IRangeOnChangeData, IRangePickerProps } from '@src/containers/ConfigStep/DateRangePicker/types'; import CalendarTodayIcon from '@mui/icons-material/CalendarToday'; import { DateValidationError } from '@mui/x-date-pickers'; import { TextField, TextFieldProps } from '@mui/material'; @@ -35,15 +35,7 @@ const HelperTextForEndDate = (props: TextFieldProps) => { return ; }; -export const DateRangePicker = ({ - startDate, - endDate, - index, - onError, - onChange, - onRemove, - rangeList, -}: IRangePickerProps) => { +export const DateRangePicker = ({ startDate, endDate, index, onChange, onRemove, rangeList }: IRangePickerProps) => { const isShowRemoveButton = rangeList.length > 1; const dateRangeGroupExcludeSelf = rangeList.filter(({ sortIndex }: { sortIndex: number }) => sortIndex !== index); const shouldStartDateDisableDate = isDateDisabled.bind(null, dateRangeGroupExcludeSelf); @@ -64,49 +56,65 @@ export const DateRangePicker = ({ : draftDaysAddition; } - const result = isNull(value) - ? { + let result: IRangeOnChangeData = { startDate: null, endDate: null, startDateError: null, endDateError: null }; + if (isNull(validationError)) { + if (isNull(value)) { + result = { startDate: null, endDate: null, - } - : { + startDateError: BASIC_INFO_ERROR_MESSAGE.dateRange.startDate.required, + endDateError: BASIC_INFO_ERROR_MESSAGE.dateRange.endDate.required, + }; + } else { + result = { startDate: value.startOf('date').format(DATE_RANGE_FORMAT), endDate: value.endOf('date').add(daysAddToEndDate, 'day').format(DATE_RANGE_FORMAT), + startDateError: null, + endDateError: null, }; - - if (isNull(validationError)) { - if (isNull(value)) { - onError('startDateError', BASIC_INFO_ERROR_MESSAGE.dateRange.startDate.required, index); } setValue(startDateFieldName, result.startDate, { shouldValidate: true }); setValue(endDateFieldName, result.endDate, { shouldValidate: true }); } else { + result = { + startDate: value!.startOf('date').format(DATE_RANGE_FORMAT), + endDate, + startDateError: BASIC_INFO_ERROR_MESSAGE.dateRange.startDate.invalid, + endDateError: rangeList.find((item) => item.sortIndex === index)!.endDateError, + }; setValue(startDateFieldName, AGGREGATED_DATE_ERROR_REASON, { shouldValidate: true }); - onError('startDateError', validationError, index); } onChange(result, index); }; const changeEndDate = (value: Nullable, { validationError }: { validationError: DateValidationError }) => { - const result = isNull(value) - ? { + let result: IRangeOnChangeData = { startDate: null, endDate: null, startDateError: null, endDateError: null }; + if (isNull(validationError)) { + if (isNull(value)) { + result = { startDate, endDate: null, - } - : { + startDateError: rangeList.find((item) => item.sortIndex === index)!.startDateError, + endDateError: BASIC_INFO_ERROR_MESSAGE.dateRange.endDate.required, + }; + } else { + result = { startDate, endDate: value.endOf('date').format(DATE_RANGE_FORMAT), + startDateError: null, + endDateError: null, }; - - if (isNull(validationError)) { - if (isNull(value)) { - onError('endDateError', BASIC_INFO_ERROR_MESSAGE.dateRange.endDate.required, index); } setValue(startDateFieldName, result.startDate, { shouldValidate: true }); setValue(endDateFieldName, result.endDate, { shouldValidate: true }); } else { + result = { + startDate, + endDate: value!.endOf('date').format(DATE_RANGE_FORMAT), + startDateError: rangeList.find((item) => item.sortIndex === index)!.startDateError, + endDateError: BASIC_INFO_ERROR_MESSAGE.dateRange.endDate.invalid, + }; setValue(endDateFieldName, AGGREGATED_DATE_ERROR_REASON, { shouldValidate: true }); - onError('endDateError', validationError, index); } onChange(result, index); }; diff --git a/frontend/src/containers/ConfigStep/DateRangePicker/DateRangePickerGroup.tsx b/frontend/src/containers/ConfigStep/DateRangePicker/DateRangePickerGroup.tsx index 74558ed5d9..e310760d4b 100644 --- a/frontend/src/containers/ConfigStep/DateRangePicker/DateRangePickerGroup.tsx +++ b/frontend/src/containers/ConfigStep/DateRangePicker/DateRangePickerGroup.tsx @@ -1,4 +1,9 @@ -import { SortedDateRangeType, sortFn, TProps, TSortErrorTypes } from '@src/containers/ConfigStep/DateRangePicker/types'; +import { + IRangeOnChangeData, + SortedDateRangeType, + sortFn, + TProps, +} from '@src/containers/ConfigStep/DateRangePicker/types'; import { updateShouldGetBoardConfig, updateShouldGetPipelineConfig } from '@src/context/Metrics/metricsSlice'; import { selectDateRange, selectDateRangeSortType, updateDateRange } from '@src/context/config/configSlice'; import { DateRangePickerGroupContainer } from '@src/containers/ConfigStep/DateRangePicker/style'; @@ -9,7 +14,6 @@ import { LocalizationProvider } from '@mui/x-date-pickers/LocalizationProvider'; import { useAppDispatch, useAppSelector } from '@src/hooks/useAppDispatch'; import { AddButton } from '@src/components/Common/AddButtonOneLine'; import { AdapterDayjs } from '@mui/x-date-pickers/AdapterDayjs'; -import { DateValidationError } from '@mui/x-date-pickers'; import { useFormContext } from 'react-hook-form'; import { Nullable } from '@src/utils/types'; import { useEffect, useState } from 'react'; @@ -48,14 +52,6 @@ export const DateRangePickerGroup = ({ onError }: TProps) => { onError?.(rangeListWithErrors); }, [onError, rangeListWithMeta]); - const handleError = (type: TSortErrorTypes, error: DateValidationError | string, index: number) => { - const newList = rangeListWithMeta.map((item) => ({ - ...item, - [type]: item.sortIndex === index ? error : item[type], - })); - setRangeListWithMeta(newList); - }; - const dispatchUpdateConfig = () => { dispatch(updateShouldGetBoardConfig(true)); dispatch(updateShouldGetPipelineConfig(true)); @@ -72,18 +68,15 @@ export const DateRangePickerGroup = ({ onError }: TProps) => { dispatch(updateDateRange(result.map(({ startDate, endDate }) => ({ startDate, endDate })))); }; - const handleChange = ( - { startDate, endDate }: { startDate: string | null; endDate: string | null }, - index: number, - ) => { + const handleChange = ({ startDate, endDate, startDateError, endDateError }: IRangeOnChangeData, index: number) => { const result = rangeListWithMeta.map((item) => item.sortIndex === index ? { ...item, startDate, endDate, - startDateError: deriveErrorMessageByDate(startDate, BASIC_INFO_ERROR_MESSAGE.dateRange.startDate.required), - endDateError: deriveErrorMessageByDate(endDate, BASIC_INFO_ERROR_MESSAGE.dateRange.endDate.required), + startDateError, + endDateError, } : { ...item }, ); @@ -116,7 +109,6 @@ export const DateRangePickerGroup = ({ onError }: TProps) => { index={sortIndex} key={index} onChange={handleChange} - onError={handleError} onRemove={handleRemove} rangeList={rangeListWithMeta} /> diff --git a/frontend/src/containers/ConfigStep/DateRangePicker/types.ts b/frontend/src/containers/ConfigStep/DateRangePicker/types.ts index 44185769c3..26337c4add 100644 --- a/frontend/src/containers/ConfigStep/DateRangePicker/types.ts +++ b/frontend/src/containers/ConfigStep/DateRangePicker/types.ts @@ -1,8 +1,7 @@ import { DateValidationError } from '@mui/x-date-pickers'; +import { Nullable } from '@src/utils/types'; import dayjs from 'dayjs'; -export type TSortErrorTypes = 'startDateError' | 'endDateError'; - export type SortedDateRangeType = { startDate: string | null; endDate: string | null; @@ -11,13 +10,19 @@ export type SortedDateRangeType = { endDateError: DateValidationError | string | null; }; +export interface IRangeOnChangeData { + startDate: Nullable; + endDate: Nullable; + startDateError: Nullable; + endDateError: Nullable; +} + export interface IRangePickerProps { startDate: string | null; endDate: string | null; index: number; key?: string | number; - onError: (type: TSortErrorTypes, error: DateValidationError | string, index: number) => void; - onChange: (data: { startDate: string | null; endDate: string | null }, index: number) => void; + onChange: (data: IRangeOnChangeData, index: number) => void; onRemove: (index: number) => void; rangeList: SortedDateRangeType[]; } From 827d783e39aab436e884377eb3060781cce8497f Mon Sep 17 00:00:00 2001 From: Steveay <907221539@qq.com> Date: Tue, 7 May 2024 18:09:55 +0800 Subject: [PATCH 68/81] ADM-928:[frontend]feat: add metrics failed date range viewer icon (#1432) * ADM-928:[frontend]feat: add failed time range list * ADM-928:[frontend]feat: add metrics board and pipeline failed time range * ADM-928:[frontend]feat: use priority high icon replace * ADM-928:[frontend]feat: add failed date range icon container style * ADM-928:[frontend]feat: move metrics failed time range logic * ADM-928:[frontend]feat: combine metrics time range logic * ADM-928:[frontend]feat: add update load metrics for update config * ADM-928:[frontend]test: add metrics failed date range viewer icon test * ADM-928:[frontend]feat: update px style * ADM-928:[frontend]refactor: update code conflict * ADM-928:[frontend]test: fix test * ADM-928:[frontend]test: fix jsdom test --- .../DateRangeViewer/DateRangeViewer.test.tsx | 37 ++++++++++++++++++- .../__tests__/context/stepperSlice.test.ts | 4 ++ .../__tests__/hooks/useGetBoardInfo.test.tsx | 21 ++++++++--- .../hooks/useGetMetricsStepsEffect.test.tsx | 2 +- frontend/package.json | 4 +- .../Common/DateRangeViewer/index.tsx | 12 +++++- .../Common/DateRangeViewer/style.tsx | 7 ++++ .../DateRangePicker/DateRangePickerGroup.tsx | 2 + .../PipelineMetricSelection/index.tsx | 2 +- frontend/src/context/stepper/StepperSlice.tsx | 15 +++++++- frontend/src/hooks/useGetBoardInfo.ts | 8 ++++ .../src/hooks/useGetMetricsStepsEffect.ts | 9 +++++ 12 files changed, 109 insertions(+), 14 deletions(-) diff --git a/frontend/__tests__/components/Common/DateRangeViewer/DateRangeViewer.test.tsx b/frontend/__tests__/components/Common/DateRangeViewer/DateRangeViewer.test.tsx index 879e0abe61..5ab80b37c1 100644 --- a/frontend/__tests__/components/Common/DateRangeViewer/DateRangeViewer.test.tsx +++ b/frontend/__tests__/components/Common/DateRangeViewer/DateRangeViewer.test.tsx @@ -1,12 +1,30 @@ +import { nextStep, updateFailedTimeRange } from '@src/context/stepper/StepperSlice'; import DateRangeViewer from '@src/components/Common/DateRangeViewer'; import { DateRange } from '@src/context/config/configSlice'; +import { setupStore } from '@test/utils/setupStoreUtil'; +import { render, screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; -import { render } from '@testing-library/react'; +import { Provider } from 'react-redux'; +import React from 'react'; describe('DateRangeViewer', () => { + let store = setupStore(); const setup = (dateRanges: DateRange) => { - return render(); + return render( + + + , + ); }; + + beforeEach(() => { + store = setupStore(); + }); + + afterEach(() => { + jest.clearAllMocks(); + }); + const mockDateRanges = [ { startDate: '2024-03-19T00:00:00.000+08:00', @@ -42,4 +60,19 @@ describe('DateRangeViewer', () => { expect(getByText(/2024\/03\/19/)).toBeInTheDocument(); expect(getByText(/2024\/03\/21/)).toBeInTheDocument(); }); + + it('should show priority high icon when click expand button and step number is 1', async () => { + const failedTimeRanges = ['1706716800000']; + store.dispatch(nextStep()); + store.dispatch(updateFailedTimeRange(failedTimeRanges)); + const { getByLabelText } = setup(mockDateRanges); + await userEvent.click(getByLabelText('expandMore')); + expect(screen.getByTestId('PriorityHighIcon')).toBeInTheDocument(); + }); + + it('should not show priority high icon when click expand button and step number is 0', async () => { + const { getByLabelText } = setup(mockDateRanges); + await userEvent.click(getByLabelText('expandMore')); + expect(screen.queryByTestId('PriorityHighIcon')).not.toBeInTheDocument(); + }); }); diff --git a/frontend/__tests__/context/stepperSlice.test.ts b/frontend/__tests__/context/stepperSlice.test.ts index 14d5d69cee..98c2ca1ef5 100644 --- a/frontend/__tests__/context/stepperSlice.test.ts +++ b/frontend/__tests__/context/stepperSlice.test.ts @@ -21,6 +21,7 @@ describe('stepper reducer', () => { stepNumber: 0, timeStamp: 0, shouldMetricsLoad: true, + failedTimeRange: [], }, nextStep(), ); @@ -34,6 +35,7 @@ describe('stepper reducer', () => { stepNumber: 0, timeStamp: 0, shouldMetricsLoad: true, + failedTimeRange: [], }, backStep(), ); @@ -47,6 +49,7 @@ describe('stepper reducer', () => { stepNumber: 2, timeStamp: 0, shouldMetricsLoad: true, + failedTimeRange: [], }, backStep(), ); @@ -61,6 +64,7 @@ describe('stepper reducer', () => { stepNumber: 2, timeStamp: 0, shouldMetricsLoad: true, + failedTimeRange: [], }, updateTimeStamp(mockTime), ); diff --git a/frontend/__tests__/hooks/useGetBoardInfo.test.tsx b/frontend/__tests__/hooks/useGetBoardInfo.test.tsx index e0a4ee8d8d..ff6ac62485 100644 --- a/frontend/__tests__/hooks/useGetBoardInfo.test.tsx +++ b/frontend/__tests__/hooks/useGetBoardInfo.test.tsx @@ -2,7 +2,10 @@ import { MOCK_BOARD_INFO_URL, FAKE_TOKEN, FAKE_DATE_EARLIER, FAKE_DATE_LATER } f import { AXIOS_REQUEST_ERROR_CODE } from '@src/constants/resources'; import { useGetBoardInfoEffect } from '@src/hooks/useGetBoardInfo'; import { renderHook, act, waitFor } from '@testing-library/react'; +import { setupStore } from '@test/utils/setupStoreUtil'; +import React, { ReactNode } from 'react'; import { HttpResponse, http } from 'msw'; +import { Provider } from 'react-redux'; import { setupServer } from 'msw/node'; import { HttpStatusCode } from 'axios'; @@ -33,8 +36,14 @@ describe('use get board info', () => { jest.clearAllMocks(); server.close(); }); + const store = setupStore(); + const wrapper = ({ children }: { children: ReactNode }) => { + return {children}; + }; + const setup = () => renderHook(() => useGetBoardInfoEffect(), { wrapper }); + it('should got init data when hook render', () => { - const { result } = renderHook(() => useGetBoardInfoEffect()); + const { result } = setup(); expect(result.current.isLoading).toBe(false); expect(result.current.errorMessage).toMatchObject({}); }); @@ -74,7 +83,7 @@ describe('use get board info', () => { }), ); - const { result } = renderHook(() => useGetBoardInfoEffect()); + const { result } = setup(); await act(() => { result.current.getBoardInfo(mockBoardConfig); }); @@ -119,7 +128,7 @@ describe('use get board info', () => { }); }), ); - const { result } = renderHook(() => useGetBoardInfoEffect()); + const { result } = setup(); await act(() => { result.current.getBoardInfo(mockBoardConfig); }); @@ -145,7 +154,7 @@ describe('use get board info', () => { ); }), ); - const { result } = renderHook(() => useGetBoardInfoEffect()); + const { result } = setup(); await act(() => { result.current.getBoardInfo(mockBoardConfig); }); @@ -199,8 +208,8 @@ describe('use get board info', () => { }, ), ); - const { result } = renderHook(() => useGetBoardInfoEffect()); - await act(() => { + const { result } = setup(); + act(() => { result.current.getBoardInfo(mockBoardConfig); }); }); diff --git a/frontend/__tests__/hooks/useGetMetricsStepsEffect.test.tsx b/frontend/__tests__/hooks/useGetMetricsStepsEffect.test.tsx index f979b73669..9d5e68a303 100644 --- a/frontend/__tests__/hooks/useGetMetricsStepsEffect.test.tsx +++ b/frontend/__tests__/hooks/useGetMetricsStepsEffect.test.tsx @@ -150,6 +150,6 @@ describe('use get steps effect', () => { }); expect(result.current.errorMessage).toEqual('Failed to get BuildKite steps: timeout'); - expect(mockDispatch).toHaveBeenCalledTimes(1); + expect(mockDispatch).toHaveBeenCalledTimes(7); }); }); diff --git a/frontend/package.json b/frontend/package.json index f8a38ec005..3830f6d994 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -12,8 +12,8 @@ "lint": "eslint -c .eslintrc.json ./ && prettier --check ./", "fix": "eslint -c .eslintrc.json --fix && npx prettier --write . --ignore-unknown", "audit": "npx audit-ci@^6 --config ./audit-ci.jsonc", - "test": "jest", - "test:watch": "jest --watchAll", + "test": "jest --env=jsdom", + "test:watch": "jest --env=jsdom --watchAll", "coverage": "jest --env=jsdom --watchAll=false --coverage", "coverage:silent": "jest --env=jsdom --watchAll=false --coverage --silent", "pre-e2e": "./scripts/generate-config-files.sh", diff --git a/frontend/src/components/Common/DateRangeViewer/index.tsx b/frontend/src/components/Common/DateRangeViewer/index.tsx index 0f5a3f69d4..14c20aa02a 100644 --- a/frontend/src/components/Common/DateRangeViewer/index.tsx +++ b/frontend/src/components/Common/DateRangeViewer/index.tsx @@ -1,15 +1,19 @@ import { DateRangeContainer, DateRangeExpandContainer, + DateRangeFailedIconContainer, SingleDateRange, StyledArrowForward, StyledCalendarToday, StyledDivider, StyledExpandMoreIcon, } from './style'; +import { selectFailedTimeRange, selectStepNumber } from '@src/context/stepper/StepperSlice'; import React, { useRef, useState, forwardRef, useEffect, useCallback } from 'react'; +import { formatDate, formatDateToTimestampString } from '@src/utils/util'; +import PriorityHighIcon from '@mui/icons-material/PriorityHigh'; import { DateRange } from '@src/context/config/configSlice'; -import { formatDate } from '@src/utils/util'; +import { useAppSelector } from '@src/hooks'; import { theme } from '@src/theme'; type Props = { @@ -22,6 +26,8 @@ type Props = { const DateRangeViewer = ({ dateRangeList, changeDateRange, selectedDateRange, disabledAll = true }: Props) => { const [showMoreDateRange, setShowMoreDateRange] = useState(false); const DateRangeExpandRef = useRef(null); + const failedTimeRange = useAppSelector(selectFailedTimeRange); + const stepNumber = useAppSelector(selectStepNumber); const handleClickOutside = useCallback((event: MouseEvent) => { if (DateRangeExpandRef.current && !DateRangeExpandRef.current?.contains(event.target as Node)) { @@ -46,12 +52,16 @@ const DateRangeViewer = ({ dateRangeList, changeDateRange, selectedDateRange, di {dateRangeList.map((dateRange) => { const disabled = dateRange.disabled || disabledAll; + const hasMetricsError = failedTimeRange.includes(formatDateToTimestampString(dateRange.startDate as string)); return ( handleClick(dateRange.startDate!)} key={dateRange.startDate!} > + + {hasMetricsError && stepNumber === 1 && } + {formatDate(dateRange.startDate as string)} {formatDate(dateRange.endDate as string)} diff --git a/frontend/src/components/Common/DateRangeViewer/style.tsx b/frontend/src/components/Common/DateRangeViewer/style.tsx index 760df7b6a7..d112b5369d 100644 --- a/frontend/src/components/Common/DateRangeViewer/style.tsx +++ b/frontend/src/components/Common/DateRangeViewer/style.tsx @@ -69,6 +69,13 @@ export const StyledArrowForward = styled(ArrowForward)({ fontSize: '0.875rem', }); +export const DateRangeFailedIconContainer = styled.div({ + minWidth: '1.25rem', + display: 'flex', + justifyContent: 'center', + alignItems: 'center', +}); + export const StyledCalendarToday = styled(CalendarToday)({ marginLeft: '1rem', fontSize: '.875rem', diff --git a/frontend/src/containers/ConfigStep/DateRangePicker/DateRangePickerGroup.tsx b/frontend/src/containers/ConfigStep/DateRangePicker/DateRangePickerGroup.tsx index e310760d4b..caab855a95 100644 --- a/frontend/src/containers/ConfigStep/DateRangePicker/DateRangePickerGroup.tsx +++ b/frontend/src/containers/ConfigStep/DateRangePicker/DateRangePickerGroup.tsx @@ -11,6 +11,7 @@ import { DateRangePicker } from '@src/containers/ConfigStep/DateRangePicker/Date import { ADD_TIME_RANGE_BUTTON_TEXT, MAX_TIME_RANGE_AMOUNT } from '@src/constants/resources'; import { BASIC_INFO_ERROR_MESSAGE } from '@src/containers/ConfigStep/Form/literal'; import { LocalizationProvider } from '@mui/x-date-pickers/LocalizationProvider'; +import { updateShouldMetricsLoad } from '@src/context/stepper/StepperSlice'; import { useAppDispatch, useAppSelector } from '@src/hooks/useAppDispatch'; import { AddButton } from '@src/components/Common/AddButtonOneLine'; import { AdapterDayjs } from '@mui/x-date-pickers/AdapterDayjs'; @@ -55,6 +56,7 @@ export const DateRangePickerGroup = ({ onError }: TProps) => { const dispatchUpdateConfig = () => { dispatch(updateShouldGetBoardConfig(true)); dispatch(updateShouldGetPipelineConfig(true)); + dispatch(updateShouldMetricsLoad(true)); }; const addRangeHandler = () => { diff --git a/frontend/src/containers/MetricsStep/DeploymentFrequencySettings/PipelineMetricSelection/index.tsx b/frontend/src/containers/MetricsStep/DeploymentFrequencySettings/PipelineMetricSelection/index.tsx index c2da87bd2e..c8468ebd9a 100644 --- a/frontend/src/containers/MetricsStep/DeploymentFrequencySettings/PipelineMetricSelection/index.tsx +++ b/frontend/src/containers/MetricsStep/DeploymentFrequencySettings/PipelineMetricSelection/index.tsx @@ -25,8 +25,8 @@ import { useGetMetricsStepsEffect } from '@src/hooks/useGetMetricsStepsEffect'; import { addNotification } from '@src/context/notification/NotificationSlice'; import { uniqPipelineListCrews, updateResponseCrews } from '@src/utils/util'; import { MESSAGE, NO_PIPELINE_STEP_ERROR } from '@src/constants/resources'; -import { ErrorNotification } from '@src/components/ErrorNotification'; import { shouldMetricsLoad } from '@src/context/stepper/StepperSlice'; +import { ErrorNotification } from '@src/components/ErrorNotification'; import { METRICS_DATA_FAIL_STATUS } from '@src/constants/commons'; import { useAppDispatch, useAppSelector } from '@src/hooks'; import { useEffect, useRef, useState } from 'react'; diff --git a/frontend/src/context/stepper/StepperSlice.tsx b/frontend/src/context/stepper/StepperSlice.tsx index 15051de290..2d75fa5403 100644 --- a/frontend/src/context/stepper/StepperSlice.tsx +++ b/frontend/src/context/stepper/StepperSlice.tsx @@ -6,12 +6,14 @@ export interface StepState { stepNumber: number; timeStamp: number; shouldMetricsLoad: boolean; + failedTimeRange: string[]; } const initialState: StepState = { stepNumber: 0, timeStamp: 0, shouldMetricsLoad: true, + failedTimeRange: [], }; export const stepperSlice = createSlice({ @@ -23,6 +25,9 @@ export const stepperSlice = createSlice({ state.timeStamp = initialState.timeStamp; }, nextStep: (state) => { + if (state.shouldMetricsLoad && state.stepNumber === 0) { + state.failedTimeRange = []; + } state.shouldMetricsLoad = true; state.stepNumber += 1; }, @@ -30,16 +35,24 @@ export const stepperSlice = createSlice({ state.shouldMetricsLoad = false; state.stepNumber = state.stepNumber === ZERO ? ZERO : state.stepNumber - 1; }, + updateShouldMetricsLoad: (state, action) => { + state.shouldMetricsLoad = action.payload; + }, updateTimeStamp: (state, action) => { state.timeStamp = action.payload; }, + updateFailedTimeRange: (state, action) => { + state.failedTimeRange = state.failedTimeRange.concat(action.payload); + }, }, }); -export const { resetStep, nextStep, backStep, updateTimeStamp } = stepperSlice.actions; +export const { resetStep, nextStep, backStep, updateShouldMetricsLoad, updateTimeStamp, updateFailedTimeRange } = + stepperSlice.actions; export const selectStepNumber = (state: RootState) => state.stepper.stepNumber; export const selectTimeStamp = (state: RootState) => state.stepper.timeStamp; export const shouldMetricsLoad = (state: RootState) => state.stepper.shouldMetricsLoad; +export const selectFailedTimeRange = (state: RootState) => state.stepper.failedTimeRange; export default stepperSlice.reducer; diff --git a/frontend/src/hooks/useGetBoardInfo.ts b/frontend/src/hooks/useGetBoardInfo.ts index 37d49dbdb8..72aab8791a 100644 --- a/frontend/src/hooks/useGetBoardInfo.ts +++ b/frontend/src/hooks/useGetBoardInfo.ts @@ -1,7 +1,10 @@ import { AXIOS_REQUEST_ERROR_CODE, BOARD_CONFIG_INFO_ERROR, BOARD_CONFIG_INFO_TITLE } from '@src/constants/resources'; +import { updateFailedTimeRange } from '@src/context/stepper/StepperSlice'; import { boardInfoClient } from '@src/clients/board/BoardInfoClient'; import { BoardInfoConfigDTO } from '@src/clients/board/dto/request'; import { METRICS_DATA_FAIL_STATUS } from '@src/constants/commons'; +import { formatDateToTimestampString } from '@src/utils/util'; +import { useAppDispatch } from '@src/hooks/index'; import { ReactNode, useState } from 'react'; import { HttpStatusCode } from 'axios'; import get from 'lodash/get'; @@ -64,9 +67,11 @@ const errorStatusMap = (status: METRICS_DATA_FAIL_STATUS) => { }; export const useGetBoardInfoEffect = (): useGetBoardInfoInterface => { + const dispatch = useAppDispatch(); const [isLoading, setIsLoading] = useState(false); const [errorMessage, setErrorMessage] = useState({}); const [boardInfoFailedStatus, setBoardInfoFailedStatus] = useState(METRICS_DATA_FAIL_STATUS.NOT_FAILED); + const localFailedTimeRange: string[] = []; const getBoardInfo = async (data: BoardInfoConfigDTO) => { setIsLoading(true); @@ -98,6 +103,7 @@ export const useGetBoardInfoEffect = (): useGetBoardInfoInterface => { if (!res.data) { errorCount++; localBoardInfoFailedStatus = METRICS_DATA_FAIL_STATUS.PARTIAL_FAILED_NO_CARDS; + localFailedTimeRange.push(formatDateToTimestampString(info.startDate as string)); setBoardInfoFailedStatus(METRICS_DATA_FAIL_STATUS.PARTIAL_FAILED_NO_CARDS); } return res; @@ -105,6 +111,7 @@ export const useGetBoardInfoEffect = (): useGetBoardInfoInterface => { .catch((err) => { errorCount++; localBoardInfoFailedStatus = boardInfoPartialFailedStatusMapping(err?.code); + localFailedTimeRange.push(formatDateToTimestampString(info.startDate as string)); setBoardInfoFailedStatus(localBoardInfoFailedStatus); return err; }); @@ -128,6 +135,7 @@ export const useGetBoardInfoEffect = (): useGetBoardInfoInterface => { }) .finally(() => { setIsLoading(false); + dispatch(updateFailedTimeRange(localFailedTimeRange)); }); } }; diff --git a/frontend/src/hooks/useGetMetricsStepsEffect.ts b/frontend/src/hooks/useGetMetricsStepsEffect.ts index 0c54841eac..6e4f839c4b 100644 --- a/frontend/src/hooks/useGetMetricsStepsEffect.ts +++ b/frontend/src/hooks/useGetMetricsStepsEffect.ts @@ -1,6 +1,7 @@ import { updateShouldRetryPipelineConfig } from '@src/context/Metrics/metricsSlice'; import { IStepsParams, IStepsRes, metricsClient } from '@src/clients/MetricsClient'; import { METRICS_DATA_FAIL_STATUS, DURATION } from '@src/constants/commons'; +import { updateFailedTimeRange } from '@src/context/stepper/StepperSlice'; import { useAppDispatch } from '@src/hooks/useAppDispatch'; import { TimeoutError } from '@src/errors/TimeoutError'; import { MESSAGE } from '@src/constants/resources'; @@ -48,6 +49,14 @@ export const useGetMetricsStepsEffect = (): useGetMetricsStepsEffectInterface => ); const hasRejected = allStepsRes.some((stepInfo) => stepInfo.status === 'rejected'); const hasFulfilled = allStepsRes.some((stepInfo) => stepInfo.status === 'fulfilled'); + const rejectedIndices = allStepsRes.reduce((indices: number[], stepInfo, index) => { + if (stepInfo.status === 'rejected') { + indices.push(index); + } + return indices; + }, []); + const rejectedTimeRanges = rejectedIndices.map((index) => params[index].startTime.toString()); + dispatch(updateFailedTimeRange(rejectedTimeRanges)); if (!hasRejected) { setStepFailedStatus(METRICS_DATA_FAIL_STATUS.NOT_FAILED); } else if (hasRejected && hasFulfilled) { From 07b1c577c096cd83f556b8b168cc71f861e070ee Mon Sep 17 00:00:00 2001 From: Steveay <907221539@qq.com> Date: Wed, 8 May 2024 22:30:10 +0800 Subject: [PATCH 69/81] ADM-928:[frontend]refactor: update code style and add features (#1433) * ADM-928:[frontend]refactor: update code style * ADM-928:[frontend]refactor: update rejected and fulfilled constants * fix(e2e): rename * fix(e2e): refactor * fix(e2e): format --------- Co-authored-by: guzhongren --- .../DateRangeViewer/DateRangeViewer.test.tsx | 9 ++++-- .../__tests__/context/stepperSlice.test.ts | 16 +++++------ frontend/jest.config.json | 2 +- frontend/jsdom.extended.ts | 25 ----------------- frontend/package.json | 8 +++--- .../Common/DateRangeViewer/index.tsx | 6 ++-- frontend/src/constants/resources.ts | 3 ++ .../DateRangePicker/DateRangePickerGroup.tsx | 4 +-- .../PipelineMetricSelection/index.tsx | 4 +-- frontend/src/containers/MetricsStep/index.tsx | 4 +-- frontend/src/context/stepper/StepperSlice.tsx | 28 +++++++++---------- frontend/src/hooks/useGetBoardInfo.ts | 8 +++--- .../src/hooks/useGetMetricsStepsEffect.ts | 14 +++++----- .../src/hooks/useGetPipelineToolInfoEffect.ts | 4 +-- frontend/tsconfig.json | 8 +----- 15 files changed, 61 insertions(+), 82 deletions(-) delete mode 100644 frontend/jsdom.extended.ts diff --git a/frontend/__tests__/components/Common/DateRangeViewer/DateRangeViewer.test.tsx b/frontend/__tests__/components/Common/DateRangeViewer/DateRangeViewer.test.tsx index 5ab80b37c1..86c9069273 100644 --- a/frontend/__tests__/components/Common/DateRangeViewer/DateRangeViewer.test.tsx +++ b/frontend/__tests__/components/Common/DateRangeViewer/DateRangeViewer.test.tsx @@ -1,5 +1,6 @@ import { nextStep, updateFailedTimeRange } from '@src/context/stepper/StepperSlice'; import DateRangeViewer from '@src/components/Common/DateRangeViewer'; +import { formatDateToTimestampString } from '@src/utils/util'; import { DateRange } from '@src/context/config/configSlice'; import { setupStore } from '@test/utils/setupStoreUtil'; import { render, screen } from '@testing-library/react'; @@ -62,17 +63,21 @@ describe('DateRangeViewer', () => { }); it('should show priority high icon when click expand button and step number is 1', async () => { - const failedTimeRanges = ['1706716800000']; + const failedTimeRangeList = [formatDateToTimestampString('2024-02-01T00:00:00.000+08:00')]; store.dispatch(nextStep()); - store.dispatch(updateFailedTimeRange(failedTimeRanges)); + store.dispatch(updateFailedTimeRange(failedTimeRangeList)); const { getByLabelText } = setup(mockDateRanges); + await userEvent.click(getByLabelText('expandMore')); + expect(screen.getByTestId('PriorityHighIcon')).toBeInTheDocument(); }); it('should not show priority high icon when click expand button and step number is 0', async () => { const { getByLabelText } = setup(mockDateRanges); + await userEvent.click(getByLabelText('expandMore')); + expect(screen.queryByTestId('PriorityHighIcon')).not.toBeInTheDocument(); }); }); diff --git a/frontend/__tests__/context/stepperSlice.test.ts b/frontend/__tests__/context/stepperSlice.test.ts index 98c2ca1ef5..b5af94c84f 100644 --- a/frontend/__tests__/context/stepperSlice.test.ts +++ b/frontend/__tests__/context/stepperSlice.test.ts @@ -20,8 +20,8 @@ describe('stepper reducer', () => { { stepNumber: 0, timeStamp: 0, - shouldMetricsLoad: true, - failedTimeRange: [], + shouldMetricsLoaded: true, + failedTimeRangeList: [], }, nextStep(), ); @@ -34,8 +34,8 @@ describe('stepper reducer', () => { { stepNumber: 0, timeStamp: 0, - shouldMetricsLoad: true, - failedTimeRange: [], + shouldMetricsLoaded: true, + failedTimeRangeList: [], }, backStep(), ); @@ -48,8 +48,8 @@ describe('stepper reducer', () => { { stepNumber: 2, timeStamp: 0, - shouldMetricsLoad: true, - failedTimeRange: [], + shouldMetricsLoaded: true, + failedTimeRangeList: [], }, backStep(), ); @@ -63,8 +63,8 @@ describe('stepper reducer', () => { { stepNumber: 2, timeStamp: 0, - shouldMetricsLoad: true, - failedTimeRange: [], + shouldMetricsLoaded: true, + failedTimeRangeList: [], }, updateTimeStamp(mockTime), ); diff --git a/frontend/jest.config.json b/frontend/jest.config.json index eaf91a9801..8c4a848129 100644 --- a/frontend/jest.config.json +++ b/frontend/jest.config.json @@ -7,7 +7,7 @@ "globalSetup": "./global-setup.ts", "setupFiles": ["./jest.polyfills.ts"], "setupFilesAfterEnv": ["/__tests__/setupTests.ts"], - "testEnvironment": "/jsdom.extended.ts", + "testEnvironment": "jsdom", "testRegex": "/__tests__/.*(test|spec)\\.(jsx?|tsx?|ts?)$", "moduleFileExtensions": ["ts", "tsx", "js", "jsx", "json", "node"], "moduleNameMapper": { diff --git a/frontend/jsdom.extended.ts b/frontend/jsdom.extended.ts deleted file mode 100644 index 4cf426208d..0000000000 --- a/frontend/jsdom.extended.ts +++ /dev/null @@ -1,25 +0,0 @@ -// eslint-disable-next-line @typescript-eslint/no-var-requires -const JSDOMEnvironment = require('jest-environment-jsdom').default; // or import JSDOMEnvironment from 'jest-environment-jsdom' if you are using ESM modules - -class JSDOMEnvironmentExtended extends JSDOMEnvironment { - constructor(...args: unknown[]) { - super(...args); - - this.global.ReadableStream = ReadableStream; - this.global.TextDecoder = TextDecoder; - this.global.TextEncoder = TextEncoder; - - this.global.Blob = Blob; - this.global.File = File; - this.global.Headers = Headers; - this.global.FormData = FormData; - this.global.Request = Request; - this.global.Response = Response; - this.global.Request = Request; - this.global.Response = Response; - this.global.fetch = fetch; - this.global.structuredClone = structuredClone; - } -} - -module.exports = JSDOMEnvironmentExtended; diff --git a/frontend/package.json b/frontend/package.json index 3830f6d994..a100def25d 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -12,10 +12,10 @@ "lint": "eslint -c .eslintrc.json ./ && prettier --check ./", "fix": "eslint -c .eslintrc.json --fix && npx prettier --write . --ignore-unknown", "audit": "npx audit-ci@^6 --config ./audit-ci.jsonc", - "test": "jest --env=jsdom", - "test:watch": "jest --env=jsdom --watchAll", - "coverage": "jest --env=jsdom --watchAll=false --coverage", - "coverage:silent": "jest --env=jsdom --watchAll=false --coverage --silent", + "test": "jest", + "test:watch": "jest --watchAll", + "coverage": "jest --watchAll=false --coverage", + "coverage:silent": "jest --watchAll=false --coverage --silent", "pre-e2e": "./scripts/generate-config-files.sh", "e2e": "pnpm exec playwright test", "e2e:major": "pnpm run pre-e2e && pnpm exec playwright test /major-path --project='Google Chrome'", diff --git a/frontend/src/components/Common/DateRangeViewer/index.tsx b/frontend/src/components/Common/DateRangeViewer/index.tsx index 14c20aa02a..d2091c1df5 100644 --- a/frontend/src/components/Common/DateRangeViewer/index.tsx +++ b/frontend/src/components/Common/DateRangeViewer/index.tsx @@ -26,7 +26,7 @@ type Props = { const DateRangeViewer = ({ dateRangeList, changeDateRange, selectedDateRange, disabledAll = true }: Props) => { const [showMoreDateRange, setShowMoreDateRange] = useState(false); const DateRangeExpandRef = useRef(null); - const failedTimeRange = useAppSelector(selectFailedTimeRange); + const failedTimeRangeList = useAppSelector(selectFailedTimeRange); const stepNumber = useAppSelector(selectStepNumber); const handleClickOutside = useCallback((event: MouseEvent) => { @@ -52,7 +52,9 @@ const DateRangeViewer = ({ dateRangeList, changeDateRange, selectedDateRange, di {dateRangeList.map((dateRange) => { const disabled = dateRange.disabled || disabledAll; - const hasMetricsError = failedTimeRange.includes(formatDateToTimestampString(dateRange.startDate as string)); + const hasMetricsError = failedTimeRangeList.includes( + formatDateToTimestampString(dateRange.startDate as string), + ); return ( { const dispatchUpdateConfig = () => { dispatch(updateShouldGetBoardConfig(true)); dispatch(updateShouldGetPipelineConfig(true)); - dispatch(updateShouldMetricsLoad(true)); + dispatch(updateShouldMetricsLoaded(true)); }; const addRangeHandler = () => { diff --git a/frontend/src/containers/MetricsStep/DeploymentFrequencySettings/PipelineMetricSelection/index.tsx b/frontend/src/containers/MetricsStep/DeploymentFrequencySettings/PipelineMetricSelection/index.tsx index c8468ebd9a..cba67b5d90 100644 --- a/frontend/src/containers/MetricsStep/DeploymentFrequencySettings/PipelineMetricSelection/index.tsx +++ b/frontend/src/containers/MetricsStep/DeploymentFrequencySettings/PipelineMetricSelection/index.tsx @@ -25,7 +25,7 @@ import { useGetMetricsStepsEffect } from '@src/hooks/useGetMetricsStepsEffect'; import { addNotification } from '@src/context/notification/NotificationSlice'; import { uniqPipelineListCrews, updateResponseCrews } from '@src/utils/util'; import { MESSAGE, NO_PIPELINE_STEP_ERROR } from '@src/constants/resources'; -import { shouldMetricsLoad } from '@src/context/stepper/StepperSlice'; +import { shouldMetricsLoaded } from '@src/context/stepper/StepperSlice'; import { ErrorNotification } from '@src/components/ErrorNotification'; import { METRICS_DATA_FAIL_STATUS } from '@src/constants/commons'; import { useAppDispatch, useAppSelector } from '@src/hooks'; @@ -73,7 +73,7 @@ export const PipelineMetricSelection = ({ const pipelineNameWarningMessage = selectPipelineNameWarningMessage(storeContext, id); const stepWarningMessage = selectStepWarningMessage(storeContext, id); const [isShowNoStepWarning, setIsShowNoStepWarning] = useState(false); - const shouldLoad = useAppSelector(shouldMetricsLoad); + const shouldLoad = useAppSelector(shouldMetricsLoaded); const pipelineList = useAppSelector(selectPipelineList); const shouldGetPipelineConfig = useAppSelector(selectShouldGetPipelineConfig); const isLoadingRef = useRef(false); diff --git a/frontend/src/containers/MetricsStep/index.tsx b/frontend/src/containers/MetricsStep/index.tsx index 14e917095e..83aad1385e 100644 --- a/frontend/src/containers/MetricsStep/index.tsx +++ b/frontend/src/containers/MetricsStep/index.tsx @@ -31,7 +31,7 @@ import { import { DeploymentFrequencySettings } from '@src/containers/MetricsStep/DeploymentFrequencySettings'; import { addNotification, closeAllNotifications } from '@src/context/notification/NotificationSlice'; import { Classification } from '@src/containers/MetricsStep/Classification'; -import { shouldMetricsLoad } from '@src/context/stepper/StepperSlice'; +import { shouldMetricsLoaded } from '@src/context/stepper/StepperSlice'; import DateRangeViewer from '@src/components/Common/DateRangeViewer'; import { useGetBoardInfoEffect } from '@src/hooks/useGetBoardInfo'; import { combineBoardInfo, sortDateRanges } from '@src/utils/util'; @@ -69,7 +69,7 @@ const MetricsStep = () => { cycleTimeSettingsType === CYCLE_TIME_SETTINGS_TYPES.BY_COLUMN && cycleTimeSettings.filter((e) => e.value === DONE).length > 1; const { getBoardInfo, isLoading, errorMessage, boardInfoFailedStatus } = useGetBoardInfoEffect(); - const shouldLoad = useAppSelector(shouldMetricsLoad); + const shouldLoad = useAppSelector(shouldMetricsLoaded); const shouldGetBoardConfig = useAppSelector(selectShouldGetBoardConfig); const getInfo = useCallback( diff --git a/frontend/src/context/stepper/StepperSlice.tsx b/frontend/src/context/stepper/StepperSlice.tsx index 2d75fa5403..1ce9c2e055 100644 --- a/frontend/src/context/stepper/StepperSlice.tsx +++ b/frontend/src/context/stepper/StepperSlice.tsx @@ -5,15 +5,15 @@ import type { RootState } from '@src/store'; export interface StepState { stepNumber: number; timeStamp: number; - shouldMetricsLoad: boolean; - failedTimeRange: string[]; + shouldMetricsLoaded: boolean; + failedTimeRangeList: string[]; } const initialState: StepState = { stepNumber: 0, timeStamp: 0, - shouldMetricsLoad: true, - failedTimeRange: [], + shouldMetricsLoaded: true, + failedTimeRangeList: [], }; export const stepperSlice = createSlice({ @@ -25,34 +25,34 @@ export const stepperSlice = createSlice({ state.timeStamp = initialState.timeStamp; }, nextStep: (state) => { - if (state.shouldMetricsLoad && state.stepNumber === 0) { - state.failedTimeRange = []; + if (state.shouldMetricsLoaded && state.stepNumber === 0) { + state.failedTimeRangeList = []; } - state.shouldMetricsLoad = true; + state.shouldMetricsLoaded = true; state.stepNumber += 1; }, backStep: (state) => { - state.shouldMetricsLoad = false; + state.shouldMetricsLoaded = false; state.stepNumber = state.stepNumber === ZERO ? ZERO : state.stepNumber - 1; }, - updateShouldMetricsLoad: (state, action) => { - state.shouldMetricsLoad = action.payload; + updateShouldMetricsLoaded: (state, action) => { + state.shouldMetricsLoaded = action.payload; }, updateTimeStamp: (state, action) => { state.timeStamp = action.payload; }, updateFailedTimeRange: (state, action) => { - state.failedTimeRange = state.failedTimeRange.concat(action.payload); + state.failedTimeRangeList = state.failedTimeRangeList.concat(action.payload); }, }, }); -export const { resetStep, nextStep, backStep, updateShouldMetricsLoad, updateTimeStamp, updateFailedTimeRange } = +export const { resetStep, nextStep, backStep, updateShouldMetricsLoaded, updateTimeStamp, updateFailedTimeRange } = stepperSlice.actions; export const selectStepNumber = (state: RootState) => state.stepper.stepNumber; export const selectTimeStamp = (state: RootState) => state.stepper.timeStamp; -export const shouldMetricsLoad = (state: RootState) => state.stepper.shouldMetricsLoad; -export const selectFailedTimeRange = (state: RootState) => state.stepper.failedTimeRange; +export const shouldMetricsLoaded = (state: RootState) => state.stepper.shouldMetricsLoaded; +export const selectFailedTimeRange = (state: RootState) => state.stepper.failedTimeRangeList; export default stepperSlice.reducer; diff --git a/frontend/src/hooks/useGetBoardInfo.ts b/frontend/src/hooks/useGetBoardInfo.ts index 72aab8791a..893ed7f3c9 100644 --- a/frontend/src/hooks/useGetBoardInfo.ts +++ b/frontend/src/hooks/useGetBoardInfo.ts @@ -71,7 +71,7 @@ export const useGetBoardInfoEffect = (): useGetBoardInfoInterface => { const [isLoading, setIsLoading] = useState(false); const [errorMessage, setErrorMessage] = useState({}); const [boardInfoFailedStatus, setBoardInfoFailedStatus] = useState(METRICS_DATA_FAIL_STATUS.NOT_FAILED); - const localFailedTimeRange: string[] = []; + const localFailedTimeRangeList: string[] = []; const getBoardInfo = async (data: BoardInfoConfigDTO) => { setIsLoading(true); @@ -103,7 +103,7 @@ export const useGetBoardInfoEffect = (): useGetBoardInfoInterface => { if (!res.data) { errorCount++; localBoardInfoFailedStatus = METRICS_DATA_FAIL_STATUS.PARTIAL_FAILED_NO_CARDS; - localFailedTimeRange.push(formatDateToTimestampString(info.startDate as string)); + localFailedTimeRangeList.push(formatDateToTimestampString(info.startDate as string)); setBoardInfoFailedStatus(METRICS_DATA_FAIL_STATUS.PARTIAL_FAILED_NO_CARDS); } return res; @@ -111,7 +111,7 @@ export const useGetBoardInfoEffect = (): useGetBoardInfoInterface => { .catch((err) => { errorCount++; localBoardInfoFailedStatus = boardInfoPartialFailedStatusMapping(err?.code); - localFailedTimeRange.push(formatDateToTimestampString(info.startDate as string)); + localFailedTimeRangeList.push(formatDateToTimestampString(info.startDate as string)); setBoardInfoFailedStatus(localBoardInfoFailedStatus); return err; }); @@ -135,7 +135,7 @@ export const useGetBoardInfoEffect = (): useGetBoardInfoInterface => { }) .finally(() => { setIsLoading(false); - dispatch(updateFailedTimeRange(localFailedTimeRange)); + dispatch(updateFailedTimeRange(localFailedTimeRangeList)); }); } }; diff --git a/frontend/src/hooks/useGetMetricsStepsEffect.ts b/frontend/src/hooks/useGetMetricsStepsEffect.ts index 6e4f839c4b..5ea8f5c59d 100644 --- a/frontend/src/hooks/useGetMetricsStepsEffect.ts +++ b/frontend/src/hooks/useGetMetricsStepsEffect.ts @@ -2,9 +2,9 @@ import { updateShouldRetryPipelineConfig } from '@src/context/Metrics/metricsSli import { IStepsParams, IStepsRes, metricsClient } from '@src/clients/MetricsClient'; import { METRICS_DATA_FAIL_STATUS, DURATION } from '@src/constants/commons'; import { updateFailedTimeRange } from '@src/context/stepper/StepperSlice'; +import { FULFILLED, MESSAGE, REJECTED } from '@src/constants/resources'; import { useAppDispatch } from '@src/hooks/useAppDispatch'; import { TimeoutError } from '@src/errors/TimeoutError'; -import { MESSAGE } from '@src/constants/resources'; import { useState } from 'react'; export interface useGetMetricsStepsEffectInterface { @@ -47,10 +47,10 @@ export const useGetMetricsStepsEffect = (): useGetMetricsStepsEffectInterface => return metricsClient.getSteps(param, organizationId, buildId, pipelineType, token); }), ); - const hasRejected = allStepsRes.some((stepInfo) => stepInfo.status === 'rejected'); - const hasFulfilled = allStepsRes.some((stepInfo) => stepInfo.status === 'fulfilled'); + const hasRejected = allStepsRes.some((stepInfo) => stepInfo.status === REJECTED); + const hasFulfilled = allStepsRes.some((stepInfo) => stepInfo.status === FULFILLED); const rejectedIndices = allStepsRes.reduce((indices: number[], stepInfo, index) => { - if (stepInfo.status === 'rejected') { + if (stepInfo.status === REJECTED) { indices.push(index); } return indices; @@ -60,7 +60,7 @@ export const useGetMetricsStepsEffect = (): useGetMetricsStepsEffectInterface => if (!hasRejected) { setStepFailedStatus(METRICS_DATA_FAIL_STATUS.NOT_FAILED); } else if (hasRejected && hasFulfilled) { - const rejectedStep = allStepsRes.find((stepInfo) => stepInfo.status === 'rejected'); + const rejectedStep = allStepsRes.find((stepInfo) => stepInfo.status === REJECTED); if ((rejectedStep as PromiseRejectedResult).reason.code == 400) { setStepFailedStatus(METRICS_DATA_FAIL_STATUS.PARTIAL_FAILED_4XX); } else { @@ -68,7 +68,7 @@ export const useGetMetricsStepsEffect = (): useGetMetricsStepsEffectInterface => } } setIsLoading(false); - if (allStepsRes.every((stepInfo) => stepInfo.status === 'rejected')) { + if (allStepsRes.every((stepInfo) => stepInfo.status === REJECTED)) { if (isAllTimeoutError(allStepsRes)) { dispatch(updateShouldRetryPipelineConfig(true)); setErrorMessageAndTime(pipelineType, TIMEOUT); @@ -79,7 +79,7 @@ export const useGetMetricsStepsEffect = (): useGetMetricsStepsEffectInterface => } return allStepsRes - .filter((stepInfo) => stepInfo.status === 'fulfilled') + .filter((stepInfo) => stepInfo.status === FULFILLED) .map((stepInfo) => (stepInfo as PromiseFulfilledResult).value) .reduce( (accumulator, currentValue) => { diff --git a/frontend/src/hooks/useGetPipelineToolInfoEffect.ts b/frontend/src/hooks/useGetPipelineToolInfoEffect.ts index 26138168c9..279e61c833 100644 --- a/frontend/src/hooks/useGetPipelineToolInfoEffect.ts +++ b/frontend/src/hooks/useGetPipelineToolInfoEffect.ts @@ -6,7 +6,7 @@ import { import { pipelineToolClient, IGetPipelineToolInfoResult } from '@src/clients/pipeline/PipelineToolClient'; import { selectShouldGetPipelineConfig, updatePipelineSettings } from '@src/context/Metrics/metricsSlice'; import { clearMetricsPipelineFormMeta } from '@src/context/meta/metaSlice'; -import { shouldMetricsLoad } from '@src/context/stepper/StepperSlice'; +import { shouldMetricsLoaded } from '@src/context/stepper/StepperSlice'; import { useEffect, useState, useRef, useCallback } from 'react'; import { useAppDispatch, useAppSelector } from '@src/hooks'; @@ -29,7 +29,7 @@ export const useGetPipelineToolInfoEffect = (): IUseVerifyPipeLineToolStateInter const [info, setInfo] = useState(defaultInfoStructure); const isProjectCreated = useAppSelector(selectIsProjectCreated); const restoredPipelineTool = useAppSelector(selectPipelineTool); - const shouldLoad = useAppSelector(shouldMetricsLoad); + const shouldLoad = useAppSelector(shouldMetricsLoaded); const shouldGetPipelineConfig = useAppSelector(selectShouldGetPipelineConfig); const [isFirstFetch, setIsFirstFetch] = useState(shouldGetPipelineConfig); diff --git a/frontend/tsconfig.json b/frontend/tsconfig.json index dd3f976b84..2c55ace78a 100644 --- a/frontend/tsconfig.json +++ b/frontend/tsconfig.json @@ -23,12 +23,6 @@ "types": ["node", "vite-plugin-pwa/react", "jest"] }, "include": ["src", "__tests__", "e2e", "*.ts"], - "exclude": [ - "__tests__/__mocks__/svgTransformer.ts", - "package.json", - "pnpm-lock.yaml", - "jsdom.extended.ts", - "jest.polyfills.ts" - ], + "exclude": ["__tests__/__mocks__/svgTransformer.ts", "package.json", "pnpm-lock.yaml", "jest.polyfills.ts"], "references": [{ "path": "./tsconfig.node.json" }, { "path": "./tsconfig.scripts.json" }] } From 081a690ab0b32b7b9aaa8502f1f1e4e949af51bf Mon Sep 17 00:00:00 2001 From: Leiqiuhong <141199516+Leiqiuhong@users.noreply.github.com> Date: Thu, 9 May 2024 16:34:30 +0800 Subject: [PATCH 70/81] Adm-936 [frontend]: When the first pipeline has no steps, it will not crash when adding the pipeline (#1434) * ADM-936 fix: remove the crash logic of pipeline * ADM-936 test: add e2e test * ADM-936 fix: fix eslint * ADM-936 test: add test * ADM-936 test: add unit test * ADM-936 fix: fix e2e test --- .../PipelineMetricSelection.test.tsx | 2 +- .../__tests__/context/metricsSlice.test.ts | 6 ++++ frontend/__tests__/utils/Util.test.tsx | 35 +++++++++++++++++++ frontend/e2e/pages/metrics/metrics-step.ts | 22 +++++++++--- .../e2e/specs/side-path/unhappy-path.spec.ts | 5 ++- frontend/src/clients/pipeline/dto/response.ts | 4 +-- .../PipelineMetricSelection/index.tsx | 32 ++++++++--------- frontend/src/context/Metrics/metricsSlice.ts | 10 +++--- frontend/src/context/config/configSlice.ts | 4 +-- .../pipelineTool/verifyResponseSlice.ts | 4 +-- frontend/src/utils/util.ts | 6 ++-- 11 files changed, 92 insertions(+), 38 deletions(-) diff --git a/frontend/__tests__/containers/MetricsStep/DeploymentFrequencySettings/PipelineMetricSelection.test.tsx b/frontend/__tests__/containers/MetricsStep/DeploymentFrequencySettings/PipelineMetricSelection.test.tsx index b93549b9d9..ea2b3b4a45 100644 --- a/frontend/__tests__/containers/MetricsStep/DeploymentFrequencySettings/PipelineMetricSelection.test.tsx +++ b/frontend/__tests__/containers/MetricsStep/DeploymentFrequencySettings/PipelineMetricSelection.test.tsx @@ -241,7 +241,7 @@ describe('PipelineMetricSelection', () => { }); await waitFor(() => { - expect(mockHandleClickRemoveButton).toHaveBeenCalledTimes(2); + expect(mockHandleClickRemoveButton).toHaveBeenCalledTimes(0); }); }); diff --git a/frontend/__tests__/context/metricsSlice.test.ts b/frontend/__tests__/context/metricsSlice.test.ts index 7ad58523ba..443f87d511 100644 --- a/frontend/__tests__/context/metricsSlice.test.ts +++ b/frontend/__tests__/context/metricsSlice.test.ts @@ -593,6 +593,12 @@ describe('saveMetricsSetting reducer', () => { expect(savedPipelineCrews.pipelineCrews).toBe(crews); }); + it('should return empty array given crews is undefined', () => { + const savedPipelineCrews = saveMetricsSettingReducer(initState, savePipelineCrews(undefined)); + + expect(savedPipelineCrews.pipelineCrews).toEqual([]); + }); + it('should update ShouldRetryPipelineConfig', async () => { store.dispatch(updateShouldRetryPipelineConfig(true)); expect(selectShouldRetryPipelineConfig(store.getState())).toEqual(true); diff --git a/frontend/__tests__/utils/Util.test.tsx b/frontend/__tests__/utils/Util.test.tsx index bd250764e2..6d08f05895 100644 --- a/frontend/__tests__/utils/Util.test.tsx +++ b/frontend/__tests__/utils/Util.test.tsx @@ -14,10 +14,12 @@ import { sortDateRanges, sortDisabledOptions, transformToCleanedBuildKiteEmoji, + updateResponseCrews, } from '@src/utils/util'; import { CleanedBuildKiteEmoji, OriginBuildKiteEmoji } from '@src/constants/emojis/emoji'; import { CYCLE_TIME_SETTINGS_TYPES, METRICS_CONSTANTS } from '@src/constants/resources'; import { ICycleTimeSetting, IPipelineConfig } from '@src/context/Metrics/metricsSlice'; +import { IPipeline } from '@src/context/config/pipelineTool/verifyResponseSlice'; import { BoardInfoResponse } from '@src/hooks/useGetBoardInfo'; import { EMPTY_STRING } from '@src/constants/commons'; import { PIPELINE_TOOL_TYPES } from '../fixtures'; @@ -570,3 +572,36 @@ describe('combineBoardInfo function', () => { expect(combineBoardData).toStrictEqual(expectResults); }); }); + +describe('updateResponseCrews function', () => { + const mockData = { + id: '0', + name: 'pipelineName', + orgId: '', + orgName: 'orgName', + repository: '', + steps: [] as string[], + branches: [] as string[], + crews: ['a', 'b', 'c'], + } as IPipeline; + it('should update crews when pipelineName and org both matched', () => { + const expectData = [ + { + ...mockData, + crews: [], + }, + ]; + const result = updateResponseCrews('orgName', 'pipelineName', [mockData]); + expect(result).toEqual(expectData); + }); + + it('should not update crews when pipelineName or org not matched', () => { + const expectData = [ + { + ...mockData, + }, + ]; + const result = updateResponseCrews('xxx', 'xxx', [mockData]); + expect(result).toEqual(expectData); + }); +}); diff --git a/frontend/e2e/pages/metrics/metrics-step.ts b/frontend/e2e/pages/metrics/metrics-step.ts index 7969a4978d..e8836a8277 100644 --- a/frontend/e2e/pages/metrics/metrics-step.ts +++ b/frontend/e2e/pages/metrics/metrics-step.ts @@ -582,13 +582,27 @@ export class MetricsStep { .getByLabel('Open') .nth(1) .click(); - await expect(this.page.getByRole('option', { name: firstPipelineConfig.pipelineName })).not.toBeEnabled(); } - async RemoveFirstNewPipeline() { - const pipelineList = this.pipelineSettingSection.getByText('Organization *Pipeline Name *Remove'); + async addNewPipelineAndSelectOrgAndName() { + await this.pipelineNewPipelineButton.click(); + await this.pipelineSettingSection.getByText('Organization *Remove').getByLabel('Open').click(); + await this.page.getByRole('option', { name: 'Thoughtworks-Heartbeat' }).click(); + await this.pipelineSettingSection + .getByText('Organization *Pipeline Name *Remove') + .getByLabel('Open') + .nth(1) + .click(); + await this.page.getByRole('option', { name: 'Heartbeat-E2E' }).click(); + } + + async checkPipelineLength(length: number) { + const pipelineLength = await this.pipelineSettingSection.getByText('Organization *').count(); + expect(pipelineLength).toEqual(length); + } - await pipelineList.nth(0).getByRole('button', { name: 'remove' }).click(); + async removePipeline(index: number) { + await this.pipelineSettingSection.getByText('Remove').nth(index).click(); } async checkPipelineFillNoStep(pipelineSettings: typeof metricsStepData.deployment) { diff --git a/frontend/e2e/specs/side-path/unhappy-path.spec.ts b/frontend/e2e/specs/side-path/unhappy-path.spec.ts index 68f0789a8d..ba00a2d2b3 100644 --- a/frontend/e2e/specs/side-path/unhappy-path.spec.ts +++ b/frontend/e2e/specs/side-path/unhappy-path.spec.ts @@ -56,6 +56,9 @@ test('unhappy path when import file', async ({ homePage, configStep, metricsStep await configStep.goToMetrics(); await metricsStep.checkBoardNoCard(); + await metricsStep.addNewPipelineAndSelectOrgAndName(); + await metricsStep.checkPipelineLength(2); + await metricsStep.removePipeline(1); await metricsStep.checkPipelineFillNoStep(importUnhappyPathProjectFromFile.deployment); await metricsStep.goToPreviousStep(); await configStep.typeInDateRange(dateRange); @@ -72,7 +75,7 @@ test('unhappy path when import file', async ({ homePage, configStep, metricsStep await metricsStep.selectCrews(modifiedCorrectProjectFromFile.crews); await metricsStep.deselectBranch(modifiedCorrectProjectFromFile.deletedBranch); await metricsStep.addNewPipelineAndSelectSamePipeline(importUnhappyPathProjectFromFile.deployment); - await metricsStep.RemoveFirstNewPipeline(); + await metricsStep.removePipeline(1); await metricsStep.selectDoneHeartbeatState(ModifiedhbStateData[6]); await metricsStep.validateNextButtonNotClickable(); await metricsStep.selectDoneHeartbeatState(hbStateData[6]); diff --git a/frontend/src/clients/pipeline/dto/response.ts b/frontend/src/clients/pipeline/dto/response.ts index f15061508c..8125bda16a 100644 --- a/frontend/src/clients/pipeline/dto/response.ts +++ b/frontend/src/clients/pipeline/dto/response.ts @@ -1,5 +1,5 @@ -import { pipeline } from '@src/context/config/pipelineTool/verifyResponseSlice'; +import { IPipeline } from '@src/context/config/pipelineTool/verifyResponseSlice'; export interface IPipelineInfoResponseDTO { - pipelineList: pipeline[]; + pipelineList: IPipeline[]; } diff --git a/frontend/src/containers/MetricsStep/DeploymentFrequencySettings/PipelineMetricSelection/index.tsx b/frontend/src/containers/MetricsStep/DeploymentFrequencySettings/PipelineMetricSelection/index.tsx index cba67b5d90..0b0614cf0e 100644 --- a/frontend/src/containers/MetricsStep/DeploymentFrequencySettings/PipelineMetricSelection/index.tsx +++ b/frontend/src/containers/MetricsStep/DeploymentFrequencySettings/PipelineMetricSelection/index.tsx @@ -110,24 +110,20 @@ export const PipelineMetricSelection = ({ ); setLoadingCompletedNumber((value) => Math.max(value - 1, 0)); getSteps(params, organizationId, buildId, pipelineType, token).then((res) => { - if (res && !res.haveStep) { - isShowRemoveButton && handleRemoveClick(); - } else { - const steps = res?.response ?? []; - const branches = res?.branches ?? []; - const pipelineCrews = res?.pipelineCrews ?? []; - dispatch( - updatePipelineToolVerifyResponseSteps({ - organization, - pipelineName: _pipelineName, - steps, - branches, - pipelineCrews, - }), - ); - res?.haveStep && dispatch(updatePipelineStep({ steps, id, type, branches, pipelineCrews })); - dispatch(updateShouldGetPipelineConfig(false)); - } + const steps = res?.response ?? []; + const branches = res?.branches ?? []; + const pipelineCrews = res?.pipelineCrews ?? []; + dispatch( + updatePipelineToolVerifyResponseSteps({ + organization, + pipelineName: _pipelineName, + steps, + branches, + pipelineCrews, + }), + ); + res?.haveStep && dispatch(updatePipelineStep({ steps, id, type, branches, pipelineCrews })); + dispatch(updateShouldGetPipelineConfig(false)); res && setIsShowNoStepWarning(!res.haveStep); }); }; diff --git a/frontend/src/context/Metrics/metricsSlice.ts b/frontend/src/context/Metrics/metricsSlice.ts index dca1ce04d3..c5f95e0f17 100644 --- a/frontend/src/context/Metrics/metricsSlice.ts +++ b/frontend/src/context/Metrics/metricsSlice.ts @@ -6,7 +6,7 @@ import { METRICS_CONSTANTS, } from '@src/constants/resources'; import { convertCycleTimeSettings, getSortedAndDeduplicationBoardingMapping } from '@src/utils/util'; -import { pipeline } from '@src/context/config/pipelineTool/verifyResponseSlice'; +import { IPipeline } from '@src/context/config/pipelineTool/verifyResponseSlice'; import _, { omit, uniqWith, isEqual, intersection, concat } from 'lodash'; import { createSlice } from '@reduxjs/toolkit'; import camelCase from 'lodash.camelcase'; @@ -309,7 +309,7 @@ export const metricsSlice = createSlice({ state.users = action.payload; }, savePipelineCrews: (state, action) => { - state.pipelineCrews = action.payload; + state.pipelineCrews = action.payload || []; }, updateCycleTimeSettings: (state, action) => { state.cycleTimeSettings = action.payload; @@ -477,11 +477,11 @@ export const metricsSlice = createSlice({ if (pipelineCrews) { state.pipelineCrews = setPipelineCrews(isProjectCreated, pipelineCrews, state.pipelineCrews); } - const orgNames: Array = _.uniq(pipelineList.map((item: pipeline) => item.orgName)); + const orgNames: Array = _.uniq(pipelineList.map((item: IPipeline) => item.orgName)); const filteredPipelineNames = (organization: string) => pipelineList - .filter((pipeline: pipeline) => pipeline.orgName.toLowerCase() === organization.toLowerCase()) - .map((item: pipeline) => item.name); + .filter((pipeline: IPipeline) => pipeline.orgName.toLowerCase() === organization.toLowerCase()) + .map((item: IPipeline) => item.name); const uniqueResponse = (res: IPipelineConfig[]) => { let itemsOmitId = uniqWith( diff --git a/frontend/src/context/config/configSlice.ts b/frontend/src/context/config/configSlice.ts index dc2e5370db..511dc8626a 100644 --- a/frontend/src/context/config/configSlice.ts +++ b/frontend/src/context/config/configSlice.ts @@ -10,7 +10,7 @@ import { import { initialPipelineToolState, IPipelineToolState } from '@src/context/config/pipelineTool/pipelineToolSlice'; import { initialSourceControlState, ISourceControl } from '@src/context/config/sourceControl/sourceControlSlice'; import { IBoardState, initialBoardState } from '@src/context/config/board/boardSlice'; -import { pipeline } from '@src/context/config/pipelineTool/verifyResponseSlice'; +import { IPipeline } from '@src/context/config/pipelineTool/verifyResponseSlice'; import { uniqPipelineListCrews, updateResponseCrews } from '@src/utils/util'; import { SortType } from '@src/containers/ConfigStep/DateRangePicker/types'; import { createSlice } from '@reduxjs/toolkit'; @@ -171,7 +171,7 @@ export const configSlice = createSlice({ }, updatePipelineToolVerifyResponse: (state, action) => { const { pipelineList } = action.payload; - state.pipelineTool.verifiedResponse.pipelineList = pipelineList.map((pipeline: pipeline) => ({ + state.pipelineTool.verifiedResponse.pipelineList = pipelineList.map((pipeline: IPipeline) => ({ ...pipeline, steps: [], })); diff --git a/frontend/src/context/config/pipelineTool/verifyResponseSlice.ts b/frontend/src/context/config/pipelineTool/verifyResponseSlice.ts index 40bffe4887..30f288e765 100644 --- a/frontend/src/context/config/pipelineTool/verifyResponseSlice.ts +++ b/frontend/src/context/config/pipelineTool/verifyResponseSlice.ts @@ -1,8 +1,8 @@ export interface IPipelineToolVerifyResponse { - pipelineList: pipeline[]; + pipelineList: IPipeline[]; } -export interface pipeline { +export interface IPipeline { id: string; name: string; orgId: string; diff --git a/frontend/src/utils/util.ts b/frontend/src/utils/util.ts index 98351fe3df..b523b79173 100644 --- a/frontend/src/utils/util.ts +++ b/frontend/src/utils/util.ts @@ -2,7 +2,7 @@ import { CYCLE_TIME_LIST, CYCLE_TIME_SETTINGS_TYPES, METRICS_CONSTANTS } from '@ import { CleanedBuildKiteEmoji, OriginBuildKiteEmoji } from '@src/constants/emojis/emoji'; import { ICycleTimeSetting, IPipelineConfig } from '@src/context/Metrics/metricsSlice'; import { ITargetFieldType } from '@src/components/Common/MultiAutoComplete/styles'; -import { pipeline } from '@src/context/config/pipelineTool/verifyResponseSlice'; +import { IPipeline } from '@src/context/config/pipelineTool/verifyResponseSlice'; import { includes, isEqual, sortBy, uniq, uniqBy } from 'lodash'; import { BoardInfoResponse } from '@src/hooks/useGetBoardInfo'; import { DATE_FORMAT_TEMPLATE } from '@src/constants/template'; @@ -159,7 +159,7 @@ export const convertCycleTimeSettings = ( return cycleTimeSettings?.map(({ status, value }: ICycleTimeSetting) => ({ [status]: value })); }; -export const updateResponseCrews = (organization: string, pipelineName: string, pipelineList: pipeline[]) => { +export const updateResponseCrews = (organization: string, pipelineName: string, pipelineList: IPipeline[]) => { return pipelineList.map((pipeline) => pipeline.name === pipelineName && pipeline.orgName === organization ? { @@ -170,7 +170,7 @@ export const updateResponseCrews = (organization: string, pipelineName: string, ); }; -export const uniqPipelineListCrews = (pipelineList: pipeline[]) => +export const uniqPipelineListCrews = (pipelineList: IPipeline[]) => uniq(pipelineList.flatMap(({ crews }) => crews)).filter((crew) => crew !== undefined); export function existBlockState(cycleTimeSettings: ICycleTimeSetting[]) { From 2eb02b036fcd1df4486f04c5d883dd6dacb9a992 Mon Sep 17 00:00:00 2001 From: zhou-yinyuan <147299494+zhou-yinyuan@users.noreply.github.com> Date: Fri, 10 May 2024 11:43:48 +0800 Subject: [PATCH 71/81] ADM-940 [frontend][backend]: fix the report file bug (#1437) * ADM-940 [frontend][backend]: fix the bug about deleting expired file * ADM-940 [frontend][backend]: fix the bug about deleting expired file * ADM-940 [frontend][backend]: modify test --- .../handler/base/AsyncDataBaseHandler.java | 2 +- .../report/GenerateReporterService.java | 2 +- .../handler/AsyncExceptionHandlerTest.java | 34 ++++++++++++------- .../handler/AsyncMetricsDataHandlerTest.java | 2 +- .../AsyncReportRequestHandlerTest.java | 12 +++++-- .../report/GenerateReporterServiceTest.java | 6 ++-- 6 files changed, 37 insertions(+), 21 deletions(-) diff --git a/backend/src/main/java/heartbeat/handler/base/AsyncDataBaseHandler.java b/backend/src/main/java/heartbeat/handler/base/AsyncDataBaseHandler.java index d1ead8f3ed..71c998c2d0 100644 --- a/backend/src/main/java/heartbeat/handler/base/AsyncDataBaseHandler.java +++ b/backend/src/main/java/heartbeat/handler/base/AsyncDataBaseHandler.java @@ -156,7 +156,7 @@ private void deleteOldFiles(FIleType fIleType, long currentTimeStamp, File direc for (File file : files) { String fileName = file.getName(); String[] splitResult = fileName.split(FILENAME_SPLIT_PATTERN); - String timeStamp = splitResult[1]; + String timeStamp = splitResult[3]; if (validateExpire(currentTimeStamp, Long.parseLong(timeStamp)) && !file.delete() && file.exists()) { log.error("Failed to deleted expired fIleType: {} file, file name: {}", fIleType.getType(), fileName); diff --git a/backend/src/main/java/heartbeat/service/report/GenerateReporterService.java b/backend/src/main/java/heartbeat/service/report/GenerateReporterService.java index 8936de4379..f31c422f08 100644 --- a/backend/src/main/java/heartbeat/service/report/GenerateReporterService.java +++ b/backend/src/main/java/heartbeat/service/report/GenerateReporterService.java @@ -337,7 +337,7 @@ private void deleteOldCSV(long currentTimeStamp, File directory) { for (File file : files) { String fileName = file.getName(); String[] splitResult = fileName.split("[-.]"); - String timeStamp = splitResult[1]; + String timeStamp = splitResult[3]; if (validateExpire(currentTimeStamp, Long.parseLong(timeStamp)) && !file.delete() && file.exists()) { log.error("Failed to deleted expired CSV file, file name: {}", fileName); } diff --git a/backend/src/test/java/heartbeat/handler/AsyncExceptionHandlerTest.java b/backend/src/test/java/heartbeat/handler/AsyncExceptionHandlerTest.java index bbae219d2e..19aa8e5f71 100644 --- a/backend/src/test/java/heartbeat/handler/AsyncExceptionHandlerTest.java +++ b/backend/src/test/java/heartbeat/handler/AsyncExceptionHandlerTest.java @@ -34,6 +34,10 @@ class AsyncExceptionHandlerTest { public static final String APP_OUTPUT_ERROR = "./app/output/error"; + public static final String START_TIME = "20240417"; + + public static final String END_TIME = "20240418"; + @InjectMocks AsyncExceptionHandler asyncExceptionHandler; @@ -56,8 +60,8 @@ void shouldDeleteAsyncException() { long fileId = System.currentTimeMillis(); String currentTime = Long.toString(fileId); String expireTime = Long.toString(fileId - 1900000L); - String unExpireFile = IdUtil.getBoardReportFileId(currentTime); - String expireFile = IdUtil.getBoardReportFileId(expireTime); + String unExpireFile = getBoardReportFileId(currentTime); + String expireFile = getBoardReportFileId(expireTime); asyncExceptionHandler.put(unExpireFile, new UnauthorizedException("")); asyncExceptionHandler.put(expireFile, new UnauthorizedException("")); @@ -74,8 +78,8 @@ void shouldDeleteAsyncExceptionTmpFile() { long fileId = System.currentTimeMillis(); String currentTime = Long.toString(fileId); String expireTime = Long.toString(fileId - 1900000L); - String unExpireFile = IdUtil.getBoardReportFileId(currentTime) + ".tmp"; - String expireFile = IdUtil.getBoardReportFileId(expireTime) + ".tmp"; + String unExpireFile = getBoardReportFileId(currentTime) + ".tmp"; + String expireFile = getBoardReportFileId(expireTime) + ".tmp"; asyncExceptionHandler.put(unExpireFile, new UnauthorizedException("")); asyncExceptionHandler.put(expireFile, new UnauthorizedException("")); @@ -92,8 +96,8 @@ void shouldSafeDeleteAsyncExceptionWhenHaveManyThordToDeleteFile() throws Interr long fileId = System.currentTimeMillis(); String currentTime = Long.toString(fileId); String expireTime = Long.toString(fileId - 1900000L); - String unExpireFile = IdUtil.getBoardReportFileId(currentTime); - String expireFile = IdUtil.getBoardReportFileId(expireTime); + String unExpireFile = getBoardReportFileId(currentTime); + String expireFile = getBoardReportFileId(expireTime); asyncExceptionHandler.put(unExpireFile, new UnauthorizedException("")); asyncExceptionHandler.put(expireFile, new UnauthorizedException("")); CyclicBarrier barrier = new CyclicBarrier(3); @@ -125,7 +129,7 @@ void shouldSafeDeleteAsyncExceptionWhenHaveManyThordToDeleteFile() throws Interr void shouldPutAndGetAsyncException() { long currentTimeMillis = System.currentTimeMillis(); String currentTime = Long.toString(currentTimeMillis); - String boardReportId = IdUtil.getBoardReportFileId(currentTime); + String boardReportId = getBoardReportFileId(currentTime); asyncExceptionHandler.put(boardReportId, new UnauthorizedException("test")); var baseException = asyncExceptionHandler.get(boardReportId); @@ -147,7 +151,7 @@ void shouldThrowExceptionGivenCantWriteFileWhenPutFile() { @Test void shouldThrowExceptionGivenCannotReadFileWhenGetFile() throws IOException { new File("./app/output/error/").mkdirs(); - String boardReportId = IdUtil.getBoardReportFileId(Long.toString(System.currentTimeMillis())); + String boardReportId = getBoardReportFileId(Long.toString(System.currentTimeMillis())); Path filePath = Paths.get("./app/output/error/" + boardReportId); Files.createFile(filePath); Files.write(filePath, "test".getBytes()); @@ -163,7 +167,7 @@ void shouldCreateTargetDirWhenPutAsyncException() { boolean mkdirs = new File(APP_OUTPUT_ERROR).mkdirs(); long currentTimeMillis = System.currentTimeMillis(); String currentTime = Long.toString(currentTimeMillis); - String boardReportId = IdUtil.getBoardReportFileId(currentTime); + String boardReportId = getBoardReportFileId(currentTime); asyncExceptionHandler.put(boardReportId, new UnauthorizedException("test")); @@ -177,7 +181,7 @@ void shouldCreateTargetDirWhenPutAsyncException() { void shouldPutAndRemoveAsyncException() { long currentTimeMillis = System.currentTimeMillis(); String currentTime = Long.toString(currentTimeMillis); - String boardReportId = IdUtil.getBoardReportFileId(currentTime); + String boardReportId = getBoardReportFileId(currentTime); asyncExceptionHandler.put(boardReportId, new UnauthorizedException("test")); AsyncExceptionDTO baseException = asyncExceptionHandler.remove(boardReportId); @@ -190,7 +194,7 @@ void shouldPutAndRemoveAsyncException() { @Test void shouldReturnExceptionGivenWrongFileWhenReadAndRemoveAsyncException() throws IOException { new File("./app/output/error/").mkdirs(); - String boardReportId = IdUtil.getBoardReportFileId(Long.toString(System.currentTimeMillis())); + String boardReportId = getBoardReportFileId(Long.toString(System.currentTimeMillis())); Path filePath = Paths.get("./app/output/error/" + boardReportId); Files.createFile(filePath); Files.write(filePath, "test".getBytes()); @@ -204,7 +208,7 @@ void shouldReturnExceptionGivenWrongFileWhenReadAndRemoveAsyncException() throws @Test void shouldThrowExceptionWhenDeleteFile() { File mockFile = mock(File.class); - when(mockFile.getName()).thenReturn("board-1683734399999"); + when(mockFile.getName()).thenReturn("board-20240417-20240418-1683734399999"); when(mockFile.delete()).thenThrow(new RuntimeException("test")); File[] mockFiles = new File[] { mockFile }; File directory = mock(File.class); @@ -217,7 +221,7 @@ void shouldThrowExceptionWhenDeleteFile() { @Test void shouldDeleteFailWhenDeleteFile() { File mockFile = mock(File.class); - when(mockFile.getName()).thenReturn("board-1683734399999"); + when(mockFile.getName()).thenReturn("board-20240417-20240418-1683734399999"); when(mockFile.delete()).thenReturn(false); when(mockFile.exists()).thenReturn(true); File[] mockFiles = new File[] { mockFile }; @@ -237,4 +241,8 @@ private void deleteTestFile(String reportId) { asyncExceptionHandler.remove(reportId); } + private String getBoardReportFileId(String timestamp) { + return "board-" + START_TIME + "-" + END_TIME + "-" + timestamp; + } + } diff --git a/backend/src/test/java/heartbeat/handler/AsyncMetricsDataHandlerTest.java b/backend/src/test/java/heartbeat/handler/AsyncMetricsDataHandlerTest.java index 612465955d..aacd2b7d74 100644 --- a/backend/src/test/java/heartbeat/handler/AsyncMetricsDataHandlerTest.java +++ b/backend/src/test/java/heartbeat/handler/AsyncMetricsDataHandlerTest.java @@ -90,7 +90,7 @@ class DeleteExpireMetricsDataCompletedFile { @Test void shouldDeleteMetricsDataReadyWhenMetricsFileIsExpire() throws IOException { long currentTimeMillis = System.currentTimeMillis(); - String prefix = "prefix-"; + String prefix = "prefix-20240417-20240418-"; String currentTimeFileId = prefix + currentTimeMillis; String expireTimeFileId = prefix + (currentTimeMillis - 1900000L); String expireTimeLockFileId = prefix + (currentTimeMillis - 1900000L) + ".lock"; diff --git a/backend/src/test/java/heartbeat/handler/AsyncReportRequestHandlerTest.java b/backend/src/test/java/heartbeat/handler/AsyncReportRequestHandlerTest.java index 85740864e6..a09cab1bac 100644 --- a/backend/src/test/java/heartbeat/handler/AsyncReportRequestHandlerTest.java +++ b/backend/src/test/java/heartbeat/handler/AsyncReportRequestHandlerTest.java @@ -25,6 +25,10 @@ class AsyncReportRequestHandlerTest { public static final String APP_OUTPUT_REPORT = "./app/output/report"; + public static final String START_TIME = "20240417"; + + public static final String END_TIME = "20240418"; + @InjectMocks AsyncReportRequestHandler asyncReportRequestHandler; @@ -47,8 +51,8 @@ void shouldDeleteReportWhenReportIsExpire() throws IOException { long currentTimeMillis = System.currentTimeMillis(); String currentTime = Long.toString(currentTimeMillis); String expireTime = Long.toString(currentTimeMillis - 1900000L); - String unExpireFile = IdUtil.getBoardReportFileId(currentTime); - String expireFile = IdUtil.getBoardReportFileId(expireTime); + String unExpireFile = getBoardReportFileId(currentTime); + String expireFile = getBoardReportFileId(expireTime); asyncReportRequestHandler.putReport(unExpireFile, ReportResponse.builder().build()); asyncReportRequestHandler.putReport(expireFile, ReportResponse.builder().build()); @@ -79,4 +83,8 @@ void shouldThrowGenerateReportExceptionGivenFileNameInvalidWhenHandlerPutData() () -> asyncReportRequestHandler.putReport("../", ReportResponse.builder().build())); } + private String getBoardReportFileId(String timestamp) { + return "board-" + START_TIME + "-" + END_TIME + "-" + timestamp; + } + } diff --git a/backend/src/test/java/heartbeat/service/report/GenerateReporterServiceTest.java b/backend/src/test/java/heartbeat/service/report/GenerateReporterServiceTest.java index f6786fdca1..d3f3083cf6 100644 --- a/backend/src/test/java/heartbeat/service/report/GenerateReporterServiceTest.java +++ b/backend/src/test/java/heartbeat/service/report/GenerateReporterServiceTest.java @@ -957,7 +957,7 @@ void shouldNotDeleteOldCsvWhenExportCsvWithoutOldCsvInsideThirtyMinutes() throws @Test void shouldDeleteFailWhenDeleteCSV() { File mockFile = mock(File.class); - when(mockFile.getName()).thenReturn("file1-1683734399999.CSV"); + when(mockFile.getName()).thenReturn("file1-20240417-20240418-1683734399999.CSV"); when(mockFile.delete()).thenReturn(false); File[] mockFiles = new File[] { mockFile }; File directory = mock(File.class); @@ -985,7 +985,7 @@ void shouldThrowExceptionWhenDeleteCSV() { @Test void shouldDeleteFailWhenDeleteFile() { File mockFile = mock(File.class); - when(mockFile.getName()).thenReturn("board-1683734399999"); + when(mockFile.getName()).thenReturn("board-20240417-20240418-1683734399999"); when(mockFile.delete()).thenReturn(false); when(mockFile.exists()).thenReturn(true); File[] mockFiles = new File[] { mockFile }; @@ -1000,7 +1000,7 @@ void shouldDeleteFailWhenDeleteFile() { @Test void shouldDeleteTempFailWhenDeleteFile() { File mockFile = mock(File.class); - when(mockFile.getName()).thenReturn("board-1683734399999.tmp"); + when(mockFile.getName()).thenReturn("board-20240417-20240418-1683734399999.tmp"); when(mockFile.delete()).thenReturn(true); when(mockFile.exists()).thenReturn(false); File[] mockFiles = new File[] { mockFile }; From 14f07feb6383c054db68b773dcb3e09311d7b59c Mon Sep 17 00:00:00 2001 From: TingyuDong <113588395+TingyuDong@users.noreply.github.com> Date: Fri, 10 May 2024 15:23:22 +0800 Subject: [PATCH 72/81] ADM-924: [frontend] could export multiple sets of data in report list page (#1436) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * ADM-924:[frontend]feat: add download dialog * ADM-924:[backend]feat: display time period * ADM-924:[frontend]feat: add button display logic * ADM-924:[frontend]feat: only show dialog when date range length > 1 * ADM-924:[frontend]feat: display dateRange * ADM-924:[frontend]feat: determine whether a single report can be downloaded by downloadReportList * ADM-924:[frontend]feat: map three sets of list results * ADM-924:[frontend]feat: optimize button disable logic in ReportButtonGroup * ADM-924:[frontend]feat: could select checkbox * ADM-924:[frontend]feat: download csv file in DownloadDialog * ADM-924:[frontend]feat: disable error items * ADM-924:[frontend]feat: add styles to DownloadDialog * ADM-924:[frontend]feat: add toolTip message * ADM-924:[frontend]feat: adjust the tooltip style * ADM-924:[frontend]feat: add background color for checked label * ADM-924:[frontend]feat: remove redundant params in ReportButtonGroup * ADM-924:[frontend]refactor: rename dateRangeItems to dateRangeList * ADM-924:[frontend]refactor: remove unnecessary reportData * ADM-924:[frontend]refactor: export DISABLED_DATE_RANGE_MESSAGE * ADM-924:[frontend]refactor: refactor code * ADM-924:[frontend]refactor: refactor ReportButtonGroup * ADM-924:[frontend]feat: add test * ADM-924:[frontend]feat: the confirm button is un-clickable if user didn’t select any time range * ADM-924:[frontend]feat: enable button only after all the reports completed * ADM-924:[frontend]feat: fetch dataRange data form request result * ADM-924:[frontend]feat: add some css style for DownloadDialog * ADM-924:[frontend]refactor: refactor some code * ADM-924:[frontend]feat: add test for DownloadDialog * ADM-924:[frontend]feat: add test for ReportButtonGroup * ADM-924:[frontend]feat: refactored and supplemented partial tests for ReportButtonGroup * ADM-924:[frontend]feat: added null value checks and refactored code * ADM-924:[frontend]refactor: refactor code & export colors * ADM-924:[frontend]refactor: refactor test for ReportButtonGroup * ADM-924:[frontend]refactor: refactor test & convert color to hex format * ADM-924:[frontend]refactor: align the type of overallMetricsCompleted with boardMetricsCompleted and doraMetricsCompleted in DateRangeRequestResult * ADM-924:[frontend]refactor: refactor exportCSV --- .../containers/ReportButtonGroup.test.tsx | 208 +++++++++++++++--- .../ReportStep/DownloadDialog.test.tsx | 106 +++++++++ frontend/src/constants/resources.ts | 3 +- .../containers/ReportButtonGroup/index.tsx | 99 ++++++--- .../ReportStep/DownloadDialog/index.tsx | 100 +++++++++ .../ReportStep/DownloadDialog/style.tsx | 80 +++++++ frontend/src/containers/ReportStep/index.tsx | 45 +++- frontend/src/theme.ts | 6 + 8 files changed, 583 insertions(+), 64 deletions(-) create mode 100644 frontend/__tests__/containers/ReportStep/DownloadDialog.test.tsx create mode 100644 frontend/src/containers/ReportStep/DownloadDialog/index.tsx create mode 100644 frontend/src/containers/ReportStep/DownloadDialog/style.tsx diff --git a/frontend/__tests__/containers/ReportButtonGroup.test.tsx b/frontend/__tests__/containers/ReportButtonGroup.test.tsx index 2e01a9fc53..baaeb428c4 100644 --- a/frontend/__tests__/containers/ReportButtonGroup.test.tsx +++ b/frontend/__tests__/containers/ReportButtonGroup.test.tsx @@ -1,31 +1,95 @@ -import { EXPORT_METRIC_DATA, MOCK_REPORT_RESPONSE } from '../fixtures'; +import { EXPORT_BOARD_DATA, EXPORT_METRIC_DATA, EXPORT_PIPELINE_DATA } from '../fixtures'; import { ReportButtonGroup } from '@src/containers/ReportButtonGroup'; +import { DateRangeRequestResult } from '@src/containers/ReportStep'; +import { render, renderHook, screen } from '@testing-library/react'; +import { useExportCsvEffect } from '@src/hooks/useExportCsvEffect'; import { setupStore } from '@test/utils/setupStoreUtil'; -import { render, screen } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; import { Provider } from 'react-redux'; -describe('test', () => { +jest.mock('@src/hooks/useExportCsvEffect', () => ({ + useExportCsvEffect: jest.fn().mockReturnValue({ + fetchExportData: jest.fn(), + isExpired: false, + }), +})); + +describe('ReportButtonGroup', () => { + afterEach(() => { + jest.clearAllMocks(); + }); + const mockHandler = jest.fn(); - const mockData = { - ...MOCK_REPORT_RESPONSE, - exportValidityTime: 30, - reportMetricsError: { - boardMetricsError: { - status: 401, - message: 'Unauthorized', - }, - pipelineMetricsError: { - status: 401, - message: 'Unauthorized', - }, - sourceControlMetricsError: { - status: 401, - message: 'Unauthorized', - }, + const buttonNames = [EXPORT_METRIC_DATA, EXPORT_BOARD_DATA, EXPORT_PIPELINE_DATA]; + const basicMockError = { + boardMetricsError: { + status: 500, + message: 'mockError', + }, + pipelineMetricsError: { + status: 500, + message: 'mockError', + }, + sourceControlMetricsError: { + status: 500, + message: 'mockError', }, }; + const nullMockError = { + boardMetricsError: null, + pipelineMetricsError: null, + sourceControlMetricsError: null, + }; + + const firstBasicMockDateRangeRequestResult = { + startDate: '2024-01-01T00:00:00.000+08:00', + endDate: '2024-01-14T23:59:59.000+08:00', + overallMetricsCompleted: true, + boardMetricsCompleted: true, + doraMetricsCompleted: true, + reportMetricsError: nullMockError, + }; + const secondBasicMockDateRangeRequestResult = { + startDate: '2024-01-15T00:00:00.000+08:00', + endDate: '2024-01-31T23:59:59.000+08:00', + overallMetricsCompleted: true, + boardMetricsCompleted: true, + doraMetricsCompleted: true, + reportMetricsError: nullMockError, + }; + + const successMockData: DateRangeRequestResult[] = [ + firstBasicMockDateRangeRequestResult, + secondBasicMockDateRangeRequestResult, + ]; + const pendingMockData: DateRangeRequestResult[] = [ + firstBasicMockDateRangeRequestResult, + { + ...secondBasicMockDateRangeRequestResult, + overallMetricsCompleted: false, + boardMetricsCompleted: false, + doraMetricsCompleted: false, + }, + ]; + const partialFailedMockData: DateRangeRequestResult[] = [ + firstBasicMockDateRangeRequestResult, + { + ...secondBasicMockDateRangeRequestResult, + reportMetricsError: basicMockError, + }, + ]; + const allFailedMockData: DateRangeRequestResult[] = [ + { + ...firstBasicMockDateRangeRequestResult, + reportMetricsError: basicMockError, + }, + { + ...secondBasicMockDateRangeRequestResult, + reportMetricsError: basicMockError, + }, + ]; - const setup = () => { + const setup = (dateRangeRequestResults: DateRangeRequestResult[]) => { const store = setupStore(); render( @@ -36,18 +100,108 @@ describe('test', () => { isShowExportPipelineButton={true} handleBack={mockHandler} handleSave={mockHandler} - reportData={mockData} - startDate={''} - endDate={''} - csvTimeStamp={1239013} + csvTimeStamp={1715250961572} + dateRangeRequestResults={dateRangeRequestResults} /> , ); }; - it('test', () => { - setup(); + it('should all buttons be clickable given the request successfully finishes', () => { + setup(successMockData); + + expect(screen.getByRole('button', { name: EXPORT_METRIC_DATA })).not.toBeDisabled(); + expect(screen.getByRole('button', { name: EXPORT_BOARD_DATA })).not.toBeDisabled(); + expect(screen.getByRole('button', { name: EXPORT_PIPELINE_DATA })).not.toBeDisabled(); + }); + + it.each(buttonNames)( + 'should be able to export all the overall metrics CSV files when clicking the %s button given the request successfully finishes', + async (buttonName) => { + setup(successMockData); + const exportButton = screen.getByRole('button', { name: buttonName }); + expect(exportButton).not.toBeDisabled(); + + await userEvent.click(exportButton); + + expect(screen.getByText('2024/01/01 - 2024/01/14')).toBeInTheDocument(); + expect(screen.getByText('2024/01/15 - 2024/01/31')).toBeInTheDocument(); + expect(screen.getAllByRole('checkbox')[0]).not.toBeDisabled(); + expect(screen.getAllByRole('checkbox')[1]).not.toBeDisabled(); + }, + ); + + it('should export data buttons be not clickable given the CSV file for one of the dataRanges is still in the process of generating.', () => { + setup(pendingMockData); + + expect(screen.getByRole('button', { name: EXPORT_METRIC_DATA })).toBeDisabled(); + expect(screen.getByRole('button', { name: EXPORT_BOARD_DATA })).toBeDisabled(); + expect(screen.getByRole('button', { name: EXPORT_PIPELINE_DATA })).toBeDisabled(); + }); + + it.each(buttonNames)( + 'should not be able to export the CSV file when clicking the %s button given an error occurs for the dataRanges', + async (buttonName) => { + setup(partialFailedMockData); + const exportButton = screen.getByRole('button', { name: buttonName }); + expect(exportButton).not.toBeDisabled(); + + await userEvent.click(exportButton); + + expect(screen.getByText('2024/01/15 - 2024/01/31')).toBeInTheDocument(); + const checkbox = screen.getAllByRole('checkbox')[1]; + expect(checkbox).toBeDisabled(); + }, + ); + + it.each(buttonNames)( + 'should not open download dialog when clicking the %s button given only setting one dataRange', + async (buttonName) => { + setup([firstBasicMockDateRangeRequestResult]); + const exportButton = screen.getByRole('button', { name: buttonName }); + expect(exportButton).not.toBeDisabled(); + + await userEvent.click(exportButton); + + expect(screen.queryByText('Select the time period for the exporting data')).not.toBeInTheDocument(); + }, + ); + + it('should close download dialog when clicking the close button given the download dialog is open', async () => { + setup(successMockData); + const exportMetricDataButton = screen.getByRole('button', { name: EXPORT_METRIC_DATA }); + expect(exportMetricDataButton).not.toBeDisabled(); + await userEvent.click(exportMetricDataButton); + expect(screen.getByText('Select the time period for the exporting data')).toBeInTheDocument(); + + const closeButton = screen.getByTestId('CloseIcon'); + await userEvent.click(closeButton); + + expect(screen.queryByText('Select the time period for the exporting data')).not.toBeInTheDocument(); + }); + + it('should close download dialog and download csv file when clicking the confirm button given the download dialog is open and one of the dataRanges is checked', async () => { + const { result } = renderHook(() => useExportCsvEffect()); + setup(successMockData); + const exportMetricDataButton = screen.getByRole('button', { name: EXPORT_METRIC_DATA }); + expect(exportMetricDataButton).not.toBeDisabled(); + await userEvent.click(exportMetricDataButton); + expect(screen.getByText('Select the time period for the exporting data')).toBeInTheDocument(); + const checkbox = screen.getAllByRole('checkbox')[0]; + expect(checkbox).not.toBeDisabled(); + await userEvent.click(checkbox); + + await userEvent.click(screen.getByText('Confirm')); + + expect(screen.queryByText('Select the time period for the exporting data')).not.toBeInTheDocument(); + expect(result.current.fetchExportData).toBeCalledTimes(1); + }); + + it(`should not be able to click the export buttons when all dataRanges encounter errors`, async () => { + setup(allFailedMockData); - expect(screen.queryByRole('button', { name: EXPORT_METRIC_DATA })).toBeDisabled(); + expect(screen.getByRole('button', { name: EXPORT_METRIC_DATA })).toBeDisabled(); + expect(screen.getByRole('button', { name: EXPORT_BOARD_DATA })).toBeDisabled(); + expect(screen.getByRole('button', { name: EXPORT_PIPELINE_DATA })).toBeDisabled(); }); }); diff --git a/frontend/__tests__/containers/ReportStep/DownloadDialog.test.tsx b/frontend/__tests__/containers/ReportStep/DownloadDialog.test.tsx new file mode 100644 index 0000000000..1a37edc3f6 --- /dev/null +++ b/frontend/__tests__/containers/ReportStep/DownloadDialog.test.tsx @@ -0,0 +1,106 @@ +import { DateRangeItem, DownloadDialog } from '@src/containers/ReportStep/DownloadDialog'; +import { render, screen } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; + +describe('DownloadDialog', () => { + afterEach(() => { + jest.clearAllMocks(); + }); + + const handleCloseFn = jest.fn(); + const downloadCSVFileFn = jest.fn(); + const mockData = [ + { + startDate: '2024-01-01', + endDate: '2024-01-14', + disabled: false, + }, + { + startDate: '2024-01-15', + endDate: '2024-01-31', + disabled: false, + }, + ]; + + const setup = (dateRangeList: DateRangeItem[]) => { + render( + , + ); + }; + + it('should show all dateRanges in DownloadDialog', () => { + setup(mockData); + + expect(screen.getByText('2024/01/01 - 2024/01/14')).toBeInTheDocument(); + expect(screen.getByText('2024/01/15 - 2024/01/31')).toBeInTheDocument(); + expect(screen.getAllByRole('checkbox')[0]).not.toBeDisabled(); + expect(screen.getAllByRole('checkbox')[1]).not.toBeDisabled(); + expect(screen.getByText('Confirm')).toBeDisabled(); + }); + + it('should not be clickable given there is an error fetching data for this dataRange', () => { + const mockDataWithDisabledDateRange = [ + ...mockData, + { + startDate: '2024-02-01', + endDate: '2024-02-14', + disabled: true, + }, + ]; + setup(mockDataWithDisabledDateRange); + const checkbox = screen.getAllByRole('checkbox')[2]; + + expect(checkbox).toBeDisabled(); + }); + + it('should confirm button be clickable when choosing one dateRange', async () => { + setup(mockData); + const checkbox = screen.getAllByRole('checkbox')[0]; + expect(checkbox).not.toBeDisabled(); + expect(screen.getByText('Confirm')).toBeDisabled(); + + await userEvent.click(checkbox); + + expect(screen.getByText('Confirm')).not.toBeDisabled(); + }); + + it('should close download dialog when clicking the close button', async () => { + setup(mockData); + + const closeButton = screen.getByTestId('CloseIcon'); + await userEvent.click(closeButton); + + expect(handleCloseFn).toBeCalledTimes(1); + }); + + it('should close download dialog and download csv file when clicking the confirm button given that a dataRange is checked', async () => { + setup(mockData); + const checkbox = screen.getAllByRole('checkbox')[0]; + expect(checkbox).not.toBeDisabled(); + await userEvent.click(checkbox); + const confirmButton = screen.getByText('Confirm'); + expect(confirmButton).not.toBeDisabled(); + + await userEvent.click(confirmButton); + + expect(handleCloseFn).toBeCalledTimes(1); + expect(downloadCSVFileFn).toBeCalledTimes(1); + }); + + it('should not check the dataRange when clicking on the checkbox given that the dataRange is already checked', async () => { + setup(mockData); + const checkbox = screen.getAllByRole('checkbox')[0]; + expect(checkbox).not.toBeDisabled(); + await userEvent.click(checkbox); + expect(checkbox).toBeChecked(); + + await userEvent.click(checkbox); + + expect(checkbox).not.toBeChecked(); + }); +}); diff --git a/frontend/src/constants/resources.ts b/frontend/src/constants/resources.ts index 064512f7fc..7a855282cb 100644 --- a/frontend/src/constants/resources.ts +++ b/frontend/src/constants/resources.ts @@ -443,4 +443,5 @@ export enum SORTING_DATE_RANGE_TEXT { DESCENDING = 'Descending', } -export const BLOCK_COLUMN_NAME = ['BLOCKED', 'BLOCK']; +export const DISABLED_DATE_RANGE_MESSAGE = + 'Unavailable time period indicates that report generation during this period has failed.'; diff --git a/frontend/src/containers/ReportButtonGroup/index.tsx b/frontend/src/containers/ReportButtonGroup/index.tsx index b635b18dbc..088e24570d 100644 --- a/frontend/src/containers/ReportButtonGroup/index.tsx +++ b/frontend/src/containers/ReportButtonGroup/index.tsx @@ -1,42 +1,81 @@ import { StyledButtonGroup, StyledExportButton, StyledRightButtonGroup } from '@src/containers/ReportButtonGroup/style'; +import { DateRangeItem, DownloadDialog } from '@src/containers/ReportStep/DownloadDialog'; import { BackButton, SaveButton } from '@src/containers/MetricsStepper/style'; import { ExpiredDialog } from '@src/containers/ReportStep/ExpiredDialog'; import { CSVReportRequestDTO } from '@src/clients/report/dto/request'; import { COMMON_BUTTONS, REPORT_TYPES } from '@src/constants/commons'; -import { ReportResponseDTO } from '@src/clients/report/dto/response'; +import { AllErrorResponse } from '@src/clients/report/dto/response'; +import { DateRangeRequestResult } from '@src/containers/ReportStep'; import { useExportCsvEffect } from '@src/hooks/useExportCsvEffect'; import SaveAltIcon from '@mui/icons-material/SaveAlt'; import { TIPS } from '@src/constants/resources'; import { Tooltip } from '@mui/material'; -import React from 'react'; +import React, { useState } from 'react'; interface ReportButtonGroupProps { handleSave?: () => void; handleBack: () => void; csvTimeStamp: number; - startDate: string; - endDate: string; - reportData: ReportResponseDTO | undefined; isShowSave: boolean; isShowExportBoardButton: boolean; isShowExportPipelineButton: boolean; isShowExportMetrics: boolean; + dateRangeRequestResults: DateRangeRequestResult[]; } export const ReportButtonGroup = ({ handleSave, handleBack, csvTimeStamp, - startDate, - endDate, - reportData, isShowSave, isShowExportMetrics, isShowExportBoardButton, isShowExportPipelineButton, + dateRangeRequestResults, }: ReportButtonGroupProps) => { + const [isShowDialog, setIsShowDialog] = useState(false); + const [downloadReportList, setDownloadReportList] = useState([]); + const [dataType, setDataType] = useState(null); const { fetchExportData, isExpired } = useExportCsvEffect(); + const isReportHasError = (reportMetricsError: AllErrorResponse) => { + return ( + !!reportMetricsError.boardMetricsError || + !!reportMetricsError.pipelineMetricsError || + !!reportMetricsError.sourceControlMetricsError + ); + }; + + const isReportHasDoraError = (reportMetricsError: AllErrorResponse) => { + return !!reportMetricsError.pipelineMetricsError || !!reportMetricsError.sourceControlMetricsError; + }; + + const overallMetricsResults = dateRangeRequestResults.map((item) => ({ + startDate: item.startDate, + endDate: item.endDate, + disabled: !(item.overallMetricsCompleted && !isReportHasError(item.reportMetricsError)), + })); + const boardMetricsResults = dateRangeRequestResults.map((item) => ({ + startDate: item.startDate, + endDate: item.endDate, + disabled: !(item.boardMetricsCompleted && !item.reportMetricsError.boardMetricsError), + })); + const pipelineMetricsResults = dateRangeRequestResults.map((item) => ({ + startDate: item.startDate, + endDate: item.endDate, + disabled: !(item.doraMetricsCompleted && !isReportHasDoraError(item.reportMetricsError)), + })); + + const isExportMetricsButtonClickable = + dateRangeRequestResults.every(({ overallMetricsCompleted }) => overallMetricsCompleted) && + overallMetricsResults.some(({ disabled }) => !disabled); + const isExportBoardButtonClickable = + dateRangeRequestResults.every(({ boardMetricsCompleted }) => boardMetricsCompleted) && + boardMetricsResults.some(({ disabled }) => !disabled); + const isExportPipelineButtonClickable = + dateRangeRequestResults.every(({ doraMetricsCompleted }) => doraMetricsCompleted) && + pipelineMetricsResults.some(({ disabled }) => !disabled); + const exportCSV = (dataType: REPORT_TYPES, startDate: string, endDate: string): CSVReportRequestDTO => ({ dataType: dataType, csvTimeStamp: csvTimeStamp, @@ -44,23 +83,31 @@ export const ReportButtonGroup = ({ endDate: endDate, }); - const handleDownload = (dataType: REPORT_TYPES, startDate: string, endDate: string) => { - fetchExportData(exportCSV(dataType, startDate, endDate)); + const handleDownload = (dateRange: DateRangeItem[], dataType: REPORT_TYPES) => { + if (dateRange.length > 1) { + setDownloadReportList(dateRange); + setDataType(dataType); + setIsShowDialog(true); + } else { + fetchExportData(exportCSV(dataType, dateRange[0].startDate, dateRange[0].endDate)); + } }; - const pipelineButtonDisabled = - !reportData || - reportData.doraMetricsCompleted === false || - reportData?.reportMetricsError?.pipelineMetricsError || - reportData?.reportMetricsError?.sourceControlMetricsError; - - const isReportHasError = - !!reportData?.reportMetricsError.boardMetricsError || - !!reportData?.reportMetricsError.pipelineMetricsError || - !!reportData?.reportMetricsError.sourceControlMetricsError; + const handleCloseDialog = () => { + setIsShowDialog(false); + setDataType(null); + }; return ( <> + {dataType && ( + fetchExportData(exportCSV(dataType, startDate, endDate))} + /> + )} {isShowSave && ( @@ -75,24 +122,24 @@ export const ReportButtonGroup = ({ {isShowExportMetrics && ( handleDownload(REPORT_TYPES.METRICS, startDate, endDate)} + disabled={!isExportMetricsButtonClickable} + onClick={() => handleDownload(overallMetricsResults, REPORT_TYPES.METRICS)} > {COMMON_BUTTONS.EXPORT_METRIC_DATA} )} {isShowExportBoardButton && ( handleDownload(REPORT_TYPES.BOARD, startDate, endDate)} + disabled={!isExportBoardButtonClickable} + onClick={() => handleDownload(boardMetricsResults, REPORT_TYPES.BOARD)} > {COMMON_BUTTONS.EXPORT_BOARD_DATA} )} {isShowExportPipelineButton && ( handleDownload(REPORT_TYPES.PIPELINE, startDate, endDate)} + disabled={!isExportPipelineButtonClickable} + onClick={() => handleDownload(pipelineMetricsResults, REPORT_TYPES.PIPELINE)} > {COMMON_BUTTONS.EXPORT_PIPELINE_DATA} diff --git a/frontend/src/containers/ReportStep/DownloadDialog/index.tsx b/frontend/src/containers/ReportStep/DownloadDialog/index.tsx new file mode 100644 index 0000000000..1a52e9eabe --- /dev/null +++ b/frontend/src/containers/ReportStep/DownloadDialog/index.tsx @@ -0,0 +1,100 @@ +import { + CloseButton, + DialogContainer, + StyledButton, + StyledCalendarToday, + StyledDialogContent, + StyledDialogTitle, + StyledFormControlLabel, + StyledFormGroup, + TimePeriodSelectionMessage, + tooltipModifiers, +} from '@src/containers/ReportStep/DownloadDialog/style'; +import { DISABLED_DATE_RANGE_MESSAGE } from '@src/constants/resources'; +import { Checkbox, Dialog, Tooltip } from '@mui/material'; +import { COMMON_BUTTONS } from '@src/constants/commons'; +import { formatDate } from '@src/utils/util'; +import React, { useState } from 'react'; + +interface DownloadDialogProps { + isShowDialog: boolean; + handleClose: () => void; + dateRangeList: DateRangeItem[]; + downloadCSVFile: (startDate: string, endDate: string) => void; +} + +export interface DateRangeItem { + startDate: string; + endDate: string; + disabled: boolean; +} + +export const DownloadDialog = ({ isShowDialog, handleClose, dateRangeList, downloadCSVFile }: DownloadDialogProps) => { + const [selectedRangeItems, setSelectedRangeItems] = useState([]); + const confirmButtonDisabled = selectedRangeItems.length === 0; + + const handleChange = (targetItem: DateRangeItem) => { + if (selectedRangeItems.includes(targetItem)) { + setSelectedRangeItems(selectedRangeItems.filter((item) => targetItem !== item)); + } else { + setSelectedRangeItems([...selectedRangeItems, targetItem]); + } + }; + + const handleDownload = () => { + selectedRangeItems.forEach((item) => { + downloadCSVFile(item.startDate, item.endDate); + }); + handleClose(); + }; + + const getLabel = (item: DateRangeItem) => { + if (item.disabled) { + return ( + + {`${formatDate(item.startDate)} - ${formatDate(item.endDate)}`} + + ); + } else { + return `${formatDate(item.startDate)} - ${formatDate(item.endDate)}`; + } + }; + + return ( + + + + Export Board Data + + + + + + Select the time period for the exporting data + + + {dateRangeList.map((item) => ( + handleChange(item)} />} + label={getLabel(item)} + checked={selectedRangeItems.includes(item)} + disabled={item.disabled} + /> + ))} + + + {COMMON_BUTTONS.CONFIRM} + + + + + ); +}; diff --git a/frontend/src/containers/ReportStep/DownloadDialog/style.tsx b/frontend/src/containers/ReportStep/DownloadDialog/style.tsx new file mode 100644 index 0000000000..9b2311d401 --- /dev/null +++ b/frontend/src/containers/ReportStep/DownloadDialog/style.tsx @@ -0,0 +1,80 @@ +import { Button, DialogContent, DialogTitle, FormControlLabel, FormGroup } from '@mui/material'; +import { CalendarToday } from '@mui/icons-material'; +import CloseIcon from '@mui/icons-material/Close'; +import { styled } from '@mui/material/styles'; +import { theme } from '@src/theme'; + +export const DialogContainer = styled('div')({ + width: '38rem', + display: 'flex', + flexDirection: 'column', + alignItems: 'center', + justifyContent: 'flex-start', +}); + +export const StyledDialogTitle = styled(DialogTitle)({ + boxSizing: 'border-box', + width: '100%', + padding: '1.5rem 2.5rem 1.5rem 2.5rem', + display: 'flex', + justifyContent: 'space-between', + alignItems: 'center', + fontSize: '1rem', +}); + +export const StyledDialogContent = styled(DialogContent)({ + boxSizing: 'border-box', + width: '100%', + display: 'flex', + flexDirection: 'column', + justifyContent: 'center', + alignItems: 'center', + padding: '1.25rem 3.125rem 1.875rem 3.125rem', +}); + +export const StyledCalendarToday = styled(CalendarToday)({ + color: theme.palette.text.disabled, + marginRight: '0.75rem', + fontSize: '1.5rem', +}); + +export const TimePeriodSelectionMessage = styled('div')({ + width: '100%', + display: 'flex', + justifyContent: 'flex-start', + alignItems: 'center', + fontSize: '1rem', +}); + +export const StyledFormGroup = styled(FormGroup)({ + margin: '2.5rem 0', +}); + +export const StyledButton = styled(Button)({ + alignSelf: 'flex-end', +}); + +export const tooltipModifiers = { + modifiers: [ + { + name: 'offset', + options: { + offset: [190, 0], + }, + }, + ], +}; + +export const StyledFormControlLabel = styled(FormControlLabel)(({ checked }) => ({ + width: '15.5rem', + border: `0.0625rem solid ${theme.main.boardColor}`, + margin: '0.375rem 0', + + ...(checked && { + background: theme.main.downloadListLabel.backgroundColor, + }), +})); + +export const CloseButton = styled(CloseIcon)({ + cursor: 'pointer', +}); diff --git a/frontend/src/containers/ReportStep/index.tsx b/frontend/src/containers/ReportStep/index.tsx index 72af57d453..8499b355b7 100644 --- a/frontend/src/containers/ReportStep/index.tsx +++ b/frontend/src/containers/ReportStep/index.tsx @@ -15,17 +15,18 @@ import { useGenerateReportEffect, } from '@src/hooks/useGenerateReportEffect'; import { - addNotification, - closeAllNotifications, - closeNotification, - Notification, -} from '@src/context/notification/NotificationSlice'; -import { + DateRange, isOnlySelectClassification, isSelectBoardMetrics, isSelectDoraMetrics, selectConfig, } from '@src/context/config/configSlice'; +import { + addNotification, + closeAllNotifications, + closeNotification, + Notification, +} from '@src/context/notification/NotificationSlice'; import { BOARD_METRICS, CALENDAR, @@ -35,11 +36,11 @@ import { REQUIRED_DATA, } from '@src/constants/resources'; import { IPipelineConfig, selectMetricsContent } from '@src/context/Metrics/metricsSlice'; +import { AllErrorResponse, ReportResponseDTO } from '@src/clients/report/dto/response'; import { backStep, selectTimeStamp } from '@src/context/stepper/StepperSlice'; import { StyledCalendarWrapper } from '@src/containers/ReportStep/style'; import { ReportButtonGroup } from '@src/containers/ReportButtonGroup'; import DateRangeViewer from '@src/components/Common/DateRangeViewer'; -import { ReportResponseDTO } from '@src/clients/report/dto/response'; import BoardMetrics from '@src/containers/ReportStep/BoardMetrics'; import DoraMetrics from '@src/containers/ReportStep/DoraMetrics'; import React, { useEffect, useMemo, useState } from 'react'; @@ -59,6 +60,15 @@ const timeoutNotificationMessages = { [TimeoutErrorKey[METRIC_TYPES.ALL]]: 'Report', }; +export interface DateRangeRequestResult { + startDate: string; + endDate: string; + overallMetricsCompleted: boolean | null; + boardMetricsCompleted: boolean | null; + doraMetricsCompleted: boolean | null; + reportMetricsError: AllErrorResponse; +} + const ReportStep = ({ handleSave }: ReportStepProps) => { const dispatch = useAppDispatch(); const configData = useAppSelector(selectConfig); @@ -111,6 +121,23 @@ const ReportStep = ({ handleSave }: ReportStepProps) => { const onlySelectClassification = useAppSelector(isOnlySelectClassification); const isSummaryPage = useMemo(() => pageType === REPORT_PAGE_TYPE.SUMMARY, [pageType]); + const mapDateResult = (descendingDateRanges: DateRange, reportInfos: IReportInfo[]) => + descendingDateRanges.map(({ startDate, endDate }) => { + const reportData = reportInfos.find((singleResult) => singleResult.id === startDate)?.reportData ?? null; + return { + startDate: startDate, + endDate: endDate, + overallMetricsCompleted: reportData?.overallMetricsCompleted ?? null, + boardMetricsCompleted: reportData?.boardMetricsCompleted ?? null, + doraMetricsCompleted: reportData?.doraMetricsCompleted ?? null, + reportMetricsError: reportData?.reportMetricsError ?? { + boardMetricsError: null, + pipelineMetricsError: null, + sourceControlMetricsError: null, + }, + } as DateRangeRequestResult; + }); + const getErrorMessage4Board = () => { if (currentDataInfo.reportData?.reportMetricsError.boardMetricsError) { return `Failed to get Jira info, status: ${currentDataInfo.reportData.reportMetricsError.boardMetricsError.status}`; @@ -460,10 +487,8 @@ const ReportStep = ({ handleSave }: ReportStepProps) => { isShowExportPipelineButton={isSummaryPage ? shouldShowDoraMetrics : pageType === REPORT_PAGE_TYPE.DORA} handleBack={() => handleBack()} handleSave={() => handleSave()} - reportData={currentDataInfo.reportData} - startDate={startDate} - endDate={endDate} csvTimeStamp={csvTimeStamp} + dateRangeRequestResults={mapDateResult(descendingDateRanges, reportInfos)} /> ); diff --git a/frontend/src/theme.ts b/frontend/src/theme.ts index 1a7eb7e20e..ccf93ea355 100644 --- a/frontend/src/theme.ts +++ b/frontend/src/theme.ts @@ -59,6 +59,9 @@ declare module '@mui/material/styles' { borderColor: string; }; }; + downloadListLabel: { + backgroundColor: string; + }; }; } @@ -143,6 +146,9 @@ export const theme = createTheme({ borderColor: '#939DDA', }, }, + downloadListLabel: { + backgroundColor: '#4350AF1A', + }, }, typography: { button: { From fe9f64cfd268333bf394cc5894f4d95852ee4c53 Mon Sep 17 00:00:00 2001 From: zhou-yinyuan <147299494+zhou-yinyuan@users.noreply.github.com> Date: Sat, 11 May 2024 15:52:08 +0800 Subject: [PATCH 73/81] ADM-940 [backend]: fix the bug2 by add lock (#1440) * ADM-940 [frontend][backend]: fix the bug about deleting expired file * ADM-940 [frontend][backend]: fix the bug about deleting expired file * ADM-940:[backend]refactor: add async order logic for update overall metrics completed * ADM-940 [frontend][backend]: modify test * ADM-940 [backend]: fix the bug2 by add lock * ADM-940 [backend]: fix format * ADM-940 [backend]: fix format * ADM-940 [backend]: fix format * ADM-940 [backend]: fix format and comment * ADM-940 [backend]: fix format * ADM-940 [backend]: fix format * ADM-940 [backend]: fix format * ADM-940 [backend]: add comment --------- Co-authored-by: weiraneve <907221539@qq.com> --- .../handler/AsyncMetricsDataHandler.java | 11 ++- .../service/report/ReportService.java | 7 +- .../handler/AsyncMetricsDataHandlerTest.java | 73 ++++++++++++++++++- 3 files changed, 80 insertions(+), 11 deletions(-) diff --git a/backend/src/main/java/heartbeat/handler/AsyncMetricsDataHandler.java b/backend/src/main/java/heartbeat/handler/AsyncMetricsDataHandler.java index 38f7ed6c21..4e619ac6c9 100644 --- a/backend/src/main/java/heartbeat/handler/AsyncMetricsDataHandler.java +++ b/backend/src/main/java/heartbeat/handler/AsyncMetricsDataHandler.java @@ -26,6 +26,8 @@ public class AsyncMetricsDataHandler extends AsyncDataBaseHandler { private static final String SLASH = "/"; + private final Object readWriteLock = new Object(); + public void putMetricsDataCompleted(String timeStamp, MetricsDataCompleted metricsDataCompleted) { try { acquireLock(METRICS_DATA_COMPLETED, timeStamp); @@ -46,12 +48,13 @@ public void deleteExpireMetricsDataCompletedFile(long currentTimeStamp, File dir deleteExpireFileByType(METRICS_DATA_COMPLETED, currentTimeStamp, directory); } - @Synchronized + @Synchronized("readWriteLock") public void updateMetricsDataCompletedInHandler(String metricDataFileId, MetricType metricType, boolean isCreateCsvSuccess) { MetricsDataCompleted previousMetricsCompleted = getMetricsDataCompleted(metricDataFileId); if (previousMetricsCompleted == null) { - log.error(GENERATE_REPORT_ERROR); + String filename = OUTPUT_FILE_PATH + METRICS_DATA_COMPLETED.getPath() + metricDataFileId; + log.error(GENERATE_REPORT_ERROR + "; filename: " + filename); throw new GenerateReportException(GENERATE_REPORT_ERROR); } if (isCreateCsvSuccess) { @@ -66,10 +69,12 @@ public void updateMetricsDataCompletedInHandler(String metricDataFileId, MetricT putMetricsDataCompleted(metricDataFileId, previousMetricsCompleted); } + @Synchronized("readWriteLock") public void updateOverallMetricsCompletedInHandler(String metricDataFileId) { MetricsDataCompleted previousMetricsCompleted = getMetricsDataCompleted(metricDataFileId); if (previousMetricsCompleted == null) { - log.error(GENERATE_REPORT_ERROR); + String filename = OUTPUT_FILE_PATH + METRICS_DATA_COMPLETED.getPath() + metricDataFileId; + log.error(GENERATE_REPORT_ERROR + "; filename: " + filename); throw new GenerateReportException(GENERATE_REPORT_ERROR); } previousMetricsCompleted.setOverallMetricCompleted(true); diff --git a/backend/src/main/java/heartbeat/service/report/ReportService.java b/backend/src/main/java/heartbeat/service/report/ReportService.java index 3e8778e3f6..6e88e4cea3 100644 --- a/backend/src/main/java/heartbeat/service/report/ReportService.java +++ b/backend/src/main/java/heartbeat/service/report/ReportService.java @@ -67,11 +67,8 @@ public void generateReport(GenerateReportRequest request) { threadList.add(metricTypeThread); } - CompletableFuture.runAsync(() -> { - for (CompletableFuture thread : threadList) { - thread.join(); - } - + CompletableFuture allFutures = CompletableFuture.allOf(threadList.toArray(new CompletableFuture[0])); + allFutures.thenRun(() -> { ReportResponse reportResponse = generateReporterService.getComposedReportResponse(request.getCsvTimeStamp(), convertTimeStampToYYYYMMDD(request.getStartTime()), convertTimeStampToYYYYMMDD(request.getEndTime())); diff --git a/backend/src/test/java/heartbeat/handler/AsyncMetricsDataHandlerTest.java b/backend/src/test/java/heartbeat/handler/AsyncMetricsDataHandlerTest.java index aacd2b7d74..143902446a 100644 --- a/backend/src/test/java/heartbeat/handler/AsyncMetricsDataHandlerTest.java +++ b/backend/src/test/java/heartbeat/handler/AsyncMetricsDataHandlerTest.java @@ -9,6 +9,7 @@ import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.RepeatedTest; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; import org.mockito.junit.jupiter.MockitoExtension; @@ -17,9 +18,15 @@ import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; +import java.util.ArrayList; +import java.util.List; +import java.util.Random; +import java.util.concurrent.CompletableFuture; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; +import static heartbeat.controller.report.dto.request.MetricType.BOARD; +import static heartbeat.controller.report.dto.request.MetricType.DORA; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNotNull; @@ -142,8 +149,7 @@ void shouldThrowGenerateReportExceptionWhenPreviousMetricsStatusIsNull() { String currentTime = Long.toString(currentTimeMillis); GenerateReportException exception = assertThrows(GenerateReportException.class, - () -> asyncMetricsDataHandler.updateMetricsDataCompletedInHandler(currentTime, MetricType.BOARD, - false)); + () -> asyncMetricsDataHandler.updateMetricsDataCompletedInHandler(currentTime, BOARD, false)); assertEquals("Failed to update metrics data completed through this timestamp.", exception.getMessage()); } @@ -157,7 +163,7 @@ void shouldUpdateBoardMetricDataWhenPreviousMetricsStatusIsNotNullAndMetricTypeI .build(); asyncMetricsDataHandler.putMetricsDataCompleted(currentTime, metricsDataCompleted); - asyncMetricsDataHandler.updateMetricsDataCompletedInHandler(currentTime, MetricType.BOARD, true); + asyncMetricsDataHandler.updateMetricsDataCompletedInHandler(currentTime, BOARD, true); MetricsDataCompleted completed = asyncMetricsDataHandler.getMetricsDataCompleted(currentTime); assertTrue(completed.boardMetricsCompleted()); @@ -239,6 +245,67 @@ void shouldUpdateAllMetricDataWhenPreviousMetricsStatusIsNotNull() throws IOExce } + @Nested + class UpdateAllMetricsCompletedInHandlerAtTheSameTime { + + // The test should be moved to integration test next. + @RepeatedTest(100) + @SuppressWarnings("unchecked") + void shouldUpdateAllMetricDataAtTheSameTimeWhenPreviousMetricsStatusIsNotNull() throws IOException { + long currentTimeMillis = System.currentTimeMillis(); + String currentTime = Long.toString(currentTimeMillis); + List sleepTime = new ArrayList<>(); + for (int i = 0; i < 3; i++) { + sleepTime.add(new Random().nextInt(100)); + } + MetricsDataCompleted metricsDataCompleted = MetricsDataCompleted.builder() + .boardMetricsCompleted(false) + .doraMetricsCompleted(false) + .overallMetricCompleted(false) + .build(); + asyncMetricsDataHandler.putMetricsDataCompleted(currentTime, metricsDataCompleted); + + List> threadList = new ArrayList<>(); + + threadList.add(CompletableFuture.runAsync(() -> { + try { + TimeUnit.MILLISECONDS.sleep(sleepTime.get(0)); // NOSONAR + } + catch (InterruptedException ignored) { + } + asyncMetricsDataHandler.updateMetricsDataCompletedInHandler(currentTime, BOARD, true); + })); + threadList.add(CompletableFuture.runAsync(() -> { + try { + TimeUnit.MILLISECONDS.sleep(sleepTime.get(1)); // NOSONAR + } + catch (InterruptedException ignored) { + } + asyncMetricsDataHandler.updateMetricsDataCompletedInHandler(currentTime, DORA, true); + })); + threadList.add(CompletableFuture.runAsync(() -> { + try { + TimeUnit.MILLISECONDS.sleep(sleepTime.get(2)); // NOSONAR + } + catch (InterruptedException ignored) { + } + asyncMetricsDataHandler.updateOverallMetricsCompletedInHandler(currentTime); + })); + + for (CompletableFuture thread : threadList) { + thread.join(); + } + + MetricsDataCompleted completed = asyncMetricsDataHandler.getMetricsDataCompleted(currentTime); + assertTrue(completed.boardMetricsCompleted()); + assertTrue(completed.doraMetricsCompleted()); + assertTrue(completed.allMetricsCompleted()); + Files.deleteIfExists(Path.of(APP_OUTPUT_METRICS + "/" + currentTime)); + assertNull(asyncMetricsDataHandler.getMetricsDataCompleted(currentTime)); + } + + } + private void createLockFile(String currentTime) throws IOException { String fileName = APP_OUTPUT_METRICS + "/" + currentTime + ".lock"; File file = new File(fileName); From 4a6096abdbec7f0f216680e9f79671cf0ad419d8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 12 May 2024 12:15:33 +0800 Subject: [PATCH 74/81] chore(deps): bump ejs from 3.1.9 to 3.1.10 in /[frontend](#1430) Bumps [ejs](https://github.com/mde/ejs) from 3.1.9 to 3.1.10. - [Release notes](https://github.com/mde/ejs/releases) - [Commits](https://github.com/mde/ejs/compare/v3.1.9...v3.1.10) --- updated-dependencies: - dependency-name: ejs dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: guzhongren --- frontend/pnpm-lock.yaml | 95 +++-------------------------------------- 1 file changed, 7 insertions(+), 88 deletions(-) diff --git a/frontend/pnpm-lock.yaml b/frontend/pnpm-lock.yaml index dc952b6734..e2e9253f12 100644 --- a/frontend/pnpm-lock.yaml +++ b/frontend/pnpm-lock.yaml @@ -87,7 +87,7 @@ devDependencies: version: 15.0.6(@types/react@18.3.1)(react-dom@18.3.1)(react@18.3.1) '@testing-library/user-event': specifier: ^14.5.2 - version: 14.5.2(@testing-library/dom@9.3.4) + version: 14.5.2(@testing-library/dom@10.1.0) '@types/jest': specifier: ^29.5.12 version: 29.5.12 @@ -3018,7 +3018,7 @@ packages: /@surma/rollup-plugin-off-main-thread@2.2.3: resolution: {integrity: sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==} dependencies: - ejs: 3.1.9 + ejs: 3.1.10 json5: 2.2.3 magic-string: 0.25.9 string.prototype.matchall: 4.0.11 @@ -3163,20 +3163,6 @@ packages: pretty-format: 27.5.1 dev: true - /@testing-library/dom@9.3.4: - resolution: {integrity: sha512-FlS4ZWlp97iiNWig0Muq8p+3rVDjRiYE+YKGbAqXOu9nwJFFOdL00kFpz42M+4huzYi86vAK1sOOfyOG45muIQ==} - engines: {node: '>=14'} - dependencies: - '@babel/code-frame': 7.24.2 - '@babel/runtime': 7.24.4 - '@types/aria-query': 5.0.4 - aria-query: 5.1.3 - chalk: 4.1.2 - dom-accessibility-api: 0.5.16 - lz-string: 1.5.0 - pretty-format: 27.5.1 - dev: true - /@testing-library/jest-dom@6.4.5(@types/jest@29.5.12)(jest@29.7.0): resolution: {integrity: sha512-AguB9yvTXmCnySBP1lWjfNNUwpbElsaQ567lt2VdGqAdHtpieLgjmcVyv1q7PMIvLbgpDdkWV5Ydv3FEejyp2A==} engines: {node: '>=14', npm: '>=6', yarn: '>=1'} @@ -3229,13 +3215,13 @@ packages: react-dom: 18.3.1(react@18.3.1) dev: true - /@testing-library/user-event@14.5.2(@testing-library/dom@9.3.4): + /@testing-library/user-event@14.5.2(@testing-library/dom@10.1.0): resolution: {integrity: sha512-YAh82Wh4TIrxYLmfGcixwD18oIjyC1pFQC2Y01F2lzV2HTMiYrI0nze0FD0ocB//CKS/7jIUgae+adPqxK5yCQ==} engines: {node: '>=12', npm: '>=6'} peerDependencies: '@testing-library/dom': '>=7.21.4' dependencies: - '@testing-library/dom': 9.3.4 + '@testing-library/dom': 10.1.0 dev: true /@tootallnate/once@2.0.0: @@ -3757,12 +3743,6 @@ packages: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} dev: true - /aria-query@5.1.3: - resolution: {integrity: sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==} - dependencies: - deep-equal: 2.2.3 - dev: true - /aria-query@5.3.0: resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} dependencies: @@ -4320,7 +4300,7 @@ packages: dev: false /concat-map@0.0.1: - resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=} + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} /conf@10.2.0: resolution: {integrity: sha512-8fLl9F04EJqjSqH+QjITQfJF8BrOVaYr1jewVgSRAEWePfxT0sku4w2hrGQ60BC/TNLGQ2pgxNlTbWQmMPFvXg==} @@ -4534,30 +4514,6 @@ packages: optional: true dev: true - /deep-equal@2.2.3: - resolution: {integrity: sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==} - engines: {node: '>= 0.4'} - dependencies: - array-buffer-byte-length: 1.0.1 - call-bind: 1.0.7 - es-get-iterator: 1.1.3 - get-intrinsic: 1.2.4 - is-arguments: 1.1.1 - is-array-buffer: 3.0.4 - is-date-object: 1.0.5 - is-regex: 1.1.4 - is-shared-array-buffer: 1.0.3 - isarray: 2.0.5 - object-is: 1.1.6 - object-keys: 1.1.1 - object.assign: 4.1.5 - regexp.prototype.flags: 1.5.2 - side-channel: 1.0.6 - which-boxed-primitive: 1.0.2 - which-collection: 1.0.2 - which-typed-array: 1.1.15 - dev: true - /deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} dev: true @@ -4693,8 +4649,8 @@ packages: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} dev: true - /ejs@3.1.9: - resolution: {integrity: sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==} + /ejs@3.1.10: + resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} engines: {node: '>=0.10.0'} hasBin: true dependencies: @@ -4855,20 +4811,6 @@ packages: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} - /es-get-iterator@1.1.3: - resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==} - dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 - has-symbols: 1.0.3 - is-arguments: 1.1.1 - is-map: 2.0.3 - is-set: 2.0.3 - is-string: 1.0.7 - isarray: 2.0.5 - stop-iteration-iterator: 1.0.0 - dev: true - /es-iterator-helpers@1.0.18: resolution: {integrity: sha512-scxAJaewsahbqTYrGKJihhViaM6DDZDDoucfvzNbK0pOren1g/daDQ3IAhzn+1G14rBG7w+i5N+qul60++zlKA==} engines: {node: '>= 0.4'} @@ -5851,14 +5793,6 @@ packages: hasown: 2.0.2 side-channel: 1.0.6 - /is-arguments@1.1.1: - resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - has-tostringtag: 1.0.2 - dev: true - /is-array-buffer@3.0.4: resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} engines: {node: '>= 0.4'} @@ -7190,14 +7124,6 @@ packages: /object-inspect@1.13.1: resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} - /object-is@1.1.6: - resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - dev: true - /object-keys@1.1.1: resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} engines: {node: '>= 0.4'} @@ -8185,13 +8111,6 @@ packages: engines: {node: '>= 0.8'} dev: true - /stop-iteration-iterator@1.0.0: - resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==} - engines: {node: '>= 0.4'} - dependencies: - internal-slot: 1.0.7 - dev: true - /stream-combiner@0.2.2: resolution: {integrity: sha512-6yHMqgLYDzQDcAkL+tjJDC5nSNuNIx0vZtRZeiPh7Saef7VHX9H5Ijn9l2VIol2zaNYlYEX6KyuT/237A58qEQ==} dependencies: From be57951c509ec4d67c3c9b5818812fcafdd4944f Mon Sep 17 00:00:00 2001 From: Leiqiuhong <141199516+Leiqiuhong@users.noreply.github.com> Date: Mon, 13 May 2024 14:19:28 +0800 Subject: [PATCH 75/81] ADM-928 [frontend]: fix dc issues and implement the retry function (#1441) * ADM-928:[frontend]feat: add dark and white switch for metrics and report page * ADM-928 fix: increase drop-down area * ADM-928 fix: fix date range viewer style * ADM-928 feat: optimize style * ADM-928 feat: add retry logic * ADM-928 test: add unit test * ADM-928 test: add test * ADM-928 fix: replace the test id with aria-label --------- Co-authored-by: weiraneve <907221539@qq.com> --- .../DateRangeViewer/DateRangeViewer.test.tsx | 39 ++++++++-- .../__tests__/context/stepperSlice.test.ts | 8 +- .../Common/DateRangeViewer/index.tsx | 49 ++++++++---- .../Common/DateRangeViewer/style.tsx | 76 +++++++++++++------ frontend/src/containers/ReportStep/index.tsx | 12 +-- frontend/src/context/stepper/StepperSlice.tsx | 44 +++++++++-- frontend/src/hooks/useGenerateReportEffect.ts | 7 +- frontend/src/hooks/useGetBoardInfo.ts | 18 ++++- .../src/hooks/useGetMetricsStepsEffect.ts | 21 ++--- .../src/hooks/useGetPipelineToolInfoEffect.ts | 23 +++++- 10 files changed, 215 insertions(+), 82 deletions(-) diff --git a/frontend/__tests__/components/Common/DateRangeViewer/DateRangeViewer.test.tsx b/frontend/__tests__/components/Common/DateRangeViewer/DateRangeViewer.test.tsx index 86c9069273..99769b8ce9 100644 --- a/frontend/__tests__/components/Common/DateRangeViewer/DateRangeViewer.test.tsx +++ b/frontend/__tests__/components/Common/DateRangeViewer/DateRangeViewer.test.tsx @@ -1,4 +1,4 @@ -import { nextStep, updateFailedTimeRange } from '@src/context/stepper/StepperSlice'; +import { nextStep, updateMetricsPageFailedTimeRangeInfos } from '@src/context/stepper/StepperSlice'; import DateRangeViewer from '@src/components/Common/DateRangeViewer'; import { formatDateToTimestampString } from '@src/utils/util'; import { DateRange } from '@src/context/config/configSlice'; @@ -63,17 +63,46 @@ describe('DateRangeViewer', () => { }); it('should show priority high icon when click expand button and step number is 1', async () => { - const failedTimeRangeList = [formatDateToTimestampString('2024-02-01T00:00:00.000+08:00')]; + const failedTimeRangeList = [ + { + startDate: formatDateToTimestampString('2024-02-01T00:00:00.000+08:00'), + errors: { boardInfoError: true }, + }, + { + startDate: formatDateToTimestampString('2024-03-19T00:00:00.000+08:00'), + errors: { pipelineStepError: true }, + }, + { + startDate: formatDateToTimestampString('2024-04-01T00:00:00.000+08:00'), + errors: { pipelineInfoError: true }, + }, + ]; store.dispatch(nextStep()); - store.dispatch(updateFailedTimeRange(failedTimeRangeList)); + store.dispatch(updateMetricsPageFailedTimeRangeInfos(failedTimeRangeList)); const { getByLabelText } = setup(mockDateRanges); + expect(screen.getByTestId('PriorityHighIcon')).toBeInTheDocument(); await userEvent.click(getByLabelText('expandMore')); - - expect(screen.getByTestId('PriorityHighIcon')).toBeInTheDocument(); + expect(screen.getAllByTestId('PriorityHighIcon')).toHaveLength(4); }); it('should not show priority high icon when click expand button and step number is 0', async () => { + const failedTimeRangeList = [ + { + startDate: formatDateToTimestampString('2024-02-01T00:00:00.000+08:00'), + errors: { boardInfoError: false }, + }, + { + startDate: formatDateToTimestampString('2024-03-19T00:00:00.000+08:00'), + errors: { pipelineStepError: false }, + }, + { + startDate: formatDateToTimestampString('2024-04-01T00:00:00.000+08:00'), + errors: { pipelineInfoError: false }, + }, + ]; + store.dispatch(nextStep()); + store.dispatch(updateMetricsPageFailedTimeRangeInfos(failedTimeRangeList)); const { getByLabelText } = setup(mockDateRanges); await userEvent.click(getByLabelText('expandMore')); diff --git a/frontend/__tests__/context/stepperSlice.test.ts b/frontend/__tests__/context/stepperSlice.test.ts index b5af94c84f..e8a5e038e2 100644 --- a/frontend/__tests__/context/stepperSlice.test.ts +++ b/frontend/__tests__/context/stepperSlice.test.ts @@ -21,7 +21,7 @@ describe('stepper reducer', () => { stepNumber: 0, timeStamp: 0, shouldMetricsLoaded: true, - failedTimeRangeList: [], + metricsPageFailedTimeRangeInfos: {}, }, nextStep(), ); @@ -35,7 +35,7 @@ describe('stepper reducer', () => { stepNumber: 0, timeStamp: 0, shouldMetricsLoaded: true, - failedTimeRangeList: [], + metricsPageFailedTimeRangeInfos: {}, }, backStep(), ); @@ -49,7 +49,7 @@ describe('stepper reducer', () => { stepNumber: 2, timeStamp: 0, shouldMetricsLoaded: true, - failedTimeRangeList: [], + metricsPageFailedTimeRangeInfos: {}, }, backStep(), ); @@ -64,7 +64,7 @@ describe('stepper reducer', () => { stepNumber: 2, timeStamp: 0, shouldMetricsLoaded: true, - failedTimeRangeList: [], + metricsPageFailedTimeRangeInfos: {}, }, updateTimeStamp(mockTime), ); diff --git a/frontend/src/components/Common/DateRangeViewer/index.tsx b/frontend/src/components/Common/DateRangeViewer/index.tsx index d2091c1df5..37be8ab3a3 100644 --- a/frontend/src/components/Common/DateRangeViewer/index.tsx +++ b/frontend/src/components/Common/DateRangeViewer/index.tsx @@ -5,10 +5,12 @@ import { SingleDateRange, StyledArrowForward, StyledCalendarToday, + StyledDateRangeViewerContainer, StyledDivider, + StyledExpandContainer, StyledExpandMoreIcon, } from './style'; -import { selectFailedTimeRange, selectStepNumber } from '@src/context/stepper/StepperSlice'; +import { selectMetricsPageFailedTimeRangeInfos, selectStepNumber } from '@src/context/stepper/StepperSlice'; import React, { useRef, useState, forwardRef, useEffect, useCallback } from 'react'; import { formatDate, formatDateToTimestampString } from '@src/utils/util'; import PriorityHighIcon from '@mui/icons-material/PriorityHigh'; @@ -26,8 +28,15 @@ type Props = { const DateRangeViewer = ({ dateRangeList, changeDateRange, selectedDateRange, disabledAll = true }: Props) => { const [showMoreDateRange, setShowMoreDateRange] = useState(false); const DateRangeExpandRef = useRef(null); - const failedTimeRangeList = useAppSelector(selectFailedTimeRange); + const metricsPageFailedTimeRangeInfos = useAppSelector(selectMetricsPageFailedTimeRangeInfos); const stepNumber = useAppSelector(selectStepNumber); + const backgroundColor = stepNumber === 1 ? theme.palette.secondary.dark : theme.palette.common.white; + const currentDateRangeHasFailed = + stepNumber === 1 + ? Object.values(metricsPageFailedTimeRangeInfos).some( + (errorInfo) => errorInfo.pipelineInfoError || errorInfo.boardInfoError || errorInfo.pipelineStepError, + ) + : false; const handleClickOutside = useCallback((event: MouseEvent) => { if (DateRangeExpandRef.current && !DateRangeExpandRef.current?.contains(event.target as Node)) { @@ -49,15 +58,19 @@ const DateRangeViewer = ({ dateRangeList, changeDateRange, selectedDateRange, di const DateRangeExpand = forwardRef((props, ref: React.ForwardedRef) => { return ( - + {dateRangeList.map((dateRange) => { const disabled = dateRange.disabled || disabledAll; - const hasMetricsError = failedTimeRangeList.includes( - formatDateToTimestampString(dateRange.startDate as string), - ); + const currentFailedInfo = metricsPageFailedTimeRangeInfos[formatDateToTimestampString(dateRange.startDate!)]; + const hasMetricsError = currentFailedInfo + ? currentFailedInfo.pipelineInfoError || + currentFailedInfo.boardInfoError || + currentFailedInfo.pipelineStepError + : false; return ( handleClick(dateRange.startDate!)} key={dateRange.startDate!} > @@ -75,18 +88,24 @@ const DateRangeViewer = ({ dateRangeList, changeDateRange, selectedDateRange, di }); return ( - - {formatDate((selectedDateRange || dateRangeList[0]).startDate as string)} - - {formatDate((selectedDateRange || dateRangeList[0]).endDate as string)} - + + {currentDateRangeHasFailed && } + {formatDate((selectedDateRange || dateRangeList[0]).startDate as string)} + + {formatDate((selectedDateRange || dateRangeList[0]).endDate as string)} + + - setShowMoreDateRange(true)} /> - {showMoreDateRange && } - + setShowMoreDateRange(true)}> + + {showMoreDateRange && } + + ); }; diff --git a/frontend/src/components/Common/DateRangeViewer/style.tsx b/frontend/src/components/Common/DateRangeViewer/style.tsx index d112b5369d..eb6dc62a4e 100644 --- a/frontend/src/components/Common/DateRangeViewer/style.tsx +++ b/frontend/src/components/Common/DateRangeViewer/style.tsx @@ -4,31 +4,49 @@ import { Divider } from '@mui/material'; import styled from '@emotion/styled'; import { theme } from '@src/theme'; -export const DateRangeContainer = styled('div')(({ color }) => ({ +interface DateRangeContainerProps { + backgroundColor: string; + color: string; +} + +export const StyledDateRangeViewerContainer = styled('div')(({ backgroundColor, color }) => ({ position: 'relative', + width: 'fit-content', + height: '3rem', display: 'flex', - justifyContent: 'flex-start', + flexDirection: 'row', alignItems: 'center', borderRadius: '0.5rem', - border: '0.07rem solid', - borderColor: theme.palette.grey[400], - width: 'fit-content', - padding: '.75rem', - fontSize: '.875rem', + border: `0.07rem solid ${theme.palette.grey[400]}`, + backgroundColor: backgroundColor, color: color, })); -export const DateRangeExpandContainer = styled.div({ +export const DateRangeContainer = styled('div')({ + position: 'relative', + display: 'flex', + justifyContent: 'flex-start', + alignItems: 'center', + borderTopLeftRadius: '0.5rem', + borderBottomLeftRadius: '0.5rem', + padding: '.75rem', + fontSize: '.875rem', +}); + +interface DateRangeExpandContainerProps { + backgroundColor: string; +} + +export const DateRangeExpandContainer = styled.div(({ backgroundColor }) => ({ position: 'absolute', - top: '4rem', right: '0', - width: '14rem', + top: '4rem', display: 'flex', flexDirection: 'column', gap: '0.0625rem', borderRadius: '0.25rem', filter: `drop-shadow(0 0 0.25rem ${theme.palette.grey[400]})`, - backgroundColor: theme.palette.common.white, + backgroundColor: backgroundColor, zIndex: Z_INDEX.POPOVER, padding: '0.25rem 0', '&:after': { @@ -39,43 +57,46 @@ export const DateRangeExpandContainer = styled.div({ width: '0', height: '0', border: '0.5rem solid transparent', - borderTopColor: theme.palette.common.white, - borderRightColor: theme.palette.common.white, + borderTopColor: backgroundColor, + borderRightColor: backgroundColor, transform: 'rotate(-45deg)', }, -}); +})); interface SingleDateRangeProps { disabled: boolean; + backgroundColor: string; } -export const SingleDateRange = styled('div')(({ disabled }: SingleDateRangeProps) => ({ +export const SingleDateRange = styled('div')(({ disabled, backgroundColor }: SingleDateRangeProps) => ({ display: 'flex', justifyContent: 'center', alignItems: 'center', + height: '1.25rem', color: theme.palette.text.primary, + backgroundColor: backgroundColor, fontSize: '.875rem', padding: '0.5rem', + paddingRight: '1rem', cursor: 'pointer', - ...(disabled && { color: theme.palette.text.disabled, cursor: 'default', }), })); -export const StyledArrowForward = styled(ArrowForward)({ - margin: '0 .5rem', - fontSize: '0.875rem', -}); - export const DateRangeFailedIconContainer = styled.div({ - minWidth: '1.25rem', + minWidth: '1.5rem', display: 'flex', justifyContent: 'center', alignItems: 'center', }); +export const StyledArrowForward = styled(ArrowForward)({ + margin: '0 .5rem', + fontSize: '0.875rem', +}); + export const StyledCalendarToday = styled(CalendarToday)({ marginLeft: '1rem', fontSize: '.875rem', @@ -89,7 +110,16 @@ export const StyledDivider = styled(Divider)({ }); export const StyledExpandMoreIcon = styled(ExpandMore)({ - marginLeft: '1.5rem', color: theme.palette.common.black, cursor: 'pointer', }); + +export const StyledExpandContainer = styled('div')({ + position: 'relative', + height: '100%', + width: '3rem', + display: 'flex', + justifyContent: 'center', + alignItems: 'center', + cursor: 'pointer', +}); diff --git a/frontend/src/containers/ReportStep/index.tsx b/frontend/src/containers/ReportStep/index.tsx index 8499b355b7..b05b7986c1 100644 --- a/frontend/src/containers/ReportStep/index.tsx +++ b/frontend/src/containers/ReportStep/index.tsx @@ -268,14 +268,6 @@ const ReportStep = ({ handleSave }: ReportStepProps) => { // eslint-disable-next-line react-hooks/exhaustive-deps }, [selectedDateRange]); - useEffect(() => { - setPageType(onlySelectClassification ? REPORT_PAGE_TYPE.BOARD : REPORT_PAGE_TYPE.SUMMARY); - return () => { - stopPollingReports(); - }; - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []); - useEffect(() => { exportValidityTimeMin && isCsvFileGeneratedAtEnd && @@ -401,7 +393,11 @@ const ReportStep = ({ handleSave }: ReportStepProps) => { ]); useEffect(() => { + setPageType(onlySelectClassification ? REPORT_PAGE_TYPE.BOARD : REPORT_PAGE_TYPE.SUMMARY); startToRequestData(basicReportRequestBody); + return () => { + stopPollingReports(); + }; // eslint-disable-next-line react-hooks/exhaustive-deps }, []); diff --git a/frontend/src/context/stepper/StepperSlice.tsx b/frontend/src/context/stepper/StepperSlice.tsx index 1ce9c2e055..686f934f3a 100644 --- a/frontend/src/context/stepper/StepperSlice.tsx +++ b/frontend/src/context/stepper/StepperSlice.tsx @@ -2,18 +2,29 @@ import { createSlice } from '@reduxjs/toolkit'; import { ZERO } from '@src/constants/commons'; import type { RootState } from '@src/store'; +export interface IMetricsPageFailedDateRange { + boardInfoError?: boolean; + pipelineInfoError?: boolean; + pipelineStepError?: boolean; +} + +export interface IMetricsPageFailedDateRangePayload { + startDate: string; + errors: IMetricsPageFailedDateRange; +} + export interface StepState { stepNumber: number; timeStamp: number; shouldMetricsLoaded: boolean; - failedTimeRangeList: string[]; + metricsPageFailedTimeRangeInfos: Record; } const initialState: StepState = { stepNumber: 0, timeStamp: 0, shouldMetricsLoaded: true, - failedTimeRangeList: [], + metricsPageFailedTimeRangeInfos: {}, }; export const stepperSlice = createSlice({ @@ -26,7 +37,7 @@ export const stepperSlice = createSlice({ }, nextStep: (state) => { if (state.shouldMetricsLoaded && state.stepNumber === 0) { - state.failedTimeRangeList = []; + state.metricsPageFailedTimeRangeInfos = {}; } state.shouldMetricsLoaded = true; state.stepNumber += 1; @@ -41,18 +52,35 @@ export const stepperSlice = createSlice({ updateTimeStamp: (state, action) => { state.timeStamp = action.payload; }, - updateFailedTimeRange: (state, action) => { - state.failedTimeRangeList = state.failedTimeRangeList.concat(action.payload); + updateMetricsPageFailedTimeRangeInfos: (state, action) => { + const errorInfoList: IMetricsPageFailedDateRangePayload[] = action.payload; + + errorInfoList.forEach((singleTimeRangeInfo) => updateInfo(singleTimeRangeInfo)); + + function updateInfo(errorInfo: IMetricsPageFailedDateRangePayload) { + const { startDate, errors } = errorInfo; + state.metricsPageFailedTimeRangeInfos[startDate] = { + ...state.metricsPageFailedTimeRangeInfos[startDate], + ...errors, + }; + } }, }, }); -export const { resetStep, nextStep, backStep, updateShouldMetricsLoaded, updateTimeStamp, updateFailedTimeRange } = - stepperSlice.actions; +export const { + resetStep, + nextStep, + backStep, + updateShouldMetricsLoaded, + updateTimeStamp, + updateMetricsPageFailedTimeRangeInfos, +} = stepperSlice.actions; export const selectStepNumber = (state: RootState) => state.stepper.stepNumber; export const selectTimeStamp = (state: RootState) => state.stepper.timeStamp; export const shouldMetricsLoaded = (state: RootState) => state.stepper.shouldMetricsLoaded; -export const selectFailedTimeRange = (state: RootState) => state.stepper.failedTimeRangeList; +export const selectMetricsPageFailedTimeRangeInfos = (state: RootState) => + state.stepper.metricsPageFailedTimeRangeInfos; export default stepperSlice.reducer; diff --git a/frontend/src/hooks/useGenerateReportEffect.ts b/frontend/src/hooks/useGenerateReportEffect.ts index 85db63ff39..29a8c39f1a 100644 --- a/frontend/src/hooks/useGenerateReportEffect.ts +++ b/frontend/src/hooks/useGenerateReportEffect.ts @@ -94,6 +94,9 @@ export const useGenerateReportEffect = (): IUseGenerateReportEffect => { const startToRequestData = async (params: ReportRequestDTO) => { const { metricTypes } = params; resetTimeoutMessage(metricTypes); + if (hasPollingStarted || nextHasPollingStarted) return; + nextHasPollingStarted = true; + setHasPollingStarted(nextHasPollingStarted); const res: PromiseSettledResult[] = await Promise.allSettled( dateRangeList.map(({ startDate, endDate }) => reportClient.retrieveByUrl( @@ -109,10 +112,6 @@ export const useGenerateReportEffect = (): IUseGenerateReportEffect => { updateErrorAfterFetchReport(res, metricTypes); - if (hasPollingStarted) return; - nextHasPollingStarted = true; - setHasPollingStarted(nextHasPollingStarted); - const { pollingInfos, pollingInterval } = assemblePollingParams(res); await pollingReport({ pollingInfos, interval: pollingInterval }); diff --git a/frontend/src/hooks/useGetBoardInfo.ts b/frontend/src/hooks/useGetBoardInfo.ts index 893ed7f3c9..dfc172d706 100644 --- a/frontend/src/hooks/useGetBoardInfo.ts +++ b/frontend/src/hooks/useGetBoardInfo.ts @@ -1,5 +1,5 @@ import { AXIOS_REQUEST_ERROR_CODE, BOARD_CONFIG_INFO_ERROR, BOARD_CONFIG_INFO_TITLE } from '@src/constants/resources'; -import { updateFailedTimeRange } from '@src/context/stepper/StepperSlice'; +import { updateMetricsPageFailedTimeRangeInfos } from '@src/context/stepper/StepperSlice'; import { boardInfoClient } from '@src/clients/board/BoardInfoClient'; import { BoardInfoConfigDTO } from '@src/clients/board/dto/request'; import { METRICS_DATA_FAIL_STATUS } from '@src/constants/commons'; @@ -13,18 +13,21 @@ import dayjs from 'dayjs'; export type JiraColumns = Record[]; export type TargetFields = Record[]; export type Users = string[]; + export interface BoardInfoResponse { jiraColumns: JiraColumns; targetFields: TargetFields; ignoredTargetFields: TargetFields; users: Users; } + export interface useGetBoardInfoInterface { getBoardInfo: (data: BoardInfoConfigDTO) => Promise | undefined>; isLoading: boolean; errorMessage: Record; boardInfoFailedStatus: METRICS_DATA_FAIL_STATUS; } + const boardInfoPartialFailedStatusMapping = (code: string | number) => { if (code == AXIOS_REQUEST_ERROR_CODE.TIMEOUT) { return METRICS_DATA_FAIL_STATUS.PARTIAL_FAILED_TIMEOUT; @@ -71,11 +74,11 @@ export const useGetBoardInfoEffect = (): useGetBoardInfoInterface => { const [isLoading, setIsLoading] = useState(false); const [errorMessage, setErrorMessage] = useState({}); const [boardInfoFailedStatus, setBoardInfoFailedStatus] = useState(METRICS_DATA_FAIL_STATUS.NOT_FAILED); - const localFailedTimeRangeList: string[] = []; const getBoardInfo = async (data: BoardInfoConfigDTO) => { setIsLoading(true); setErrorMessage({}); + const localFailedTimeRangeList: string[] = []; let errorCount = 0; let localBoardInfoFailedStatus: METRICS_DATA_FAIL_STATUS; @@ -135,7 +138,16 @@ export const useGetBoardInfoEffect = (): useGetBoardInfoInterface => { }) .finally(() => { setIsLoading(false); - dispatch(updateFailedTimeRange(localFailedTimeRangeList)); + dispatch( + updateMetricsPageFailedTimeRangeInfos( + dateRangeCopy.map((dateRange) => ({ + startDate: formatDateToTimestampString(dateRange.startDate!), + errors: { + boardInfoError: localFailedTimeRangeList.includes(formatDateToTimestampString(dateRange.startDate!)), + }, + })), + ), + ); }); } }; diff --git a/frontend/src/hooks/useGetMetricsStepsEffect.ts b/frontend/src/hooks/useGetMetricsStepsEffect.ts index 5ea8f5c59d..a371f7b49c 100644 --- a/frontend/src/hooks/useGetMetricsStepsEffect.ts +++ b/frontend/src/hooks/useGetMetricsStepsEffect.ts @@ -1,7 +1,7 @@ +import { updateMetricsPageFailedTimeRangeInfos } from '@src/context/stepper/StepperSlice'; import { updateShouldRetryPipelineConfig } from '@src/context/Metrics/metricsSlice'; import { IStepsParams, IStepsRes, metricsClient } from '@src/clients/MetricsClient'; import { METRICS_DATA_FAIL_STATUS, DURATION } from '@src/constants/commons'; -import { updateFailedTimeRange } from '@src/context/stepper/StepperSlice'; import { FULFILLED, MESSAGE, REJECTED } from '@src/constants/resources'; import { useAppDispatch } from '@src/hooks/useAppDispatch'; import { TimeoutError } from '@src/errors/TimeoutError'; @@ -49,14 +49,17 @@ export const useGetMetricsStepsEffect = (): useGetMetricsStepsEffectInterface => ); const hasRejected = allStepsRes.some((stepInfo) => stepInfo.status === REJECTED); const hasFulfilled = allStepsRes.some((stepInfo) => stepInfo.status === FULFILLED); - const rejectedIndices = allStepsRes.reduce((indices: number[], stepInfo, index) => { - if (stepInfo.status === REJECTED) { - indices.push(index); - } - return indices; - }, []); - const rejectedTimeRanges = rejectedIndices.map((index) => params[index].startTime.toString()); - dispatch(updateFailedTimeRange(rejectedTimeRanges)); + + dispatch( + updateMetricsPageFailedTimeRangeInfos( + params.map((param, index) => { + return { + startDate: param.startTime, + errors: { pipelineStepError: allStepsRes[index].status === REJECTED }, + }; + }), + ), + ); if (!hasRejected) { setStepFailedStatus(METRICS_DATA_FAIL_STATUS.NOT_FAILED); } else if (hasRejected && hasFulfilled) { diff --git a/frontend/src/hooks/useGetPipelineToolInfoEffect.ts b/frontend/src/hooks/useGetPipelineToolInfoEffect.ts index 279e61c833..b7f20056e8 100644 --- a/frontend/src/hooks/useGetPipelineToolInfoEffect.ts +++ b/frontend/src/hooks/useGetPipelineToolInfoEffect.ts @@ -2,13 +2,16 @@ import { updatePipelineToolVerifyResponse, selectIsProjectCreated, selectPipelineTool, + selectDateRange, } from '@src/context/config/configSlice'; +import { shouldMetricsLoaded, updateMetricsPageFailedTimeRangeInfos } from '@src/context/stepper/StepperSlice'; import { pipelineToolClient, IGetPipelineToolInfoResult } from '@src/clients/pipeline/PipelineToolClient'; import { selectShouldGetPipelineConfig, updatePipelineSettings } from '@src/context/Metrics/metricsSlice'; import { clearMetricsPipelineFormMeta } from '@src/context/meta/metaSlice'; -import { shouldMetricsLoaded } from '@src/context/stepper/StepperSlice'; import { useEffect, useState, useRef, useCallback } from 'react'; +import { formatDateToTimestampString } from '@src/utils/util'; import { useAppDispatch, useAppSelector } from '@src/hooks'; +import { HttpStatusCode } from 'axios'; export interface IUseVerifyPipeLineToolStateInterface { result: IGetPipelineToolInfoResult; @@ -31,6 +34,7 @@ export const useGetPipelineToolInfoEffect = (): IUseVerifyPipeLineToolStateInter const restoredPipelineTool = useAppSelector(selectPipelineTool); const shouldLoad = useAppSelector(shouldMetricsLoaded); const shouldGetPipelineConfig = useAppSelector(selectShouldGetPipelineConfig); + const dateRangeList = useAppSelector(selectDateRange); const [isFirstFetch, setIsFirstFetch] = useState(shouldGetPipelineConfig); const getPipelineToolInfo = useCallback(async () => { @@ -42,12 +46,25 @@ export const useGetPipelineToolInfoEffect = (): IUseVerifyPipeLineToolStateInter try { const response = await pipelineToolClient.getInfo(params); setInfo(response); - dispatch(updatePipelineToolVerifyResponse(response.data)); - dispatch(updatePipelineSettings({ ...response.data, isProjectCreated })); + if (response.code === HttpStatusCode.Ok) { + dispatch(updatePipelineToolVerifyResponse(response.data)); + dispatch(updatePipelineSettings({ ...response.data, isProjectCreated })); + } + dispatch( + updateMetricsPageFailedTimeRangeInfos( + dateRangeList.map((dateRange) => ({ + startDate: formatDateToTimestampString(dateRange.startDate!), + errors: { + pipelineInfoError: response.code !== HttpStatusCode.Ok, + }, + })), + ), + ); } finally { setIsLoading(false); setIsFirstFetch(false); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [dispatch, isProjectCreated, restoredPipelineTool.type, restoredPipelineTool.token]); useEffect(() => { From c27bd3933aed45db384040ea917c47da53c0db31 Mon Sep 17 00:00:00 2001 From: Leiqiuhong <141199516+Leiqiuhong@users.noreply.github.com> Date: Wed, 15 May 2024 09:55:20 +0800 Subject: [PATCH 76/81] Adm-938 [frontend]: Add a mark to the failed time range in report page (#1442) * ADM-938 refactor: rename * ADM-938 feat: add report error infos to redux * ADM-938 feat: rename and add logic for report errors * ADM-938 test: add test for date viewer * ADM-938 test: fix test * ADM-938 fix: fix eslint * ADM-938 style: optimize style * ADM-938 rename: rename test * ADM-938 rename: rename test * ADM-938 refactor: refactor * ADM-938 refactor: rename --- .../DateRangeViewer/DateRangeViewer.test.tsx | 144 ++++++++++++------ .../containers/ReportStep/ReportStep.test.tsx | 4 +- .../__tests__/context/stepperSlice.test.ts | 4 + frontend/src/clients/board/dto/request.ts | 4 +- .../Common/DateRangeViewer/index.tsx | 58 ++++--- .../ConfigStep/DateRangePicker/validation.ts | 6 +- frontend/src/containers/ReportStep/index.tsx | 21 ++- frontend/src/context/config/configSlice.ts | 9 +- frontend/src/context/stepper/StepperSlice.tsx | 38 ++++- frontend/src/hooks/useGenerateReportEffect.ts | 38 ++++- frontend/src/utils/util.ts | 4 +- 11 files changed, 230 insertions(+), 100 deletions(-) diff --git a/frontend/__tests__/components/Common/DateRangeViewer/DateRangeViewer.test.tsx b/frontend/__tests__/components/Common/DateRangeViewer/DateRangeViewer.test.tsx index 99769b8ce9..ae6b02646e 100644 --- a/frontend/__tests__/components/Common/DateRangeViewer/DateRangeViewer.test.tsx +++ b/frontend/__tests__/components/Common/DateRangeViewer/DateRangeViewer.test.tsx @@ -1,7 +1,11 @@ -import { nextStep, updateMetricsPageFailedTimeRangeInfos } from '@src/context/stepper/StepperSlice'; +import { + nextStep, + updateMetricsPageFailedTimeRangeInfos, + updateReportPageFailedTimeRangeInfos, +} from '@src/context/stepper/StepperSlice'; import DateRangeViewer from '@src/components/Common/DateRangeViewer'; +import { DateRangeList } from '@src/context/config/configSlice'; import { formatDateToTimestampString } from '@src/utils/util'; -import { DateRange } from '@src/context/config/configSlice'; import { setupStore } from '@test/utils/setupStoreUtil'; import { render, screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; @@ -10,7 +14,7 @@ import React from 'react'; describe('DateRangeViewer', () => { let store = setupStore(); - const setup = (dateRanges: DateRange) => { + const setup = (dateRanges: DateRangeList) => { return render( @@ -62,51 +66,103 @@ describe('DateRangeViewer', () => { expect(getByText(/2024\/03\/21/)).toBeInTheDocument(); }); - it('should show priority high icon when click expand button and step number is 1', async () => { - const failedTimeRangeList = [ - { - startDate: formatDateToTimestampString('2024-02-01T00:00:00.000+08:00'), - errors: { boardInfoError: true }, - }, - { - startDate: formatDateToTimestampString('2024-03-19T00:00:00.000+08:00'), - errors: { pipelineStepError: true }, - }, - { - startDate: formatDateToTimestampString('2024-04-01T00:00:00.000+08:00'), - errors: { pipelineInfoError: true }, - }, - ]; - store.dispatch(nextStep()); - store.dispatch(updateMetricsPageFailedTimeRangeInfos(failedTimeRangeList)); - const { getByLabelText } = setup(mockDateRanges); - expect(screen.getByTestId('PriorityHighIcon')).toBeInTheDocument(); + describe('DateRangeViewer in metrics page', () => { + beforeEach(() => { + store.dispatch(nextStep()); + }); + it('should show priority high icon given click expand button and there are some error infos', async () => { + const failedTimeRangeList = [ + { + startDate: formatDateToTimestampString('2024-02-01T00:00:00.000+08:00'), + errors: { isBoardInfoError: true }, + }, + { + startDate: formatDateToTimestampString('2024-03-19T00:00:00.000+08:00'), + errors: { isPipelineStepError: true }, + }, + { + startDate: formatDateToTimestampString('2024-04-01T00:00:00.000+08:00'), + errors: { isPipelineInfoError: true }, + }, + ]; + store.dispatch(updateMetricsPageFailedTimeRangeInfos(failedTimeRangeList)); + const { getByLabelText } = setup(mockDateRanges); + expect(screen.getByTestId('PriorityHighIcon')).toBeInTheDocument(); - await userEvent.click(getByLabelText('expandMore')); - expect(screen.getAllByTestId('PriorityHighIcon')).toHaveLength(4); + await userEvent.click(getByLabelText('expandMore')); + expect(screen.getAllByTestId('PriorityHighIcon')).toHaveLength(4); + }); + + it('should not show priority high icon given click expand button and there is no error info', async () => { + const failedTimeRangeList = [ + { + startDate: formatDateToTimestampString('2024-02-01T00:00:00.000+08:00'), + errors: { isBoardInfoError: false }, + }, + { + startDate: formatDateToTimestampString('2024-03-19T00:00:00.000+08:00'), + errors: { isPipelineStepError: false }, + }, + { + startDate: formatDateToTimestampString('2024-04-01T00:00:00.000+08:00'), + errors: { isPipelineInfoError: false }, + }, + ]; + store.dispatch(updateMetricsPageFailedTimeRangeInfos(failedTimeRangeList)); + const { getByLabelText } = setup(mockDateRanges); + + await userEvent.click(getByLabelText('expandMore')); + + expect(screen.queryByTestId('PriorityHighIcon')).not.toBeInTheDocument(); + }); }); - it('should not show priority high icon when click expand button and step number is 0', async () => { - const failedTimeRangeList = [ - { - startDate: formatDateToTimestampString('2024-02-01T00:00:00.000+08:00'), - errors: { boardInfoError: false }, - }, - { - startDate: formatDateToTimestampString('2024-03-19T00:00:00.000+08:00'), - errors: { pipelineStepError: false }, - }, - { - startDate: formatDateToTimestampString('2024-04-01T00:00:00.000+08:00'), - errors: { pipelineInfoError: false }, - }, - ]; - store.dispatch(nextStep()); - store.dispatch(updateMetricsPageFailedTimeRangeInfos(failedTimeRangeList)); - const { getByLabelText } = setup(mockDateRanges); + describe('DateRangeViewer in report page', () => { + beforeEach(() => { + store.dispatch(nextStep()); + store.dispatch(nextStep()); + }); + it('should not show priority high icon in report page given click expand button and there is no error info', async () => { + const failedTimeRangeList = [ + { + startDate: formatDateToTimestampString('2024-02-01T00:00:00.000+08:00'), + errors: { isGainPollingUrlError: false }, + }, + { + startDate: formatDateToTimestampString('2024-03-19T00:00:00.000+08:00'), + errors: { isPollingError: false }, + }, + ]; - await userEvent.click(getByLabelText('expandMore')); + store.dispatch(updateReportPageFailedTimeRangeInfos(failedTimeRangeList)); + const { getByLabelText } = setup(mockDateRanges); + + await userEvent.click(getByLabelText('expandMore')); + + expect(screen.queryByTestId('PriorityHighIcon')).not.toBeInTheDocument(); + }); + + it('should show priority high icon in report page given click expand button and there are some error infos', async () => { + const failedTimeRangeList = [ + { + startDate: formatDateToTimestampString('2024-02-01T00:00:00.000+08:00'), + errors: { isGainPollingUrlError: true }, + }, + { + startDate: formatDateToTimestampString('2024-03-19T00:00:00.000+08:00'), + errors: { isPollingError: true }, + }, + { + startDate: formatDateToTimestampString('2024-04-01T00:00:00.000+08:00'), + errors: { isPollingError: false }, + }, + ]; + store.dispatch(updateReportPageFailedTimeRangeInfos(failedTimeRangeList)); + const { getByLabelText } = setup(mockDateRanges); + expect(screen.getByTestId('PriorityHighIcon')).toBeInTheDocument(); - expect(screen.queryByTestId('PriorityHighIcon')).not.toBeInTheDocument(); + await userEvent.click(getByLabelText('expandMore')); + expect(screen.getAllByTestId('PriorityHighIcon')).toHaveLength(3); + }); }); }); diff --git a/frontend/__tests__/containers/ReportStep/ReportStep.test.tsx b/frontend/__tests__/containers/ReportStep/ReportStep.test.tsx index 19982fe4d6..742d349632 100644 --- a/frontend/__tests__/containers/ReportStep/ReportStep.test.tsx +++ b/frontend/__tests__/containers/ReportStep/ReportStep.test.tsx @@ -16,7 +16,7 @@ import { SHOW_MORE, } from '../../fixtures'; import { - DateRange, + DateRangeList, updateDateRange, updateJiraVerifyResponse, updateMetrics, @@ -133,7 +133,7 @@ describe('Report Step', () => { ]; }; const handleSaveMock = jest.fn(); - const setup = (params: string[], dateRange: DateRange = [fullValueDateRange]) => { + const setup = (params: string[], dateRange: DateRangeList = [fullValueDateRange]) => { dateRange && store.dispatch(updateDateRange(dateRange)); store.dispatch( updateJiraVerifyResponse({ diff --git a/frontend/__tests__/context/stepperSlice.test.ts b/frontend/__tests__/context/stepperSlice.test.ts index e8a5e038e2..9f0bec1803 100644 --- a/frontend/__tests__/context/stepperSlice.test.ts +++ b/frontend/__tests__/context/stepperSlice.test.ts @@ -22,6 +22,7 @@ describe('stepper reducer', () => { timeStamp: 0, shouldMetricsLoaded: true, metricsPageFailedTimeRangeInfos: {}, + reportPageFailedTimeRangeInfos: {}, }, nextStep(), ); @@ -36,6 +37,7 @@ describe('stepper reducer', () => { timeStamp: 0, shouldMetricsLoaded: true, metricsPageFailedTimeRangeInfos: {}, + reportPageFailedTimeRangeInfos: {}, }, backStep(), ); @@ -50,6 +52,7 @@ describe('stepper reducer', () => { timeStamp: 0, shouldMetricsLoaded: true, metricsPageFailedTimeRangeInfos: {}, + reportPageFailedTimeRangeInfos: {}, }, backStep(), ); @@ -65,6 +68,7 @@ describe('stepper reducer', () => { timeStamp: 0, shouldMetricsLoaded: true, metricsPageFailedTimeRangeInfos: {}, + reportPageFailedTimeRangeInfos: {}, }, updateTimeStamp(mockTime), ); diff --git a/frontend/src/clients/board/dto/request.ts b/frontend/src/clients/board/dto/request.ts index 140d3657d9..69eb24c4bd 100644 --- a/frontend/src/clients/board/dto/request.ts +++ b/frontend/src/clients/board/dto/request.ts @@ -1,4 +1,4 @@ -import { DateRange } from '@src/context/config/configSlice'; +import { DateRangeList } from '@src/context/config/configSlice'; export interface BoardRequestDTO { token: string; @@ -20,6 +20,6 @@ export interface BoardInfoRequestDTO { } export interface BoardInfoConfigDTO extends BoardRequestDTO { - dateRanges: DateRange | null; + dateRanges: DateRangeList | null; projectKey: string; } diff --git a/frontend/src/components/Common/DateRangeViewer/index.tsx b/frontend/src/components/Common/DateRangeViewer/index.tsx index 37be8ab3a3..80237642e7 100644 --- a/frontend/src/components/Common/DateRangeViewer/index.tsx +++ b/frontend/src/components/Common/DateRangeViewer/index.tsx @@ -10,18 +10,22 @@ import { StyledExpandContainer, StyledExpandMoreIcon, } from './style'; -import { selectMetricsPageFailedTimeRangeInfos, selectStepNumber } from '@src/context/stepper/StepperSlice'; +import { + selectMetricsPageFailedTimeRangeInfos, + selectReportPageFailedTimeRangeInfos, + selectStepNumber, +} from '@src/context/stepper/StepperSlice'; import React, { useRef, useState, forwardRef, useEffect, useCallback } from 'react'; +import { DateRange, DateRangeList } from '@src/context/config/configSlice'; import { formatDate, formatDateToTimestampString } from '@src/utils/util'; import PriorityHighIcon from '@mui/icons-material/PriorityHigh'; -import { DateRange } from '@src/context/config/configSlice'; import { useAppSelector } from '@src/hooks'; import { theme } from '@src/theme'; type Props = { - dateRangeList: DateRange; - selectedDateRange?: Record; - changeDateRange?: (dateRange: Record) => void; + dateRangeList: DateRangeList; + selectedDateRange?: DateRange; + changeDateRange?: (dateRange: DateRange) => void; disabledAll?: boolean; }; @@ -29,14 +33,15 @@ const DateRangeViewer = ({ dateRangeList, changeDateRange, selectedDateRange, di const [showMoreDateRange, setShowMoreDateRange] = useState(false); const DateRangeExpandRef = useRef(null); const metricsPageFailedTimeRangeInfos = useAppSelector(selectMetricsPageFailedTimeRangeInfos); + const reportPageFailedTimeRangeInfos = useAppSelector(selectReportPageFailedTimeRangeInfos); const stepNumber = useAppSelector(selectStepNumber); - const backgroundColor = stepNumber === 1 ? theme.palette.secondary.dark : theme.palette.common.white; - const currentDateRangeHasFailed = - stepNumber === 1 - ? Object.values(metricsPageFailedTimeRangeInfos).some( - (errorInfo) => errorInfo.pipelineInfoError || errorInfo.boardInfoError || errorInfo.pipelineStepError, - ) - : false; + const currentDateRange: DateRange = selectedDateRange || dateRangeList[0]; + const isMetricsPage = stepNumber === 1; + + const backgroundColor = isMetricsPage ? theme.palette.secondary.dark : theme.palette.common.white; + const currentDateRangeHasFailed = getCurrentDateRangeHasFailed( + formatDateToTimestampString(currentDateRange.startDate!), + ); const handleClickOutside = useCallback((event: MouseEvent) => { if (DateRangeExpandRef.current && !DateRangeExpandRef.current?.contains(event.target as Node)) { @@ -56,17 +61,22 @@ const DateRangeViewer = ({ dateRangeList, changeDateRange, selectedDateRange, di }; }, [handleClickOutside]); + function getCurrentDateRangeHasFailed(startDate: string) { + if (isMetricsPage) { + const errorInfo = metricsPageFailedTimeRangeInfos[startDate]; + return !!(errorInfo?.isPipelineInfoError || errorInfo?.isBoardInfoError || errorInfo?.isPipelineStepError); + } else { + const errorInfo = reportPageFailedTimeRangeInfos[startDate]; + return !!(errorInfo?.isPollingError || errorInfo?.isGainPollingUrlError); + } + } + const DateRangeExpand = forwardRef((props, ref: React.ForwardedRef) => { return ( {dateRangeList.map((dateRange) => { const disabled = dateRange.disabled || disabledAll; - const currentFailedInfo = metricsPageFailedTimeRangeInfos[formatDateToTimestampString(dateRange.startDate!)]; - const hasMetricsError = currentFailedInfo - ? currentFailedInfo.pipelineInfoError || - currentFailedInfo.boardInfoError || - currentFailedInfo.pipelineStepError - : false; + const hasError = getCurrentDateRangeHasFailed(formatDateToTimestampString(dateRange.startDate!)); return ( - {hasMetricsError && stepNumber === 1 && } + {hasError && } {formatDate(dateRange.startDate as string)} @@ -91,13 +101,15 @@ const DateRangeViewer = ({ dateRangeList, changeDateRange, selectedDateRange, di - {currentDateRangeHasFailed && } - {formatDate((selectedDateRange || dateRangeList[0]).startDate as string)} + + {currentDateRangeHasFailed && } + + {formatDate(currentDateRange.startDate!)} - {formatDate((selectedDateRange || dateRangeList[0]).endDate as string)} + {formatDate(currentDateRange.endDate!)} diff --git a/frontend/src/containers/ConfigStep/DateRangePicker/validation.ts b/frontend/src/containers/ConfigStep/DateRangePicker/validation.ts index 56b83c25d7..a3cdf9a38f 100644 --- a/frontend/src/containers/ConfigStep/DateRangePicker/validation.ts +++ b/frontend/src/containers/ConfigStep/DateRangePicker/validation.ts @@ -1,12 +1,12 @@ import dayjsSameOrBeforePlugin from 'dayjs/plugin/isSameOrBefore'; +import { DateRangeList } from '@src/context/config/configSlice'; import dayjsSameOrAfterPlugin from 'dayjs/plugin/isSameOrAfter'; -import { DateRange } from '@src/context/config/configSlice'; import dayjs, { Dayjs } from 'dayjs'; dayjs.extend(dayjsSameOrBeforePlugin); dayjs.extend(dayjsSameOrAfterPlugin); -export const calculateLastAvailableDate = (date: Dayjs, coveredRange: DateRange) => { +export const calculateLastAvailableDate = (date: Dayjs, coveredRange: DateRangeList) => { let lastAvailableDate = dayjs(new Date()).startOf('date'); let minimumDiffDays = lastAvailableDate.diff(date, 'days'); @@ -24,7 +24,7 @@ export const calculateLastAvailableDate = (date: Dayjs, coveredRange: DateRange) return lastAvailableDate; }; -export const isDateDisabled = (coveredRange: DateRange, date: Dayjs) => +export const isDateDisabled = (coveredRange: DateRangeList, date: Dayjs) => coveredRange.some( ({ startDate, endDate }) => date.isSameOrAfter(startDate, 'date') && date.isSameOrBefore(endDate, 'date'), ); diff --git a/frontend/src/containers/ReportStep/index.tsx b/frontend/src/containers/ReportStep/index.tsx index b05b7986c1..3aad0b6a4e 100644 --- a/frontend/src/containers/ReportStep/index.tsx +++ b/frontend/src/containers/ReportStep/index.tsx @@ -6,6 +6,14 @@ import { onlyEmptyAndDoneState, sortDateRanges, } from '@src/utils/util'; +import { + DateRange, + DateRangeList, + isOnlySelectClassification, + isSelectBoardMetrics, + isSelectDoraMetrics, + selectConfig, +} from '@src/context/config/configSlice'; import { GeneralErrorKey, initReportInfo, @@ -14,13 +22,6 @@ import { TimeoutErrorKey, useGenerateReportEffect, } from '@src/hooks/useGenerateReportEffect'; -import { - DateRange, - isOnlySelectClassification, - isSelectBoardMetrics, - isSelectDoraMetrics, - selectConfig, -} from '@src/context/config/configSlice'; import { addNotification, closeAllNotifications, @@ -73,9 +74,7 @@ const ReportStep = ({ handleSave }: ReportStepProps) => { const dispatch = useAppDispatch(); const configData = useAppSelector(selectConfig); const descendingDateRanges = sortDateRanges(configData.basic.dateRange); - const [selectedDateRange, setSelectedDateRange] = useState>( - descendingDateRanges[0], - ); + const [selectedDateRange, setSelectedDateRange] = useState(descendingDateRanges[0]); const [currentDataInfo, setCurrentDataInfo] = useState(initReportInfo()); const { @@ -121,7 +120,7 @@ const ReportStep = ({ handleSave }: ReportStepProps) => { const onlySelectClassification = useAppSelector(isOnlySelectClassification); const isSummaryPage = useMemo(() => pageType === REPORT_PAGE_TYPE.SUMMARY, [pageType]); - const mapDateResult = (descendingDateRanges: DateRange, reportInfos: IReportInfo[]) => + const mapDateResult = (descendingDateRanges: DateRangeList, reportInfos: IReportInfo[]) => descendingDateRanges.map(({ startDate, endDate }) => { const reportData = reportInfos.find((singleResult) => singleResult.id === startDate)?.reportData ?? null; return { diff --git a/frontend/src/context/config/configSlice.ts b/frontend/src/context/config/configSlice.ts index 511dc8626a..191fa283dc 100644 --- a/frontend/src/context/config/configSlice.ts +++ b/frontend/src/context/config/configSlice.ts @@ -18,19 +18,20 @@ import type { RootState } from '@src/store'; import merge from 'lodash/merge'; import { isArray } from 'lodash'; import dayjs from 'dayjs'; - -export type DateRange = { +export interface DateRange { startDate: string | null; endDate: string | null; disabled?: boolean; -}[]; +} + +export type DateRangeList = DateRange[]; export interface BasicConfigState { isProjectCreated: boolean; basic: { projectName: string; calendarType: string; - dateRange: DateRange; + dateRange: DateRangeList; sortType: SortType; metrics: string[]; }; diff --git a/frontend/src/context/stepper/StepperSlice.tsx b/frontend/src/context/stepper/StepperSlice.tsx index 686f934f3a..f3d0913e96 100644 --- a/frontend/src/context/stepper/StepperSlice.tsx +++ b/frontend/src/context/stepper/StepperSlice.tsx @@ -3,14 +3,19 @@ import { ZERO } from '@src/constants/commons'; import type { RootState } from '@src/store'; export interface IMetricsPageFailedDateRange { - boardInfoError?: boolean; - pipelineInfoError?: boolean; - pipelineStepError?: boolean; + isBoardInfoError?: boolean; + isPipelineInfoError?: boolean; + isPipelineStepError?: boolean; } -export interface IMetricsPageFailedDateRangePayload { +export interface IReportPageFailedDateRange { + isGainPollingUrlError?: boolean; + isPollingError?: boolean; +} + +export interface IPageFailedDateRangePayload { startDate: string; - errors: IMetricsPageFailedDateRange; + errors: T; } export interface StepState { @@ -18,6 +23,7 @@ export interface StepState { timeStamp: number; shouldMetricsLoaded: boolean; metricsPageFailedTimeRangeInfos: Record; + reportPageFailedTimeRangeInfos: Record; } const initialState: StepState = { @@ -25,6 +31,7 @@ const initialState: StepState = { timeStamp: 0, shouldMetricsLoaded: true, metricsPageFailedTimeRangeInfos: {}, + reportPageFailedTimeRangeInfos: {}, }; export const stepperSlice = createSlice({ @@ -53,11 +60,11 @@ export const stepperSlice = createSlice({ state.timeStamp = action.payload; }, updateMetricsPageFailedTimeRangeInfos: (state, action) => { - const errorInfoList: IMetricsPageFailedDateRangePayload[] = action.payload; + const errorInfoList: IPageFailedDateRangePayload[] = action.payload; errorInfoList.forEach((singleTimeRangeInfo) => updateInfo(singleTimeRangeInfo)); - function updateInfo(errorInfo: IMetricsPageFailedDateRangePayload) { + function updateInfo(errorInfo: IPageFailedDateRangePayload) { const { startDate, errors } = errorInfo; state.metricsPageFailedTimeRangeInfos[startDate] = { ...state.metricsPageFailedTimeRangeInfos[startDate], @@ -65,6 +72,20 @@ export const stepperSlice = createSlice({ }; } }, + + updateReportPageFailedTimeRangeInfos: (state, action) => { + const errorInfoList: IPageFailedDateRangePayload[] = action.payload; + + errorInfoList.forEach((singleTimeRangeInfo) => updateInfo(singleTimeRangeInfo)); + + function updateInfo(errorInfo: IPageFailedDateRangePayload) { + const { startDate, errors } = errorInfo; + state.reportPageFailedTimeRangeInfos[startDate] = { + ...state.reportPageFailedTimeRangeInfos[startDate], + ...errors, + }; + } + }, }, }); @@ -75,6 +96,7 @@ export const { updateShouldMetricsLoaded, updateTimeStamp, updateMetricsPageFailedTimeRangeInfos, + updateReportPageFailedTimeRangeInfos, } = stepperSlice.actions; export const selectStepNumber = (state: RootState) => state.stepper.stepNumber; @@ -83,4 +105,6 @@ export const shouldMetricsLoaded = (state: RootState) => state.stepper.shouldMet export const selectMetricsPageFailedTimeRangeInfos = (state: RootState) => state.stepper.metricsPageFailedTimeRangeInfos; +export const selectReportPageFailedTimeRangeInfos = (state: RootState) => state.stepper.reportPageFailedTimeRangeInfos; + export default stepperSlice.reducer; diff --git a/frontend/src/hooks/useGenerateReportEffect.ts b/frontend/src/hooks/useGenerateReportEffect.ts index 29a8c39f1a..5a70d4f814 100644 --- a/frontend/src/hooks/useGenerateReportEffect.ts +++ b/frontend/src/hooks/useGenerateReportEffect.ts @@ -1,10 +1,16 @@ +import { + IPageFailedDateRangePayload, + IReportPageFailedDateRange, + updateReportPageFailedTimeRangeInfos, +} from '@src/context/stepper/StepperSlice'; import { ReportCallbackResponse, ReportResponseDTO } from '@src/clients/report/dto/response'; import { exportValidityTimeMapper } from '@src/hooks/reportMapper/exportValidityTime'; import { DATA_LOADING_FAILED, DEFAULT_MESSAGE } from '@src/constants/resources'; +import { DateRangeList, selectConfig } from '@src/context/config/configSlice'; import { IPollingRes, reportClient } from '@src/clients/report/ReportClient'; -import { DateRange, selectConfig } from '@src/context/config/configSlice'; import { ReportRequestDTO } from '@src/clients/report/dto/request'; import { formatDateToTimestampString } from '@src/utils/util'; +import { useAppDispatch } from '@src/hooks/useAppDispatch'; import { TimeoutError } from '@src/errors/TimeoutError'; import { METRIC_TYPES } from '@src/constants/commons'; import { useAppSelector } from '@src/hooks/index'; @@ -83,9 +89,10 @@ const getErrorKey = (error: Error, source: METRIC_TYPES): string => { export const useGenerateReportEffect = (): IUseGenerateReportEffect => { const reportPath = '/reports'; + const dispatch = useAppDispatch(); const configData = useAppSelector(selectConfig); const timerIdRef = useRef(); - const dateRangeList: DateRange = get(configData, 'basic.dateRange', []); + const dateRangeList: DateRangeList = get(configData, 'basic.dateRange', []); const [reportInfos, setReportInfos] = useState( dateRangeList.map((dateRange) => ({ ...initReportInfo(), id: dateRange.startDate as string })), ); @@ -156,6 +163,7 @@ export const useGenerateReportEffect = (): IUseGenerateReportEffect => { const pollingResponsesWithId = assemblePollingResWithId(pollingResponses, pollingInfos); setReportInfos((preReportInfos) => getReportInfosAfterPolling(preReportInfos, pollingResponsesWithId)); + updateReportPageFailedTimeRangeInfosAfterPolling(pollingResponsesWithId); const nextPollingInfos = getNextPollingInfos(pollingResponsesWithId, pollingInfos); if (nextPollingInfos.length === 0) { @@ -209,8 +217,34 @@ export const useGenerateReportEffect = (): IUseGenerateReportEffect => { return resInfo; }); }); + + updateReportPageFailedTimeRangeInfosAfterReport(res); }; + function updateReportPageFailedTimeRangeInfosAfterPolling( + pollingResponsesWithId: PromiseSettledResultWithId[], + ) { + const updateReportPageFailedTimeRangeInfosPayload: IPageFailedDateRangePayload[] = []; + pollingResponsesWithId.forEach((currentRes) => { + updateReportPageFailedTimeRangeInfosPayload.push({ + startDate: formatDateToTimestampString(currentRes.id), + errors: { isPollingError: currentRes.status === REJECTED }, + }); + }); + dispatch(updateReportPageFailedTimeRangeInfos(updateReportPageFailedTimeRangeInfosPayload)); + } + + function updateReportPageFailedTimeRangeInfosAfterReport(res: PromiseSettledResult[]) { + const updateReportPageFailedTimeRangeInfosPayload: IPageFailedDateRangePayload[] = []; + res.forEach((currentRes, index) => { + updateReportPageFailedTimeRangeInfosPayload.push({ + startDate: formatDateToTimestampString(reportInfos[index].id), + errors: { isGainPollingUrlError: currentRes.status === REJECTED }, + }); + }); + dispatch(updateReportPageFailedTimeRangeInfos(updateReportPageFailedTimeRangeInfosPayload)); + } + const assemblePollingParams = (res: PromiseSettledResult[]) => { const resWithIds: PromiseSettledResultWithId[] = res.map((item, index) => ({ ...item, diff --git a/frontend/src/utils/util.ts b/frontend/src/utils/util.ts index b523b79173..23a47b04de 100644 --- a/frontend/src/utils/util.ts +++ b/frontend/src/utils/util.ts @@ -4,9 +4,9 @@ import { ICycleTimeSetting, IPipelineConfig } from '@src/context/Metrics/metrics import { ITargetFieldType } from '@src/components/Common/MultiAutoComplete/styles'; import { IPipeline } from '@src/context/config/pipelineTool/verifyResponseSlice'; import { includes, isEqual, sortBy, uniq, uniqBy } from 'lodash'; +import { DateRangeList } from '@src/context/config/configSlice'; import { BoardInfoResponse } from '@src/hooks/useGetBoardInfo'; import { DATE_FORMAT_TEMPLATE } from '@src/constants/template'; -import { DateRange } from '@src/context/config/configSlice'; import duration from 'dayjs/plugin/duration'; import dayjs from 'dayjs'; @@ -103,7 +103,7 @@ export const formatDateToTimestampString = (date: string) => { return dayjs(date).valueOf().toString(); }; -export const sortDateRanges = (dateRanges: DateRange, descending = true) => { +export const sortDateRanges = (dateRanges: DateRangeList, descending = true) => { const result = [...dateRanges].sort((a, b) => { return dayjs(b.startDate as string).diff(dayjs(a.startDate as string)); }); From a05af5b7f704416f2b68a442b4cb8949b17231d8 Mon Sep 17 00:00:00 2001 From: Leiqiuhong <141199516+Leiqiuhong@users.noreply.github.com> Date: Wed, 15 May 2024 11:29:42 +0800 Subject: [PATCH 77/81] ADM-938-fix test: fix e2e test (#1444) --- .../e2e/fixtures/create-new/board-data.csv | 44 +++++++++---------- .../e2e/fixtures/create-new/metric-data.csv | 4 +- frontend/e2e/pages/metrics/report-step.ts | 14 +++--- 3 files changed, 30 insertions(+), 32 deletions(-) diff --git a/frontend/e2e/fixtures/create-new/board-data.csv b/frontend/e2e/fixtures/create-new/board-data.csv index da5ffc9569..6cf9b22a98 100644 --- a/frontend/e2e/fixtures/create-new/board-data.csv +++ b/frontend/e2e/fixtures/create-new/board-data.csv @@ -1,24 +1,22 @@ -Issue key,Summary,Issue Type,Status,Status Date,Story Points,assignee,Reporter,Project Key,Project Name,Priority,Parent Summary,Sprint,Labels,Cycle Time,Story testing-1,Flagged,Fix versions,Partner,Time tracking,Story point estimate,QA,Feature/Operation,Story testing-2,Cycle Time / Story Points,Analysis Days,In Dev Days,Waiting Days,Testing Days,Block Days,Review Days,OriginCycleTime: TODO,OriginCycleTime: TESTING,OriginCycleTime: WAIT FOR TEST,OriginCycleTime: DOING,OriginCycleTime: REVIEW,OriginCycleTime: BLOCKED,Rework: total - In dev,Rework: from Block,Rework: from Review,Rework: from Waiting for testing,Rework: from Testing,Rework: from Done -ADM-735,[backend]identify the source of the error when generate reports encounter exception,Task,Done,2024-01-19,1.0,Yunsong Yang,Yunsong Yang,ADM,Auto Dora Metrics,Medium,Precise on Metrics,Sprint 28,Stream2,7.70,1.0,"","","",None,1.0,"","","",7.70,0,2.02,1.81,0,0,3.87,3.03,0,1.81,2.02,3.87,0,0,0,0,0,0,0 -ADM-708,[Backend] Verify board and obtain board data with new API,Task,Done,2024-01-19,3.0,Weiran Sun,heartbeat user,ADM,Auto Dora Metrics,Medium,easy to use,Sprint 28,Stream1,9.95,1.0,"","","",None,3.0,"","","",3.32,0,4.00,0.93,1.04,0.98,3.00,7.10,1.04,0.93,4.00,3.00,0.98,2,2,0,0,0,0 -ADM-699,[Frontend] Optimize the 4xx&504 error display of report overview,Task,Done,2024-01-18,2.0,heartbeat user,heartbeat user,ADM,Auto Dora Metrics,Medium,Performance Improvement,Sprint 28,Stream2,10.93,1.0,"","","",None,2.0,"","","",5.46,0,5.14,0.04,0.78,2.01,2.96,10.75,0.78,0.04,5.14,2.96,2.01,2,2,0,0,0,0 -ADM-717,[Backend] Verify github and obtain github data with new API,Task,Done,2024-01-17,2.0,Junbo Dai,Yufan Wang,ADM,Auto Dora Metrics,Medium,easy to use,Sprint 28,Stream1,8.09,1.0,"","","",None,2.0,Weiran Sun,"","",4.04,0,2.83,2.72,0.05,2.14,0.35,6.00,0.05,2.72,2.83,0.35,2.14,3,3,0,0,0,0 -ADM-724,[Spike] redesign board verify API to meet business requirements,Spike,Done,2024-01-17,1.0,heartbeat user,Yufan Wang,ADM,Auto Dora Metrics,Medium,easy to use,Sprint 28,Stream1,12.94,"","","","",None,1.0,"","","",12.94,0,1.08,1.99,0,7.65,2.22,0.27,0,1.99,1.08,2.22,7.65,2,2,0,0,0,0 -ADM-652,[Frontend]Generate the separate modules detail report,Task,Done,2024-01-17,3.0,Xuebing Li,heartbeat user,ADM,Auto Dora Metrics,Medium,Performance Improvement,Sprint 28,Stream2,10.15,1.0,"","","",None,3.0,"","","",3.38,0,5.94,1.35,1.87,0.72,0.27,22.87,1.87,1.35,5.94,0.27,0.72,1,1,0,0,0,0 -ADM-683,[Frontend] UI refine for the date picker in report page,Task,Done,2024-01-17,1.0,heartbeat user,heartbeat user,ADM,Auto Dora Metrics,Medium,easy to use,Sprint 28,Stream2,8.92,1.0,"","","",None,1.0,"","","",8.92,0,3.00,0.10,1.84,3.00,0.98,15.05,1.84,0.10,3.00,0.98,3.00,1,1,0,0,0,0 -ADM-669,[Frontend] UI refine for notification pop up change in report page,Task,Done,2024-01-17,1.0,heartbeat user,heartbeat user,ADM,Auto Dora Metrics,Medium,easy to use,Sprint 28,Stream2,7.13,1.0,"","","",None,1.0,"","","",7.13,0,4.22,0.02,1.16,0,1.73,17.80,1.16,0.02,4.22,1.73,0,0,0,0,0,0,0 -ADM-709,[Backend] Verify buildkite and obtain buildkite data with new API,Task,Done,2024-01-15,3.0,Xinyi Wang,heartbeat user,ADM,Auto Dora Metrics,Medium,easy to use,Sprint 27,Stream1,6.85,1.0,"","","",None,3.0,"","","",2.28,0,2.81,0.07,0.78,0,3.19,8.03,0.78,0.07,2.81,3.19,0,,,,,, +"Issue key","Summary","Issue Type","Status","Status Date","Story Points","assignee","Reporter","Project Key","Project Name","Priority","Parent Summary","Sprint","Labels","Cycle Time","Fix versions","Partner","Time tracking","Story testing-1","Flagged","Story point estimate","QA","Feature/Operation","Story testing-2","Cycle Time / Story Points","Analysis Days","In Dev Days","Waiting Days","Testing Days","Block Days","Review Days","OriginCycleTime: TODO","OriginCycleTime: TESTING","OriginCycleTime: WAIT FOR TEST","OriginCycleTime: DOING","OriginCycleTime: REVIEW","OriginCycleTime: BLOCKED","Rework: total - In dev","Rework: from Block","Rework: from Review","Rework: from Waiting for testing","Rework: from Testing","Rework: from Done" +"ADM-735","[backend]identify the source of the error when generate reports encounter exception","Task","Done","2024-01-19","1.0","Yunsong Yang","Yunsong Yang","ADM","Auto Dora Metrics","Medium","Precise on Metrics","Sprint 28","Stream2","7.70","","","None","1.0","","1.0","","","","7.70","0","2.02","1.81","0","0","3.87","3.03","0","1.81","2.02","3.87","0","0","0","0","0","0","0" +"ADM-708","[Backend] Verify board and obtain board data with new API","Task","Done","2024-01-19","3.0","Weiran Sun","heartbeat user","ADM","Auto Dora Metrics","Medium","easy to use","Sprint 28","Stream1","9.95","","","None","1.0","","3.0","","","","3.32","0","4.00","0.93","1.04","0.98","3.00","7.10","1.04","0.93","4.00","3.00","0.98","2","2","0","0","0","0" +"ADM-699","[Frontend] Optimize the 4xx&504 error display of report overview","Task","Done","2024-01-18","2.0","heartbeat user","heartbeat user","ADM","Auto Dora Metrics","Medium","Performance Improvement","Sprint 28","Stream2","10.93","","","None","1.0","","2.0","","","","5.46","0","5.14","0.04","0.78","2.01","2.96","10.75","0.78","0.04","5.14","2.96","2.01","2","2","0","0","0","0" +"ADM-717","[Backend] Verify github and obtain github data with new API","Task","Done","2024-01-17","2.0","Junbo Dai","Yufan Wang","ADM","Auto Dora Metrics","Medium","easy to use","Sprint 28","Stream1","8.09","","","None","1.0","","2.0","Weiran Sun","","","4.04","0","2.83","2.72","0.05","2.14","0.35","6.00","0.05","2.72","2.83","0.35","2.14","3","3","0","0","0","0" +"ADM-724","[Spike] redesign board verify API to meet business requirements","Spike","Done","2024-01-17","1.0","heartbeat user","Yufan Wang","ADM","Auto Dora Metrics","Medium","easy to use","Sprint 28","Stream1","12.94","","","None","","","1.0","","","","12.94","0","1.08","1.99","0","7.65","2.22","0.27","0","1.99","1.08","2.22","7.65","2","2","0","0","0","0" +"ADM-652","[Frontend]Generate the separate modules detail report","Task","Done","2024-01-17","3.0","Xuebing Li","heartbeat user","ADM","Auto Dora Metrics","Medium","Performance Improvement","Sprint 28","Stream2","10.15","","","None","1.0","","3.0","","","","3.38","0","5.94","1.35","1.87","0.72","0.27","22.87","1.87","1.35","5.94","0.27","0.72","1","1","0","0","0","0" +"ADM-683","[Frontend] UI refine for the date picker in report page","Task","Done","2024-01-17","1.0","heartbeat user","heartbeat user","ADM","Auto Dora Metrics","Medium","easy to use","Sprint 28","Stream2","8.92","","","None","1.0","","1.0","","","","8.92","0","3.00","0.10","1.84","3.00","0.98","15.05","1.84","0.10","3.00","0.98","3.00","1","1","0","0","0","0" +"ADM-669","[Frontend] UI refine for notification pop up change in report page","Task","Done","2024-01-17","1.0","heartbeat user","heartbeat user","ADM","Auto Dora Metrics","Medium","easy to use","Sprint 28","Stream2","7.13","","","None","1.0","","1.0","","","","7.13","0","4.22","0.02","1.16","0","1.73","17.80","1.16","0.02","4.22","1.73","0","0","0","0","0","0","0" +"ADM-709","[Backend] Verify buildkite and obtain buildkite data with new API","Task","Done","2024-01-15","3.0","Xinyi Wang","heartbeat user","ADM","Auto Dora Metrics","Medium","easy to use","Sprint 27","Stream1","6.85","","","None","1.0","","3.0","","","","2.28","0","2.81","0.07","0.78","0","3.19","8.03","0.78","0.07","2.81","3.19","0","0","0","0","0","0","0" ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -ADM-806,[BE]no need to obtain pipeline data twice in backend,Bug,Review,2024-02-26,2.0,heartbeat user,Yufan Wang,ADM,Auto Dora Metrics,Medium,,Sprint 30,"Stream2,v1.1.5",0,"","","","",None,2.0,"","","",0,0,2.89,0,0,0,0.04,8.10,0,0,2.89,0.04,0,,,,,, -ADM-813,[FE]add new field 'Advance' in metrics page,Task,Review,2024-02-26,2.0,heartbeat user,Yufan Wang,ADM,Auto Dora Metrics,Medium,,Sprint 30,"Stream2,v1.1.5",0,1.0,"","","",None,2.0,"","","",0,0,4.78,0,0,4.68,0.53,0.19,0,0,4.78,0.53,4.68,,,,,, -ADM-677,[Spike]Investigate Github graphQL API about replacing existing REST API,Spike,Blocked,2024-02-21,2.0,Junbo Dai,Yichen Wang,ADM,Auto Dora Metrics,Medium,Performance Improvement,Sprint 30,Stream1,0,"","","","",None,2.0,"","","",0,0,1.05,0,0,10.17,0,38.43,0,0,1.05,0,10.17,,,,,, -ADM-819,[BE]cache doesn't work in one case,Bug,Doing,2024-02-26,2.0,Shiqi Yuan,Yufan Wang,ADM,Auto Dora Metrics,Medium,,Sprint 30,"Stream2,v1.1.5",0,"","","","",None,2.0,"","","",0,0,3.14,0,0,1.05,0,0.84,0,0,3.14,0,1.05,,,,,, -ADM-797,[BE]The add flag as block logic is not working,Bug,Doing,2024-02-26,2.0,heartbeat user,Wenting Yan,ADM,Auto Dora Metrics,High,,Sprint 30,"Stream2,v1.1.5",0,"","","","",None,2.0,"","","",0,0,7.13,0,0,5.00,0,2.03,0,0,7.38,0,5.80,,,,,, -ADM-829,jump home page when user click next button in config page,Bug,Doing,2024-02-23,2.0,Junbo Dai,Yufan Wang,ADM,Auto Dora Metrics,High,,Sprint 30,"Stream1,v1.1.5",0,"","","","",None,2.0,"","","",0,0,1.03,0,0,0,0,1.17,0,0,1.03,0,0,,,,,, -ADM-812,[FE]metrics page needs to retain the modified data,Bug,Doing,2024-02-23,2.0,heartbeat user,Yufan Wang,ADM,Auto Dora Metrics,Medium,,Sprint 30,Stream1,0,"","","","",None,2.0,"","","",0,0,3.04,0,0,1.03,0,6.67,0,0,3.04,0,1.03,,,,,, -ADM-809,"[E2E] build ""import a new project"" scenario",Task,Doing,2024-02-22,2.0,heartbeat user,Xingmeng Tao,ADM,Auto Dora Metrics,High,,Sprint 30,"Stream1,v1.1.5",0,1.0,"","","",None,2.0,"","","",0,0,2.24,0,0,0,0,8.00,0,0,2.24,0,0,,,,,, -ADM-808,"[E2E] build ""Create a new Project"" scenario",Task,Doing,2024-02-19,3.5,heartbeat user,Xingmeng Tao,ADM,Auto Dora Metrics,High,,Sprint 30,"Stream1,v1.1.5",0,1.0,"","","",None,3.5,"","","",0,0,8.04,0,0,1.99,0,0.95,0,0,8.04,0,1.99,,,,,, -ADM-825,"[E2E] build ""page jumps"" scenario",Task,TODO,,2.0,,Yufan Wang,ADM,Auto Dora Metrics,High,,Sprint 30,"Stream1,v1.1.5",0,1.0,"","","",None,2.0,"","","",0,0,0,0,0,0,0,0,0,0,0,0,0,,,,,, -ADM-820,user was misguided to home page when they want to enter metrics page,Bug,TODO,,0.0,heartbeat user,Yufan Wang,ADM,Auto Dora Metrics,Medium,,Sprint 30,Stream2,0,"","","","",None,"","","","","",0,0,0,0,0,0,0,0,0,0,0,0,,,,,, -ADM-833,"[E2E] build ""unhappy path"" scenario",Task,TODO,,0.0,,heartbeat user,ADM,Auto Dora Metrics,Medium,,Sprint 30,Stream1,0,1.0,"","","",None,"","","","","",0,0,0,0,0,0,0,0,0,0,0,0,,,,,, -ADM-789,refactor E2E-step2,Task,TODO,,1.0,,Yufan Wang,ADM,Auto Dora Metrics,High,,Sprint 30,Stream2,0,1.0,"","","",None,1.0,"","","",0,0,0,0,0,0,0,0,0,0,0,0,0,,,,,, +"ADM-879","[FE]Generate data reports for multiple time ranges","Story","Testing","2024-05-10","3.0","heartbeat user","Yufan Wang","ADM","Auto Dora Metrics","Medium","Charting","Sprint 36","1.1.7","0","","","None","","","3.0","","","","0","0","12.04","4.04","3.75","1.00","0","19.82","3.75","4.04","12.04","0","1.00",,,,,, +"ADM-924","[FE] Export data in report list page","Story","Review","2024-05-15","3.0","heartbeat user","Yufan Wang","ADM","Auto Dora Metrics","Medium","Charting","Sprint 36","1.1.7,Stream2","0","","","None","","","3.0","","","","0","0","12.77","0","0","3.25","3.97","1.15","0","0","12.77","3.97","3.25",,,,,, +"ADM-937","[BE] Pipeline crew setting could filter out dependentbot pipeline","Bug","Blocked","2024-05-15","2.0","heartbeat user","Yichen Wang","ADM","Auto Dora Metrics","Medium","Precise on Metrics","Sprint 36","1.1.7","0","","","None","","","2.0","","","","0","0","2.83","4.02","0","3.05","0.90","2.25","0","4.02","2.83","0.90","3.05",,,,,, +"ADM-881","[FE] Export data in report chart page","Story","Blocked","2024-05-11","1.0","heartbeat user","Yufan Wang","ADM","Auto Dora Metrics","Medium","Charting","Sprint 36","1.1.7","0","","","None","","","1.0","","","","0","0","3.63","0","0","4.18","0","32.84","0","0","3.63","0","4.18",,,,,, +"ADM-907","[FE]update Readme about 'charting'","Task","Blocked","2024-04-28","1.0","Yufan Wang","Yufan Wang","ADM","Auto Dora Metrics","Medium","Charting","Sprint 36","1.1.7,Stream2","0","","","None","1.0","","1.0","","","","0","0","1.81","0","0","11.04","0","17.28","0","0","1.81","0","11.04",,,,,, +"ADM-880","[FE] Generate chart - board metrics","Story","Doing","2024-05-15","3.0","heartbeat user","Yufan Wang","ADM","Auto Dora Metrics","Highest","Charting","Sprint 36","1.1.7","0","","","None","","","3.0","","","","0","0","8.26","0","0","0.74","0","31.66","0","0","8.26","0","0.74",,,,,, +"ADM-744","[FE] add pop-up when board token & email are incorrect","Story","Doing","2024-05-14","1.0","Weiran Sun","Yufan Wang","ADM","Auto Dora Metrics","Medium","easy to use","Sprint 36","Stream1","0","","","None","","","1.0","","","","0","0","0.83","0","0","0","0","86.91","0","0","0.83","0","0",,,,,, +"ADM-938","[FE] Add a mark to the failed time range in report page","Story","Doing","2024-05-14","1.0","heartbeat user","Yufan Wang","ADM","Auto Dora Metrics","Medium","Charting","Sprint 36","1.1.7","0","","","None","","","1.0","","","","0","0","3.01","0","0","1.02","0","4.95","0","0","3.01","0","1.02",,,,,, +"ADM-906","[E2E] build 'charting' scenario-happy path","Task","Doing","2024-05-09","3.0","Chao Wang","Yufan Wang","ADM","Auto Dora Metrics","Medium","Charting","Sprint 36","1.1.7","0","","YinYuan Zhou","None","1.0","","3.0","","","","0","0","6.83","0","0","0","0","23.31","0","0","6.83","0","0",,,,,, +"ADM-908","[FE] Generate chart - dora metrics","Story","Doing","2024-05-06","2.0","heartbeat user","Yufan Wang","ADM","Auto Dora Metrics","Medium","Charting","Sprint 36","1.1.7,Stream2","0","","","None","","","2.0","","","","0","0","14.61","0","0","4.16","0","11.36","0","0","14.61","0","4.16",,,,,, +"ADM-945","[FE]optimize the time range settings","Bug","TODO",,"2.0",,"Yufan Wang","ADM","Auto Dora Metrics","Medium","easy to use","Sprint 36","","0","","","None","","","2.0","","","","0","0","0","0","0","0","0","0","0","0","0","0","0",,,,,, diff --git a/frontend/e2e/fixtures/create-new/metric-data.csv b/frontend/e2e/fixtures/create-new/metric-data.csv index 7402eda4b6..4fcc230604 100644 --- a/frontend/e2e/fixtures/create-new/metric-data.csv +++ b/frontend/e2e/fixtures/create-new/metric-data.csv @@ -26,17 +26,17 @@ "Classifications","Story testing-2 / None","100.00" "Classifications","Story testing-1 / 1.0","88.89" "Classifications","Story testing-1 / None","11.11" +"Classifications","Project / Auto Dora Metrics","100.00" "Classifications","Sprint / Sprint 26","11.11" "Classifications","Sprint / Sprint 27","100.00" "Classifications","Sprint / Sprint 28","88.89" -"Classifications","Project / Auto Dora Metrics","100.00" "Classifications","Flagged / None","100.00" "Classifications","Fix versions / None","100.00" "Classifications","Priority / Medium","100.00" "Classifications","Partner / None","100.00" +"Classifications","Time tracking / None","100.00" "Classifications","Labels / Stream1","44.44" "Classifications","Labels / Stream2","55.56" -"Classifications","Time tracking / None","100.00" "Classifications","Story point estimate / 1.0","44.44" "Classifications","Story point estimate / 2.0","22.22" "Classifications","Story point estimate / 3.0","33.33" diff --git a/frontend/e2e/pages/metrics/report-step.ts b/frontend/e2e/pages/metrics/report-step.ts index 043b22c92e..936e0963d8 100644 --- a/frontend/e2e/pages/metrics/report-step.ts +++ b/frontend/e2e/pages/metrics/report-step.ts @@ -229,17 +229,17 @@ export class ReportStep { await expect(this.classificationRows.nth(8)).toContainText(this.combineStrings(['None', '100.00%'])); await expect(this.classificationRows.nth(10)).toContainText(this.combineStrings(['1.0', '88.89%'])); await expect(this.classificationRows.nth(11)).toContainText(this.combineStrings(['None', '11.11%'])); - await expect(this.classificationRows.nth(13)).toContainText(this.combineStrings(['Sprint 26', '11.11%'])); - await expect(this.classificationRows.nth(14)).toContainText(this.combineStrings(['Sprint 27', '100.00%'])); - await expect(this.classificationRows.nth(15)).toContainText(this.combineStrings(['Sprint 28', '88.89%'])); - await expect(this.classificationRows.nth(17)).toContainText(this.combineStrings(['Auto Dora Metrics', '100.00%'])); + await expect(this.classificationRows.nth(13)).toContainText(this.combineStrings(['Auto Dora Metrics', '100.00%'])); + await expect(this.classificationRows.nth(15)).toContainText(this.combineStrings(['Sprint 26', '11.11%'])); + await expect(this.classificationRows.nth(16)).toContainText(this.combineStrings(['Sprint 27', '100.00%'])); + await expect(this.classificationRows.nth(17)).toContainText(this.combineStrings(['Sprint 28', '88.89%'])); await expect(this.classificationRows.nth(19)).toContainText(this.combineStrings(['None', '100.00%'])); await expect(this.classificationRows.nth(21)).toContainText(this.combineStrings(['None', '100.00%'])); await expect(this.classificationRows.nth(23)).toContainText(this.combineStrings(['Medium', '100.00%'])); await expect(this.classificationRows.nth(25)).toContainText(this.combineStrings(['None', '100.00%'])); - await expect(this.classificationRows.nth(27)).toContainText(this.combineStrings(['Stream1', '44.44%'])); - await expect(this.classificationRows.nth(28)).toContainText(this.combineStrings(['Stream2', '55.56%'])); - await expect(this.classificationRows.nth(30)).toContainText(this.combineStrings(['None', '100.00%'])); + await expect(this.classificationRows.nth(27)).toContainText(this.combineStrings(['None', '100.00%'])); + await expect(this.classificationRows.nth(29)).toContainText(this.combineStrings(['Stream1', '44.44%'])); + await expect(this.classificationRows.nth(30)).toContainText(this.combineStrings(['Stream2', '55.56%'])); await expect(this.classificationRows.nth(32)).toContainText(this.combineStrings(['1.0', '44.44%'])); await expect(this.classificationRows.nth(33)).toContainText(this.combineStrings(['2.0', '22.22%'])); await expect(this.classificationRows.nth(34)).toContainText(this.combineStrings(['3.0', '33.33%'])); From d98b9f4e3ace6947836902e555094ebba1a3eaea Mon Sep 17 00:00:00 2001 From: Leiqiuhong <141199516+Leiqiuhong@users.noreply.github.com> Date: Wed, 15 May 2024 12:11:29 +0800 Subject: [PATCH 78/81] ADM-938-last test: fix e2e test (#1445) --- frontend/e2e/fixtures/import-file/metric-data.csv | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/e2e/fixtures/import-file/metric-data.csv b/frontend/e2e/fixtures/import-file/metric-data.csv index 7402eda4b6..4fcc230604 100644 --- a/frontend/e2e/fixtures/import-file/metric-data.csv +++ b/frontend/e2e/fixtures/import-file/metric-data.csv @@ -26,17 +26,17 @@ "Classifications","Story testing-2 / None","100.00" "Classifications","Story testing-1 / 1.0","88.89" "Classifications","Story testing-1 / None","11.11" +"Classifications","Project / Auto Dora Metrics","100.00" "Classifications","Sprint / Sprint 26","11.11" "Classifications","Sprint / Sprint 27","100.00" "Classifications","Sprint / Sprint 28","88.89" -"Classifications","Project / Auto Dora Metrics","100.00" "Classifications","Flagged / None","100.00" "Classifications","Fix versions / None","100.00" "Classifications","Priority / Medium","100.00" "Classifications","Partner / None","100.00" +"Classifications","Time tracking / None","100.00" "Classifications","Labels / Stream1","44.44" "Classifications","Labels / Stream2","55.56" -"Classifications","Time tracking / None","100.00" "Classifications","Story point estimate / 1.0","44.44" "Classifications","Story point estimate / 2.0","22.22" "Classifications","Story point estimate / 3.0","33.33" From ad52ee15ad6f62917723c241139838cad1c5453c Mon Sep 17 00:00:00 2001 From: neomgb <123063936+neomgb@users.noreply.github.com> Date: Wed, 15 May 2024 14:03:29 +0800 Subject: [PATCH 79/81] ADM-924 [frontend]: fix download report dialog title and style (#1443) * ADM-924:[frontend]fix: fix download dialog title * ADM-924:[frontend]fix: fix style * ADM-924: [frontend] fix: modify style * ADM-924: [frontend] fix: fix lint issues * ADM-924: [frontend] fix: fix lint issues * ADM-924: [frontend] fix: fix unit test --------- Co-authored-by: Tingyu Dong --- .../containers/ReportButtonGroup.test.tsx | 3 +-- .../ReportStep/DownloadDialog.test.tsx | 1 + frontend/src/constants/commons.ts | 6 +++++ .../containers/ReportButtonGroup/index.tsx | 3 ++- .../ReportStep/DownloadDialog/index.tsx | 20 ++++++++++++----- .../ReportStep/DownloadDialog/style.tsx | 22 +++++++++++++------ 6 files changed, 39 insertions(+), 16 deletions(-) diff --git a/frontend/__tests__/containers/ReportButtonGroup.test.tsx b/frontend/__tests__/containers/ReportButtonGroup.test.tsx index baaeb428c4..1c1b89e8b7 100644 --- a/frontend/__tests__/containers/ReportButtonGroup.test.tsx +++ b/frontend/__tests__/containers/ReportButtonGroup.test.tsx @@ -172,7 +172,6 @@ describe('ReportButtonGroup', () => { const exportMetricDataButton = screen.getByRole('button', { name: EXPORT_METRIC_DATA }); expect(exportMetricDataButton).not.toBeDisabled(); await userEvent.click(exportMetricDataButton); - expect(screen.getByText('Select the time period for the exporting data')).toBeInTheDocument(); const closeButton = screen.getByTestId('CloseIcon'); await userEvent.click(closeButton); @@ -186,7 +185,7 @@ describe('ReportButtonGroup', () => { const exportMetricDataButton = screen.getByRole('button', { name: EXPORT_METRIC_DATA }); expect(exportMetricDataButton).not.toBeDisabled(); await userEvent.click(exportMetricDataButton); - expect(screen.getByText('Select the time period for the exporting data')).toBeInTheDocument(); + const checkbox = screen.getAllByRole('checkbox')[0]; expect(checkbox).not.toBeDisabled(); await userEvent.click(checkbox); diff --git a/frontend/__tests__/containers/ReportStep/DownloadDialog.test.tsx b/frontend/__tests__/containers/ReportStep/DownloadDialog.test.tsx index 1a37edc3f6..4ef4372bbb 100644 --- a/frontend/__tests__/containers/ReportStep/DownloadDialog.test.tsx +++ b/frontend/__tests__/containers/ReportStep/DownloadDialog.test.tsx @@ -25,6 +25,7 @@ describe('DownloadDialog', () => { const setup = (dateRangeList: DateRangeItem[]) => { render( fetchExportData(exportCSV(dataType, startDate, endDate))} + title={DOWNLOAD_DIALOG_TITLE[dataType]} /> )} diff --git a/frontend/src/containers/ReportStep/DownloadDialog/index.tsx b/frontend/src/containers/ReportStep/DownloadDialog/index.tsx index 1a52e9eabe..3d4887cd1c 100644 --- a/frontend/src/containers/ReportStep/DownloadDialog/index.tsx +++ b/frontend/src/containers/ReportStep/DownloadDialog/index.tsx @@ -3,6 +3,7 @@ import { DialogContainer, StyledButton, StyledCalendarToday, + StyledDialog, StyledDialogContent, StyledDialogTitle, StyledFormControlLabel, @@ -11,8 +12,8 @@ import { tooltipModifiers, } from '@src/containers/ReportStep/DownloadDialog/style'; import { DISABLED_DATE_RANGE_MESSAGE } from '@src/constants/resources'; -import { Checkbox, Dialog, Tooltip } from '@mui/material'; import { COMMON_BUTTONS } from '@src/constants/commons'; +import { Checkbox, Tooltip } from '@mui/material'; import { formatDate } from '@src/utils/util'; import React, { useState } from 'react'; @@ -21,6 +22,7 @@ interface DownloadDialogProps { handleClose: () => void; dateRangeList: DateRangeItem[]; downloadCSVFile: (startDate: string, endDate: string) => void; + title: string; } export interface DateRangeItem { @@ -29,7 +31,13 @@ export interface DateRangeItem { disabled: boolean; } -export const DownloadDialog = ({ isShowDialog, handleClose, dateRangeList, downloadCSVFile }: DownloadDialogProps) => { +export const DownloadDialog = ({ + isShowDialog, + handleClose, + dateRangeList, + downloadCSVFile, + title, +}: DownloadDialogProps) => { const [selectedRangeItems, setSelectedRangeItems] = useState([]); const confirmButtonDisabled = selectedRangeItems.length === 0; @@ -68,16 +76,16 @@ export const DownloadDialog = ({ isShowDialog, handleClose, dateRangeList, downl }; return ( - + - Export Board Data + Export {title} Data - Select the time period for the exporting data + Select the time period {dateRangeList.map((item) => ( @@ -95,6 +103,6 @@ export const DownloadDialog = ({ isShowDialog, handleClose, dateRangeList, downl - + ); }; diff --git a/frontend/src/containers/ReportStep/DownloadDialog/style.tsx b/frontend/src/containers/ReportStep/DownloadDialog/style.tsx index 9b2311d401..d111053a26 100644 --- a/frontend/src/containers/ReportStep/DownloadDialog/style.tsx +++ b/frontend/src/containers/ReportStep/DownloadDialog/style.tsx @@ -1,11 +1,17 @@ -import { Button, DialogContent, DialogTitle, FormControlLabel, FormGroup } from '@mui/material'; +import { Button, Dialog, DialogContent, DialogTitle, FormControlLabel, FormGroup } from '@mui/material'; import { CalendarToday } from '@mui/icons-material'; import CloseIcon from '@mui/icons-material/Close'; import { styled } from '@mui/material/styles'; import { theme } from '@src/theme'; +export const StyledDialog = styled(Dialog)({ + '& .MuiDialog-paper': { + borderRadius: '1rem', + }, +}); + export const DialogContainer = styled('div')({ - width: '38rem', + width: '24rem', display: 'flex', flexDirection: 'column', alignItems: 'center', @@ -15,7 +21,7 @@ export const DialogContainer = styled('div')({ export const StyledDialogTitle = styled(DialogTitle)({ boxSizing: 'border-box', width: '100%', - padding: '1.5rem 2.5rem 1.5rem 2.5rem', + padding: '2.5rem 1.375rem 1.5rem 1.375rem', display: 'flex', justifyContent: 'space-between', alignItems: 'center', @@ -29,11 +35,11 @@ export const StyledDialogContent = styled(DialogContent)({ flexDirection: 'column', justifyContent: 'center', alignItems: 'center', - padding: '1.25rem 3.125rem 1.875rem 3.125rem', + padding: '1.25rem 1.375rem 1.875rem 1.375rem', }); export const StyledCalendarToday = styled(CalendarToday)({ - color: theme.palette.text.disabled, + color: theme.palette.text.primary, marginRight: '0.75rem', fontSize: '1.5rem', }); @@ -47,7 +53,7 @@ export const TimePeriodSelectionMessage = styled('div')({ }); export const StyledFormGroup = styled(FormGroup)({ - margin: '2.5rem 0', + margin: '2.25rem 0', }); export const StyledButton = styled(Button)({ @@ -66,7 +72,9 @@ export const tooltipModifiers = { }; export const StyledFormControlLabel = styled(FormControlLabel)(({ checked }) => ({ - width: '15.5rem', + width: '21rem', + height: '2rem', + borderRadius: '0.75rem', border: `0.0625rem solid ${theme.main.boardColor}`, margin: '0.375rem 0', From 78936ff3a748dc4a5acb3a5e2259112c7ae0a111 Mon Sep 17 00:00:00 2001 From: Leiqiuhong <141199516+Leiqiuhong@users.noreply.github.com> Date: Wed, 15 May 2024 15:19:38 +0800 Subject: [PATCH 80/81] ADM-938-style [frontend]: fix style (#1446) --- frontend/src/containers/ReportStep/style.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/frontend/src/containers/ReportStep/style.tsx b/frontend/src/containers/ReportStep/style.tsx index 9186edec3f..960d9412dd 100644 --- a/frontend/src/containers/ReportStep/style.tsx +++ b/frontend/src/containers/ReportStep/style.tsx @@ -1,3 +1,4 @@ +import { Z_INDEX } from '@src/constants/commons'; import { styled } from '@mui/material/styles'; import { theme } from '@src/theme'; @@ -19,4 +20,5 @@ export const StyledCalendarWrapper = styled('div')((props: { isSummaryPage: bool justifyContent: 'flex-end', marginTop: '0.25rem', marginBottom: props.isSummaryPage ? '-3.5rem' : '-2rem', + zIndex: Z_INDEX.DROPDOWN, })); From 6b47b63d2bca18f3283e41e084c6733d292876d1 Mon Sep 17 00:00:00 2001 From: GuangbinMa Date: Thu, 16 May 2024 11:15:15 +0800 Subject: [PATCH 81/81] ADM-924: [frontend] fix: fix dialog style --- frontend/src/constants/resources.ts | 2 +- frontend/src/containers/ReportStep/DownloadDialog/style.tsx | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/frontend/src/constants/resources.ts b/frontend/src/constants/resources.ts index 7a855282cb..d7561d3c7b 100644 --- a/frontend/src/constants/resources.ts +++ b/frontend/src/constants/resources.ts @@ -444,4 +444,4 @@ export enum SORTING_DATE_RANGE_TEXT { } export const DISABLED_DATE_RANGE_MESSAGE = - 'Unavailable time period indicates that report generation during this period has failed.'; + 'Report generated failed during this period.'; diff --git a/frontend/src/containers/ReportStep/DownloadDialog/style.tsx b/frontend/src/containers/ReportStep/DownloadDialog/style.tsx index d111053a26..940111244b 100644 --- a/frontend/src/containers/ReportStep/DownloadDialog/style.tsx +++ b/frontend/src/containers/ReportStep/DownloadDialog/style.tsx @@ -49,7 +49,7 @@ export const TimePeriodSelectionMessage = styled('div')({ display: 'flex', justifyContent: 'flex-start', alignItems: 'center', - fontSize: '1rem', + fontSize: '0.875rem', }); export const StyledFormGroup = styled(FormGroup)({ @@ -77,6 +77,9 @@ export const StyledFormControlLabel = styled(FormControlLabel)(({ checked }) => borderRadius: '0.75rem', border: `0.0625rem solid ${theme.main.boardColor}`, margin: '0.375rem 0', + '& .MuiTypography-root': { + fontSize: '0.875rem', + }, ...(checked && { background: theme.main.downloadListLabel.backgroundColor,