diff --git a/documentation/html/ExternalRESTClients.html b/documentation/html/ExternalRESTClients.html index 10fc104964..937351fefe 100644 --- a/documentation/html/ExternalRESTClients.html +++ b/documentation/html/ExternalRESTClients.html @@ -414,7 +414,7 @@ Documentation generated by JSDoc 4.0.5 - on Thu Jul 16th 2026 + on Tue Jul 28th 2026 using the DocStrap template. diff --git a/documentation/html/GraphQLClient.html b/documentation/html/GraphQLClient.html index e29141b167..79ddd85de6 100644 --- a/documentation/html/GraphQLClient.html +++ b/documentation/html/GraphQLClient.html @@ -912,7 +912,7 @@ Documentation generated by JSDoc 4.0.5 - on Thu Jul 16th 2026 + on Tue Jul 28th 2026 using the DocStrap template. diff --git a/documentation/html/RESTClient.html b/documentation/html/RESTClient.html index 87d44c61ce..e24372e1d8 100644 --- a/documentation/html/RESTClient.html +++ b/documentation/html/RESTClient.html @@ -10217,7 +10217,7 @@ Documentation generated by JSDoc 4.0.5 - on Thu Jul 16th 2026 + on Tue Jul 28th 2026 using the DocStrap template. diff --git a/documentation/html/Static.html b/documentation/html/Static.html index ae4d56fcf6..bbfe91e8fb 100644 --- a/documentation/html/Static.html +++ b/documentation/html/Static.html @@ -391,7 +391,7 @@ Documentation generated by JSDoc 4.0.5 - on Thu Jul 16th 2026 + on Tue Jul 28th 2026 using the DocStrap template. diff --git a/documentation/html/classes.list.html b/documentation/html/classes.list.html index c803560872..04cfe29bae 100644 --- a/documentation/html/classes.list.html +++ b/documentation/html/classes.list.html @@ -2984,7 +2984,7 @@ Documentation generated by JSDoc 4.0.5 - on Thu Jul 16th 2026 + on Tue Jul 28th 2026 using the DocStrap template. diff --git a/documentation/html/components_Curators_CuratorRecordsAwaitingApproval.vue.html b/documentation/html/components_Curators_CuratorRecordsAwaitingApproval.vue.html index cfdccb8660..2bebd1b06f 100644 --- a/documentation/html/components_Curators_CuratorRecordsAwaitingApproval.vue.html +++ b/documentation/html/components_Curators_CuratorRecordsAwaitingApproval.vue.html @@ -833,7 +833,7 @@ Documentation generated by JSDoc 4.0.5 - on Thu Jul 16th 2026 + on Tue Jul 28th 2026 using the DocStrap template. diff --git a/documentation/html/components_Curators_DownLoadRecordsComponents_CuratorSummaryStatistics.vue.html b/documentation/html/components_Curators_DownLoadRecordsComponents_CuratorSummaryStatistics.vue.html index b96ea4f24a..6be409a62d 100644 --- a/documentation/html/components_Curators_DownLoadRecordsComponents_CuratorSummaryStatistics.vue.html +++ b/documentation/html/components_Curators_DownLoadRecordsComponents_CuratorSummaryStatistics.vue.html @@ -199,7 +199,7 @@ Documentation generated by JSDoc 4.0.5 - on Thu Jul 16th 2026 + on Tue Jul 28th 2026 using the DocStrap template. diff --git a/documentation/html/components_Curators_DownLoadRecordsComponents_RecordEditsByMonth.vue.html b/documentation/html/components_Curators_DownLoadRecordsComponents_RecordEditsByMonth.vue.html index fbab801f3b..935f0c3f20 100644 --- a/documentation/html/components_Curators_DownLoadRecordsComponents_RecordEditsByMonth.vue.html +++ b/documentation/html/components_Curators_DownLoadRecordsComponents_RecordEditsByMonth.vue.html @@ -202,7 +202,7 @@ Documentation generated by JSDoc 4.0.5 - on Thu Jul 16th 2026 + on Tue Jul 28th 2026 using the DocStrap template. diff --git a/documentation/html/components_Curators_DownLoadRecordsComponents_RecordsCreatedByMonth.vue.html b/documentation/html/components_Curators_DownLoadRecordsComponents_RecordsCreatedByMonth.vue.html index b0d3006869..15f3a147ce 100644 --- a/documentation/html/components_Curators_DownLoadRecordsComponents_RecordsCreatedByMonth.vue.html +++ b/documentation/html/components_Curators_DownLoadRecordsComponents_RecordsCreatedByMonth.vue.html @@ -204,7 +204,7 @@ Documentation generated by JSDoc 4.0.5 - on Thu Jul 16th 2026 + on Tue Jul 28th 2026 using the DocStrap template. diff --git a/documentation/html/components_Curators_DownLoadRecordsComponents_RecordsNeedingReview.vue.html b/documentation/html/components_Curators_DownLoadRecordsComponents_RecordsNeedingReview.vue.html index 47eb81cb89..03ced4b9c8 100644 --- a/documentation/html/components_Curators_DownLoadRecordsComponents_RecordsNeedingReview.vue.html +++ b/documentation/html/components_Curators_DownLoadRecordsComponents_RecordsNeedingReview.vue.html @@ -199,7 +199,7 @@ Documentation generated by JSDoc 4.0.5 - on Thu Jul 16th 2026 + on Tue Jul 28th 2026 using the DocStrap template. diff --git a/documentation/html/components_Curators_DownLoadRecordsComponents_RecordsWithoutDois.vue.html b/documentation/html/components_Curators_DownLoadRecordsComponents_RecordsWithoutDois.vue.html index d455277d69..be409a71ae 100644 --- a/documentation/html/components_Curators_DownLoadRecordsComponents_RecordsWithoutDois.vue.html +++ b/documentation/html/components_Curators_DownLoadRecordsComponents_RecordsWithoutDois.vue.html @@ -205,7 +205,7 @@ Documentation generated by JSDoc 4.0.5 - on Thu Jul 16th 2026 + on Tue Jul 28th 2026 using the DocStrap template. diff --git a/documentation/html/components_Curators_HiddenRecords.vue.html b/documentation/html/components_Curators_HiddenRecords.vue.html index 043c22f32a..825d42136d 100644 --- a/documentation/html/components_Curators_HiddenRecords.vue.html +++ b/documentation/html/components_Curators_HiddenRecords.vue.html @@ -299,7 +299,7 @@ Documentation generated by JSDoc 4.0.5 - on Thu Jul 16th 2026 + on Tue Jul 28th 2026 using the DocStrap template. diff --git a/documentation/html/components_Curators_IncompleteRecords.vue.html b/documentation/html/components_Curators_IncompleteRecords.vue.html index 56b951ebed..fbc9d8f8d9 100644 --- a/documentation/html/components_Curators_IncompleteRecords.vue.html +++ b/documentation/html/components_Curators_IncompleteRecords.vue.html @@ -385,7 +385,7 @@ Documentation generated by JSDoc 4.0.5 - on Thu Jul 16th 2026 + on Tue Jul 28th 2026 using the DocStrap template. diff --git a/documentation/html/components_Curators_MaintenanceRequests.vue.html b/documentation/html/components_Curators_MaintenanceRequests.vue.html index b9205b32e6..cc802db9a7 100644 --- a/documentation/html/components_Curators_MaintenanceRequests.vue.html +++ b/documentation/html/components_Curators_MaintenanceRequests.vue.html @@ -672,7 +672,7 @@ Documentation generated by JSDoc 4.0.5 - on Thu Jul 16th 2026 + on Tue Jul 28th 2026 using the DocStrap template. diff --git a/documentation/html/components_Curators_RecentCuratorCreation.vue.html b/documentation/html/components_Curators_RecentCuratorCreation.vue.html index 57ae88787f..7592d43952 100644 --- a/documentation/html/components_Curators_RecentCuratorCreation.vue.html +++ b/documentation/html/components_Curators_RecentCuratorCreation.vue.html @@ -294,7 +294,7 @@ Documentation generated by JSDoc 4.0.5 - on Thu Jul 16th 2026 + on Tue Jul 28th 2026 using the DocStrap template. diff --git a/documentation/html/components_Curators_SystemMessages.vue.html b/documentation/html/components_Curators_SystemMessages.vue.html index 2d2d70c097..87f30e59a2 100644 --- a/documentation/html/components_Curators_SystemMessages.vue.html +++ b/documentation/html/components_Curators_SystemMessages.vue.html @@ -474,7 +474,7 @@ Documentation generated by JSDoc 4.0.5 - on Thu Jul 16th 2026 + on Tue Jul 28th 2026 using the DocStrap template. diff --git a/documentation/html/components_Curators_UserRecordsAwaitingApproval.vue.html b/documentation/html/components_Curators_UserRecordsAwaitingApproval.vue.html index bc03f58468..e128d59c00 100644 --- a/documentation/html/components_Curators_UserRecordsAwaitingApproval.vue.html +++ b/documentation/html/components_Curators_UserRecordsAwaitingApproval.vue.html @@ -839,7 +839,7 @@ Documentation generated by JSDoc 4.0.5 - on Thu Jul 16th 2026 + on Tue Jul 28th 2026 using the DocStrap template. diff --git a/documentation/html/components_Records_Record_Collections.vue.html b/documentation/html/components_Records_Record_Collections.vue.html index 2f7262bd8d..355305c0a0 100644 --- a/documentation/html/components_Records_Record_Collections.vue.html +++ b/documentation/html/components_Records_Record_Collections.vue.html @@ -462,7 +462,7 @@ Documentation generated by JSDoc 4.0.5 - on Thu Jul 16th 2026 + on Tue Jul 28th 2026 using the DocStrap template. diff --git a/documentation/html/components_Records_Record_GeneralInfo_SavedSearches.vue.html b/documentation/html/components_Records_Record_GeneralInfo_SavedSearches.vue.html index a7c154da7b..79c1a46ee6 100644 --- a/documentation/html/components_Records_Record_GeneralInfo_SavedSearches.vue.html +++ b/documentation/html/components_Records_Record_GeneralInfo_SavedSearches.vue.html @@ -319,7 +319,7 @@ Documentation generated by JSDoc 4.0.5 - on Thu Jul 16th 2026 + on Tue Jul 28th 2026 using the DocStrap template. diff --git a/documentation/html/components_Records_Record_RelatedContent.vue.html b/documentation/html/components_Records_Record_RelatedContent.vue.html index bfe443255c..60f228344b 100644 --- a/documentation/html/components_Records_Record_RelatedContent.vue.html +++ b/documentation/html/components_Records_Record_RelatedContent.vue.html @@ -454,7 +454,7 @@ Documentation generated by JSDoc 4.0.5 - on Thu Jul 16th 2026 + on Tue Jul 28th 2026 using the DocStrap template. diff --git a/documentation/html/components_Records_Search_Header_FilterChips.vue.html b/documentation/html/components_Records_Search_Header_FilterChips.vue.html index 4eb5c670e2..76bed49902 100644 --- a/documentation/html/components_Records_Search_Header_FilterChips.vue.html +++ b/documentation/html/components_Records_Search_Header_FilterChips.vue.html @@ -251,7 +251,7 @@ Documentation generated by JSDoc 4.0.5 - on Thu Jul 16th 2026 + on Tue Jul 28th 2026 using the DocStrap template. diff --git a/documentation/html/components_Records_Search_Header_Pagination.vue.html b/documentation/html/components_Records_Search_Header_Pagination.vue.html index 2cbd765b3e..66572d54c7 100644 --- a/documentation/html/components_Records_Search_Header_Pagination.vue.html +++ b/documentation/html/components_Records_Search_Header_Pagination.vue.html @@ -262,7 +262,7 @@ Documentation generated by JSDoc 4.0.5 - on Thu Jul 16th 2026 + on Tue Jul 28th 2026 using the DocStrap template. diff --git a/documentation/html/components_Records_Search_Header_Sorting.vue.html b/documentation/html/components_Records_Search_Header_Sorting.vue.html index 7e7c9ddcba..76321fa7f6 100644 --- a/documentation/html/components_Records_Search_Header_Sorting.vue.html +++ b/documentation/html/components_Records_Search_Header_Sorting.vue.html @@ -219,7 +219,7 @@ Documentation generated by JSDoc 4.0.5 - on Thu Jul 16th 2026 + on Tue Jul 28th 2026 using the DocStrap template. diff --git a/documentation/html/components_Records_Search_Input_AdvancedSearch_AdvancedSearchDialogBox.vue.html b/documentation/html/components_Records_Search_Input_AdvancedSearch_AdvancedSearchDialogBox.vue.html index c8e4973227..034bd24ec2 100644 --- a/documentation/html/components_Records_Search_Input_AdvancedSearch_AdvancedSearchDialogBox.vue.html +++ b/documentation/html/components_Records_Search_Input_AdvancedSearch_AdvancedSearchDialogBox.vue.html @@ -487,7 +487,7 @@ Documentation generated by JSDoc 4.0.5 - on Thu Jul 16th 2026 + on Tue Jul 28th 2026 using the DocStrap template. diff --git a/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderComponents_GeneralComponents_Countries.vue.html b/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderComponents_GeneralComponents_Countries.vue.html index a203a04ed4..5caad10fe2 100644 --- a/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderComponents_GeneralComponents_Countries.vue.html +++ b/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderComponents_GeneralComponents_Countries.vue.html @@ -225,7 +225,7 @@ Documentation generated by JSDoc 4.0.5 - on Thu Jul 16th 2026 + on Tue Jul 28th 2026 using the DocStrap template. diff --git a/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderComponents_GeneralComponents_Domains.vue.html b/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderComponents_GeneralComponents_Domains.vue.html index e759f31cb9..57c9129579 100644 --- a/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderComponents_GeneralComponents_Domains.vue.html +++ b/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderComponents_GeneralComponents_Domains.vue.html @@ -218,7 +218,7 @@ Documentation generated by JSDoc 4.0.5 - on Thu Jul 16th 2026 + on Tue Jul 28th 2026 using the DocStrap template. diff --git a/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderComponents_GeneralComponents_Licences.vue.html b/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderComponents_GeneralComponents_Licences.vue.html index 3a3e5fe5a3..27f67ba891 100644 --- a/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderComponents_GeneralComponents_Licences.vue.html +++ b/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderComponents_GeneralComponents_Licences.vue.html @@ -218,7 +218,7 @@ Documentation generated by JSDoc 4.0.5 - on Thu Jul 16th 2026 + on Tue Jul 28th 2026 using the DocStrap template. diff --git a/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderComponents_GeneralComponents_ObjectTypes.vue.html b/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderComponents_GeneralComponents_ObjectTypes.vue.html index 020c3665ca..431b8ebd41 100644 --- a/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderComponents_GeneralComponents_ObjectTypes.vue.html +++ b/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderComponents_GeneralComponents_ObjectTypes.vue.html @@ -220,7 +220,7 @@ Documentation generated by JSDoc 4.0.5 - on Thu Jul 16th 2026 + on Tue Jul 28th 2026 using the DocStrap template. diff --git a/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderComponents_GeneralComponents_Organisations.vue.html b/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderComponents_GeneralComponents_Organisations.vue.html index f051ddfca1..fe647c3c86 100644 --- a/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderComponents_GeneralComponents_Organisations.vue.html +++ b/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderComponents_GeneralComponents_Organisations.vue.html @@ -229,7 +229,7 @@ Documentation generated by JSDoc 4.0.5 - on Thu Jul 16th 2026 + on Tue Jul 28th 2026 using the DocStrap template. diff --git a/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderComponents_GeneralComponents_Subject.vue.html b/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderComponents_GeneralComponents_Subject.vue.html index 3010e0a0a0..13494c9f07 100644 --- a/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderComponents_GeneralComponents_Subject.vue.html +++ b/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderComponents_GeneralComponents_Subject.vue.html @@ -218,7 +218,7 @@ Documentation generated by JSDoc 4.0.5 - on Thu Jul 16th 2026 + on Tue Jul 28th 2026 using the DocStrap template. diff --git a/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderComponents_GeneralComponents_Taxonomies.vue.html b/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderComponents_GeneralComponents_Taxonomies.vue.html index 6b99f20938..a04916de20 100644 --- a/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderComponents_GeneralComponents_Taxonomies.vue.html +++ b/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderComponents_GeneralComponents_Taxonomies.vue.html @@ -224,7 +224,7 @@ Documentation generated by JSDoc 4.0.5 - on Thu Jul 16th 2026 + on Tue Jul 28th 2026 using the DocStrap template. diff --git a/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderComponents_GeneralComponents_UserDefinedTag.vue.html b/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderComponents_GeneralComponents_UserDefinedTag.vue.html index e26686168f..f7cf8af867 100644 --- a/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderComponents_GeneralComponents_UserDefinedTag.vue.html +++ b/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderComponents_GeneralComponents_UserDefinedTag.vue.html @@ -224,7 +224,7 @@ Documentation generated by JSDoc 4.0.5 - on Thu Jul 16th 2026 + on Tue Jul 28th 2026 using the DocStrap template. diff --git a/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderComponents_GroupCtrlSlot_DatabaseRule.vue.html b/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderComponents_GroupCtrlSlot_DatabaseRule.vue.html index 28edb01249..132627d34e 100644 --- a/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderComponents_GroupCtrlSlot_DatabaseRule.vue.html +++ b/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderComponents_GroupCtrlSlot_DatabaseRule.vue.html @@ -315,7 +315,7 @@ Documentation generated by JSDoc 4.0.5 - on Thu Jul 16th 2026 + on Tue Jul 28th 2026 using the DocStrap template. diff --git a/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderComponents_GroupCtrlSlot_FairassistRule.vue.html b/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderComponents_GroupCtrlSlot_FairassistRule.vue.html index f6a04f88f2..4e214dde44 100644 --- a/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderComponents_GroupCtrlSlot_FairassistRule.vue.html +++ b/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderComponents_GroupCtrlSlot_FairassistRule.vue.html @@ -252,7 +252,7 @@ Documentation generated by JSDoc 4.0.5 - on Thu Jul 16th 2026 + on Tue Jul 28th 2026 using the DocStrap template. diff --git a/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderComponents_GroupCtrlSlot_GeneralRule.vue.html b/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderComponents_GroupCtrlSlot_GeneralRule.vue.html index 6092e2cbce..8f71a07faf 100644 --- a/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderComponents_GroupCtrlSlot_GeneralRule.vue.html +++ b/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderComponents_GroupCtrlSlot_GeneralRule.vue.html @@ -272,7 +272,7 @@ Documentation generated by JSDoc 4.0.5 - on Thu Jul 16th 2026 + on Tue Jul 28th 2026 using the DocStrap template. diff --git a/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderComponents_GroupCtrlSlot_GroupCtrlSlot.vue.html b/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderComponents_GroupCtrlSlot_GroupCtrlSlot.vue.html index 44be1009b4..155bbf9311 100644 --- a/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderComponents_GroupCtrlSlot_GroupCtrlSlot.vue.html +++ b/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderComponents_GroupCtrlSlot_GroupCtrlSlot.vue.html @@ -199,7 +199,7 @@ Documentation generated by JSDoc 4.0.5 - on Thu Jul 16th 2026 + on Tue Jul 28th 2026 using the DocStrap template. diff --git a/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderComponents_GroupCtrlSlot_PolicyRule.vue.html b/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderComponents_GroupCtrlSlot_PolicyRule.vue.html index ac79a5c303..0bd0cac247 100644 --- a/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderComponents_GroupCtrlSlot_PolicyRule.vue.html +++ b/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderComponents_GroupCtrlSlot_PolicyRule.vue.html @@ -328,7 +328,7 @@ Documentation generated by JSDoc 4.0.5 - on Thu Jul 16th 2026 + on Tue Jul 28th 2026 using the DocStrap template. diff --git a/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderComponents_GroupCtrlSlot_StandardRule.vue.html b/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderComponents_GroupCtrlSlot_StandardRule.vue.html index 3f5979be98..e6f0b286ff 100644 --- a/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderComponents_GroupCtrlSlot_StandardRule.vue.html +++ b/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderComponents_GroupCtrlSlot_StandardRule.vue.html @@ -230,7 +230,7 @@ Documentation generated by JSDoc 4.0.5 - on Thu Jul 16th 2026 + on Tue Jul 28th 2026 using the DocStrap template. diff --git a/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderView.vue.html b/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderView.vue.html index 7d1cdcdd38..763461866b 100644 --- a/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderView.vue.html +++ b/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderView.vue.html @@ -676,7 +676,7 @@ Documentation generated by JSDoc 4.0.5 - on Thu Jul 16th 2026 + on Tue Jul 28th 2026 using the DocStrap template. diff --git a/documentation/html/components_Records_Search_Input_FilterAutocomplete.vue.html b/documentation/html/components_Records_Search_Input_FilterAutocomplete.vue.html index 950f4d0b2f..40ba5b84ab 100644 --- a/documentation/html/components_Records_Search_Input_FilterAutocomplete.vue.html +++ b/documentation/html/components_Records_Search_Input_FilterAutocomplete.vue.html @@ -376,7 +376,7 @@ Documentation generated by JSDoc 4.0.5 - on Thu Jul 16th 2026 + on Tue Jul 28th 2026 using the DocStrap template. diff --git a/documentation/html/components_Records_Search_Input_FilterButton.vue.html b/documentation/html/components_Records_Search_Input_FilterButton.vue.html index a448b2ac84..26440398a5 100644 --- a/documentation/html/components_Records_Search_Input_FilterButton.vue.html +++ b/documentation/html/components_Records_Search_Input_FilterButton.vue.html @@ -287,7 +287,7 @@ Documentation generated by JSDoc 4.0.5 - on Thu Jul 16th 2026 + on Tue Jul 28th 2026 using the DocStrap template. diff --git a/documentation/html/components_Records_Search_Input_SearchInput.vue.html b/documentation/html/components_Records_Search_Input_SearchInput.vue.html index 9d8a522d27..a55bf493eb 100644 --- a/documentation/html/components_Records_Search_Input_SearchInput.vue.html +++ b/documentation/html/components_Records_Search_Input_SearchInput.vue.html @@ -284,7 +284,7 @@ Documentation generated by JSDoc 4.0.5 - on Thu Jul 16th 2026 + on Tue Jul 28th 2026 using the DocStrap template. diff --git a/documentation/html/components_Records_Search_SaveSearch_SaveSearchButton.vue.html b/documentation/html/components_Records_Search_SaveSearch_SaveSearchButton.vue.html index 8c222b410a..01e9d276fc 100644 --- a/documentation/html/components_Records_Search_SaveSearch_SaveSearchButton.vue.html +++ b/documentation/html/components_Records_Search_SaveSearch_SaveSearchButton.vue.html @@ -182,7 +182,7 @@ Documentation generated by JSDoc 4.0.5 - on Thu Jul 16th 2026 + on Tue Jul 28th 2026 using the DocStrap template. diff --git a/documentation/html/components_Records_Search_SaveSearch_SaveSearchStepper.vue.html b/documentation/html/components_Records_Search_SaveSearch_SaveSearchStepper.vue.html index 98d419e011..862352eb21 100644 --- a/documentation/html/components_Records_Search_SaveSearch_SaveSearchStepper.vue.html +++ b/documentation/html/components_Records_Search_SaveSearch_SaveSearchStepper.vue.html @@ -464,7 +464,7 @@ Documentation generated by JSDoc 4.0.5 - on Thu Jul 16th 2026 + on Tue Jul 28th 2026 using the DocStrap template. diff --git a/documentation/html/components_Records_Search_SaveSearch_StepperComponents_OrganisationStepper.vue.html b/documentation/html/components_Records_Search_SaveSearch_StepperComponents_OrganisationStepper.vue.html index f0c0237794..be81b14644 100644 --- a/documentation/html/components_Records_Search_SaveSearch_StepperComponents_OrganisationStepper.vue.html +++ b/documentation/html/components_Records_Search_SaveSearch_StepperComponents_OrganisationStepper.vue.html @@ -259,7 +259,7 @@ Documentation generated by JSDoc 4.0.5 - on Thu Jul 16th 2026 + on Tue Jul 28th 2026 using the DocStrap template. diff --git a/documentation/html/components_Records_Search_SaveSearch_StepperComponents_PolicyStepper.vue.html b/documentation/html/components_Records_Search_SaveSearch_StepperComponents_PolicyStepper.vue.html index 032b16b49b..1624444bac 100644 --- a/documentation/html/components_Records_Search_SaveSearch_StepperComponents_PolicyStepper.vue.html +++ b/documentation/html/components_Records_Search_SaveSearch_StepperComponents_PolicyStepper.vue.html @@ -259,7 +259,7 @@ Documentation generated by JSDoc 4.0.5 - on Thu Jul 16th 2026 + on Tue Jul 28th 2026 using the DocStrap template. diff --git a/documentation/html/components_Records_Search_SaveSearch_StepperComponents_ResultCard.vue.html b/documentation/html/components_Records_Search_SaveSearch_StepperComponents_ResultCard.vue.html index efdea90e51..8b52dca4bc 100644 --- a/documentation/html/components_Records_Search_SaveSearch_StepperComponents_ResultCard.vue.html +++ b/documentation/html/components_Records_Search_SaveSearch_StepperComponents_ResultCard.vue.html @@ -259,7 +259,7 @@ Documentation generated by JSDoc 4.0.5 - on Thu Jul 16th 2026 + on Tue Jul 28th 2026 using the DocStrap template. diff --git a/documentation/html/components_Records_Search_SaveSearch_StepperComponents_StepperDialogHeader.vue.html b/documentation/html/components_Records_Search_SaveSearch_StepperComponents_StepperDialogHeader.vue.html index 510f82584d..0589679282 100644 --- a/documentation/html/components_Records_Search_SaveSearch_StepperComponents_StepperDialogHeader.vue.html +++ b/documentation/html/components_Records_Search_SaveSearch_StepperComponents_StepperDialogHeader.vue.html @@ -182,7 +182,7 @@ Documentation generated by JSDoc 4.0.5 - on Thu Jul 16th 2026 + on Tue Jul 28th 2026 using the DocStrap template. diff --git a/documentation/html/components_Records_Search_SaveSearch_StepperComponents_UserStepper.vue.html b/documentation/html/components_Records_Search_SaveSearch_StepperComponents_UserStepper.vue.html index 29d7b64173..8f8ef85f8f 100644 --- a/documentation/html/components_Records_Search_SaveSearch_StepperComponents_UserStepper.vue.html +++ b/documentation/html/components_Records_Search_SaveSearch_StepperComponents_UserStepper.vue.html @@ -211,7 +211,7 @@ Documentation generated by JSDoc 4.0.5 - on Thu Jul 16th 2026 + on Tue Jul 28th 2026 using the DocStrap template. diff --git a/documentation/html/components_Users_Profiles_Private_ViewSavedSearchesTable.vue.html b/documentation/html/components_Users_Profiles_Private_ViewSavedSearchesTable.vue.html index 9e3b9726e3..44f80458e9 100644 --- a/documentation/html/components_Users_Profiles_Private_ViewSavedSearchesTable.vue.html +++ b/documentation/html/components_Users_Profiles_Private_ViewSavedSearchesTable.vue.html @@ -509,7 +509,7 @@ Documentation generated by JSDoc 4.0.5 - on Thu Jul 16th 2026 + on Tue Jul 28th 2026 using the DocStrap template. diff --git a/documentation/html/global.html b/documentation/html/global.html index 5d7c0f624f..4f6c4faa00 100644 --- a/documentation/html/global.html +++ b/documentation/html/global.html @@ -2964,7 +2964,7 @@ Documentation generated by JSDoc 4.0.5 - on Thu Jul 16th 2026 + on Tue Jul 28th 2026 using the DocStrap template. diff --git a/documentation/html/index.html b/documentation/html/index.html index 14c5709d59..4252cde104 100644 --- a/documentation/html/index.html +++ b/documentation/html/index.html @@ -216,7 +216,7 @@ Documentation generated by JSDoc 4.0.5 - on Thu Jul 16th 2026 + on Tue Jul 28th 2026 using the DocStrap template. diff --git a/documentation/html/lib_Client_ExternalClients.js.html b/documentation/html/lib_Client_ExternalClients.js.html index ad87fa86ca..a8fd4a9792 100644 --- a/documentation/html/lib_Client_ExternalClients.js.html +++ b/documentation/html/lib_Client_ExternalClients.js.html @@ -256,7 +256,7 @@ Documentation generated by JSDoc 4.0.5 - on Thu Jul 16th 2026 + on Tue Jul 28th 2026 using the DocStrap template. diff --git a/documentation/html/lib_Client_RESTClient.js.html b/documentation/html/lib_Client_RESTClient.js.html index ce0a02737b..d520e4818b 100644 --- a/documentation/html/lib_Client_RESTClient.js.html +++ b/documentation/html/lib_Client_RESTClient.js.html @@ -1284,7 +1284,7 @@ Documentation generated by JSDoc 4.0.5 - on Thu Jul 16th 2026 + on Tue Jul 28th 2026 using the DocStrap template. diff --git a/documentation/html/lib_GraphClient_GraphClient.js.html b/documentation/html/lib_GraphClient_GraphClient.js.html index 51d6c37cb4..203765670b 100644 --- a/documentation/html/lib_GraphClient_GraphClient.js.html +++ b/documentation/html/lib_GraphClient_GraphClient.js.html @@ -285,7 +285,7 @@ Documentation generated by JSDoc 4.0.5 - on Thu Jul 16th 2026 + on Tue Jul 28th 2026 using the DocStrap template. diff --git a/documentation/html/lib_GraphClient_GraphClientSEO.js.html b/documentation/html/lib_GraphClient_GraphClientSEO.js.html index 207f0fbec1..138198ffb3 100644 --- a/documentation/html/lib_GraphClient_GraphClientSEO.js.html +++ b/documentation/html/lib_GraphClient_GraphClientSEO.js.html @@ -286,7 +286,7 @@ Documentation generated by JSDoc 4.0.5 - on Thu Jul 16th 2026 + on Tue Jul 28th 2026 using the DocStrap template. diff --git a/documentation/html/module-Home.html b/documentation/html/module-Home.html index 5c22b1c6ff..a50b095197 100644 --- a/documentation/html/module-Home.html +++ b/documentation/html/module-Home.html @@ -220,7 +220,7 @@ Documentation generated by JSDoc 4.0.5 - on Thu Jul 16th 2026 + on Tue Jul 28th 2026 using the DocStrap template. diff --git a/documentation/html/module-Login.html b/documentation/html/module-Login.html index 262cb08329..88c320c669 100644 --- a/documentation/html/module-Login.html +++ b/documentation/html/module-Login.html @@ -220,7 +220,7 @@ Documentation generated by JSDoc 4.0.5 - on Thu Jul 16th 2026 + on Tue Jul 28th 2026 using the DocStrap template. diff --git a/documentation/html/module-NewRecord.html b/documentation/html/module-NewRecord.html index b59425fc4c..e7e3892713 100644 --- a/documentation/html/module-NewRecord.html +++ b/documentation/html/module-NewRecord.html @@ -220,7 +220,7 @@ Documentation generated by JSDoc 4.0.5 - on Thu Jul 16th 2026 + on Tue Jul 28th 2026 using the DocStrap template. diff --git a/documentation/html/module-Pagination.html b/documentation/html/module-Pagination.html index 9f2505ffd7..ef08864178 100644 --- a/documentation/html/module-Pagination.html +++ b/documentation/html/module-Pagination.html @@ -527,7 +527,7 @@ Documentation generated by JSDoc 4.0.5 - on Thu Jul 16th 2026 + on Tue Jul 28th 2026 using the DocStrap template. diff --git a/documentation/html/module-Signup.html b/documentation/html/module-Signup.html index a720d14734..faf41c1bfb 100644 --- a/documentation/html/module-Signup.html +++ b/documentation/html/module-Signup.html @@ -220,7 +220,7 @@ Documentation generated by JSDoc 4.0.5 - on Thu Jul 16th 2026 + on Tue Jul 28th 2026 using the DocStrap template. diff --git a/documentation/html/module-User.html b/documentation/html/module-User.html index ba94522cc7..a3df91ad22 100644 --- a/documentation/html/module-User.html +++ b/documentation/html/module-User.html @@ -228,7 +228,7 @@ Documentation generated by JSDoc 4.0.5 - on Thu Jul 16th 2026 + on Tue Jul 28th 2026 using the DocStrap template. diff --git a/documentation/html/modules.list.html b/documentation/html/modules.list.html index 1089d26429..a45d2d1e5f 100644 --- a/documentation/html/modules.list.html +++ b/documentation/html/modules.list.html @@ -2984,7 +2984,7 @@ Documentation generated by JSDoc 4.0.5 - on Thu Jul 16th 2026 + on Tue Jul 28th 2026 using the DocStrap template. diff --git a/documentation/html/namespaces.list.html b/documentation/html/namespaces.list.html index 07891c03fe..38922a7a27 100644 --- a/documentation/html/namespaces.list.html +++ b/documentation/html/namespaces.list.html @@ -2984,7 +2984,7 @@ Documentation generated by JSDoc 4.0.5 - on Thu Jul 16th 2026 + on Tue Jul 28th 2026 using the DocStrap template. diff --git a/documentation/html/router_hackSearch.js.html b/documentation/html/router_hackSearch.js.html index 6b100bb22b..6cc422e95b 100644 --- a/documentation/html/router_hackSearch.js.html +++ b/documentation/html/router_hackSearch.js.html @@ -209,7 +209,7 @@ Documentation generated by JSDoc 4.0.5 - on Thu Jul 16th 2026 + on Tue Jul 28th 2026 using the DocStrap template. diff --git a/documentation/html/store_introspector.js.html b/documentation/html/store_introspector.js.html index 318632760f..80e05d05bf 100644 --- a/documentation/html/store_introspector.js.html +++ b/documentation/html/store_introspector.js.html @@ -325,7 +325,7 @@ Documentation generated by JSDoc 4.0.5 - on Thu Jul 16th 2026 + on Tue Jul 28th 2026 using the DocStrap template. diff --git a/documentation/html/store_recordData.js.html b/documentation/html/store_recordData.js.html index 2d8ef51a77..470eae8589 100644 --- a/documentation/html/store_recordData.js.html +++ b/documentation/html/store_recordData.js.html @@ -872,7 +872,7 @@ Documentation generated by JSDoc 4.0.5 - on Thu Jul 16th 2026 + on Tue Jul 28th 2026 using the DocStrap template. diff --git a/documentation/html/store_recordSearch.js.html b/documentation/html/store_recordSearch.js.html index f7d452230a..c0fdd31eac 100644 --- a/documentation/html/store_recordSearch.js.html +++ b/documentation/html/store_recordSearch.js.html @@ -355,7 +355,7 @@ Documentation generated by JSDoc 4.0.5 - on Thu Jul 16th 2026 + on Tue Jul 28th 2026 using the DocStrap template. diff --git a/documentation/html/store_searchFilters.js.html b/documentation/html/store_searchFilters.js.html index 4531819ad9..dcf776c884 100644 --- a/documentation/html/store_searchFilters.js.html +++ b/documentation/html/store_searchFilters.js.html @@ -301,7 +301,7 @@ Documentation generated by JSDoc 4.0.5 - on Thu Jul 16th 2026 + on Tue Jul 28th 2026 using the DocStrap template. diff --git a/documentation/html/utils_advancedSearchUtils.js.html b/documentation/html/utils_advancedSearchUtils.js.html index 99a35cd13a..e46d93e1a5 100644 --- a/documentation/html/utils_advancedSearchUtils.js.html +++ b/documentation/html/utils_advancedSearchUtils.js.html @@ -196,7 +196,7 @@ Documentation generated by JSDoc 4.0.5 - on Thu Jul 16th 2026 + on Tue Jul 28th 2026 using the DocStrap template. diff --git a/documentation/html/utils_query-builder-vue-3_dist_query-builder-vue-3.js.html b/documentation/html/utils_query-builder-vue-3_dist_query-builder-vue-3.js.html index 3b2ec69e8f..4031a3cbbe 100644 --- a/documentation/html/utils_query-builder-vue-3_dist_query-builder-vue-3.js.html +++ b/documentation/html/utils_query-builder-vue-3_dist_query-builder-vue-3.js.html @@ -3653,7 +3653,7 @@ Documentation generated by JSDoc 4.0.5 - on Thu Jul 16th 2026 + on Tue Jul 28th 2026 using the DocStrap template. diff --git a/documentation/html/utils_recordTabUtils.js.html b/documentation/html/utils_recordTabUtils.js.html index 0185ac53c2..03652e6a2d 100644 --- a/documentation/html/utils_recordTabUtils.js.html +++ b/documentation/html/utils_recordTabUtils.js.html @@ -270,7 +270,7 @@ Documentation generated by JSDoc 4.0.5 - on Thu Jul 16th 2026 + on Tue Jul 28th 2026 using the DocStrap template. diff --git a/documentation/html/utils_rules.js.html b/documentation/html/utils_rules.js.html index 6f19c73248..413be9760c 100644 --- a/documentation/html/utils_rules.js.html +++ b/documentation/html/utils_rules.js.html @@ -293,7 +293,7 @@ Documentation generated by JSDoc 4.0.5 - on Thu Jul 16th 2026 + on Tue Jul 28th 2026 using the DocStrap template. diff --git a/documentation/html/views_AdvancedSearch_AdvancedSearchResultTable.vue.html b/documentation/html/views_AdvancedSearch_AdvancedSearchResultTable.vue.html index cffaa20c9c..5a41542d0e 100644 --- a/documentation/html/views_AdvancedSearch_AdvancedSearchResultTable.vue.html +++ b/documentation/html/views_AdvancedSearch_AdvancedSearchResultTable.vue.html @@ -451,7 +451,7 @@ Documentation generated by JSDoc 4.0.5 - on Thu Jul 16th 2026 + on Tue Jul 28th 2026 using the DocStrap template. diff --git a/documentation/html/views_AdvancedSearch_AdvancedSearchSelection.vue.html b/documentation/html/views_AdvancedSearch_AdvancedSearchSelection.vue.html index f9656c3567..94816e2ca2 100644 --- a/documentation/html/views_AdvancedSearch_AdvancedSearchSelection.vue.html +++ b/documentation/html/views_AdvancedSearch_AdvancedSearchSelection.vue.html @@ -373,7 +373,7 @@ Documentation generated by JSDoc 4.0.5 - on Thu Jul 16th 2026 + on Tue Jul 28th 2026 using the DocStrap template. diff --git a/documentation/html/views_Browsers_OntologyBrowser.vue.html b/documentation/html/views_Browsers_OntologyBrowser.vue.html index dfe152c145..bfe467aaa3 100644 --- a/documentation/html/views_Browsers_OntologyBrowser.vue.html +++ b/documentation/html/views_Browsers_OntologyBrowser.vue.html @@ -697,7 +697,7 @@ Documentation generated by JSDoc 4.0.5 - on Thu Jul 16th 2026 + on Tue Jul 28th 2026 using the DocStrap template. diff --git a/documentation/html/views_CreateRecord_NewRecord.vue.html b/documentation/html/views_CreateRecord_NewRecord.vue.html index baa9016b6c..250da99ed4 100644 --- a/documentation/html/views_CreateRecord_NewRecord.vue.html +++ b/documentation/html/views_CreateRecord_NewRecord.vue.html @@ -401,7 +401,7 @@ Documentation generated by JSDoc 4.0.5 - on Thu Jul 16th 2026 + on Tue Jul 28th 2026 using the DocStrap template. diff --git a/documentation/html/views_Home_Home.vue.html b/documentation/html/views_Home_Home.vue.html index b6f423cafa..d9250c4c41 100644 --- a/documentation/html/views_Home_Home.vue.html +++ b/documentation/html/views_Home_Home.vue.html @@ -188,7 +188,7 @@ Documentation generated by JSDoc 4.0.5 - on Thu Jul 16th 2026 + on Tue Jul 28th 2026 using the DocStrap template. diff --git a/documentation/html/views_Organisations_Organisation.vue.html b/documentation/html/views_Organisations_Organisation.vue.html index 820d9c2242..896a7823ee 100644 --- a/documentation/html/views_Organisations_Organisation.vue.html +++ b/documentation/html/views_Organisations_Organisation.vue.html @@ -991,7 +991,7 @@ Documentation generated by JSDoc 4.0.5 - on Thu Jul 16th 2026 + on Tue Jul 28th 2026 using the DocStrap template. diff --git a/documentation/html/views_Records_NetworkGraph.vue.html b/documentation/html/views_Records_NetworkGraph.vue.html index 6c85a0c833..15e997f968 100644 --- a/documentation/html/views_Records_NetworkGraph.vue.html +++ b/documentation/html/views_Records_NetworkGraph.vue.html @@ -734,7 +734,7 @@ Documentation generated by JSDoc 4.0.5 - on Thu Jul 16th 2026 + on Tue Jul 28th 2026 using the DocStrap template. diff --git a/documentation/html/views_Records_Record.vue.html b/documentation/html/views_Records_Record.vue.html index acfe2b9ccc..1f384cbe15 100644 --- a/documentation/html/views_Records_Record.vue.html +++ b/documentation/html/views_Records_Record.vue.html @@ -1494,7 +1494,7 @@ Documentation generated by JSDoc 4.0.5 - on Thu Jul 16th 2026 + on Tue Jul 28th 2026 using the DocStrap template. diff --git a/documentation/html/views_Records_Records.vue.html b/documentation/html/views_Records_Records.vue.html index 752c5e8c49..319190aa29 100644 --- a/documentation/html/views_Records_Records.vue.html +++ b/documentation/html/views_Records_Records.vue.html @@ -450,7 +450,7 @@ Documentation generated by JSDoc 4.0.5 - on Thu Jul 16th 2026 + on Tue Jul 28th 2026 using the DocStrap template. diff --git a/documentation/html/views_Static_Community_Community.vue.html b/documentation/html/views_Static_Community_Community.vue.html index e8592eb54c..da492c27e2 100644 --- a/documentation/html/views_Static_Community_Community.vue.html +++ b/documentation/html/views_Static_Community_Community.vue.html @@ -999,7 +999,7 @@ Documentation generated by JSDoc 4.0.5 - on Thu Jul 16th 2026 + on Tue Jul 28th 2026 using the DocStrap template. diff --git a/documentation/html/views_Static_Timeline_Timeline.vue.html b/documentation/html/views_Static_Timeline_Timeline.vue.html index 186c04f757..44595584db 100644 --- a/documentation/html/views_Static_Timeline_Timeline.vue.html +++ b/documentation/html/views_Static_Timeline_Timeline.vue.html @@ -153,7 +153,7 @@ Documentation generated by JSDoc 4.0.5 - on Thu Jul 16th 2026 + on Tue Jul 28th 2026 using the DocStrap template. diff --git a/documentation/html/views_Users_Login_Login.vue.html b/documentation/html/views_Users_Login_Login.vue.html index 11b5aa542b..822faf9196 100644 --- a/documentation/html/views_Users_Login_Login.vue.html +++ b/documentation/html/views_Users_Login_Login.vue.html @@ -462,7 +462,7 @@ Documentation generated by JSDoc 4.0.5 - on Thu Jul 16th 2026 + on Tue Jul 28th 2026 using the DocStrap template. diff --git a/documentation/html/views_Users_Signup.vue.html b/documentation/html/views_Users_Signup.vue.html index bf9e9dfc1a..5218f52afb 100644 --- a/documentation/html/views_Users_Signup.vue.html +++ b/documentation/html/views_Users_Signup.vue.html @@ -150,7 +150,7 @@ Documentation generated by JSDoc 4.0.5 - on Thu Jul 16th 2026 + on Tue Jul 28th 2026 using the DocStrap template. diff --git a/package-lock.json b/package-lock.json index 4442a0bbe9..3456a820d0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -64,8 +64,8 @@ "@fortawesome/free-solid-svg-icons": "^6.6.0", "@vitejs/plugin-legacy": "^8.0.2", "@vitejs/plugin-vue": "^6.0.6", - "@vitest/coverage-v8": "^3.2.4", - "@vitest/ui": "^3.2.4", + "@vitest/coverage-v8": "^4.1.10", + "@vitest/ui": "^4.1.10", "@vue/babel-preset-app": "^5.0.8", "@vue/test-utils": "^2.4.6", "autoprefixer": "^10.4.20", @@ -103,7 +103,7 @@ "vite-plugin-compression2": "^2.5.3", "vite-plugin-eslint": "^1.8.1", "vite-plugin-vuetify": "^2.1.3", - "vitest": "^3.2.4", + "vitest": "^4.1.10", "vue-3-linkify": "^1.1.0", "yaml": "^2.8.3" }, @@ -111,20 +111,6 @@ "fsevents": "^2.3.2" } }, - "node_modules/@ampproject/remapping": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/@babel/code-frame": { "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", @@ -153,6 +139,7 @@ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.29.7", "@babel/generator": "^7.29.7", @@ -1858,6 +1845,7 @@ "integrity": "sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@keyv/serialize": "^1.1.1" } @@ -1899,6 +1887,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": ">=18" }, @@ -1947,6 +1936,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": ">=18" } @@ -2002,7 +1992,6 @@ "integrity": "sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==", "license": "MIT", "optional": true, - "peer": true, "dependencies": { "@emnapi/wasi-threads": "1.2.2", "tslib": "^2.4.0" @@ -2013,8 +2002,7 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "license": "0BSD", - "optional": true, - "peer": true + "optional": true }, "node_modules/@emnapi/runtime": { "version": "1.11.1", @@ -2022,7 +2010,6 @@ "integrity": "sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==", "license": "MIT", "optional": true, - "peer": true, "dependencies": { "tslib": "^2.4.0" } @@ -2032,8 +2019,7 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "license": "0BSD", - "optional": true, - "peer": true + "optional": true }, "node_modules/@emnapi/wasi-threads": { "version": "1.2.2", @@ -2041,7 +2027,6 @@ "integrity": "sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==", "license": "MIT", "optional": true, - "peer": true, "dependencies": { "tslib": "^2.4.0" } @@ -2051,8 +2036,7 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "license": "0BSD", - "optional": true, - "peer": true + "optional": true }, "node_modules/@epic-web/invariant": { "version": "1.0.0", @@ -2560,6 +2544,7 @@ "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.7.2.tgz", "integrity": "sha512-yxtOBWDrdi5DD5o1pmVdq3WMCvnobT0LU6R8RyyVXPvFRd2o79/0NCuQoCjNTeZz9EzA9xS3JxNWfv54RIHFEA==", "license": "MIT", + "peer": true, "dependencies": { "@fortawesome/fontawesome-common-types": "6.7.2" }, @@ -2685,16 +2670,6 @@ "node": ">=18.0.0" } }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.6.tgz", - "integrity": "sha512-+Sg6GCR/wy1oSmQDFq4LQDAhm3ETKnorxN+y5nbLULOR3P0c14f2Wurzj3/xqPXtasLFfHd5iRFQ7AJt4KH2cw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.13", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", @@ -4351,6 +4326,13 @@ "node": ">=4" } }, + "node_modules/@standard-schema/spec": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", + "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", + "dev": true, + "license": "MIT" + }, "node_modules/@szmarczak/http-timer": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", @@ -5066,8 +5048,7 @@ "resolved": "https://registry.npmjs.org/@types/esrecurse/-/esrecurse-4.3.1.tgz", "integrity": "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@types/estree": { "version": "1.0.9", @@ -5122,6 +5103,7 @@ "integrity": "sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@types/linkify-it": "^5", "@types/mdurl": "^2" @@ -5415,32 +5397,30 @@ } }, "node_modules/@vitest/coverage-v8": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-3.2.6.tgz", - "integrity": "sha512-LsAdmUapA0qSN306d8+zOyawM0hFm2m2Hg9IwVNIKBm+qJV8cijiq2c+gxKZcB1HCfIWAy+0qEZDCUQA58A1cw==", + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-4.1.10.tgz", + "integrity": "sha512-IM49HmthevbgAO4anp1hwtoT9wYe59w0LR00gr+eagHE+ZJ5lK4sLPeO0ubgoJcwLk6dehU3R24N+FbEEKDc8g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "@ampproject/remapping": "^2.3.0", "@bcoe/v8-coverage": "^1.0.2", - "ast-v8-to-istanbul": "^0.3.3", - "debug": "^4.4.1", + "@vitest/utils": "4.1.10", + "ast-v8-to-istanbul": "^1.0.0", "istanbul-lib-coverage": "^3.2.2", "istanbul-lib-report": "^3.0.1", - "istanbul-lib-source-maps": "^5.0.6", - "istanbul-reports": "^3.1.7", - "magic-string": "^0.30.17", - "magicast": "^0.3.5", - "std-env": "^3.9.0", - "test-exclude": "^7.0.1", - "tinyrainbow": "^2.0.0" + "istanbul-reports": "^3.2.0", + "magicast": "^0.5.2", + "obug": "^2.1.1", + "std-env": "^4.0.0-rc.1", + "tinyrainbow": "^3.1.0" }, "funding": { "url": "https://opencollective.com/vitest" }, "peerDependencies": { - "@vitest/browser": "3.2.6", - "vitest": "3.2.6" + "@vitest/browser": "4.1.10", + "vitest": "4.1.10" }, "peerDependenciesMeta": { "@vitest/browser": { @@ -5449,39 +5429,40 @@ } }, "node_modules/@vitest/expect": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.2.6.tgz", - "integrity": "sha512-1+7q9BtaKzEmO+fmNT3kYvoNn5Y71XWAx2Q5HRim4tTVRQVRv4uJFAQ5FbK0OPUeNP/WmVCpxYxoJdvuHVjzBQ==", + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.10.tgz", + "integrity": "sha512-YsCn+qAk1GWjQOWFEsEcL2gNQ0zmVmQu3T03qP6UyjhtmdtwtbuI+DASn/7iQB3HGTXkdBwGddzxPlmiql5vlA==", "dev": true, "license": "MIT", "dependencies": { + "@standard-schema/spec": "^1.1.0", "@types/chai": "^5.2.2", - "@vitest/spy": "3.2.6", - "@vitest/utils": "3.2.6", - "chai": "^5.2.0", - "tinyrainbow": "^2.0.0" + "@vitest/spy": "4.1.10", + "@vitest/utils": "4.1.10", + "chai": "^6.2.2", + "tinyrainbow": "^3.1.0" }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/mocker": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.2.6.tgz", - "integrity": "sha512-EZOrpDbkKotFAP7wPAQV1UIyoGOk4oX7ynWhBhLB7v+meMHbQhU16oPpIYGTTe4oFlhpryGpgpcZP/sin3hYuw==", + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.10.tgz", + "integrity": "sha512-v0xaezt+DKEmKfaxg133ldzADrwLGd7Ze1MfQQTYfvs8OqZIwbxyxaYURivwV7sWy5fqn3rH5uOrSp07bp44Ow==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/spy": "3.2.6", + "@vitest/spy": "4.1.10", "estree-walker": "^3.0.3", - "magic-string": "^0.30.17" + "magic-string": "^0.30.21" }, "funding": { "url": "https://opencollective.com/vitest" }, "peerDependencies": { "msw": "^2.4.9", - "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "msw": { @@ -5503,42 +5484,42 @@ } }, "node_modules/@vitest/pretty-format": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.6.tgz", - "integrity": "sha512-lb7XXXzmm2h2ASzFnRvQpDo6onT1NmMJA3tkGTWiBFtRJ9lxGY3d3mm/Apt36gej2bkkOVLL/yTOtufDaFa/jA==", + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.10.tgz", + "integrity": "sha512-W1HsjSH4MXQ9YfmmhLAoIYf1HRfekQCGngeIgcei6MP5QQGWUe0gkopdZQaVCFO+JDJMrAJGwa5pRpNpvy4P8Q==", "dev": true, "license": "MIT", "dependencies": { - "tinyrainbow": "^2.0.0" + "tinyrainbow": "^3.1.0" }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/runner": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.2.6.tgz", - "integrity": "sha512-HYcoSj1w5tcgUnzoF0HcyaAQjpA1gj9ftUJ7iSJSuipc02jW9gKkigwZbjFldAfYHA1fa8UZVRftdMY5msWM9Q==", + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.10.tgz", + "integrity": "sha512-IKI6kpIH+LmpROplyLwBBaCfMgOZOMsygVa6BARD6ahA04VRuJSa6OaVG7kRvSEMD870Vd91rSSw0eegtWyLGg==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/utils": "3.2.6", - "pathe": "^2.0.3", - "strip-literal": "^3.0.0" + "@vitest/utils": "4.1.10", + "pathe": "^2.0.3" }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/snapshot": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.2.6.tgz", - "integrity": "sha512-H+ZjNTWGpObenh0YnlBctAPnJSI20P81PL8BPzWpx54YXLLTm8hEsWawtcYLMrwvpK48hGxLLbCS+1KRXhsKhw==", + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.10.tgz", + "integrity": "sha512-xRkfOT1qpTAi/Ti4Y1LtfRc3kEuqxGw59eN2jN9pRWMtS/XDevekhcFSqvQqjUNGksfjMJu3Y+oJ+4Ypn2OaJw==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "3.2.6", - "magic-string": "^0.30.17", + "@vitest/pretty-format": "4.1.10", + "@vitest/utils": "4.1.10", + "magic-string": "^0.30.21", "pathe": "^2.0.3" }, "funding": { @@ -5546,50 +5527,48 @@ } }, "node_modules/@vitest/spy": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.2.6.tgz", - "integrity": "sha512-oq6BbH68WzcWmwtBrU9nqLeaXTR4XwJF7FSLkKEZo4i6eoXcrxjcwSuTvWBIRUTC6VC72nXYunzqgZA+IKdtxg==", + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.10.tgz", + "integrity": "sha512-PLf/Ugvoq5wO/b4rwYCR1h2PSIdXz7wnkQFMiUpLdtM7l6pqVFcQIBEHyT1+l+cj7mNwAfZHzqXqDyjvOuwbDw==", "dev": true, "license": "MIT", - "dependencies": { - "tinyspy": "^4.0.3" - }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/ui": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/@vitest/ui/-/ui-3.2.6.tgz", - "integrity": "sha512-mATfG3zVdhobE9U1rIpvtYD3DGuSSxqZ3Aj/8ityGqKXy8YDJ9BoAjZmAz6dZ1IZ1xI5V+MerkCczvVa+3QK9Q==", + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@vitest/ui/-/ui-4.1.10.tgz", + "integrity": "sha512-EOUqfXHTXtpSHsyLHH40ts3Ue+hRhSGwzwzMlK0dTEOLSDYyOXLyr5JDGmHQWhN2DYI30gw6dVx3cdgM9FZl+Q==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "@vitest/utils": "3.2.6", + "@vitest/utils": "4.1.10", "fflate": "^0.8.2", - "flatted": "^3.3.3", + "flatted": "^3.4.2", "pathe": "^2.0.3", - "sirv": "^3.0.1", - "tinyglobby": "^0.2.14", - "tinyrainbow": "^2.0.0" + "sirv": "^3.0.2", + "tinyglobby": "^0.2.15", + "tinyrainbow": "^3.1.0" }, "funding": { "url": "https://opencollective.com/vitest" }, "peerDependencies": { - "vitest": "3.2.6" + "vitest": "4.1.10" } }, "node_modules/@vitest/utils": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.6.tgz", - "integrity": "sha512-lI23nIs4bnT3T8NIoh+vFaz5s2/DdP0Jgt2jxwgWljvwn82cLJtyi/If+fjFyoLMGIOz0U/fKvWE0d4jsNQEfg==", + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.10.tgz", + "integrity": "sha512-fy9am/HWxbaGt/Sawrp90vt6Y6jQwf1RX77cz3uwoJwJVMli/e1IEwRPnMNJ7vKfPTwo0diXifkpPvwH9v7nGA==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "3.2.6", - "loupe": "^3.1.4", - "tinyrainbow": "^2.0.0" + "@vitest/pretty-format": "4.1.10", + "convert-source-map": "^2.0.0", + "tinyrainbow": "^3.1.0" }, "funding": { "url": "https://opencollective.com/vitest" @@ -5853,6 +5832,7 @@ "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.38.tgz", "integrity": "sha512-JTqp25l8aFfJYF7/KmsXZjAxJz7T+SjmTJLoXVjHtc2BrSgSiW2n9Aem/cWq1OPe68A8JL06B3eVdhlP0H4TVw==", "license": "MIT", + "peer": true, "dependencies": { "@vue/compiler-core": "3.5.38", "@vue/shared": "3.5.38" @@ -5863,6 +5843,7 @@ "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.38.tgz", "integrity": "sha512-DuA2GiZawSEW442iw/9+Fkol8hTgb4Ke5KkhmSry65QA7YuyMbIdy8p0XZRMvNwJdgRz307W8g1CSzdvS4nuNg==", "license": "MIT", + "peer": true, "dependencies": { "@babel/parser": "^7.29.7", "@vue/compiler-core": "3.5.38", @@ -5927,6 +5908,7 @@ "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.38.tgz", "integrity": "sha512-vue8vbf2QlV4quHqzwmJy6dWfmRhP1J8l4wtZg60CL6VoKqcPY2oe7may3+1d9qfpedjK5PRLFqd5k3Isj9mUw==", "license": "MIT", + "peer": true, "dependencies": { "@vue/compiler-ssr": "3.5.38", "@vue/shared": "3.5.38" @@ -5996,6 +5978,7 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.17.0.tgz", "integrity": "sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==", "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -6220,9 +6203,9 @@ } }, "node_modules/ast-v8-to-istanbul": { - "version": "0.3.12", - "resolved": "https://registry.npmjs.org/ast-v8-to-istanbul/-/ast-v8-to-istanbul-0.3.12.tgz", - "integrity": "sha512-BRRC8VRZY2R4Z4lFIL35MwNXmwVqBityvOIwETtsCSwvjl0IdgFsy9NhdaA6j74nUdtJJlIypeRhpDam19Wq3g==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/ast-v8-to-istanbul/-/ast-v8-to-istanbul-1.0.5.tgz", + "integrity": "sha512-UPAgKJFSEGMWSDr3LX4tqnAb4f7KGT8O40Tyx8wbYmmZ/yn58lNCm8h3svs3eXgiGd5AXxz8NDOvXWvicq+rJA==", "dev": true, "license": "MIT", "dependencies": { @@ -6761,6 +6744,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "baseline-browser-mapping": "^2.10.38", "caniuse-lite": "^1.0.30001799", @@ -7200,18 +7184,11 @@ } }, "node_modules/chai": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/chai/-/chai-5.3.3.tgz", - "integrity": "sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", + "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", "dev": true, "license": "MIT", - "dependencies": { - "assertion-error": "^2.0.1", - "check-error": "^2.1.1", - "deep-eql": "^5.0.1", - "loupe": "^3.1.0", - "pathval": "^2.0.0" - }, "engines": { "node": ">=18" } @@ -7259,16 +7236,6 @@ "dev": true, "license": "MIT" }, - "node_modules/check-error": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.3.tgz", - "integrity": "sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 16" - } - }, "node_modules/chokidar": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", @@ -7946,6 +7913,7 @@ "integrity": "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "mdn-data": "2.27.1", "source-map-js": "^1.2.1" @@ -8067,16 +8035,6 @@ "dev": true, "license": "MIT" }, - "node_modules/deep-eql": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", - "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/deep-extend": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", @@ -9001,6 +8959,7 @@ "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", "license": "MIT", + "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", @@ -9163,7 +9122,6 @@ "integrity": "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==", "dev": true, "license": "BSD-2-Clause", - "peer": true, "dependencies": { "@types/esrecurse": "^4.3.1", "@types/estree": "^1.0.8", @@ -9183,7 +9141,6 @@ "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", "dev": true, "license": "Apache-2.0", - "peer": true, "engines": { "node": "^20.19.0 || ^22.13.0 || >=24" }, @@ -9197,7 +9154,6 @@ "integrity": "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==", "dev": true, "license": "BSD-2-Clause", - "peer": true, "dependencies": { "acorn": "^8.16.0", "acorn-jsx": "^5.3.2", @@ -9431,9 +9387,9 @@ } }, "node_modules/expect-type": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz", - "integrity": "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.4.0.tgz", + "integrity": "sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -10350,6 +10306,7 @@ "integrity": "sha512-6QD0ilzDDt93tX44y8tbmZdAcdTRYDhUP+Asgi6pC8Pp5IA3cvaZGyoVN/EGtlq9ziT65iPuBBn3ASLr6hCgVw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@types/node": ">=20.0.0", "@types/whatwg-mimetype": "^3.0.2", @@ -10577,7 +10534,8 @@ "version": "12.1.2", "resolved": "https://registry.npmjs.org/highcharts/-/highcharts-12.1.2.tgz", "integrity": "sha512-paZ72q1um0zZT1sS+O/3JfXVSOLPmZ0zlo8SgRc0rEplPFPQUPc4VpkgQS8IUTueeOBgIWwVpAWyC9tBYbQ0kg==", - "license": "https://www.highcharts.com/license" + "license": "https://www.highcharts.com/license", + "peer": true }, "node_modules/highcharts-vue": { "version": "2.0.1", @@ -11544,21 +11502,6 @@ "node": ">=10" } }, - "node_modules/istanbul-lib-source-maps": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz", - "integrity": "sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.23", - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/istanbul-reports": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", @@ -11611,7 +11554,8 @@ "version": "3.7.1", "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.7.1.tgz", "integrity": "sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/js-beautify": { "version": "1.15.4", @@ -12168,7 +12112,8 @@ "resolved": "https://registry.npmjs.org/linkifyjs/-/linkifyjs-3.0.5.tgz", "integrity": "sha512-1Y9XQH65eQKA9p2xtk+zxvnTeQBG7rdAXSkUG97DmuI/Xhji9uaUzaWxRj6rf9YC0v8KKHkxav7tnLX82Sz5Fg==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/lint-staged": { "version": "9.5.0", @@ -12806,13 +12751,6 @@ "node": ">=4" } }, - "node_modules/loupe": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.2.1.tgz", - "integrity": "sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==", - "dev": true, - "license": "MIT" - }, "node_modules/lowercase-keys": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", @@ -12866,15 +12804,15 @@ } }, "node_modules/magicast": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.3.5.tgz", - "integrity": "sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==", + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.5.3.tgz", + "integrity": "sha512-pVKE4UdSQ7DvHzivsCIFx2BJn1mHG6KsyrFcaxFx6tONdneEuThrDx0Cj3AMg58KyN4pzYT+LHOotxDQDjNvkw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.25.4", - "@babel/types": "^7.25.4", - "source-map-js": "^1.2.0" + "@babel/parser": "^7.29.3", + "@babel/types": "^7.29.0", + "source-map-js": "^1.2.1" } }, "node_modules/make-dir": { @@ -13998,6 +13936,20 @@ "integrity": "sha512-42CPE9AhahZRsMNslczq0ctAEtqk8Eka26QofnqC346BZdHDySk3LWka23LI7ULIw11NmltpiLagIq8gBozxTw==", "license": "MIT" }, + "node_modules/obug": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.4.tgz", + "integrity": "sha512-4a+OsYv9UktOJKE+l1A4OufDgdRF9PifWj+tJnHURo/P+WOxpG4GzUFL9qCalmWauao6ogiG+QvnCovwPoyAWA==", + "dev": true, + "funding": [ + "https://github.com/sponsors/sxzz", + "https://opencollective.com/debug" + ], + "license": "MIT", + "engines": { + "node": ">=12.20.0" + } + }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -14172,6 +14124,7 @@ "resolved": "https://registry.npmjs.org/oxc-parser/-/oxc-parser-0.104.0.tgz", "integrity": "sha512-sIEpobLwe7KhW1JdTvBJkNDgjJarHNsx+Q37iRNyASvmlDOD+f8Qirvwp6nFNz7Q5q3JcsJ1dpKM+oMPTDF/dw==", "license": "MIT", + "peer": true, "dependencies": { "@oxc-project/types": "^0.104.0" }, @@ -14502,16 +14455,6 @@ "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", "license": "MIT" }, - "node_modules/pathval": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.1.tgz", - "integrity": "sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 14.16" - } - }, "node_modules/pbkdf2": { "version": "3.1.6", "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.6.tgz", @@ -14656,6 +14599,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "nanoid": "^3.3.12", "picocolors": "^1.1.1", @@ -15786,6 +15730,7 @@ "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.3.tgz", "integrity": "sha512-i00lAJ2ks1BYr7rjNjKC7BcqAS7nVfiT3QX1SI5aY+AFHblCmaUf9OE9dbdzDvW6dJxbi2ZCZiy9v3CcwOiX3g==", "license": "MIT", + "peer": true, "dependencies": { "@oxc-project/types": "=0.133.0", "@rolldown/pluginutils": "^1.0.0" @@ -15829,6 +15774,7 @@ "integrity": "sha512-RFnrW4lhXA3s3eqHDZvN654g8OTjzRfqpIRJYczCGB6HzphckVAi/Qh4tbPUbRuDi7s1Llv8g/NspLkttY3gTA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@types/estree": "1.0.9" }, @@ -16135,6 +16081,7 @@ "integrity": "sha512-OL3GoQyoUdDt843DpVmDO6y2k1sc5IhUDSpu8XucEI+35neq5QivZ1iuegnpraEVTJXlQGK1gl27zKcTLEPbQw==", "devOptional": true, "license": "MIT", + "peer": true, "dependencies": { "chokidar": "^5.0.0", "immutable": "^5.1.5", @@ -16642,9 +16589,9 @@ "license": "MIT" }, "node_modules/std-env": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz", - "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-4.2.0.tgz", + "integrity": "sha512-oCUKSupKTHX53EyjDtuZQ64pjLJ6yYCtpmEw0goYxtjG9KpbRe8KAsl2tBUGU9DyMcJ0RwJ8GqJAFzMXcXW1Rw==", "dev": true, "license": "MIT" }, @@ -16862,26 +16809,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/strip-literal": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-3.1.0.tgz", - "integrity": "sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==", - "dev": true, - "license": "MIT", - "dependencies": { - "js-tokens": "^9.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/strip-literal/node_modules/js-tokens": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz", - "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==", - "dev": true, - "license": "MIT" - }, "node_modules/stylelint": { "version": "16.26.1", "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.26.1.tgz", @@ -17148,6 +17075,7 @@ "integrity": "sha512-HeP7D2wyhkR+XaK6v4W8oRF62Dsz4flyuczALJp61GckGm42u1saSSJ/0auvcBqxs3jMRFEcPK34At/0JBKdOg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -17374,6 +17302,7 @@ "integrity": "sha512-J/9An6vs9Us6wKRriSFXBWdRZapREHqFzdNUKk0pmu804EMR6dr6winwo7e5JDxN4xahxQsuysyYFwlwj4XN/Q==", "devOptional": true, "license": "BSD-2-Clause", + "peer": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.15.0", @@ -17394,60 +17323,6 @@ "devOptional": true, "license": "MIT" }, - "node_modules/test-exclude": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-7.0.2.tgz", - "integrity": "sha512-u9E6A+ZDYdp7a4WnarkXPZOx8Ilz46+kby6p1yZ8zsGTz9gYa6FIS7lj2oezzNKmtdyyJNNmmXDppga5GB7kSw==", - "dev": true, - "license": "ISC", - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^10.4.1", - "minimatch": "^10.2.2" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/test-exclude/node_modules/balanced-match": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", - "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "18 || 20 || >=22" - } - }, - "node_modules/test-exclude/node_modules/brace-expansion": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", - "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^4.0.2" - }, - "engines": { - "node": "18 || 20 || >=22" - } - }, - "node_modules/test-exclude/node_modules/minimatch": { - "version": "10.2.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", - "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "brace-expansion": "^5.0.5" - }, - "engines": { - "node": "18 || 20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -17489,11 +17364,14 @@ "license": "MIT" }, "node_modules/tinyexec": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", - "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.2.4.tgz", + "integrity": "sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=18" + } }, "node_modules/tinyglobby": { "version": "0.2.17", @@ -17511,30 +17389,10 @@ "url": "https://github.com/sponsors/SuperchupuDev" } }, - "node_modules/tinypool": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz", - "integrity": "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.0.0 || >=20.0.0" - } - }, "node_modules/tinyrainbow": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz", - "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tinyspy": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-4.0.4.tgz", - "integrity": "sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.1.0.tgz", + "integrity": "sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==", "dev": true, "license": "MIT", "engines": { @@ -18150,6 +18008,7 @@ "resolved": "https://registry.npmjs.org/vike/-/vike-0.4.259.tgz", "integrity": "sha512-5S+rgfLYfozCqXTlyZzr6P4FXOIoPcsSbqYO32keBK2Jun4AKR5BI/sQiP3w09Zq/WZkywEu0ofHFAAxtaIdSg==", "license": "MIT", + "peer": true, "dependencies": { "@babel/core": "^7.28.5", "@babel/types": "^7.28.5", @@ -18199,6 +18058,7 @@ "resolved": "https://registry.npmjs.org/vike-vue/-/vike-vue-0.9.11.tgz", "integrity": "sha512-Ujcu7NG/ZFsiAgEomA0PtuHFg0J/BMcol/QHiDzaIlov2JSiDfapyBLidrPVTrHwLHvmeCnxa4ruVqG+/Vj1XA==", "license": "MIT", + "peer": true, "dependencies": { "magic-string": "^0.30.21", "oxc-parser": "^0.104.0", @@ -18226,6 +18086,7 @@ "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.16.tgz", "integrity": "sha512-h9bXPmJichP5fLmVQo3PyaGSDE2n3aPuomeAlVRm0JLmt4rY6zmPKd59HYI4LNW8oTK7tlTsuC7l/m7awx9Jcw==", "license": "MIT", + "peer": true, "dependencies": { "lightningcss": "^1.32.0", "picomatch": "^4.0.4", @@ -18298,29 +18159,6 @@ } } }, - "node_modules/vite-node": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.2.4.tgz", - "integrity": "sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cac": "^6.7.14", - "debug": "^4.4.1", - "es-module-lexer": "^1.7.0", - "pathe": "^2.0.3", - "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" - }, - "bin": { - "vite-node": "vite-node.mjs" - }, - "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, "node_modules/vite-plugin-cjs-interop": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/vite-plugin-cjs-interop/-/vite-plugin-cjs-interop-4.0.3.tgz", @@ -18795,6 +18633,7 @@ "resolved": "https://registry.npmjs.org/vite-plugin-vuetify/-/vite-plugin-vuetify-2.1.3.tgz", "integrity": "sha512-Q4SC/4TqbNvaZIFb9YsfBqkGlYHbJJJ6uU3CnRBZqLUF3s5eCMVZAaV4GkTbehIH/bhSj42lMXztOwc71u6rVw==", "license": "MIT", + "peer": true, "dependencies": { "@vuetify/loader-shared": "^2.1.2", "debug": "^4.3.3", @@ -18819,65 +18658,80 @@ } }, "node_modules/vitest": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.2.6.tgz", - "integrity": "sha512-xejya+bT/j/+R/AGa1XOfRxLmNUlLtlwjRsFUILF+xHfzElmGcmFydy2gqqIrd62ptIEfwVMofd19uNWD9L7Nw==", + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.10.tgz", + "integrity": "sha512-R9jUTe5S4Qb0HCd4TNqpC7oGcrMssMRGXLW80ubjWsW9VH5GF8y1Y0SFLY9AbqSk6nt0PnOx4H4WNJYZ13GUPw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "@types/chai": "^5.2.2", - "@vitest/expect": "3.2.6", - "@vitest/mocker": "3.2.6", - "@vitest/pretty-format": "^3.2.6", - "@vitest/runner": "3.2.6", - "@vitest/snapshot": "3.2.6", - "@vitest/spy": "3.2.6", - "@vitest/utils": "3.2.6", - "chai": "^5.2.0", - "debug": "^4.4.1", - "expect-type": "^1.2.1", - "magic-string": "^0.30.17", + "@vitest/expect": "4.1.10", + "@vitest/mocker": "4.1.10", + "@vitest/pretty-format": "4.1.10", + "@vitest/runner": "4.1.10", + "@vitest/snapshot": "4.1.10", + "@vitest/spy": "4.1.10", + "@vitest/utils": "4.1.10", + "es-module-lexer": "^2.0.0", + "expect-type": "^1.3.0", + "magic-string": "^0.30.21", + "obug": "^2.1.1", "pathe": "^2.0.3", - "picomatch": "^4.0.2", - "std-env": "^3.9.0", + "picomatch": "^4.0.3", + "std-env": "^4.0.0-rc.1", "tinybench": "^2.9.0", - "tinyexec": "^0.3.2", - "tinyglobby": "^0.2.14", - "tinypool": "^1.1.1", - "tinyrainbow": "^2.0.0", - "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0", - "vite-node": "3.2.4", + "tinyexec": "^1.0.2", + "tinyglobby": "^0.2.15", + "tinyrainbow": "^3.1.0", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0", "why-is-node-running": "^2.3.0" }, "bin": { "vitest": "vitest.mjs" }, "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + "node": "^20.0.0 || ^22.0.0 || >=24.0.0" }, "funding": { "url": "https://opencollective.com/vitest" }, "peerDependencies": { "@edge-runtime/vm": "*", - "@types/debug": "^4.1.12", - "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", - "@vitest/browser": "3.2.6", - "@vitest/ui": "3.2.6", + "@opentelemetry/api": "^1.9.0", + "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", + "@vitest/browser-playwright": "4.1.10", + "@vitest/browser-preview": "4.1.10", + "@vitest/browser-webdriverio": "4.1.10", + "@vitest/coverage-istanbul": "4.1.10", + "@vitest/coverage-v8": "4.1.10", + "@vitest/ui": "4.1.10", "happy-dom": "*", - "jsdom": "*" + "jsdom": "*", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "@edge-runtime/vm": { "optional": true }, - "@types/debug": { + "@opentelemetry/api": { "optional": true }, "@types/node": { "optional": true }, - "@vitest/browser": { + "@vitest/browser-playwright": { + "optional": true + }, + "@vitest/browser-preview": { + "optional": true + }, + "@vitest/browser-webdriverio": { + "optional": true + }, + "@vitest/coverage-istanbul": { + "optional": true + }, + "@vitest/coverage-v8": { "optional": true }, "@vitest/ui": { @@ -18888,9 +18742,19 @@ }, "jsdom": { "optional": true + }, + "vite": { + "optional": false } } }, + "node_modules/vitest/node_modules/es-module-lexer": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.3.1.tgz", + "integrity": "sha512-shc1dbU90Yl/xq1QrC7QRtfcwURZuVRfPhZbDoldJ1cn1gzDvBaBWlv0eFolj5+0znnPJz5TXLxsN77X/12KTA==", + "dev": true, + "license": "MIT" + }, "node_modules/vm-browserify": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", @@ -18903,6 +18767,7 @@ "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.38.tgz", "integrity": "sha512-vAMKHfImQlYSy0C+PBue4s3ERZ2xGKfgZg5GXAsLInq1dyh2H78ILVP5sK0KPFPVW4kv+OGCIvBEondcjpZp7A==", "license": "MIT", + "peer": true, "dependencies": { "@vue/compiler-dom": "3.5.38", "@vue/compiler-sfc": "3.5.38", @@ -19147,6 +19012,7 @@ "resolved": "https://registry.npmjs.org/vuetify/-/vuetify-3.12.8.tgz", "integrity": "sha512-gvmOWeLd6CG7LVh2Qonft5YrIb7MpbKZglRjg0ItEloSbu6hfUII2RZmRSVxGKYdiXTf7J1hI3BRSHr8J9LkxA==", "license": "MIT", + "peer": true, "funding": { "type": "github", "url": "https://github.com/sponsors/johnleider" @@ -19545,6 +19411,7 @@ "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==", "devOptional": true, "license": "ISC", + "peer": true, "bin": { "yaml": "bin.mjs" }, diff --git a/package.json b/package.json index d329308d33..7a83f920c1 100644 --- a/package.json +++ b/package.json @@ -74,8 +74,8 @@ "@fortawesome/free-solid-svg-icons": "^6.6.0", "@vitejs/plugin-legacy": "^8.0.2", "@vitejs/plugin-vue": "^6.0.6", - "@vitest/coverage-v8": "^3.2.4", - "@vitest/ui": "^3.2.4", + "@vitest/coverage-v8": "^4.1.10", + "@vitest/ui": "^4.1.10", "@vue/babel-preset-app": "^5.0.8", "@vue/test-utils": "^2.4.6", "autoprefixer": "^10.4.20", @@ -113,7 +113,7 @@ "vite-plugin-compression2": "^2.5.3", "vite-plugin-eslint": "^1.8.1", "vite-plugin-vuetify": "^2.1.3", - "vitest": "^3.2.4", + "vitest": "^4.1.10", "vue-3-linkify": "^1.1.0", "yaml": "^2.8.3" }, diff --git a/public/assets/Home/BlockHero/pattern-blue.png b/public/assets/Home/BlockHero/pattern-blue.png new file mode 100644 index 0000000000..c1052d8c11 Binary files /dev/null and b/public/assets/Home/BlockHero/pattern-blue.png differ diff --git a/src/router/index.js b/src/router/index.js index a42f967d6b..e8029f5f18 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -16,6 +16,7 @@ import { Educational, Graph, Home, + Documentation, Licence, Login, LoginFailure, @@ -91,6 +92,11 @@ export function createMyRouter(store) { path: "/", component: Home, }, + { + name: "Documentation", + path: "/documentation", + component: Documentation, + }, { name: "Graph", path: "/graph/:id", diff --git a/src/router/routes.js b/src/router/routes.js index b816af2443..2c11a1067a 100644 --- a/src/router/routes.js +++ b/src/router/routes.js @@ -1,3 +1,4 @@ +export const Documentation = () => import("@/views/Static/Documentation/Documentation.vue"); export const Home = () => import("@/views/Home/Home.vue"); export const NotFound = () => import("@/views/Errors/404"); export const ServerError = () => import("@/views/Errors/500"); diff --git a/src/views/Static/Documentation/Documentation.vue b/src/views/Static/Documentation/Documentation.vue new file mode 100644 index 0000000000..c2382d99e1 --- /dev/null +++ b/src/views/Static/Documentation/Documentation.vue @@ -0,0 +1,175 @@ + + + + + diff --git a/tests/setup.js b/tests/setup.js index c160aa508f..92f5360909 100644 --- a/tests/setup.js +++ b/tests/setup.js @@ -190,19 +190,21 @@ global.IntersectionObserver = class IntersectionObserver { // --- 3. window.matchMedia Polyfill --- // CRITICAL for $vuetify.display (mdAndDown, lgAndUp, etc.) // We default 'matches' to false, meaning the test assumes "Desktop" view by default. -Object.defineProperty(window, "matchMedia", { - writable: true, - value: vi.fn().mockImplementation((query) => ({ - matches: false, - media: query, - onchange: null, - addListener: vi.fn(), // deprecated - removeListener: vi.fn(), // deprecated - addEventListener: vi.fn(), - removeEventListener: vi.fn(), - dispatchEvent: vi.fn(), - })), -}); +if (typeof window !== "undefined") { + Object.defineProperty(window, "matchMedia", { + writable: true, + value: vi.fn().mockImplementation((query) => ({ + matches: false, + media: query, + onchange: null, + addListener: vi.fn(), // deprecated + removeListener: vi.fn(), // deprecated + addEventListener: vi.fn(), + removeEventListener: vi.fn(), + dispatchEvent: vi.fn(), + })), + }); +} // --- 4. Mock global CSS support --- // Prevents errors in some Vuetify computed properties @@ -224,14 +226,16 @@ if (!Object.groupBy) { }; } -// Prevent accidental network access to local API endpoints in unit tests. +// Prevent unit tests from reaching API and embedded-service endpoints. const nativeFetch = globalThis.fetch ? globalThis.fetch.bind(globalThis) : null; const mockedFetch = async (input, init) => { const url = typeof input === "string" ? input : (input && input.url) || ""; if ( url.includes("localhost:3000") || url.includes("127.0.0.1:3000") || - url.includes("undefined/graphql") + url.includes("undefined/graphql") || + url.includes("dev-api.fairsharing.org") || + url.includes("aicc.uksouth.cloudapp.azure.com") ) { return new Response(JSON.stringify({}), { status: 200, @@ -246,14 +250,15 @@ if (typeof window !== "undefined") { window.fetch = globalThis.fetch; } -// Short-circuit GraphQL requests that would otherwise target localhost in tests. +// Short-circuit GraphQL requests to configured development endpoints in tests. const originalGetData = GraphQLClient.prototype.getData; GraphQLClient.prototype.getData = async function (queryString) { const url = this.url || ""; if ( url.includes("localhost:3000") || url.includes("127.0.0.1:3000") || - url.includes("undefined/graphql") + url.includes("undefined/graphql") || + url.includes("dev-api.fairsharing.org") ) { return { data: { data: {} } }; } @@ -266,6 +271,7 @@ RESTClient.prototype.executeQuery = async function (query) { if ( url.includes("localhost:3000") || url.includes("127.0.0.1:3000") || + url.includes("dev-api.fairsharing.org") || url.startsWith("undefined") || url.includes("/undefined/") ) { diff --git a/tests/unit/components/ChatBot/FionaChat.spec.js b/tests/unit/components/ChatBot/FionaChat.spec.js index 926e6f9911..80d4aa1c2e 100644 --- a/tests/unit/components/ChatBot/FionaChat.spec.js +++ b/tests/unit/components/ChatBot/FionaChat.spec.js @@ -12,6 +12,9 @@ describe("FionaChat", () => { document.body.innerHTML = '
'; wrapper = mount(FionaChat, { attachTo: "#app", + data: () => ({ + chatUrl: "about:blank#", + }), global: { stubs: { VBtn: { diff --git a/tests/unit/components/Curators/DownLoadRecordComponents/CuratorSummaryStatistics.spec.js b/tests/unit/components/Curators/DownLoadRecordComponents/CuratorSummaryStatistics.spec.js index c149ffa408..8df7f01867 100644 --- a/tests/unit/components/Curators/DownLoadRecordComponents/CuratorSummaryStatistics.spec.js +++ b/tests/unit/components/Curators/DownLoadRecordComponents/CuratorSummaryStatistics.spec.js @@ -15,7 +15,9 @@ const { mockClientInstance } = vi.hoisted(() => { vi.mock("@/lib/GraphClient/GraphClient", () => { return { - default: vi.fn().mockImplementation(() => mockClientInstance), + default: vi.fn(function () { + return mockClientInstance; + }), }; }); diff --git a/tests/unit/components/Curators/DownLoadRecordComponents/RecordEditsByMonth.spec.js b/tests/unit/components/Curators/DownLoadRecordComponents/RecordEditsByMonth.spec.js index f4eb14cbcc..f2c70c5e98 100644 --- a/tests/unit/components/Curators/DownLoadRecordComponents/RecordEditsByMonth.spec.js +++ b/tests/unit/components/Curators/DownLoadRecordComponents/RecordEditsByMonth.spec.js @@ -10,9 +10,11 @@ const { mockGetEditByMonth } = vi.hoisted(() => ({ // 2. Mock RestClient vi.mock("@/lib/Client/RESTClient", () => { return { - default: vi.fn().mockImplementation(() => ({ - getEditByMonth: mockGetEditByMonth, - })), + default: vi.fn(function () { + return { + getEditByMonth: mockGetEditByMonth, + }; + }), }; }); diff --git a/tests/unit/components/Curators/DownLoadRecordComponents/RecordsCreatedByMonth.spec.js b/tests/unit/components/Curators/DownLoadRecordComponents/RecordsCreatedByMonth.spec.js index f169466e4e..9746ded3d1 100644 --- a/tests/unit/components/Curators/DownLoadRecordComponents/RecordsCreatedByMonth.spec.js +++ b/tests/unit/components/Curators/DownLoadRecordComponents/RecordsCreatedByMonth.spec.js @@ -9,9 +9,11 @@ const { mockGetRecordCreatedByMonth } = vi.hoisted(() => ({ vi.mock("@/lib/Client/RESTClient", () => { return { - default: vi.fn().mockImplementation(() => ({ - getRecordCreatedByMonth: mockGetRecordCreatedByMonth, - })), + default: vi.fn(function () { + return { + getRecordCreatedByMonth: mockGetRecordCreatedByMonth, + }; + }), }; }); diff --git a/tests/unit/components/Curators/DownLoadRecordComponents/RecordsNeedingReview.spec.js b/tests/unit/components/Curators/DownLoadRecordComponents/RecordsNeedingReview.spec.js index f5970fba10..3b363a0d9c 100644 --- a/tests/unit/components/Curators/DownLoadRecordComponents/RecordsNeedingReview.spec.js +++ b/tests/unit/components/Curators/DownLoadRecordComponents/RecordsNeedingReview.spec.js @@ -13,7 +13,9 @@ const { mockClientInstance } = vi.hoisted(() => ({ vi.mock("@/lib/GraphClient/GraphClient", () => { return { - default: vi.fn().mockImplementation(() => mockClientInstance), + default: vi.fn(function () { + return mockClientInstance; + }), }; }); diff --git a/tests/unit/components/Curators/DownLoadRecordComponents/RecordsWithoutDois.spec.js b/tests/unit/components/Curators/DownLoadRecordComponents/RecordsWithoutDois.spec.js index 1736be80fc..858e322d52 100644 --- a/tests/unit/components/Curators/DownLoadRecordComponents/RecordsWithoutDois.spec.js +++ b/tests/unit/components/Curators/DownLoadRecordComponents/RecordsWithoutDois.spec.js @@ -9,9 +9,11 @@ const { mockGetRecordsWoDOIs } = vi.hoisted(() => ({ vi.mock("@/lib/Client/RESTClient", () => { return { - default: vi.fn().mockImplementation(() => ({ - getRecordsWoDOIs: mockGetRecordsWoDOIs, - })), + default: vi.fn(function () { + return { + getRecordsWoDOIs: mockGetRecordsWoDOIs, + }; + }), }; }); diff --git a/tests/unit/components/Curators/MaintenanceRequests.spec.js b/tests/unit/components/Curators/MaintenanceRequests.spec.js index 9f065d5fce..5635086f63 100644 --- a/tests/unit/components/Curators/MaintenanceRequests.spec.js +++ b/tests/unit/components/Curators/MaintenanceRequests.spec.js @@ -24,13 +24,17 @@ const restClientMock = vi.hoisted(() => ({ // Mock RESTClient and GraphClient classes vi.mock("@/lib/Client/RESTClient.js", () => { return { - default: vi.fn().mockImplementation(() => restClientMock), + default: vi.fn(function () { + return restClientMock; + }), }; }); vi.mock("@/lib/GraphClient/GraphClient", () => { return { - default: vi.fn().mockImplementation(() => graphClientMock), + default: vi.fn(function () { + return graphClientMock; + }), }; }); diff --git a/tests/unit/components/Curators/UserRecordsAwaitingApproval.spec.js b/tests/unit/components/Curators/UserRecordsAwaitingApproval.spec.js index 37d758281f..53849f3769 100644 --- a/tests/unit/components/Curators/UserRecordsAwaitingApproval.spec.js +++ b/tests/unit/components/Curators/UserRecordsAwaitingApproval.spec.js @@ -1,4 +1,4 @@ -import { afterEach, beforeAll, describe, expect, it, vi } from "vitest"; +import { afterAll, beforeAll, describe, expect, it, vi } from "vitest"; import { shallowMount } from "@vue/test-utils"; import sinon from "sinon"; import Vuex from "vuex"; @@ -119,7 +119,7 @@ describe("Curator -> UserRecordsAwaitingApproval.vue", () => { }); }); - afterEach(() => { + afterAll(() => { graphStub.restore(); restStub.restore(); }); @@ -168,7 +168,6 @@ describe("Curator -> UserRecordsAwaitingApproval.vue", () => { expect(wrapper.vm.approvalRequiredProcessed[0].curator).toMatch("Michae"); // TODO: Check that the curator are updated in the record - restStub = sinon.stub(Client.prototype, "executeQuery"); restStub.returns({ data: { error: { response: "Im an error" } } }); await wrapper.vm.assignCurator(11, 1, "Michael Smith"); expect(wrapper.vm.error.recordID).toBe(11); @@ -179,7 +178,6 @@ describe("Curator -> UserRecordsAwaitingApproval.vue", () => { it("can approve a record", async () => { //Correct approval wrapper.vm.dialogs.recordID = 100; - restStub = sinon.stub(Client.prototype, "executeQuery"); restStub.returns({ data: { error: false } }); await wrapper.vm.confirmApproval(); expect(wrapper.vm.approvalRequiredProcessed.length).toBe(2); @@ -193,9 +191,7 @@ describe("Curator -> UserRecordsAwaitingApproval.vue", () => { expect(wrapper.vm.dialogs.approveChanges).toBe(false); expect(wrapper.vm.approvalRequiredProcessed[0].id).toBe(11); //There is an error in the Client query - restStub.restore(); wrapper.vm.dialogs.recordID = 101; - restStub = sinon.stub(Client.prototype, "executeQuery"); restStub.returns({ data: { error: { response: { data: "error" } } } }); await wrapper.vm.confirmApproval(); expect(wrapper.vm.approvalRequiredProcessed.length).toBe(1); @@ -208,9 +204,7 @@ describe("Curator -> UserRecordsAwaitingApproval.vue", () => { expect(wrapper.vm.approvalRequiredProcessed.length).toBe(1); expect(wrapper.vm.dialogs.approveChanges).toBe(false); - restStub.restore(); wrapper.vm.dialogs.recordID = 102; - restStub = sinon.stub(Client.prototype, "executeQuery"); restStub.returns({ data: { error: { response: { data: "error" } } } }); await wrapper.vm.confirmApproval(); expect(wrapper.vm.approvalRequiredProcessed.length).toBe(1); @@ -220,7 +214,6 @@ describe("Curator -> UserRecordsAwaitingApproval.vue", () => { it("can delete a record", async () => { //There is an error in the Client query wrapper.vm.dialogs.recordID = 102; - restStub = sinon.stub(Client.prototype, "executeQuery"); restStub.returns({ data: { error: { response: { data: "error" } } } }); await wrapper.vm.confirmDelete(); expect(wrapper.vm.approvalRequiredProcessed.length).toBe(1); @@ -230,8 +223,6 @@ describe("Curator -> UserRecordsAwaitingApproval.vue", () => { //Correct deleted wrapper.vm.dialogs.recordID = 102; - restStub.restore(); - restStub = sinon.stub(Client.prototype, "executeQuery"); restStub.returns({ data: { error: false } }); await wrapper.vm.confirmDelete(); expect(wrapper.vm.approvalRequiredProcessed.length).toBe(0); diff --git a/tests/unit/components/Editor/DataAccess/EditDataAccess.spec.js b/tests/unit/components/Editor/DataAccess/EditDataAccess.spec.js index 8f484e8eab..39a119533f 100644 --- a/tests/unit/components/Editor/DataAccess/EditDataAccess.spec.js +++ b/tests/unit/components/Editor/DataAccess/EditDataAccess.spec.js @@ -165,6 +165,8 @@ describe("Edit -> DataAccess.vue", function () { it("handles save and exit with redirect", async () => { const btn = { textContent: "Save and exit" }; const pushCalls = $router.push.mock.calls.length; + restStub = sinon.stub(RestClient.prototype, "executeQuery"); + restStub.returns({ data: "GG!" }); await wrapper.vm.saveRecord(true, btn); expect($router.push).toHaveBeenCalledTimes(pushCalls + 1); }); diff --git a/tests/unit/components/Navigation/Header.spec.js b/tests/unit/components/Navigation/Header.spec.js index 5a587035a9..fa97f0dad7 100644 --- a/tests/unit/components/Navigation/Header.spec.js +++ b/tests/unit/components/Navigation/Header.spec.js @@ -4,6 +4,7 @@ import {createVuetify} from "vuetify"; import Vuex from "vuex"; import Header from "@/components/Navigation/Header.vue"; +import RESTClient from "@/lib/Client/RESTClient.js"; import uiControllerStore from "@/store/uiController.js"; import usersStore from "@/store/users.js"; @@ -120,6 +121,9 @@ describe("Header.vue", function () { it("logs out and redirects to Login", async () => { const push = vi.fn(); + const logoutSpy = vi + .spyOn(RESTClient.prototype, "logout") + .mockResolvedValue({ error: false }); const localStore = new Vuex.Store({ modules: { @@ -143,5 +147,6 @@ describe("Header.vue", function () { await localWrapper.vm.logoutUser(); expect(push).toHaveBeenCalledWith({ name: "Login" }); + logoutSpy.mockRestore(); }); }); diff --git a/tests/unit/components/Records/Record/GeneralInfo/DOITitle.spec.js b/tests/unit/components/Records/Record/GeneralInfo/DOITitle.spec.js index 9ab6ff76ff..29fe04f424 100644 --- a/tests/unit/components/Records/Record/GeneralInfo/DOITitle.spec.js +++ b/tests/unit/components/Records/Record/GeneralInfo/DOITitle.spec.js @@ -37,7 +37,9 @@ describe("DOITitle.vue", function () { readAsDataURL, target: fileContents, }; - window.Image = vi.fn(() => dummyFileReader); + window.Image = vi.fn(function () { + return dummyFileReader; + }); }); it("can be instantiated", async () => { diff --git a/tests/unit/components/Records/Record/GeneralInfo/SavedSearches.spec.js b/tests/unit/components/Records/Record/GeneralInfo/SavedSearches.spec.js index 4afdcd90ec..4d66d1e09c 100644 --- a/tests/unit/components/Records/Record/GeneralInfo/SavedSearches.spec.js +++ b/tests/unit/components/Records/Record/GeneralInfo/SavedSearches.spec.js @@ -33,9 +33,11 @@ const { mockUpdateSaveSearch } = vi.hoisted(() => { // Now Vitest can safely use it here! vi.mock("@/lib/Client/RESTClient.js", () => ({ - default: vi.fn().mockImplementation(() => ({ - updateSaveSearch: mockUpdateSaveSearch, - })), + default: vi.fn(function () { + return { + updateSaveSearch: mockUpdateSaveSearch, + }; + }), })); describe("SavedSearches.vue", () => { diff --git a/tests/unit/components/Records/Search/SaveSearch/SaveSearchStepper.spec.js b/tests/unit/components/Records/Search/SaveSearch/SaveSearchStepper.spec.js index 74507fdc0c..b6f1f75b6f 100644 --- a/tests/unit/components/Records/Search/SaveSearch/SaveSearchStepper.spec.js +++ b/tests/unit/components/Records/Search/SaveSearch/SaveSearchStepper.spec.js @@ -11,9 +11,11 @@ const { mockSaveSearchAPI } = vi.hoisted(() => ({ vi.mock("@/lib/Client/RESTClient", () => { return { - default: vi.fn(() => ({ - saveSearch: mockSaveSearchAPI, - })), + default: vi.fn(function () { + return { + saveSearch: mockSaveSearchAPI, + }; + }), }; }); diff --git a/tests/unit/components/Records/Search/SaveSearch/StepperComponents/PolicyStepper.spec.js b/tests/unit/components/Records/Search/SaveSearch/StepperComponents/PolicyStepper.spec.js index 1c4a5c7791..7e9c10633f 100644 --- a/tests/unit/components/Records/Search/SaveSearch/StepperComponents/PolicyStepper.spec.js +++ b/tests/unit/components/Records/Search/SaveSearch/StepperComponents/PolicyStepper.spec.js @@ -48,6 +48,9 @@ describe("PolicyStepper.vue", () => { }, saveSearch: { namespaced: true, + mutations: { + setPolicySelected: vi.fn(), + }, getters: { getPolicyRecords: getters.getPolicyRecords, getLoadingStatus: getters.getLoadingStatus, diff --git a/tests/unit/components/Users/Profiles/Private/ViewSavedSearchesTable.spec.js b/tests/unit/components/Users/Profiles/Private/ViewSavedSearchesTable.spec.js index 764784a4f3..724d153c46 100644 --- a/tests/unit/components/Users/Profiles/Private/ViewSavedSearchesTable.spec.js +++ b/tests/unit/components/Users/Profiles/Private/ViewSavedSearchesTable.spec.js @@ -13,10 +13,12 @@ const { mockDelete, mockUpdate } = vi.hoisted(() => { vi.mock("@/lib/Client/RESTClient", () => { return { - default: vi.fn(() => ({ - deleteSavedSearch: mockDelete, - updateSaveSearch: mockUpdate, - })), + default: vi.fn(function () { + return { + deleteSavedSearch: mockDelete, + updateSaveSearch: mockUpdate, + }; + }), }; }); diff --git a/tests/unit/lib/GraphClient/GraphClientSEO.spec.js b/tests/unit/lib/GraphClient/GraphClientSEO.spec.js new file mode 100644 index 0000000000..5dda924373 --- /dev/null +++ b/tests/unit/lib/GraphClient/GraphClientSEO.spec.js @@ -0,0 +1,91 @@ +import { beforeEach, describe, expect, it, vi } from "vitest"; + +import axios from "axios"; +import GraphClientSEO from "@/lib/GraphClient/GraphClientSEO.js"; + +vi.mock("axios", () => ({ + default: vi.fn(), +})); + +describe("GraphClientSEO", () => { + let client; + + beforeEach(() => { + GraphClientSEO._instance = undefined; + process.env.VITE_API_ENDPOINT = "https://api.example.org/"; + process.env.VITE_CLIENT_ID = "client-id"; + axios.mockReset(); + client = new GraphClientSEO(); + }); + + it("initializes headers, normalizes the endpoint, and remains a singleton", () => { + expect(client.url).toBe("https://api.example.org/graphql"); + expect(client.headers["X-Client-Id"]).toBe("client-id"); + expect(new GraphClientSEO()).toBe(client); + + client.setHeader("token"); + expect(client.headers.Authorization).toBe("Bearer token"); + }); + + it("omits the optional client ID header", () => { + GraphClientSEO._instance = undefined; + delete process.env.VITE_CLIENT_ID; + + const clientWithoutId = new GraphClientSEO(); + + expect(clientWithoutId.headers).not.toHaveProperty("X-Client-Id"); + }); + + it("builds parameters, fragments, and nested fields", () => { + const query = { + queryName: "records", + queryParam: { + active: true, + page: 2, + name: "Example", + filter: '{status: "ready"}', + ids: [1, "two"], + }, + fields: [ + "id", + { $ref: "keywords" }, + { $ref: "objectTypes" }, + { + name: "owner", + fields: ["name", { queryName: "profile", fields: ["id"] }], + }, + ], + }; + + const output = client.buildQuery(query); + + expect(output).toContain("records("); + expect(output).toContain("active:true"); + expect(output).toContain("page:2"); + expect(output).toContain('name:"Example"'); + expect(output).toContain('filter:{status: "ready"}'); + expect(output).toContain('ids:[1,"two"]'); + expect(output).toContain("owner{name profile{ id}}"); + expect(output).toContain("objectTypes{"); + expect(client.buildQuery({ queryName: "ping" })).toBe("ping"); + }); + + it("posts queries and returns GraphQL data or errors", async () => { + axios.mockResolvedValueOnce({ data: { data: { records: [1] } } }); + + await expect( + client.executeQuery({ queryName: "records", fields: ["id"] }), + ).resolves.toEqual({ records: [1] }); + expect(axios).toHaveBeenCalledWith({ + method: "post", + url: "https://api.example.org/graphql", + data: { query: "{records{ id}}" }, + headers: client.headers, + }); + + axios.mockResolvedValueOnce({ data: { errors: [{ message: "bad query" }] } }); + await expect(client.executeQuery({ queryName: "broken" })).resolves.toEqual([ + { message: "bad query" }, + ]); + }); +}); diff --git a/tests/unit/lib/Prerender/prerenderUtils.spec.js b/tests/unit/lib/Prerender/prerenderUtils.spec.js new file mode 100644 index 0000000000..3c6f95a979 --- /dev/null +++ b/tests/unit/lib/Prerender/prerenderUtils.spec.js @@ -0,0 +1,74 @@ +// @vitest-environment node + +import fs from "node:fs"; +import path from "node:path"; +import { afterAll, beforeAll, describe, expect, it, vi } from "vitest"; + +const mockPaths = vi.hoisted(() => { + const root = "/tmp/fairsharing-prerender-utils-tests"; + return { + root, + records: `${root}/records.json`, + organisations: `${root}/organisations.json`, + jsonld: `${root}/jsonld`, + }; +}); + +vi.mock("@/lib/Prerender/build-context.json", () => ({ + default: { + recordsFile: mockPaths.records, + organisationsFile: mockPaths.organisations, + jsonldDir: mockPaths.jsonld, + }, +})); + +import { + readGeneratedOrganisations, + readGeneratedRecords, + readGeneratedSchemaOrg, +} from "@/lib/Prerender/prerenderUtils.server.js"; +import { normalizeDoi } from "@/lib/Prerender/prerenderUtils.shared.js"; + +describe("prerender utilities", () => { + beforeAll(() => { + fs.mkdirSync(mockPaths.jsonld, { recursive: true }); + fs.writeFileSync(mockPaths.records, JSON.stringify([{ id: 1 }])); + fs.writeFileSync( + mockPaths.organisations, + JSON.stringify([{ id: 2, name: "Example" }]), + ); + fs.writeFileSync( + path.join(mockPaths.jsonld, "1.jsonld"), + JSON.stringify({ "@type": "Dataset" }), + ); + }); + + afterAll(() => { + fs.rmSync(mockPaths.root, { recursive: true, force: true }); + }); + + it("reads generated records, organisations, and schema.org data", () => { + expect(readGeneratedRecords()).toEqual([{ id: 1 }]); + expect(readGeneratedOrganisations()).toEqual([{ id: 2, name: "Example" }]); + expect(readGeneratedSchemaOrg(1)).toEqual({ "@type": "Dataset" }); + }); + + it("returns the schema fallback when a generated file is absent", () => { + const warning = vi.spyOn(console, "warn").mockImplementation(() => {}); + + expect(readGeneratedSchemaOrg("missing")).toBeNull(); + expect(warning).toHaveBeenCalledWith( + expect.stringContaining("missing.jsonld"), + ); + + warning.mockRestore(); + }); + + it.each([ + [" https://doi.org/10.1234/example/ ", "10.1234/example"], + ["http://dx.doi.org/10.1234%2Fencoded", "10.1234/encoded"], + ["doi:/10.1234/example/", "10.1234/example"], + ])("normalizes DOI value %s", (input, expected) => { + expect(normalizeDoi(input)).toBe(expected); + }); +}); diff --git a/tests/unit/pages/data.spec.js b/tests/unit/pages/data.spec.js new file mode 100644 index 0000000000..f9115ec730 --- /dev/null +++ b/tests/unit/pages/data.spec.js @@ -0,0 +1,119 @@ +import { beforeEach, describe, expect, it, vi } from "vitest"; + +const fixtures = vi.hoisted(() => ({ + records: [ + { + id: 1, + doi: "10.1234/example", + name: "Example record", + description: "Record description", + }, + { id: 2, doi: "", name: "Second record", description: "" }, + { id: "invalid", doi: "10.1234/other", name: "Other record" }, + ], + organisations: [ + { id: 1, name: "First organisation" }, + { id: 2, name: "Second organisation" }, + ], + schemaOrg: { "@type": "Dataset" }, +})); + +vi.mock("@/lib/Prerender/build-context.json", () => ({ + default: { skipFull: false, batch: 1, batchSize: 2 }, +})); +vi.mock("@/lib/Prerender/prerenderUtils.server.js", () => ({ + readGeneratedRecords: vi.fn(async () => fixtures.records), + readGeneratedOrganisations: vi.fn(async () => fixtures.organisations), + readGeneratedSchemaOrg: vi.fn(() => fixtures.schemaOrg), +})); + +import { data as recordData } from "@/pages/all/+data.js"; +import { onBeforePrerenderStart } from "@/pages/all/+onBeforePrerenderStart.js"; +import { data as organisationsData } from "@/pages/organisations/+data.js"; +import { data as organisationData } from "@/pages/organisations/@id/+data.js"; + +describe("prerender page data", () => { + beforeEach(() => { + vi.stubEnv("SSR", true); + }); + + it("returns empty metadata for empty and unknown record routes", async () => { + await expect( + recordData({ routeParams: { "*": "index" } }), + ).resolves.toMatchObject({ record: null, schemaOrg: null }); + await expect( + recordData({ routeParams: { "*": "not-found" } }), + ).resolves.toMatchObject({ record: null, canonicalUrl: null }); + }); + + it("finds numeric and DOI record routes and builds canonical metadata", async () => { + const numeric = await recordData({ routeParams: { "*": "1" } }); + const doiAlias = await recordData({ routeParams: { "*": "example" } }); + + expect(numeric).toMatchObject({ + record: fixtures.records[0], + schemaOrg: fixtures.schemaOrg, + canonicalUrl: "https://fairsharing.org/10.1234/example", + seoTitle: "Example record | FAIRsharing", + seoDescription: "Record description", + }); + expect(doiAlias.record).toEqual(fixtures.records[0]); + }); + + it("returns record-only data in the browser", async () => { + vi.stubEnv("SSR", false); + + await expect(recordData({ routeParams: { "*": "2" } })).resolves.toEqual({ + record: fixtures.records[1], + schemaOrg: null, + }); + }); + + it("builds unique static, record, DOI, and organisation prerender routes", async () => { + const log = vi.spyOn(console, "log").mockImplementation(() => {}); + const routes = await onBeforePrerenderStart(); + + expect(routes).toContain("/"); + expect(routes).toContain("/1"); + expect(routes).toContain("/10.1234/example"); + expect(routes).toContain("/example"); + expect(routes).toContain("/2"); + expect(routes).toContain("/organisations/2"); + expect(new Set(routes).size).toBe(routes.length); + expect(log).toHaveBeenCalledWith(expect.stringContaining("Building Batch #1")); + + log.mockRestore(); + }); + + it("logs when a batch contains no record routes", async () => { + const records = [...fixtures.records]; + const organisations = [...fixtures.organisations]; + fixtures.records.splice(0); + fixtures.organisations.splice(0); + const log = vi.spyOn(console, "log").mockImplementation(() => {}); + + const routes = await onBeforePrerenderStart(); + + expect(routes).toContain("/"); + expect(log).toHaveBeenCalledWith("No records found for batch #1."); + + fixtures.records.push(...records); + fixtures.organisations.push(...organisations); + log.mockRestore(); + }); + + it("returns organisation collections and selects an organisation by ID", async () => { + await expect(organisationsData()).resolves.toEqual({ + organisations: fixtures.organisations, + }); + await expect( + organisationData({ routeParams: { id: "2" } }), + ).resolves.toEqual({ organisation: fixtures.organisations[1] }); + await expect( + organisationData({ routeParams: {} }), + ).resolves.toEqual({ organisation: null }); + await expect( + organisationData({ routeParams: { id: "99" } }), + ).resolves.toEqual({ organisation: null }); + }); +}); diff --git a/tests/unit/pages/indexData.spec.js b/tests/unit/pages/indexData.spec.js new file mode 100644 index 0000000000..e0e0786cf8 --- /dev/null +++ b/tests/unit/pages/indexData.spec.js @@ -0,0 +1,47 @@ +import { beforeEach, describe, expect, it, vi } from "vitest"; + +const mocks = vi.hoisted(() => ({ + getHomepageJsonld: vi.fn(), + setConfig: vi.fn(), +})); + +vi.mock("@/lib/Client/RESTClient.js", () => ({ + default: vi.fn(function () { + return { getHomepageJsonld: mocks.getHomepageJsonld }; + }), +})); +vi.mock("vike-vue/useConfig", () => ({ + useConfig: () => mocks.setConfig, +})); + +import { data } from "@/pages/index/+data.js"; + +describe("homepage data", () => { + beforeEach(() => { + vi.clearAllMocks(); + }); + + it("adds non-empty schema.org data to the page head", async () => { + mocks.getHomepageJsonld.mockResolvedValue({ + "@type": "WebSite", + description: "", + }); + + const result = await data(); + const head = mocks.setConfig.mock.calls[0][0].Head; + + expect(result.JSONLD).toEqual({ + "@type": "WebSite", + description: "", + }); + expect(head.type).toBe("script"); + expect(head.props.innerHTML).toContain("\\u003cunsafe>"); + }); + + it("returns null and leaves the head unchanged without schema.org data", async () => { + mocks.getHomepageJsonld.mockResolvedValue(null); + + await expect(data()).resolves.toEqual({ JSONLD: null }); + expect(mocks.setConfig).not.toHaveBeenCalled(); + }); +}); diff --git a/tests/unit/pages/metadata.spec.js b/tests/unit/pages/metadata.spec.js new file mode 100644 index 0000000000..2396dbe63f --- /dev/null +++ b/tests/unit/pages/metadata.spec.js @@ -0,0 +1,162 @@ +import { beforeEach, describe, expect, it, vi } from "vitest"; + +const pageData = vi.hoisted(() => ({ current: {} })); + +vi.mock("vike-vue/useData", () => ({ + useData: () => pageData.current, +})); +vi.mock("vike-vue/config", () => ({ default: { name: "vike-vue" } })); +vi.mock("@/pages/+Layout.vue", () => ({ default: { name: "Layout" } })); + +import config from "@/pages/+config.js"; +import Head from "@/pages/all/+Head.js"; +import description from "@/pages/all/+description.js"; +import route from "@/pages/all/+route.js"; +import title from "@/pages/all/+title.js"; +import organisationDescription from "@/pages/organisations/@id/+description.js"; +import organisationTitle from "@/pages/organisations/@id/+title.js"; + +describe("page metadata", () => { + beforeEach(() => { + pageData.current = {}; + }); + + it("exports the root Vike configuration and catch-all route", () => { + expect(config.extends).toEqual([{ name: "vike-vue" }]); + expect(config.Layout).toEqual({ name: "Layout" }); + expect(config.ssr).toBe(true); + expect(config.prerender).toMatchObject({ partial: true, parallel: false }); + expect(route).toBe("/*"); + }); + + it("does not create record head elements without a record", () => { + expect(Head()).toBeNull(); + }); + + it("creates canonical, Open Graph, and escaped schema.org head elements", () => { + pageData.current = { + record: { + doi: "10.1234/example", + name: "Example record", + description: "Description ", + }, + schemaOrg: { "@context": "https://schema.org", ignoredName: "old" }, + canonicalUrl: "https://fairsharing.org/10.1234/example", + seoTitle: "Example record | FAIRsharing", + seoDescription: "Example description", + }; + + const elements = Head(); + const script = elements.find((element) => element.type === "script"); + + expect(elements).toHaveLength(7); + expect(elements.find((element) => element.type === "title").children).toBe( + "Example record | FAIRsharing", + ); + expect(script.props.innerHTML).toContain("\\u003cunsafe>"); + expect(script.props.innerHTML).toContain( + '"url":"https://fairsharing.org/10.1234/example"', + ); + }); + + it("filters optional head elements and schema when values are absent", () => { + pageData.current = { record: { name: "Minimal" } }; + + expect(Head()).toEqual([]); + }); + + it("uses schema.org fallbacks when DOI and description are absent", () => { + pageData.current = { + record: { name: "Minimal" }, + schemaOrg: { "@context": "https://schema.org" }, + canonicalUrl: "https://fairsharing.org/1", + }; + + const script = Head().find((element) => element.type === "script"); + const schema = JSON.parse(script.props.innerHTML); + + expect(schema.identifier).toEqual([]); + expect(schema.description).toBe(""); + }); + + it("returns record, static, search, and fallback titles", () => { + expect( + title({ urlPathname: "/anything", data: { record: { name: "Record" } } }), + ).toBe("Record | FAIRsharing"); + expect(title({ urlPathname: "/privacy" })).toBe( + "Privacy Policy | FAIRsharing", + ); + expect( + title({ + urlPathname: "/search", + urlParsed: { search: "?fairsharingRegistry=DATABASE" }, + }), + ).toBe("Databases | FAIRsharing"); + expect( + title({ + urlPathname: "/search", + urlParsed: { search: "?fairsharingRegistry=unknown" }, + }), + ).toBe("Search | FAIRsharing"); + expect(title({ urlPathname: "/unknown" })).toBe("FAIRsharing"); + }); + + it("returns record, static, search, and fallback descriptions", () => { + expect( + description({ + urlPathname: "/anything", + data: { record: { name: "Record", description: "Record description" } }, + }), + ).toBe("Record description"); + expect( + description({ + urlPathname: "/anything", + data: { record: { name: "Record" } }, + }), + ).toContain("Record"); + expect(description({ urlPathname: "/organisations" })).toBe( + "List of Organisations", + ); + expect( + description({ + urlPathname: "/search", + urlParsed: { search: "?fairsharingRegistry=POLICY" }, + }), + ).toContain("data preservation"); + expect(description({ urlPathname: "/search" })).toContain( + "advanced filtering", + ); + expect( + description({ + urlPathname: "/search", + urlParsed: { search: "?fairsharingRegistry=unknown" }, + }), + ).toContain("advanced filtering"); + expect(description({ urlPathname: "/unknown" })).toContain( + "A curated, informative", + ); + }); + + it("creates organisation titles and descriptions with fallbacks", () => { + const context = { + data: { + organisation: { + name: "Example Organisation", + homepage: "https://example.org", + }, + }, + }; + + expect(organisationTitle(context)).toBe( + "Example Organisation | FAIRsharing", + ); + expect(organisationDescription(context)).toBe("https://example.org"); + expect( + organisationDescription({ + data: { organisation: { name: "No homepage", length: 1 } }, + }), + ).toContain("1 organisations available"); + expect(organisationTitle({})).toBe("Organisations | FAIRsharing"); + expect(organisationDescription({})).toContain("A curated, informative"); + }); +}); diff --git a/tests/unit/pages/onCreateApp.spec.js b/tests/unit/pages/onCreateApp.spec.js new file mode 100644 index 0000000000..bceb07e3f4 --- /dev/null +++ b/tests/unit/pages/onCreateApp.spec.js @@ -0,0 +1,106 @@ +import { beforeEach, describe, expect, it, vi } from "vitest"; + +const mocks = vi.hoisted(() => ({ + store: { name: "store" }, + router: { + push: vi.fn(), + isReady: vi.fn().mockResolvedValue(undefined), + }, + bootstrapApp: vi.fn().mockResolvedValue(undefined), + vuetify: { name: "vuetify" }, + metaManager: { name: "meta" }, + sanitize: vi.fn((value) => `clean:${value}`), + accessibilityInit: vi.fn(), + loadFull: vi.fn().mockResolvedValue(undefined), +})); + +vi.mock("@/store", () => ({ createMyStore: () => mocks.store })); +vi.mock("@/router", () => ({ createMyRouter: () => mocks.router })); +vi.mock("@/plugins/vuetify", () => ({ default: () => mocks.vuetify })); +vi.mock("@/utils/setupUtils", () => ({ + bootstrapApp: mocks.bootstrapApp, + globalFilters: { capitalize: vi.fn() }, +})); +vi.mock("vue-meta", () => ({ createMetaManager: () => mocks.metaManager })); +vi.mock("vue-3-sanitize", () => ({ default: { name: "sanitize-plugin" } })); +vi.mock("vue-3-linkify", () => ({ default: { name: "linkify" } })); +vi.mock("dompurify", () => ({ default: { sanitize: mocks.sanitize } })); +vi.mock("@/components/Static/APIDoc/CodeBlock.vue", () => ({ + default: { name: "CodeBlock" }, +})); +vi.mock("highcharts-vue", () => ({ default: { name: "highcharts-vue" } })); +vi.mock("highcharts", () => ({ default: { name: "highcharts" } })); +vi.mock("highcharts/modules/accessibility", () => ({ + default: mocks.accessibilityInit, +})); +vi.mock("simple-analytics-vue", () => ({ default: { name: "analytics" } })); +vi.mock("vue-gtag", () => ({ default: { name: "gtag" } })); +vi.mock("vue-scrollto", () => ({ default: { name: "scroll-to" } })); +vi.mock("@tsparticles/vue3", () => ({ default: { name: "particles" } })); +vi.mock("tsparticles", () => ({ loadFull: mocks.loadFull })); + +import onCreateApp from "@/pages/+onCreateApp.js"; + +function createApp() { + const directives = {}; + const app = { + use: vi.fn(() => app), + component: vi.fn(), + directive: vi.fn((name, handler) => { + directives[name] = handler; + }), + config: { globalProperties: {} }, + }; + return { app, directives }; +} + +describe("onCreateApp", () => { + beforeEach(() => { + vi.clearAllMocks(); + }); + + it("initializes the isolated store and router for server rendering", async () => { + vi.stubEnv("SSR", true); + const { app, directives } = createApp(); + + await onCreateApp({ app, urlPathname: "/privacy" }); + + expect(app.use).toHaveBeenCalledWith(mocks.store); + expect(app.use).toHaveBeenCalledWith(mocks.router); + expect(mocks.bootstrapApp).toHaveBeenCalledWith(mocks.store, mocks.router); + expect(mocks.router.push).toHaveBeenCalledWith("/privacy"); + expect(mocks.router.isReady).toHaveBeenCalled(); + expect(app.component).toHaveBeenCalledWith( + "CodeBlock", + expect.objectContaining({ name: "CodeBlock" }), + ); + + const element = { innerHTML: "" }; + directives["safe-html"](element, { value: "