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 @@
Search results
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 @@ Search results
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 @@ Search results
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 @@ Search results
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 @@ Search results
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 @@ Search results
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 @@ Search results
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 @@ Search results
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 @@ Search results
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 @@ Search results
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 @@ Search results
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 @@ Search results
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 @@ Search results
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 @@ Search results
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 @@ Search results
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 @@ Search results
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 @@ Search results
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 @@ Search results
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 @@ Search results
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 @@ Search results
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 @@ Search results
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 @@ Search results
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 @@ Search results
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 @@ Search results
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 @@ Search results
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 @@ Search results
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 @@ Search results
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 @@ Search results
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 @@ Search results
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 @@ Search results
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 @@ Search results
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 @@ Search results
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 @@ Search results
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 @@ Search results
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 @@ Search results
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 @@ Search results
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 @@ Search results
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 @@ Search results
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 @@ Search results
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 @@ Search results
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 @@ Search results
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 @@ Search results
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 @@ Search results
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 @@ Search results
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 @@ Search results
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 @@ Search results
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 @@ Search results
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 @@ Search results
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 @@ Search results
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 @@ Search results
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 @@ Search results
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 @@ Search results
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 @@ Search results
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 @@ Search results
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 @@ Search results
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 @@ Search results
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 @@ Search results
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 @@ Search results
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 @@ Search results
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 @@ Search results
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 @@ Search results
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 @@ Search results
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 @@ Search results
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 @@ Search results
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 @@ Search results
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 @@ Search results
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 @@ Search results
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 @@ Search results
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 @@ Search results
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 @@ Search results
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 @@ Search results
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 @@ Search results
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 @@ Search results
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 @@ Search results
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 @@ Search results
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 @@ Search results
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 @@ Search results
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 @@ Search results
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 @@ Search results
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 @@ Search results
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 @@ Search results
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 @@ Search results
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 @@ Search results
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 @@ Search results
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 @@ Search results
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 @@ Search results
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 @@
+
+
+
+ FAIRsharing Documentation
+
+
+ This page contains links to various FAIRsharing documentation resources.
+ Please refer to the links below and to our
+ general GitBook documentation
+ for both user-facing and machine-actionable options to access, discover,
+ and edit FAIRsharing records. If you encounter any issues with the API,
+ please email
+ contact@fairsharing.org
+ to discuss your requirements.
+
+
+
+ -
+ Programmatic access:
+ Learn about the different ways to access FAIRsharing programmatically,
+ including the REST API, OAI-PMH, content negotiation and
+ machine-readable metadata in our
+ data access guide.
+
+ -
+ Data schema:
+ Explore the
+ FAIRsharing application schema, which documents the underlying data model used to structure
+ FAIRsharing records and support programmatic access.
+
+ -
+ Licensing:
+ View the
+ licence terms
+ governing the reuse of FAIRsharing data and programmatic access through
+ the FAIRsharing API.
+
+ -
+ GitHub repositories:
+ Access FAIRsharing's open source repositories, including:
+
+
+ -
+ Documentation:
+ Browse the
+ FAIRsharing documentation, including user guides, API documentation and developer resources.
+
+ -
+ Sustainability and preservation:
+ Learn about FAIRsharing's approach to long-term sustainability,
+ preservation and stewardship of its metadata and services in our
+ sustainability and preservation statement.
+
+ -
+ Privacy policy:
+ Read our
+ privacy policy
+ to learn how FAIRsharing collects, processes and protects personal
+ information, including user rights and data handling practices.
+
+
+
+
+
+
+
+
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: "