From 2e1ae4bc050ab4223e43c2b4160e383bfb6ebb84 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Boris=20Kapust=C3=ADk?= <82807109+bkapustik@users.noreply.github.com> Date: Mon, 2 Sep 2024 11:14:20 +0200 Subject: [PATCH 1/3] Fix/compare website channel name on publish event (#71) * fix(Lucene.Core): compare WebSiteChannelName of an indexed web page item model against Lucene index WebSiteChannelName * feat(git): compare jpg files --- .gitattributes | 3 +- .../Indexing/IndexedItemModelExtensions.cs | 207 +++++++++--------- 2 files changed, 108 insertions(+), 102 deletions(-) diff --git a/.gitattributes b/.gitattributes index 0899b91..974c308 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,2 +1,3 @@ * text eol=crlf -*.png binary \ No newline at end of file +*.png binary +*.jpg binary \ No newline at end of file diff --git a/src/Kentico.Xperience.Lucene.Core/Indexing/IndexedItemModelExtensions.cs b/src/Kentico.Xperience.Lucene.Core/Indexing/IndexedItemModelExtensions.cs index 73b787a..3fe017c 100644 --- a/src/Kentico.Xperience.Lucene.Core/Indexing/IndexedItemModelExtensions.cs +++ b/src/Kentico.Xperience.Lucene.Core/Indexing/IndexedItemModelExtensions.cs @@ -1,101 +1,106 @@ -using CMS.ContentEngine.Internal; -using CMS.Core; - -namespace Kentico.Xperience.Lucene.Core.Indexing; - -/// -/// Lucene extension methods for the class. -/// -internal static class IndexedItemModelExtensions -{ - /// - /// Returns true if the node is included in the Lucene index based on the index's defined paths - /// - /// Logs an error if the search model cannot be found. - /// The node to check for indexing. - /// - /// The Lucene index code name. - /// - /// - /// - public static bool IsIndexedByIndex(this IndexEventWebPageItemModel item, IEventLogService log, ILuceneIndexManager indexManager, string indexName, string eventName) - { - if (string.IsNullOrWhiteSpace(indexName)) - { - throw new ArgumentNullException(nameof(indexName)); - } - if (item is null) - { - throw new ArgumentNullException(nameof(item)); - } - - var luceneIndex = indexManager.GetIndex(indexName); - if (luceneIndex is null) - { - log.LogError(nameof(IndexedItemModelExtensions), nameof(IsIndexedByIndex), $"Error loading registered Lucene index '{indexName}' for event [{eventName}]."); - return false; - } - - if (!luceneIndex.LanguageNames.Exists(x => x == item.LanguageName)) - { - return false; - } - - return luceneIndex.IncludedPaths.Any(path => - { - bool matchesContentType = path.ContentTypes.Exists(x => string.Equals(x.ContentTypeName, item.ContentTypeName)); - - if (!matchesContentType) - { - return false; - } - - // Supports wildcard matching - if (path.AliasPath.EndsWith("/%", StringComparison.OrdinalIgnoreCase)) - { - string pathToMatch = path.AliasPath[..^2]; - var pathsOnPath = TreePathUtils.GetTreePathsOnPath(item.WebPageItemTreePath, true, false).ToHashSet(); - - return pathsOnPath.Any(p => p.StartsWith(pathToMatch, StringComparison.OrdinalIgnoreCase)); - } - - return item.WebPageItemTreePath.Equals(path.AliasPath, StringComparison.OrdinalIgnoreCase); - }); - } - - /// - /// Returns true if the node is included in the Lucene index's allowed - /// - /// Logs an error if the search model cannot be found. - /// The node to check for indexing. - /// - /// The Lucene index code name. - /// - /// - /// - public static bool IsIndexedByIndex(this IndexEventReusableItemModel item, IEventLogService log, ILuceneIndexManager indexManager, string indexName, string eventName) - { - if (string.IsNullOrEmpty(indexName)) - { - throw new ArgumentNullException(nameof(indexName)); - } - if (item is null) - { - throw new ArgumentNullException(nameof(item)); - } - - var luceneIndex = indexManager.GetIndex(indexName); - if (luceneIndex is null) - { - log.LogError(nameof(IndexedItemModelExtensions), nameof(IsIndexedByIndex), $"Error loading registered Lucene index '{indexName}' for event [{eventName}]."); - return false; - } - - if (luceneIndex.LanguageNames.Exists(x => x == item.LanguageName)) - { - return true; - } - - return false; - } -} +using CMS.ContentEngine.Internal; +using CMS.Core; + +namespace Kentico.Xperience.Lucene.Core.Indexing; + +/// +/// Lucene extension methods for the class. +/// +internal static class IndexedItemModelExtensions +{ + /// + /// Returns true if the node is included in the Lucene index based on the index's defined paths + /// + /// Logs an error if the search model cannot be found. + /// The node to check for indexing. + /// + /// The Lucene index code name. + /// + /// + /// + public static bool IsIndexedByIndex(this IndexEventWebPageItemModel item, IEventLogService log, ILuceneIndexManager indexManager, string indexName, string eventName) + { + if (string.IsNullOrWhiteSpace(indexName)) + { + throw new ArgumentNullException(nameof(indexName)); + } + if (item is null) + { + throw new ArgumentNullException(nameof(item)); + } + + var luceneIndex = indexManager.GetIndex(indexName); + if (luceneIndex is null) + { + log.LogError(nameof(IndexedItemModelExtensions), nameof(IsIndexedByIndex), $"Error loading registered Lucene index '{indexName}' for event [{eventName}]."); + return false; + } + + if (!string.Equals(item.WebsiteChannelName, luceneIndex.WebSiteChannelName)) + { + return false; + } + + if (!luceneIndex.LanguageNames.Exists(x => x == item.LanguageName)) + { + return false; + } + + return luceneIndex.IncludedPaths.Any(path => + { + bool matchesContentType = path.ContentTypes.Exists(x => string.Equals(x.ContentTypeName, item.ContentTypeName)); + + if (!matchesContentType) + { + return false; + } + + // Supports wildcard matching + if (path.AliasPath.EndsWith("/%", StringComparison.OrdinalIgnoreCase)) + { + string pathToMatch = path.AliasPath[..^2]; + var pathsOnPath = TreePathUtils.GetTreePathsOnPath(item.WebPageItemTreePath, true, false).ToHashSet(); + + return pathsOnPath.Any(p => p.StartsWith(pathToMatch, StringComparison.OrdinalIgnoreCase)); + } + + return item.WebPageItemTreePath.Equals(path.AliasPath, StringComparison.OrdinalIgnoreCase); + }); + } + + /// + /// Returns true if the node is included in the Lucene index's allowed + /// + /// Logs an error if the search model cannot be found. + /// The node to check for indexing. + /// + /// The Lucene index code name. + /// + /// + /// + public static bool IsIndexedByIndex(this IndexEventReusableItemModel item, IEventLogService log, ILuceneIndexManager indexManager, string indexName, string eventName) + { + if (string.IsNullOrEmpty(indexName)) + { + throw new ArgumentNullException(nameof(indexName)); + } + if (item is null) + { + throw new ArgumentNullException(nameof(item)); + } + + var luceneIndex = indexManager.GetIndex(indexName); + if (luceneIndex is null) + { + log.LogError(nameof(IndexedItemModelExtensions), nameof(IsIndexedByIndex), $"Error loading registered Lucene index '{indexName}' for event [{eventName}]."); + return false; + } + + if (luceneIndex.LanguageNames.Exists(x => x == item.LanguageName)) + { + return true; + } + + return false; + } +} From 211efdb6d4beb83dfe652a507cf802fd267b06c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Boris=20Kapust=C3=ADk?= <82807109+bkapustik@users.noreply.github.com> Date: Tue, 3 Sep 2024 12:32:17 +0200 Subject: [PATCH 2/3] Feat/index reusable content (#69) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(Lucene.Core): upgrade to new version of Kentico, webpage events which are listened to by Lucene changed from archive to unpublish * feat(Lucene.Core): Mapping reusable items * feat(docs): add reusable content types * fix(Lucene.Admin): wrong placeholder in content type selection * fix(Lucene.Admin): reusable content provider comment * feat(docs): reusable content types images * feat(Lucene.Core): indexing reusable content example strategy * feat(docs): indexing reusable content * fix(docs): remove invalid images * Add files via upload * mrak .jpg as binary in .gitattributes * feat(Lucene.Core): indexing reusable content example * feat(Lucene.Core): indexing reusable content do not execute rebuild query if no content type is selected * feat(Lucene.Admin): update packages * fix(docs): typo * fix(DancingGoat): refactor string initialization with string.empty * refactor(Lucene.Core, Admin): refactor string assignments * refactor(Lucene.Core): remove specific info providers * refactor(Lucene.Core): use iinfoproviders * refactor(docs): change "" to string.Empty * refactor(Lucene.Core): remove redundand info provider definitions * refactor(DancingGoat): conditional blocks --------- Co-authored-by: Miloslav Hlaváč --- docs/Custom-index-strategy.md | 13 +- docs/Managing-Indexes.md | 15 +- docs/Scraping-web-page-content.md | 10 +- docs/Search-index-querying.md | 8 +- .../Search/AdvancedSearchIndexingStrategy.cs | 86 +- .../Search/DancingGoatSearchResultModel.cs | 6 +- .../DancingGoatSearchStartupExtensions.cs | 1 + .../ReusableContentItemsIndexingStrategy.cs | 113 + .../Search/Services/AdvancedSearchService.cs | 2 +- .../Search/Services/SimpleSearchService.cs | 2 +- .../Services/WebScraperHtmlSanitizer.cs | 4 +- .../Search/SimpleSearchIndexingStrategy.cs | 39 +- ...tion-search-index-edit-form-paths-edit.jpg | Bin 129175 -> 144553 bytes ...-administration-search-index-edit-form.jpg | Bin 141254 -> 134496 bytes .../Client/package-lock.json | 3206 +++++++++-------- .../LuceneIndexConfigurationFormComponent.tsx | 2 +- .../LuceneConfigurationModel.cs | 141 +- .../ReusableContentOptionsProvider.cs | 68 + .../UIPages/BaseIndexEditPage.cs | 150 +- .../Indexing/DefaultLuceneClient.cs | 741 ++-- ...efaultLuceneConfigurationStorageService.cs | 881 ++--- .../Indexing/DefaultLuceneTaskProcessor.cs | 308 +- .../Indexing/IIndexEventItemModel.cs | 304 +- .../Indexing/LuceneIndex.cs | 174 +- .../Indexing/LuceneIndexModel.cs | 101 +- .../ILuceneContentTypeItemInfoProvider.cs | 11 - ...neContentTypeItemInfoProvider.generated.cs | 10 - .../LuceneContentTypeItemInfo.generated.cs | 4 +- ...neContentTypeItemInfoProvider.generated.cs | 18 - .../ILuceneIncludedPathItemInfoProvider.cs | 8 - ...eIncludedPathItemInfoProvider.generated.cs | 10 - .../LuceneIncludedPathItemInfo.generated.cs | 4 +- ...eIncludedPathItemInfoProvider.generated.cs | 18 - .../ILuceneIndexItemInfoProvider.cs | 8 - .../ILuceneIndexItemInfoProvider.generated.cs | 10 - .../LuceneIndexItemInfo.generated.cs | 4 +- .../LuceneIndexItemInfoProvider.generated.cs | 18 - .../ILuceneIndexLanguageItemInfoProvider.cs | 11 - ...IndexLanguageItemInfoProvider.generated.cs | 10 - .../LuceneIndexLanguageItemInfo.generated.cs | 4 +- ...IndexLanguageItemInfoProvider.generated.cs | 18 - ...neReusableContentTypeItemInfo.generated.cs | 134 + .../LuceneModuleInstaller.cs | 729 ++-- 43 files changed, 3976 insertions(+), 3428 deletions(-) create mode 100644 examples/DancingGoat/Search/ReusableContentItemsIndexingStrategy.cs create mode 100644 src/Kentico.Xperience.Lucene.Admin/Providers/ReusableContentOptionsProvider.cs delete mode 100644 src/Kentico.Xperience.Lucene.Core/InfoModels/LuceneContentTypeItem/ILuceneContentTypeItemInfoProvider.cs delete mode 100644 src/Kentico.Xperience.Lucene.Core/InfoModels/LuceneContentTypeItem/ILuceneContentTypeItemInfoProvider.generated.cs delete mode 100644 src/Kentico.Xperience.Lucene.Core/InfoModels/LuceneContentTypeItem/LuceneContentTypeItemInfoProvider.generated.cs delete mode 100644 src/Kentico.Xperience.Lucene.Core/InfoModels/LuceneIncludedPathItem/ILuceneIncludedPathItemInfoProvider.cs delete mode 100644 src/Kentico.Xperience.Lucene.Core/InfoModels/LuceneIncludedPathItem/ILuceneIncludedPathItemInfoProvider.generated.cs delete mode 100644 src/Kentico.Xperience.Lucene.Core/InfoModels/LuceneIncludedPathItem/LuceneIncludedPathItemInfoProvider.generated.cs delete mode 100644 src/Kentico.Xperience.Lucene.Core/InfoModels/LuceneIndexItem/ILuceneIndexItemInfoProvider.cs delete mode 100644 src/Kentico.Xperience.Lucene.Core/InfoModels/LuceneIndexItem/ILuceneIndexItemInfoProvider.generated.cs delete mode 100644 src/Kentico.Xperience.Lucene.Core/InfoModels/LuceneIndexItem/LuceneIndexItemInfoProvider.generated.cs delete mode 100644 src/Kentico.Xperience.Lucene.Core/InfoModels/LuceneIndexLanguageItem/ILuceneIndexLanguageItemInfoProvider.cs delete mode 100644 src/Kentico.Xperience.Lucene.Core/InfoModels/LuceneIndexLanguageItem/ILuceneIndexLanguageItemInfoProvider.generated.cs delete mode 100644 src/Kentico.Xperience.Lucene.Core/InfoModels/LuceneIndexLanguageItem/LuceneIndexLanguageItemInfoProvider.generated.cs create mode 100644 src/Kentico.Xperience.Lucene.Core/InfoModels/LuceneReusableContentTypeItem/LuceneReusableContentTypeItemInfo.generated.cs diff --git a/docs/Custom-index-strategy.md b/docs/Custom-index-strategy.md index b9b0727..ecf5ce9 100644 --- a/docs/Custom-index-strategy.md +++ b/docs/Custom-index-strategy.md @@ -31,8 +31,8 @@ public class ExampleSearchIndexingStrategy : DefaultLuceneIndexingStrategy { var document = new Document(); - string sortableTitle = ""; - string title = ""; + string sortableTitle = string.Empty; + string title = string.Empty; // IIndexEventItemModel could be a reusable content item or a web page item, so we use // pattern matching to get access to the web page item specific type and fields @@ -60,7 +60,7 @@ public class ExampleSearchIndexingStrategy : DefaultLuceneIndexingStrategy var article = page.ArticlePageArticle.FirstOrDefault(); - sortableTitle = title = article?.ArticleTitle ?? ""; + sortableTitle = title = article?.ArticleTitle ?? string.Empty; } document.Add(new TextField(nameof(GlobalSearchResultModel.Title), title, Field.Store.YES)); @@ -83,6 +83,7 @@ public static class BaseDocumentProperties public const string ID = "ID"; public const string CONTENT_TYPE_NAME = "ContentTypeName"; // ... + // This field is only added to the document if the indexed item is a web page. public const string URL = "Url"; } ``` @@ -135,9 +136,9 @@ public class ExampleSearchIndexingStrategy : DefaultLuceneIndexingStrategy { var document = new Document(); - string sortableTitle = ""; - string title = ""; - string contentType = ""; + string sortableTitle = string.Empty; + string title = string.Empty; + string contentType = string.Empty; if (item is IndexEventWebPageItemModel webpageItem && string.Equals(indexedModel.ContentTypeName, ArticlePage.CONTENT_TYPE_NAME, StringComparison.OrdinalIgnorecase)) diff --git a/docs/Managing-Indexes.md b/docs/Managing-Indexes.md index 3a7aba3..b60357c 100644 --- a/docs/Managing-Indexes.md +++ b/docs/Managing-Indexes.md @@ -12,19 +12,22 @@ Create a new index or select and index to edit by clicking the index row or the Fill out the search index form, populating the fields with your custom values. -![Administration search index list](/images/xperience-administration-search-index-edit-form.jpg) +![Administration search index edit form](/images/xperience-administration-search-index-edit-form.jpg) -- Rebuild Hook - for validating a request rebuild of the search index from an external source (ex: API request) -- Indexed Languages - the index will only include content in the selected languages -- Channel Name - the index will only be triggered by web page item creation or modication in the selected website channel +- Index Name - the name of the displayed index. +- Included Reusable Content Types - these are the reusable content types that will be processed by your custom indexing strategy. +If no option is selected, no items will be processed. +- Indexed Languages - the index will only include content in the selected languages. +- Channel Name - the index will only be triggered by web page item creation or modification in the selected website channel. - Indexing Strategy - the indexing strategy specified in code during dependency registration of a custom indexing strategies. - - If you want the default strategy to appear here, register it explicitly in `IServiceCollection.AddKenticoLucene()` method + - If you want the default strategy to appear here, register it explicitly in `IServiceCollection.AddKenticoLucene()` method. - Lucene Analyzer - the Lucene analyzer which indexes use to analyze text. +- Rebuild Hook - for validating a request rebuild of the search index from an external source (ex: API request). Now, configure the web page paths and content types that the search index depends on by clicking the Add New Path button or clicking an existing path in the table at the top of the index configuration form. -![Administration search index list](/images/xperience-administration-search-index-edit-form-paths-edit.jpg) +![Administration search index edit paths form](/images/xperience-administration-search-index-edit-form-paths-edit.jpg) - Included Path - can be an exact relative path of a web page item, (ex: `/path/to/my/page`), or a wildcard path (ex: `/parent-path/%`) - To determine a web page path, select the web page in the website channel page tree, then view the "Current URL" in the Content tab of the web page. The path will be the relative path excluding the domain diff --git a/docs/Scraping-web-page-content.md b/docs/Scraping-web-page-content.md index bf131c1..d29dd20 100644 --- a/docs/Scraping-web-page-content.md +++ b/docs/Scraping-web-page-content.md @@ -57,7 +57,7 @@ public class WebCrawlerService ex, $"Tree Path: {page.SystemFields.WebPageItemTreePath}"); } - return ""; + return string.Empty; } public async Task CrawlPage(string url) @@ -75,7 +75,7 @@ public class WebCrawlerService ex, $"Url: {url}"); } - return ""; + return string.Empty; } } ``` @@ -136,8 +136,8 @@ public class WebScraperHtmlSanitizer textContent = HTMLHelper.RegexHtmlToTextWhiteSpace.Replace(textContent, " "); textContent = textContent.Trim(); - string title = doc.Head?.QuerySelector("title")?.TextContent ?? ""; - string description = doc.Head?.QuerySelector("meta[name='description']")?.GetAttribute("content") ?? ""; + string title = doc.Head?.QuerySelector("title")?.TextContent ?? string.Empty; + string description = doc.Head?.QuerySelector("meta[name='description']")?.GetAttribute("content") ?? string.Empty; return string.Join( " ", @@ -190,7 +190,7 @@ public override async Task MapToLuceneDocumentOrNull(IIndexEventItemM // Setup same as examples in Usage-Guide.md // ... - string content = ""; + string content = string.Empty; if (item is IndexEventWebPageItemModel webpageItem && string.Equals(indexedModel.ContentTypeName, ArticlePage.CONTENT_TYPE_NAME, StringComparison.OrdinalIgnorecase)) diff --git a/docs/Search-index-querying.md b/docs/Search-index-querying.md index 52b7dac..1751a4a 100644 --- a/docs/Search-index-querying.md +++ b/docs/Search-index-querying.md @@ -11,9 +11,9 @@ To index all existing content, rebuild the index in Xperience's Administration w ```csharp public class GlobalSearchResultModel { - public string Title { get; set; } = ""; - public string ContentType { get; set; } = ""; - public string Url { get; set; } = ""; + public string Title { get; set; } = string.Empty; + public string ContentType { get; set; } = string.Empty; + public string Url { get; set; } = string.Empty; public static List PossibleFacets { get; set; } = new List { @@ -105,7 +105,7 @@ public class SearchService return new LuceneSearchResultModel { - Query = searchText ?? "", + Query = searchText ?? string.Empty, Page = page, PageSize = pageSize, TotalPages = topDocs.TotalHits <= 0 ? 0 : ((topDocs.TotalHits - 1) / pageSize) + 1, diff --git a/examples/DancingGoat/Search/AdvancedSearchIndexingStrategy.cs b/examples/DancingGoat/Search/AdvancedSearchIndexingStrategy.cs index ee716a9..b492749 100644 --- a/examples/DancingGoat/Search/AdvancedSearchIndexingStrategy.cs +++ b/examples/DancingGoat/Search/AdvancedSearchIndexingStrategy.cs @@ -15,7 +15,7 @@ namespace DancingGoat.Search; public class AdvancedSearchIndexingStrategy : DefaultLuceneIndexingStrategy { - public static string SORTABLE_TITLE_FIELD_NAME = "SortableTitle"; + public const string SORTABLE_TITLE_FIELD_NAME = "SortableTitle"; private readonly IWebPageQueryResultMapper webPageMapper; private readonly IContentQueryExecutor queryExecutor; @@ -43,60 +43,58 @@ WebCrawlerService webCrawler { var document = new Document(); - string sortableTitle = ""; - string title = ""; - string content = ""; + string sortableTitle = string.Empty; + string title = string.Empty; + string content = string.Empty; // IIndexEventItemModel could be a reusable content item or a web page item, so we use // pattern matching to get access to the web page item specific type and fields - if (item is IndexEventWebPageItemModel indexedPage) + if (item is not IndexEventWebPageItemModel indexedPage) { - if (string.Equals(item.ContentTypeName, ArticlePage.CONTENT_TYPE_NAME, StringComparison.OrdinalIgnoreCase)) + return null; + } + + if (string.Equals(item.ContentTypeName, ArticlePage.CONTENT_TYPE_NAME, StringComparison.OrdinalIgnoreCase)) + { + // The implementation of GetPage() is below + var page = await GetPage( + indexedPage.ItemGuid, + indexedPage.WebsiteChannelName, + indexedPage.LanguageName, + ArticlePage.CONTENT_TYPE_NAME); + + if (page is null) { - // The implementation of GetPage() is below - var page = await GetPage( - indexedPage.ItemGuid, - indexedPage.WebsiteChannelName, - indexedPage.LanguageName, - ArticlePage.CONTENT_TYPE_NAME); - - if (page is null) - { - return null; - } - - sortableTitle = title = page?.ArticleTitle ?? ""; - - string rawContent = await webCrawler.CrawlWebPage(page!); - content = htmlSanitizer.SanitizeHtmlDocument(rawContent); + return null; } - else if (string.Equals(item.ContentTypeName, HomePage.CONTENT_TYPE_NAME, StringComparison.OrdinalIgnoreCase)) + + sortableTitle = title = page?.ArticleTitle ?? string.Empty; + + string rawContent = await webCrawler.CrawlWebPage(page!); + content = htmlSanitizer.SanitizeHtmlDocument(rawContent); + } + else if (string.Equals(item.ContentTypeName, HomePage.CONTENT_TYPE_NAME, StringComparison.OrdinalIgnoreCase)) + { + var page = await GetPage( + indexedPage.ItemGuid, + indexedPage.WebsiteChannelName, + indexedPage.LanguageName, + HomePage.CONTENT_TYPE_NAME); + + if (page is null) { - var page = await GetPage( - indexedPage.ItemGuid, - indexedPage.WebsiteChannelName, - indexedPage.LanguageName, - HomePage.CONTENT_TYPE_NAME); - - if (page is null) - { - return null; - } - - if (page.HomePageBanner.IsNullOrEmpty()) - { - return null; - } - - sortableTitle = title = page!.HomePageBanner.First().BannerText; - - string rawContent = await webCrawler.CrawlWebPage(page!); - content = htmlSanitizer.SanitizeHtmlDocument(rawContent); + return null; } - else + + if (page.HomePageBanner.IsNullOrEmpty()) { return null; } + + sortableTitle = title = page!.HomePageBanner.First().BannerText; + + string rawContent = await webCrawler.CrawlWebPage(page!); + content = htmlSanitizer.SanitizeHtmlDocument(rawContent); } else { diff --git a/examples/DancingGoat/Search/DancingGoatSearchResultModel.cs b/examples/DancingGoat/Search/DancingGoatSearchResultModel.cs index 8a95c04..ab7311d 100644 --- a/examples/DancingGoat/Search/DancingGoatSearchResultModel.cs +++ b/examples/DancingGoat/Search/DancingGoatSearchResultModel.cs @@ -2,7 +2,7 @@ public class DancingGoatSearchResultModel { - public string Title { get; set; } = ""; - public string ContentType { get; set; } = ""; - public string Url { get; set; } = ""; + public string Title { get; set; } = string.Empty; + public string ContentType { get; set; } = string.Empty; + public string Url { get; set; } = string.Empty; } diff --git a/examples/DancingGoat/Search/DancingGoatSearchStartupExtensions.cs b/examples/DancingGoat/Search/DancingGoatSearchStartupExtensions.cs index 0e26467..53d411d 100644 --- a/examples/DancingGoat/Search/DancingGoatSearchStartupExtensions.cs +++ b/examples/DancingGoat/Search/DancingGoatSearchStartupExtensions.cs @@ -12,6 +12,7 @@ public static IServiceCollection AddKenticoDancingGoatLuceneServices(this IServi { builder.RegisterStrategy("DancingGoatExampleStrategy"); builder.RegisterStrategy("DancingGoatMinimalExampleStrategy"); + builder.RegisterStrategy(nameof(ReusableContentItemsIndexingStrategy)); builder.RegisterAnalyzer("Czech analyzer"); }); diff --git a/examples/DancingGoat/Search/ReusableContentItemsIndexingStrategy.cs b/examples/DancingGoat/Search/ReusableContentItemsIndexingStrategy.cs new file mode 100644 index 0000000..06f5b4f --- /dev/null +++ b/examples/DancingGoat/Search/ReusableContentItemsIndexingStrategy.cs @@ -0,0 +1,113 @@ +using CMS.ContentEngine; +using CMS.Websites; + +using DancingGoat.Models; +using DancingGoat.Search.Services; + +using Kentico.Xperience.Lucene.Core; +using Kentico.Xperience.Lucene.Core.Indexing; + +using Lucene.Net.Documents; +using Lucene.Net.Facet; + +namespace DancingGoat.Search; + +public class ReusableContentItemsIndexingStrategy : DefaultLuceneIndexingStrategy +{ + public const string SORTABLE_TITLE_FIELD_NAME = "SortableTitle"; + + private readonly IWebPageQueryResultMapper webPageMapper; + private readonly IContentQueryExecutor queryExecutor; + private readonly IWebPageUrlRetriever urlRetriever; + private readonly WebScraperHtmlSanitizer htmlSanitizer; + private readonly WebCrawlerService webCrawler; + + public const string FACET_DIMENSION = "ContentType"; + public const string INDEXED_WEBSITECHANNEL_NAME = "DancingGoatPages"; + public const string CRAWLER_CONTENT_FIELD_NAME = "Content"; + + public ReusableContentItemsIndexingStrategy( + IWebPageQueryResultMapper webPageMapper, + IContentQueryExecutor queryExecutor, + IWebPageUrlRetriever urlRetriever, + WebScraperHtmlSanitizer htmlSanitizer, + WebCrawlerService webCrawler + ) + { + this.urlRetriever = urlRetriever; + this.webPageMapper = webPageMapper; + this.queryExecutor = queryExecutor; + this.htmlSanitizer = htmlSanitizer; + this.webCrawler = webCrawler; + } + + public override async Task MapToLuceneDocumentOrNull(IIndexEventItemModel item) + { + var document = new Document(); + + string sortableTitle = string.Empty; + string title = string.Empty; + string content = string.Empty; + + // IIndexEventItemModel could be a reusable content item or a web page item, so we use + // pattern matching to get access to the web page item specific type and fields + if (item is not IndexEventReusableItemModel indexedItem) + { + return null; + } + + if (!string.Equals(item.ContentTypeName, Banner.CONTENT_TYPE_NAME, StringComparison.OrdinalIgnoreCase)) + { + return null; + } + + var query = new ContentItemQueryBuilder() + .ForContentType(HomePage.CONTENT_TYPE_NAME, + config => + config + .WithLinkedItems(4) + + // Because the changedItem is a reusable content item, we don't have a website channel name to use here + // so we use a hardcoded channel name. + .ForWebsite(INDEXED_WEBSITECHANNEL_NAME) + + // Retrieves all HomePages that link to the Banner through the HomePage.HomePageBanner field + .Linking(nameof(HomePage.HomePageBanner), new[] { indexedItem.ItemID })) + .InLanguage(indexedItem.LanguageName); + + var associatedWebPageItem = (await queryExecutor.GetWebPageResult(query, webPageMapper.Map)).First(); + string url = string.Empty; + try + { + url = (await urlRetriever.Retrieve(associatedWebPageItem.SystemFields.WebPageItemTreePath, + INDEXED_WEBSITECHANNEL_NAME, indexedItem.LanguageName)).RelativePath; + } + catch (Exception) + { + // Retrieve can throw an exception when processing a page update LuceneQueueItem + // and the page was deleted before the update task has processed. In this case, return no item. + return null; + } + + sortableTitle = title = associatedWebPageItem!.HomePageBanner.First().BannerText; + string rawContent = await webCrawler.CrawlWebPage(associatedWebPageItem!); + content = htmlSanitizer.SanitizeHtmlDocument(rawContent); + + //If the indexed item is a reusable content item, we need to set the url manually. + document.Add(new StringField(BaseDocumentProperties.URL, url, Field.Store.YES)); + document.Add(new TextField(nameof(DancingGoatSearchResultModel.Title), title, Field.Store.YES)); + document.Add(new StringField(SORTABLE_TITLE_FIELD_NAME, sortableTitle, Field.Store.YES)); + document.Add(new TextField(CRAWLER_CONTENT_FIELD_NAME, content, Field.Store.NO)); + + return document; + } + + public override FacetsConfig FacetsConfigFactory() + { + var facetConfig = new FacetsConfig(); + + facetConfig.SetMultiValued(FACET_DIMENSION, true); + + return facetConfig; + } +} diff --git a/examples/DancingGoat/Search/Services/AdvancedSearchService.cs b/examples/DancingGoat/Search/Services/AdvancedSearchService.cs index 27c4b7c..cbdd65d 100644 --- a/examples/DancingGoat/Search/Services/AdvancedSearchService.cs +++ b/examples/DancingGoat/Search/Services/AdvancedSearchService.cs @@ -77,7 +77,7 @@ public LuceneSearchResultModel GlobalSearch( return new LuceneSearchResultModel { - Query = searchText ?? "", + Query = searchText ?? string.Empty, Page = page, PageSize = pageSize, TotalPages = topDocs.TotalHits <= 0 ? 0 : ((topDocs.TotalHits - 1) / pageSize) + 1, diff --git a/examples/DancingGoat/Search/Services/SimpleSearchService.cs b/examples/DancingGoat/Search/Services/SimpleSearchService.cs index a1da20c..cc3aeef 100644 --- a/examples/DancingGoat/Search/Services/SimpleSearchService.cs +++ b/examples/DancingGoat/Search/Services/SimpleSearchService.cs @@ -47,7 +47,7 @@ public LuceneSearchResultModel GlobalSearch( return new LuceneSearchResultModel { - Query = searchText ?? "", + Query = searchText ?? string.Empty, Page = page, PageSize = pageSize, TotalPages = topDocs.TotalHits <= 0 ? 0 : ((topDocs.TotalHits - 1) / pageSize) + 1, diff --git a/examples/DancingGoat/Search/Services/WebScraperHtmlSanitizer.cs b/examples/DancingGoat/Search/Services/WebScraperHtmlSanitizer.cs index da935d6..473e19e 100644 --- a/examples/DancingGoat/Search/Services/WebScraperHtmlSanitizer.cs +++ b/examples/DancingGoat/Search/Services/WebScraperHtmlSanitizer.cs @@ -53,8 +53,8 @@ public virtual string SanitizeHtmlDocument(string htmlContent) textContent = HTMLHelper.RegexHtmlToTextWhiteSpace.Replace(textContent, " "); textContent = textContent.Trim(); - string title = doc.Head?.QuerySelector("title")?.TextContent ?? ""; - string description = doc.Head?.QuerySelector("meta[name='description']")?.GetAttribute("content") ?? ""; + string title = doc.Head?.QuerySelector("title")?.TextContent ?? string.Empty; + string description = doc.Head?.QuerySelector("meta[name='description']")?.GetAttribute("content") ?? string.Empty; return string.Join( " ", diff --git a/examples/DancingGoat/Search/SimpleSearchIndexingStrategy.cs b/examples/DancingGoat/Search/SimpleSearchIndexingStrategy.cs index 7f367e8..592068d 100644 --- a/examples/DancingGoat/Search/SimpleSearchIndexingStrategy.cs +++ b/examples/DancingGoat/Search/SimpleSearchIndexingStrategy.cs @@ -29,36 +29,33 @@ IContentQueryExecutor queryExecutor { var document = new Document(); - string title = ""; + string title = string.Empty; // IIndexEventItemModel could be a reusable content item or a web page item, so we use // pattern matching to get access to the web page item specific type and fields - if (item is IndexEventWebPageItemModel indexedPage) + if (item is not IndexEventWebPageItemModel indexedPage) { - if (string.Equals(item.ContentTypeName, HomePage.CONTENT_TYPE_NAME, StringComparison.OrdinalIgnoreCase)) + return null; + } + if (string.Equals(item.ContentTypeName, HomePage.CONTENT_TYPE_NAME, StringComparison.OrdinalIgnoreCase)) + { + var page = await GetPage( + indexedPage.ItemGuid, + indexedPage.WebsiteChannelName, + indexedPage.LanguageName, + HomePage.CONTENT_TYPE_NAME); + + if (page is null) { - var page = await GetPage( - indexedPage.ItemGuid, - indexedPage.WebsiteChannelName, - indexedPage.LanguageName, - HomePage.CONTENT_TYPE_NAME); - - if (page is null) - { - return null; - } - - if (page.HomePageBanner.IsNullOrEmpty()) - { - return null; - } - - title = page!.HomePageBanner.First().BannerHeaderText; + return null; } - else + + if (page.HomePageBanner.IsNullOrEmpty()) { return null; } + + title = page!.HomePageBanner.First().BannerHeaderText; } else { diff --git a/images/xperience-administration-search-index-edit-form-paths-edit.jpg b/images/xperience-administration-search-index-edit-form-paths-edit.jpg index 79cd3253d7a512b2bf0b8df1b3d3796342c32b0b..7ee97134e03c8b8421126761a682a5cbadfd6570 100644 GIT binary patch literal 144553 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

WnSm0L_ODou1lq zLgb<(K9r28Wp0&cR}gZ$yrI^kM7{MRuS*Y<_`{pC7l#gyClG$lU1~y@hK=p4_pAmT z?e|VT-x~>Wb>-{bI)3)&-4yf5ig%?yf!N+CJLa3Mc9;!658w#3#&oonUL4Sump_J8 zjyxRRWr(k&0lCuv;*xK>?B5MRRTB>F3)}y$$j^NOXlnkP2k4J%ioW~HzgGbN+Mx35 zDH(vkzwz|^0lxPoDd+nMqtfj`{>dG6dnP}-&Tg;C?ZEk=NAC6(1W2_0umaxR%>RI2 zx4$?$|B1QucHsQ~3!MMUj*>6Iv@1a8{;d-2$|G^G?oQejp0}h&LcamNkilR>&}~R2 z@S~*8`wii&9FPPYz(Y)LRb_>P5c!e$Yes+(A$-CdwT9jd>CyWm*NFWO#&`Y-TiWqy G;J*O#m<+)H literal 129175 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 z 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%0A#b@MV0K85nQ zJ~HXI30Lqwf_a3$zLHWZ;8=p%9IT!|wE;BP)gL-&r~cz8?jP=MmH&r{c>X%4;NQzZ z$?5-hB1Uc^kQ1<`QD-%8ASYn;`n}vwCl*?WOSL-R(RO`xAK>CFw%HTD_#5k>OIVJ& z(uL3VcFQMVW$Z^tRsPrW@1PAH#yG^NoDr=TSkn|ztW`-VP41?cZWhylK+s|TUu9Pw z(A1H}U%0dg1uP213ht_aiUkoYRUy;^g(^n`L95c1s^Env$R#9*tCV7CmCFMYgcJ~w zvJk~`q!u*-T5c6k5%5?*PBj7{ale^)f!JfW{e$G?WtjQS-#2gO`zFI8@gN)(c=n*R zlvC){F);mFvnV#tXL3_Wxbxh*$J1_3zUfk>u|fa-{WH_g-bU!H>Ebd`Uzys_s^#AVObHmi zaAt3U*(v8=_k|6%X0YzKM6lME-fgv81PjimWpf_xoNsb8(&!+w?xnQVZ1MNS!W8qg z;~#&{iV$n@!`@KO`A{V{-`CE3VE)EfZ2{RQHPe&KZ&?U0QfYx|Ajo(@_?xb^b<1y?3p7_zP;Dw{c1Zq~Kf zbm$Y6(S-d6+YjIGx)Ofrr-VSy1D>@T`&J4@jOy;?X_T1X>JKP?l)iG#M-!b>cUGm& zYqorrY<2u@;tRi=^~|hz^`Z1N1Jy?^1RXONsdldmvYGs}Zt#wq*+&a3R5!oBPhaQ0 zhqMgmzzYo_LA06M;=}Tvx|6FMRD7wZ?r~xArv7Is`*zQE@Gfl0?iMs2P79m!?YhQp z@q1)rF0W?rR$xF%$enLf?`~sj4ZNP<*%sGzaoxsEm5TzB?$?Ab35+o4O)b>G3BZda zC=GZ4-p0e5c{wFRSJl4?gdmo6r=r+{(OR zpZZamd#I13kinI5Wfh}Yvg$X~_Ln&_ub1gnh6#-25~h?}7Y|3YirG%3PvV`H=1ZHY zbZA@Mxk}8I;NJ2=<=qIM4f52Dnp&UBfHs%sePT8|(fLCE@I}U;=rtQM6f2FIz%oz+ zW`VGY33Hc?K!-$#=sHnl^Z+rS3>634;U|jN<}$%pa~QrCFr_j|A0FMAi7E-~0!V^q zCYk^pCWATc3#84Mx@yG3S2A}t^iVJYm}VB{29#52<5csv05QJkPbpr`1z{5C-J%ok z0!s(yktFw@TYPTI!5A3pt+Go*TtKKxvHX5b3r9!;JL4pn8mA- zY)zG7>J{c&MzZe=_fis%#C+yVSbEwdP&&t2#) zR`?P1s-=Prz=M3wFAJotkZL{?%w?6th8>J}bCaH77Ng+_Wz1sxSY}gs{mTs5uZCRy zmV36QgCaiVCi~S0KeIn5nInHLW`Q4>^AvNZj-#h z+k8-N276_FsEZ7`X(O99E)&uRb-7aJyb&<#g}J++c(nRoooxU+s)7 zlODDPNpFQ8NC<@IY6YE-sV+)i)`#pPhNe=PmQ{!YR*MQ&AEGy1fnLOxXGuO%%(x+I zS`p>ATGbN9Jr9$AUV(d3b2IRzMP}endv*+#`s$g)EkUTkwp@8tdMrVI`B~cjHxdbf>(g`cpi>yzzWl}35)!#a*iQgfiV)ZI|%(DPpz?x7t>ZV z&IR=G=M3@@eIPhmEZ-@bt1rxa3hZ^&h$m#p?GgD40jhNDB*axPv&iF#jQPsW7>9ph zis^0~kh|H}gKy65kC&cOVLwNP1TN}o1uzR@L5eVvSb-IReb+seR(kC6hFvffBd~XwMeuz6YGn=@b2z#Ni5~oedL_HdfCRBLe}fP)0AP5g2+Q zauJCT?t$Ls_9Mc^P4BOm2XVbIV*t}aovt-oFlueJzJ-0{2c3=~zhy{m(}rLLJru&y3mbrV1>#BxAeTT()SDE*!JMM5LmXVERi~(^j z|B~Q`p>%1Uj9K$_{bhu~i_zlu5`2n2)$f^mah;QRf83)q zYrWF;b7xOAJ=oPF?k$x#%WiI&e7eK)n-A?~hvc;%C>@A)Ki*|)ys+K>-P2wlMtbLW zY5802-PGJNe0;A?>oyOMqICrlfA-at!mYx1ZoYSX*`yHv8wRgRGyhd$n{oY7=$?`# z0fyYrpwCYyEeTeypSPO1uV=sRT+7wljI1M z6u|Nd{ldd0%W-3cUGk;e%YiL^#l?O5U&Wr)eNua^?uPsIc9X@Hap#`cY_Qq4uX*mN zSSJg&+Icrv&Lh_1qodQL>E1iw_ukxvN-jGt*7zlb<=*ancxYy3wRZL8lVOtyWyTK}C~p8F{rjuJRr*g7qwy>a)h!tNOH?F_%-q&2H2R#q%LzwjSV z)|*}}pQ`+FC#h>J>pp66qWn=^c1dba_tp`kn`IvdEYe%t{^qTt#nvqISdc7Bi8oqbt6usSOY>b zL6uP)!VW4+L{w&z3S%V-ae-NZ7ErtBIzd2%10(45x0f^Mme5=ql!8j2PzEFj#GXPQ z3>)ADG9$6w8a8Oab1HXm4kZR=VN^XVmTO~u2%V6sO_hLYD0h~ENLya=w05B8JE*l~ zxUkYyubD%YHK>Yt<^o1U7B#8I-Wv(}@7|80ym#2!W-pVle31D@CP3aMywJ+j|MENa zO)Lg5!EsfEI%^moXaJX^fFr~eVGpr5@ec*_$Kry!Kr`@L*1!~PWYi!`qBpXg`S_h_=HC@|<|Wl=@>9E~M9n;mS&j($pTPc}=e%{6#s z+Th_^alVaTDDP5sq}oip1%TcqWGp*vYk*41>>A;v;yMLGAZ)%s_-5jF~Y zggLQiJr8Fx{nY)KE>-!jQu?%ulBXRBS+joeg>1pLGY@kLy6)!wObT4niK&5T$55xw z&PEY_uuq;K58N5#lzC%ROeaTDpB6A_ifmpkuvdeMTJSmed;&Yr0<=*{K$52-hYz?V z9|0kTCh-8;q27Kw6g`%Miylqn@K2~dw1POR11|2PtMrjO1JuYpUyeQ4f5wj3gt&n4 zFN>kD96)FI5+Y6I1dhvv+@Z*u;{S72ACxHn115cUO z^zU?~M(86*MgjtzCE&`qjBJ20zOo|s0aQ&5TiGWJ8+a%-z&phtHP_&n4iE`|5P%*E zS7QT4U@Qi}z_>?gLBJxcz}cq5x*V)A1UWd`(FNWlL4nu<;0^{(+FJRT2gm_O;fkWQ zM4LU~l1D!AKG#DG$l;krY4S!fkOh+fM_&@yCK42wB3d&LCjc2Vp8j9N`5h`lbh=Kt z#Znl^5Srr2Ll&CIfPAL0fqe~o+pI}2nSd|hN*|5Y%14NQxf4JST}CF*H>q%zs+bRP z)*PuGa2UT(fNXLwrT~p;jQ)GKRbnQf-VlK!t`;CuTAe7QfQ4izaUeQqt5ZC6gvFp` k9CF|S-VruKrF|46IH2H9V%1-}WHEX^g(6-Ed~cfm3yG*=LjV8( literal 141254 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.12.0 <=19" } }, - "node_modules/@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/@amcharts/amcharts5": { "version": "5.9.13", "resolved": "https://registry.npmjs.org/@amcharts/amcharts5/-/amcharts5-5.9.13.tgz", @@ -85,34 +76,34 @@ } }, "node_modules/@ampproject/remapping": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", "dev": true, "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { "node": ">=6.0.0" } }, "node_modules/@babel/code-frame": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", - "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", + "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", "dependencies": { - "@babel/highlight": "^7.23.4", - "chalk": "^2.4.2" + "@babel/highlight": "^7.24.7", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/compat-data": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", - "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.2.tgz", + "integrity": "sha512-bYcppcpKBvX4znYaPEeFau03bp89ShqNMLs+rmdptMw+heSZh9+z84d2YG+K7cYLbWwzdjtDoW/uqZmPjulClQ==", "dev": true, "engines": { "node": ">=6.9.0" @@ -148,12 +139,6 @@ "url": "https://opencollective.com/babel" } }, - "node_modules/@babel/core/node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true - }, "node_modules/@babel/eslint-parser": { "version": "7.23.10", "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.23.10.tgz", @@ -172,24 +157,14 @@ "eslint": "^7.5.0 || ^8.0.0" } }, - "node_modules/@babel/eslint-parser/node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, "node_modules/@babel/generator": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", - "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", - "dev": true, + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.0.tgz", + "integrity": "sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==", "dependencies": { - "@babel/types": "^7.23.6", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", + "@babel/types": "^7.25.0", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^2.5.1" }, "engines": { @@ -197,38 +172,39 @@ } }, "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", - "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", + "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", - "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.24.7.tgz", + "integrity": "sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA==", "dev": true, "dependencies": { - "@babel/types": "^7.22.15" + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", - "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz", + "integrity": "sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.23.5", - "@babel/helper-validator-option": "^7.23.5", - "browserslist": "^4.22.2", + "@babel/compat-data": "^7.25.2", + "@babel/helper-validator-option": "^7.24.8", + "browserslist": "^4.23.1", "lru-cache": "^5.1.1", "semver": "^6.3.1" }, @@ -237,19 +213,17 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.23.6.tgz", - "integrity": "sha512-cBXU1vZni/CpGF29iTu4YRbOZt3Wat6zCoMDxRF1MayiEc4URxOj31tT65HUM0CRpMowA3HCJaAOVOUnMf96cw==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-member-expression-to-functions": "^7.23.0", - "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.20", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.0.tgz", + "integrity": "sha512-GYM6BxeQsETc9mnct+nIIpf63SAyzvyYN7UB/IlTyd+MBg06afFGp0mIeUqGyWgS2mxad6vqbMrHVlaL3m70sQ==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-member-expression-to-functions": "^7.24.8", + "@babel/helper-optimise-call-expression": "^7.24.7", + "@babel/helper-replace-supers": "^7.25.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", + "@babel/traverse": "^7.25.0", "semver": "^6.3.1" }, "engines": { @@ -260,12 +234,12 @@ } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", - "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.2.tgz", + "integrity": "sha512-+wqVGP+DFmqwFD3EH6TMTfUNeqDehV3E/dl+Sd54eaXqm17tEUNbEIn4sVivVowbvUpOtIGxdo3GoXyDH9N/9g==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-annotate-as-pure": "^7.24.7", "regexpu-core": "^5.3.1", "semver": "^6.3.1" }, @@ -277,9 +251,9 @@ } }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.5.0.tgz", - "integrity": "sha512-NovQquuQLAQ5HuyjCz7WQP9MjRj7dx++yspwiyUiGl9ZyadHRSql1HZh5ogRd8W8w6YM6EQ/NTB8rgjLt5W65Q==", + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz", + "integrity": "sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==", "dev": true, "dependencies": { "@babel/helper-compilation-targets": "^7.22.6", @@ -292,74 +266,41 @@ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", - "dev": true, - "dependencies": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", - "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.8.tgz", + "integrity": "sha512-LABppdt+Lp/RlBxqrh4qgf1oEH/WxdzQNDJIu5gC/W1GyvPVrOBiItmmM8wan2fm4oYqFuFfkXmlGpLQhPY8CA==", "dev": true, "dependencies": { - "@babel/types": "^7.23.0" + "@babel/traverse": "^7.24.8", + "@babel/types": "^7.24.8" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", - "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", + "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", "dependencies": { - "@babel/types": "^7.22.15" + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", - "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz", + "integrity": "sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-simple-access": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7", + "@babel/traverse": "^7.25.2" }, "engines": { "node": ">=6.9.0" @@ -369,35 +310,35 @@ } }, "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", - "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.7.tgz", + "integrity": "sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz", + "integrity": "sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", - "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.0.tgz", + "integrity": "sha512-NhavI2eWEIz/H9dbrG0TuOicDhNexze43i5z7lEqwYm0WEZVTwnPpA0EafUTP7+6/W79HWIP2cTe3Z5NiSTVpw==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-wrap-function": "^7.22.20" + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-wrap-function": "^7.25.0", + "@babel/traverse": "^7.25.0" }, "engines": { "node": ">=6.9.0" @@ -407,14 +348,14 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz", - "integrity": "sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.0.tgz", + "integrity": "sha512-q688zIvQVYtZu+i2PsdIu/uWGRpfxzr5WESsfpShfZECkO+d2o+WROWezCi/Q6kJ0tfPa5+pUGUlfx2HhrA3Bg==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-member-expression-to-functions": "^7.22.15", - "@babel/helper-optimise-call-expression": "^7.22.5" + "@babel/helper-member-expression-to-functions": "^7.24.8", + "@babel/helper-optimise-call-expression": "^7.24.7", + "@babel/traverse": "^7.25.0" }, "engines": { "node": ">=6.9.0" @@ -424,112 +365,104 @@ } }, "node_modules/@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", + "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", - "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.7.tgz", + "integrity": "sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", - "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", + "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", + "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", - "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz", + "integrity": "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", - "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.0.tgz", + "integrity": "sha512-s6Q1ebqutSiZnEjaofc/UKDyC4SbzV5n5SrA2Gq8UawLycr3i04f1dX4OzoQVnexm6aOCh37SQNYlJ/8Ku+PMQ==", "dev": true, "dependencies": { - "@babel/helper-function-name": "^7.22.5", - "@babel/template": "^7.22.15", - "@babel/types": "^7.22.19" + "@babel/template": "^7.25.0", + "@babel/traverse": "^7.25.0", + "@babel/types": "^7.25.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.9.tgz", - "integrity": "sha512-87ICKgU5t5SzOT7sBMfCOZQ2rHjRU+Pcb9BoILMYz600W6DkVRLFBPwQ18gwUVvggqXivaUakpnxWQGbpywbBQ==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.0.tgz", + "integrity": "sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw==", "dev": true, "dependencies": { - "@babel/template": "^7.23.9", - "@babel/traverse": "^7.23.9", - "@babel/types": "^7.23.9" + "@babel/template": "^7.25.0", + "@babel/types": "^7.25.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", - "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", + "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", + "@babel/helper-validator-identifier": "^7.24.7", "chalk": "^2.4.2", - "js-tokens": "^4.0.0" + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.9.tgz", - "integrity": "sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==", - "dev": true, + "version": "7.25.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.3.tgz", + "integrity": "sha512-iLTJKDbJ4hMvFPgQwwsVoxtHyWpKKPBrxkANrSYewDPaPpT5py5yeVkgPIJ7XYXhndxJpaA3PyALSXQ7u8e/Dw==", + "dependencies": { + "@babel/types": "^7.25.2" + }, "bin": { "parser": "bin/babel-parser.js" }, @@ -538,12 +471,12 @@ } }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.23.3.tgz", - "integrity": "sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.0.tgz", + "integrity": "sha512-lXwdNZtTmeVOOFtwM/WDe7yg1PL8sYhRk/XH0FzbR2HDQ0xC+EnQ/JHeoMYSavtU115tnUk0q9CDyq8si+LMAA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.8" }, "engines": { "node": ">=6.9.0" @@ -553,14 +486,14 @@ } }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.23.3.tgz", - "integrity": "sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.7.tgz", + "integrity": "sha512-+izXIbke1T33mY4MSNnrqhPXDz01WYhEf3yF5NbnUtkiNnm+XBZJl3kNfoK6NKmYlz/D07+l2GWVK/QfDkNCuQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-transform-optional-chaining": "^7.23.3" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", + "@babel/plugin-transform-optional-chaining": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -570,13 +503,13 @@ } }, "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.23.7.tgz", - "integrity": "sha512-LlRT7HgaifEpQA1ZgLVOIJZZFVPWN5iReq/7/JixwBtwcoeVGDBD53ZV28rrsLYOZs1Y/EHhA8N/Z6aazHR8cw==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.0.tgz", + "integrity": "sha512-tggFrk1AIShG/RUQbEwt2Tr/E+ObkfwrPjR6BjbRvsx24+PSjK8zrq0GWPNCjo8qpRx4DuJzlcvWJqlm+0h3kw==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/traverse": "^7.25.0" }, "engines": { "node": ">=6.9.0" @@ -661,12 +594,12 @@ } }, "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.23.3.tgz", - "integrity": "sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.7.tgz", + "integrity": "sha512-Ec3NRUMoi8gskrkBe3fNmEQfxDvY8bgfQpz6jlk/41kX9eUjvpyqWU7PBP/pLAvMaSQjbMNKJmvX57jP+M6bPg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -676,12 +609,12 @@ } }, "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.23.3.tgz", - "integrity": "sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.7.tgz", + "integrity": "sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -715,12 +648,12 @@ } }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz", - "integrity": "sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz", + "integrity": "sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -832,12 +765,12 @@ } }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.23.3.tgz", - "integrity": "sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.7.tgz", + "integrity": "sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -863,12 +796,12 @@ } }, "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.23.3.tgz", - "integrity": "sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.7.tgz", + "integrity": "sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -878,15 +811,15 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.9.tgz", - "integrity": "sha512-8Q3veQEDGe14dTYuwagbRtwxQDnytyg1JFu4/HwEMETeofocrB0U0ejBJIXoeG/t2oXZ8kzCyI0ZZfbT80VFNQ==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.0.tgz", + "integrity": "sha512-uaIi2FdqzjpAMvVqvB51S42oC2JEVgh0LDsGfZVDysWE8LrJtQC2jvKmOqEYThKyB7bDEb7BP1GYWDm7tABA0Q==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-remap-async-to-generator": "^7.22.20", - "@babel/plugin-syntax-async-generators": "^7.8.4" + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-remap-async-to-generator": "^7.25.0", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/traverse": "^7.25.0" }, "engines": { "node": ">=6.9.0" @@ -896,14 +829,14 @@ } }, "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.23.3.tgz", - "integrity": "sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.7.tgz", + "integrity": "sha512-SQY01PcJfmQ+4Ash7NE+rpbLFbmqA2GPIgqzxfFTL4t1FKRq4zTms/7htKpoCUI9OcFYgzqfmCdH53s6/jn5fA==", "dev": true, "dependencies": { - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-remap-async-to-generator": "^7.22.20" + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-remap-async-to-generator": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -913,12 +846,12 @@ } }, "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.23.3.tgz", - "integrity": "sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.7.tgz", + "integrity": "sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -928,12 +861,12 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.4.tgz", - "integrity": "sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.0.tgz", + "integrity": "sha512-yBQjYoOjXlFv9nlXb3f1casSHOZkWr29NX+zChVanLg5Nc157CrbEX9D7hxxtTpuFy7Q0YzmmWfJxzvps4kXrQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.8" }, "engines": { "node": ">=6.9.0" @@ -943,13 +876,13 @@ } }, "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.23.3.tgz", - "integrity": "sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.7.tgz", + "integrity": "sha512-vKbfawVYayKcSeSR5YYzzyXvsDFWU2mD8U5TFeXtbCPLFUqe7GyCgvO6XDHzje862ODrOwy6WCPmKeWHbCFJ4w==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -959,13 +892,13 @@ } }, "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.23.4.tgz", - "integrity": "sha512-nsWu/1M+ggti1SOALj3hfx5FXzAY06fwPJsUZD4/A5e1bWi46VUIWtD+kOX6/IdhXGsXBWllLFDSnqSCdUNydQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.7.tgz", + "integrity": "sha512-HMXK3WbBPpZQufbMG4B46A90PkuuhN9vBCb5T8+VAHqvAqvcLi+2cKoukcpmUYkszLhScU3l1iudhrks3DggRQ==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-class-static-block": "^7.14.5" }, "engines": { @@ -976,18 +909,16 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.23.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.8.tgz", - "integrity": "sha512-yAYslGsY1bX6Knmg46RjiCiNSwJKv2IUC8qOdYKqMMr0491SXFhcHqOdRDeCRohOOIzwN/90C6mQ9qAKgrP7dg==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.0.tgz", + "integrity": "sha512-xyi6qjr/fYU304fiRwFbekzkqVJZ6A7hOjWZd+89FVcBqPV3S9Wuozz82xdpLspckeaafntbzglaW4pqpzvtSw==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.20", - "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-compilation-targets": "^7.24.8", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-replace-supers": "^7.25.0", + "@babel/traverse": "^7.25.0", "globals": "^11.1.0" }, "engines": { @@ -998,13 +929,13 @@ } }, "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.23.3.tgz", - "integrity": "sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.7.tgz", + "integrity": "sha512-25cS7v+707Gu6Ds2oY6tCkUwsJ9YIDbggd9+cu9jzzDgiNq7hR/8dkzxWfKWnTic26vsI3EsCXNd4iEB6e8esQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/template": "^7.22.15" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/template": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1014,12 +945,12 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.3.tgz", - "integrity": "sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.8.tgz", + "integrity": "sha512-36e87mfY8TnRxc7yc6M9g9gOB7rKgSahqkIKwLpz4Ppk2+zC2Cy1is0uwtuSG6AE4zlTOUa+7JGz9jCJGLqQFQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.8" }, "engines": { "node": ">=6.9.0" @@ -1029,13 +960,13 @@ } }, "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.23.3.tgz", - "integrity": "sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.7.tgz", + "integrity": "sha512-ZOA3W+1RRTSWvyqcMJDLqbchh7U4NRGqwRfFSVbOLS/ePIP4vHB5e8T8eXcuqyN1QkgKyj5wuW0lcS85v4CrSw==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1045,12 +976,12 @@ } }, "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.23.3.tgz", - "integrity": "sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.7.tgz", + "integrity": "sha512-JdYfXyCRihAe46jUIliuL2/s0x0wObgwwiGxw/UbgJBr20gQBThrokO4nYKgWkD7uBaqM7+9x5TU7NkExZJyzw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1060,12 +991,12 @@ } }, "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.23.4.tgz", - "integrity": "sha512-V6jIbLhdJK86MaLh4Jpghi8ho5fGzt3imHOBu/x0jlBaPYqDoWz4RDXjmMOfnh+JWNaQleEAByZLV0QzBT4YQQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.7.tgz", + "integrity": "sha512-sc3X26PhZQDb3JhORmakcbvkeInvxz+A8oda99lj7J60QRuPZvNAk9wQlTBS1ZynelDrDmTU4pw1tyc5d5ZMUg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-dynamic-import": "^7.8.3" }, "engines": { @@ -1076,13 +1007,13 @@ } }, "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.23.3.tgz", - "integrity": "sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.7.tgz", + "integrity": "sha512-Rqe/vSc9OYgDajNIK35u7ot+KeCoetqQYFXM4Epf7M7ez3lWlOjrDjrwMei6caCVhfdw+mIKD4cgdGNy5JQotQ==", "dev": true, "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1092,12 +1023,12 @@ } }, "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.23.4.tgz", - "integrity": "sha512-GzuSBcKkx62dGzZI1WVgTWvkkz84FZO5TC5T8dl/Tht/rAla6Dg/Mz9Yhypg+ezVACf/rgDuQt3kbWEv7LdUDQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.7.tgz", + "integrity": "sha512-v0K9uNYsPL3oXZ/7F9NNIbAj2jv1whUEtyA6aujhekLs56R++JDQuzRcP2/z4WX5Vg/c5lE9uWZA0/iUoFhLTA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" }, "engines": { @@ -1108,13 +1039,13 @@ } }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.23.6.tgz", - "integrity": "sha512-aYH4ytZ0qSuBbpfhuofbg/e96oQ7U2w1Aw/UQmKT+1l39uEhUPoFS3fHevDc1G0OvewyDudfMKY1OulczHzWIw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.7.tgz", + "integrity": "sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1124,14 +1055,14 @@ } }, "node_modules/@babel/plugin-transform-function-name": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.23.3.tgz", - "integrity": "sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw==", + "version": "7.25.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.1.tgz", + "integrity": "sha512-TVVJVdW9RKMNgJJlLtHsKDTydjZAbwIsn6ySBPQaEAUU5+gVvlJt/9nRmqVbsV/IBanRjzWoaAQKLoamWVOUuA==", "dev": true, "dependencies": { - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-compilation-targets": "^7.24.8", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/traverse": "^7.25.1" }, "engines": { "node": ">=6.9.0" @@ -1141,12 +1072,12 @@ } }, "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.23.4.tgz", - "integrity": "sha512-81nTOqM1dMwZ/aRXQ59zVubN9wHGqk6UtqRK+/q+ciXmRy8fSolhGVvG09HHRGo4l6fr/c4ZhXUQH0uFW7PZbg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.7.tgz", + "integrity": "sha512-2yFnBGDvRuxAaE/f0vfBKvtnvvqU8tGpMHqMNpTN2oWMKIR3NqFkjaAgGwawhqK/pIN2T3XdjGPdaG0vDhOBGw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-json-strings": "^7.8.3" }, "engines": { @@ -1157,12 +1088,12 @@ } }, "node_modules/@babel/plugin-transform-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.23.3.tgz", - "integrity": "sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.2.tgz", + "integrity": "sha512-HQI+HcTbm9ur3Z2DkO+jgESMAMcYLuN/A7NRw9juzxAezN9AvqvUTnpKP/9kkYANz6u7dFlAyOu44ejuGySlfw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.8" }, "engines": { "node": ">=6.9.0" @@ -1172,12 +1103,12 @@ } }, "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.23.4.tgz", - "integrity": "sha512-Mc/ALf1rmZTP4JKKEhUwiORU+vcfarFVLfcFiolKUo6sewoxSEgl36ak5t+4WamRsNr6nzjZXQjM35WsU+9vbg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.7.tgz", + "integrity": "sha512-4D2tpwlQ1odXmTEIFWy9ELJcZHqrStlzK/dAOWYyxX3zT0iXQB6banjgeOJQXzEc4S0E0a5A+hahxPaEFYftsw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" }, "engines": { @@ -1188,12 +1119,12 @@ } }, "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.23.3.tgz", - "integrity": "sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.7.tgz", + "integrity": "sha512-T/hRC1uqrzXMKLQ6UCwMT85S3EvqaBXDGf0FaMf4446Qx9vKwlghvee0+uuZcDUCZU5RuNi4781UQ7R308zzBw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1203,13 +1134,13 @@ } }, "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.3.tgz", - "integrity": "sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.7.tgz", + "integrity": "sha512-9+pB1qxV3vs/8Hdmz/CulFB8w2tuu6EB94JZFsjdqxQokwGa9Unap7Bo2gGBGIvPmDIVvQrom7r5m/TCDMURhg==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1219,14 +1150,14 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.3.tgz", - "integrity": "sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.8.tgz", + "integrity": "sha512-WHsk9H8XxRs3JXKWFiqtQebdh9b/pTk4EgueygFzYlTKAg0Ud985mSevdNjdXdFBATSKVJGQXP1tv6aGbssLKA==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-simple-access": "^7.22.5" + "@babel/helper-module-transforms": "^7.24.8", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-simple-access": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1236,15 +1167,15 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.9.tgz", - "integrity": "sha512-KDlPRM6sLo4o1FkiSlXoAa8edLXFsKKIda779fbLrvmeuc3itnjCtaO6RrtoaANsIJANj+Vk1zqbZIMhkCAHVw==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.0.tgz", + "integrity": "sha512-YPJfjQPDXxyQWg/0+jHKj1llnY5f/R6a0p/vP4lPymxLu7Lvl4k2WMitqi08yxwQcCVUUdG9LCUj4TNEgAp3Jw==", "dev": true, "dependencies": { - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.20" + "@babel/helper-module-transforms": "^7.25.0", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-validator-identifier": "^7.24.7", + "@babel/traverse": "^7.25.0" }, "engines": { "node": ">=6.9.0" @@ -1254,13 +1185,13 @@ } }, "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.23.3.tgz", - "integrity": "sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.7.tgz", + "integrity": "sha512-3aytQvqJ/h9z4g8AsKPLvD4Zqi2qT+L3j7XoFFu1XBlZWEl2/1kWnhmAbxpLgPrHSY0M6UA02jyTiwUVtiKR6A==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1270,13 +1201,13 @@ } }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", - "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.24.7.tgz", + "integrity": "sha512-/jr7h/EWeJtk1U/uz2jlsCioHkZk1JJZVcc8oQsJ1dUlaJD83f4/6Zeh2aHt9BIFokHIsSeDfhUmju0+1GPd6g==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1286,12 +1217,12 @@ } }, "node_modules/@babel/plugin-transform-new-target": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.23.3.tgz", - "integrity": "sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.7.tgz", + "integrity": "sha512-RNKwfRIXg4Ls/8mMTza5oPF5RkOW8Wy/WgMAp1/F1yZ8mMbtwXW+HDoJiOsagWrAhI5f57Vncrmr9XeT4CVapA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1301,12 +1232,12 @@ } }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.23.4.tgz", - "integrity": "sha512-jHE9EVVqHKAQx+VePv5LLGHjmHSJR76vawFPTdlxR/LVJPfOEGxREQwQfjuZEOPTwG92X3LINSh3M40Rv4zpVA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.7.tgz", + "integrity": "sha512-Ts7xQVk1OEocqzm8rHMXHlxvsfZ0cEF2yomUqpKENHWMF4zKk175Y4q8H5knJes6PgYad50uuRmt3UJuhBw8pQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" }, "engines": { @@ -1317,12 +1248,12 @@ } }, "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.23.4.tgz", - "integrity": "sha512-mps6auzgwjRrwKEZA05cOwuDc9FAzoyFS4ZsG/8F43bTLf/TgkJg7QXOrPO1JO599iA3qgK9MXdMGOEC8O1h6Q==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.7.tgz", + "integrity": "sha512-e6q1TiVUzvH9KRvicuxdBTUj4AdKSRwzIyFFnfnezpCfP2/7Qmbb8qbU2j7GODbl4JMkblitCQjKYUaX/qkkwA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-numeric-separator": "^7.10.4" }, "engines": { @@ -1333,16 +1264,15 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.23.4.tgz", - "integrity": "sha512-9x9K1YyeQVw0iOXJlIzwm8ltobIIv7j2iLyP2jIhEbqPRQ7ScNgwQufU2I0Gq11VjyG4gI4yMXt2VFags+1N3g==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.7.tgz", + "integrity": "sha512-4QrHAr0aXQCEFni2q4DqKLD31n2DL+RxcwnNjDFkSG0eNQ/xCavnRkfCUjsyqGC2OviNJvZOF/mQqZBw7i2C5Q==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.23.3", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-compilation-targets": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.23.3" + "@babel/plugin-transform-parameters": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1352,13 +1282,13 @@ } }, "node_modules/@babel/plugin-transform-object-super": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.23.3.tgz", - "integrity": "sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.7.tgz", + "integrity": "sha512-A/vVLwN6lBrMFmMDmPPz0jnE6ZGx7Jq7d6sT/Ev4H65RER6pZ+kczlf1DthF5N0qaPHBsI7UXiE8Zy66nmAovg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.20" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-replace-supers": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1368,12 +1298,12 @@ } }, "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.23.4.tgz", - "integrity": "sha512-XIq8t0rJPHf6Wvmbn9nFxU6ao4c7WhghTR5WyV8SrJfUFzyxhCm4nhC+iAp3HFhbAKLfYpgzhJ6t4XCtVwqO5A==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.7.tgz", + "integrity": "sha512-uLEndKqP5BfBbC/5jTwPxLh9kqPWWgzN/f8w6UwAIirAEqiIVJWWY312X72Eub09g5KF9+Zn7+hT7sDxmhRuKA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" }, "engines": { @@ -1384,13 +1314,13 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.4.tgz", - "integrity": "sha512-ZU8y5zWOfjM5vZ+asjgAPwDaBjJzgufjES89Rs4Lpq63O300R/kOz30WCLo6BxxX6QVEilwSlpClnG5cZaikTA==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.8.tgz", + "integrity": "sha512-5cTOLSMs9eypEy8JUVvIKOu6NgvbJMnpG62VpIHrTmROdQ+L5mDAaI40g25k5vXti55JWNX5jCkq3HZxXBQANw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", "@babel/plugin-syntax-optional-chaining": "^7.8.3" }, "engines": { @@ -1401,12 +1331,12 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.23.3.tgz", - "integrity": "sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.7.tgz", + "integrity": "sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1416,13 +1346,13 @@ } }, "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.23.3.tgz", - "integrity": "sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.7.tgz", + "integrity": "sha512-COTCOkG2hn4JKGEKBADkA8WNb35TGkkRbI5iT845dB+NyqgO8Hn+ajPbSnIQznneJTa3d30scb6iz/DhH8GsJQ==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1432,14 +1362,14 @@ } }, "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.23.4.tgz", - "integrity": "sha512-9G3K1YqTq3F4Vt88Djx1UZ79PDyj+yKRnUy7cZGSMe+a7jkwD259uKKuUzQlPkGam7R+8RJwh5z4xO27fA1o2A==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.7.tgz", + "integrity": "sha512-9z76mxwnwFxMyxZWEgdgECQglF2Q7cFLm0kMf8pGwt+GSJsY0cONKj/UuO4bOH0w/uAel3ekS4ra5CEAyJRmDA==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" }, "engines": { @@ -1450,12 +1380,12 @@ } }, "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.23.3.tgz", - "integrity": "sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.7.tgz", + "integrity": "sha512-EMi4MLQSHfd2nrCqQEWxFdha2gBCqU4ZcCng4WBGZ5CJL4bBRW0ptdqqDdeirGZcpALazVVNJqRmsO8/+oNCBA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1465,12 +1395,12 @@ } }, "node_modules/@babel/plugin-transform-react-display-name": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.23.3.tgz", - "integrity": "sha512-GnvhtVfA2OAtzdX58FJxU19rhoGeQzyVndw3GgtdECQvQFXPEZIOVULHVZGAYmOgmqjXpVpfocAbSjh99V/Fqw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.24.7.tgz", + "integrity": "sha512-H/Snz9PFxKsS1JLI4dJLtnJgCJRoo0AUm3chP6NYr+9En1JMKloheEiLIhlp5MDVznWo+H3AAC1Mc8lmUEpsgg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1480,16 +1410,16 @@ } }, "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.23.4.tgz", - "integrity": "sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.2.tgz", + "integrity": "sha512-KQsqEAVBpU82NM/B/N9j9WOdphom1SZH3R+2V7INrQUH+V9EBFwZsEJl8eBIVeQE62FxJCc70jzEZwqU7RcVqA==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-jsx": "^7.23.3", - "@babel/types": "^7.23.4" + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/plugin-syntax-jsx": "^7.24.7", + "@babel/types": "^7.25.2" }, "engines": { "node": ">=6.9.0" @@ -1499,12 +1429,12 @@ } }, "node_modules/@babel/plugin-transform-react-jsx-development": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.22.5.tgz", - "integrity": "sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.24.7.tgz", + "integrity": "sha512-QG9EnzoGn+Qar7rxuW+ZOsbWOt56FvvI93xInqsZDC5fsekx1AlIO4KIJ5M+D0p0SqSH156EpmZyXq630B8OlQ==", "dev": true, "dependencies": { - "@babel/plugin-transform-react-jsx": "^7.22.5" + "@babel/plugin-transform-react-jsx": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1514,13 +1444,13 @@ } }, "node_modules/@babel/plugin-transform-react-pure-annotations": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.23.3.tgz", - "integrity": "sha512-qMFdSS+TUhB7Q/3HVPnEdYJDQIk57jkntAwSuz9xfSE4n+3I+vHYCli3HoHawN1Z3RfCz/y1zXA/JXjG6cVImQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.24.7.tgz", + "integrity": "sha512-PLgBVk3fzbmEjBJ/u8kFzOqS9tUeDjiaWud/rRym/yjCo/M9cASPlnrd2ZmmZpQT40fOOrvR8jh+n8jikrOhNA==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1530,12 +1460,12 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.23.3.tgz", - "integrity": "sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.7.tgz", + "integrity": "sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.7", "regenerator-transform": "^0.15.2" }, "engines": { @@ -1546,12 +1476,12 @@ } }, "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.23.3.tgz", - "integrity": "sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.7.tgz", + "integrity": "sha512-0DUq0pHcPKbjFZCfTss/pGkYMfy3vFWydkUBd9r0GHpIyfs2eCDENvqadMycRS9wZCXR41wucAfJHJmwA0UmoQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1581,12 +1511,12 @@ } }, "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.23.3.tgz", - "integrity": "sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.7.tgz", + "integrity": "sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1596,13 +1526,13 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.23.3.tgz", - "integrity": "sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.7.tgz", + "integrity": "sha512-x96oO0I09dgMDxJaANcRyD4ellXFLLiWhuwDxKZX5g2rWP1bTPkBSwCYv96VDXVT1bD9aPj8tppr5ITIh8hBng==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1612,12 +1542,12 @@ } }, "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.23.3.tgz", - "integrity": "sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.7.tgz", + "integrity": "sha512-kHPSIJc9v24zEml5geKg9Mjx5ULpfncj0wRpYtxbvKyTtHCYDkVE3aHQ03FrpEo4gEe2vrJJS1Y9CJTaThA52g==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1627,12 +1557,12 @@ } }, "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.23.3.tgz", - "integrity": "sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.7.tgz", + "integrity": "sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1642,12 +1572,12 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.23.3.tgz", - "integrity": "sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.8.tgz", + "integrity": "sha512-adNTUpDCVnmAE58VEqKlAA6ZBlNkMnWD0ZcW76lyNFN3MJniyGFZfNwERVk8Ap56MCnXztmDr19T4mPTztcuaw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.8" }, "engines": { "node": ">=6.9.0" @@ -1657,15 +1587,16 @@ } }, "node_modules/@babel/plugin-transform-typescript": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.23.6.tgz", - "integrity": "sha512-6cBG5mBvUu4VUD04OHKnYzbuHNP8huDsD3EDqqpIpsswTDoqHCjLoHb6+QgsV1WsT2nipRqCPgxD3LXnEO7XfA==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.25.2.tgz", + "integrity": "sha512-lBwRvjSmqiMYe/pS0+1gggjJleUJi7NzjvQ1Fkqtt69hBa/0t1YuW/MLQMAPixfwaQOHUXsd6jeU3Z+vdGv3+A==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.23.6", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-typescript": "^7.23.3" + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-create-class-features-plugin": "^7.25.0", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", + "@babel/plugin-syntax-typescript": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1675,12 +1606,12 @@ } }, "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.23.3.tgz", - "integrity": "sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.7.tgz", + "integrity": "sha512-U3ap1gm5+4edc2Q/P+9VrBNhGkfnf+8ZqppY71Bo/pzZmXhhLdqgaUl6cuB07O1+AQJtCLfaOmswiNbSQ9ivhw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1690,13 +1621,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.23.3.tgz", - "integrity": "sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.7.tgz", + "integrity": "sha512-uH2O4OV5M9FZYQrwc7NdVmMxQJOCCzFeYudlZSzUAHRFeOujQefa92E74TQDVskNHCzOXoigEuoyzHDhaEaK5w==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1706,13 +1637,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.23.3.tgz", - "integrity": "sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.7.tgz", + "integrity": "sha512-hlQ96MBZSAXUq7ltkjtu3FJCCSMx/j629ns3hA3pXnBXjanNP0LHi+JpPeA81zaWgVK1VGH95Xuy7u0RyQ8kMg==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1722,13 +1653,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.23.3.tgz", - "integrity": "sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.7.tgz", + "integrity": "sha512-2G8aAvF4wy1w/AGZkemprdGMRg5o6zPNhbHVImRz3lss55TYCBd6xStN19rt8XJHq20sqV0JbyWjOWwQRwV/wg==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1891,9 +1822,9 @@ "dev": true }, "node_modules/@babel/runtime": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.6.tgz", - "integrity": "sha512-zHd0eUrf5GZoOWVCXp6koAKQTfZV07eit6bGPmJgnZdnSAvvZee6zniW2XMF7Cmc4ISOOnPy3QaSiIJGJkVEDQ==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.0.tgz", + "integrity": "sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==", "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -1902,33 +1833,28 @@ } }, "node_modules/@babel/template": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.23.9.tgz", - "integrity": "sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA==", - "dev": true, + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", + "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==", "dependencies": { - "@babel/code-frame": "^7.23.5", - "@babel/parser": "^7.23.9", - "@babel/types": "^7.23.9" + "@babel/code-frame": "^7.24.7", + "@babel/parser": "^7.25.0", + "@babel/types": "^7.25.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.9.tgz", - "integrity": "sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.6", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.9", - "@babel/types": "^7.23.9", + "version": "7.25.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.3.tgz", + "integrity": "sha512-HefgyP1x754oGCsKmV5reSmtV7IXj/kpaE1XYY+D9G5PvKKoFfSbiS4M77MdjuwlZKDIKFCffq9rPU+H/s3ZdQ==", + "dependencies": { + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.25.0", + "@babel/parser": "^7.25.3", + "@babel/template": "^7.25.0", + "@babel/types": "^7.25.2", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -1937,12 +1863,12 @@ } }, "node_modules/@babel/types": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.9.tgz", - "integrity": "sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.2.tgz", + "integrity": "sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q==", "dependencies": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", + "@babel/helper-string-parser": "^7.24.8", + "@babel/helper-validator-identifier": "^7.24.7", "to-fast-properties": "^2.0.0" }, "engines": { @@ -2131,6 +2057,11 @@ "stylis": "4.2.0" } }, + "node_modules/@emotion/babel-plugin/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" + }, "node_modules/@emotion/babel-plugin/node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -2242,10 +2173,22 @@ "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/@eslint-community/regexpp": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz", + "integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" @@ -2274,6 +2217,16 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "node_modules/@eslint/eslintrc/node_modules/globals": { "version": "13.24.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", @@ -2289,6 +2242,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/@eslint/js": { "version": "8.56.0", "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz", @@ -2299,27 +2264,22 @@ } }, "node_modules/@floating-ui/core": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.5.2.tgz", - "integrity": "sha512-Ii3MrfY/GAIN3OhXNzpCKaLxHQfJF9qvwq/kEJYdqDxeIHa01K8sldugal6TmeeXl+WMvhv9cnVzUTaFFJF09A==", + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.7.tgz", + "integrity": "sha512-yDzVT/Lm101nQ5TCVeK65LtdN7Tj4Qpr9RTXJ2vPFLqtLxwOrpoxAHAJI8J3yYWUc40J0BDBheaitK5SJmno2g==", "dependencies": { - "@floating-ui/utils": "^0.1.3" + "@floating-ui/utils": "^0.2.7" } }, "node_modules/@floating-ui/dom": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.3.tgz", - "integrity": "sha512-RnDthu3mzPlQ31Ss/BTwQ1zjzIhr3lk1gZB1OC56h/1vEtaXkESrOqL5fQVMfXpwGtRwX+YsZBdyHtJMQnkArw==", + "version": "1.6.10", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.10.tgz", + "integrity": "sha512-fskgCFv8J8OamCmyun8MfjB1Olfn+uZKjOKZ0vhYF3gRmEUXcGOjxWL8bBr7i4kIuPZ2KD2S3EUIOxnjC8kl2A==", "dependencies": { - "@floating-ui/core": "^1.0.0", - "@floating-ui/utils": "^0.2.0" + "@floating-ui/core": "^1.6.0", + "@floating-ui/utils": "^0.2.7" } }, - "node_modules/@floating-ui/dom/node_modules/@floating-ui/utils": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.1.tgz", - "integrity": "sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==" - }, "node_modules/@floating-ui/react": { "version": "0.26.22", "resolved": "https://registry.npmjs.org/@floating-ui/react/-/react-0.26.22.tgz", @@ -2352,9 +2312,9 @@ "integrity": "sha512-X8R8Oj771YRl/w+c1HqAC1szL8zWQRwFvgDwT129k9ACdBoud/+/rX9V0qiMl6LWUdP9voC2nDVZYPMQQsb6eA==" }, "node_modules/@floating-ui/utils": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.6.tgz", - "integrity": "sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A==" + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.7.tgz", + "integrity": "sha512-X8R8Oj771YRl/w+c1HqAC1szL8zWQRwFvgDwT129k9ACdBoud/+/rX9V0qiMl6LWUdP9voC2nDVZYPMQQsb6eA==" }, "node_modules/@foliojs-fork/fontkit": { "version": "1.9.2", @@ -2441,19 +2401,42 @@ } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.13", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", - "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "deprecated": "Use @eslint/config-array instead", "dev": true, "dependencies": { - "@humanwhocodes/object-schema": "^2.0.1", - "debug": "^4.1.1", + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", "minimatch": "^3.0.5" }, "engines": { "node": ">=10.10.0" } }, + "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", @@ -2468,9 +2451,10 @@ } }, "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", - "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", "dev": true }, "node_modules/@internationalized/date": { @@ -2507,58 +2491,53 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "dev": true, + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", "dependencies": { - "@jridgewell/set-array": "^1.0.1", + "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", - "dev": true, + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true, + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/source-map": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", - "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", "dev": true, "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.20", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", - "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", - "dev": true, + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" @@ -2677,9 +2656,9 @@ } }, "node_modules/@leichtgewicht/ip-codec": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", - "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", + "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", "dev": true }, "node_modules/@lezer/common": { @@ -2752,28 +2731,6 @@ "eslint-scope": "5.1.1" } }, - "node_modules/@nicolo-ribaudo/eslint-scope-5-internals/node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@nicolo-ribaudo/eslint-scope-5-internals/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -3493,9 +3450,9 @@ } }, "node_modules/@types/eslint": { - "version": "8.44.8", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.8.tgz", - "integrity": "sha512-4K8GavROwhrYl2QXDXm0Rv9epkA8GBFu0EI+XrrnnuCl7u8CWBRusX7fXJfanhZTDWSAL24gDI/UqXyUM0Injw==", + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.0.tgz", + "integrity": "sha512-gi6WQJ7cHRgZxtkQEoyHMppPjq9Kxo5Tjn2prSKDSmZrCz8TZ3jSRCeTJm+WoM+oB0WG37bRqLzaaU3q7JypGg==", "dev": true, "dependencies": { "@types/estree": "*", @@ -3531,9 +3488,9 @@ } }, "node_modules/@types/express-serve-static-core": { - "version": "4.17.41", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.41.tgz", - "integrity": "sha512-OaJ7XLaelTgrvlZD8/aa0vvvxZdUmlCn6MtWeB7TkiKW70BQLc9XEPpDLPdbo52ZhXUCrznlWdCHWxJWtdyajA==", + "version": "4.19.5", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.5.tgz", + "integrity": "sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg==", "dev": true, "dependencies": { "@types/node": "*", @@ -3563,9 +3520,9 @@ "dev": true }, "node_modules/@types/http-proxy": { - "version": "1.17.14", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.14.tgz", - "integrity": "sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==", + "version": "1.17.15", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.15.tgz", + "integrity": "sha512-25g5atgiVNTIv0LBDTg1H74Hvayx0ajtJPLLcYE3whFv75J0pWNtOBzaXJQgDTmrX1bx5U9YC2w/n65BN1HwRQ==", "dev": true, "dependencies": { "@types/node": "*" @@ -3590,18 +3547,18 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.10.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.4.tgz", - "integrity": "sha512-D08YG6rr8X90YB56tSIuBaddy/UXAA9RKJoFvrsnogAum/0pmjkgi4+2nx96A330FmioegBWmEYQ+syqCFaveg==", + "version": "22.4.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.4.1.tgz", + "integrity": "sha512-1tbpb9325+gPnKK0dMm+/LMriX0vKxf6RnB0SZUqfyVkQ4fMgUSySqhxE/y8Jvs4NyF1yHzTfG9KlnkIODxPKg==", "devOptional": true, "dependencies": { - "undici-types": "~5.26.4" + "undici-types": "~6.19.2" } }, "node_modules/@types/node-forge": { - "version": "1.3.10", - "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.10.tgz", - "integrity": "sha512-y6PJDYN4xYBxwd22l+OVH35N+1fCYWiuC3aiP2SlXVE6Lo7SS+rSx9r89hLxrP4pn6n1lBGhHJ12pj3F3Mpttw==", + "version": "1.3.11", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", + "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", "dev": true, "dependencies": { "@types/node": "*" @@ -3618,14 +3575,14 @@ "integrity": "sha512-9Zw2KoDpi+T4PZz2G6pO2xArE0m/GSMTW1MIxF2s8ZY8x9XDO6fv9um0ydRGvcbkFLlaq8yNK6eZxnmMZtDgWQ==" }, "node_modules/@types/prop-types": { - "version": "15.7.11", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.11.tgz", - "integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==" + "version": "15.7.12", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz", + "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==" }, "node_modules/@types/qs": { - "version": "6.9.10", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.10.tgz", - "integrity": "sha512-3Gnx08Ns1sEoCrWssEgTSJs/rsT2vhGP+Ja9cnnk9k4ALxinORlQneLXFeFKOTJMOeZUFD1s7w+w2AphTpvzZw==", + "version": "6.9.15", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.15.tgz", + "integrity": "sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==", "dev": true }, "node_modules/@types/range-parser": { @@ -3679,14 +3636,14 @@ "dev": true }, "node_modules/@types/scheduler": { - "version": "0.16.8", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz", - "integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==" + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-YIoDCTH3Af6XM5VuwGG/QL/CJqga1Zm3NkU3HZ4ZHK2fRMPYP1VczsTUqtsf43PH/iJNVlPHAo2oWX7BSdB2Hw==" }, "node_modules/@types/semver": { - "version": "7.5.6", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz", - "integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==", + "version": "7.5.8", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", + "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", "dev": true }, "node_modules/@types/send": { @@ -3709,15 +3666,15 @@ } }, "node_modules/@types/serve-static": { - "version": "1.15.5", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.5.tgz", - "integrity": "sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==", + "version": "1.15.7", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", + "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", "dev": true, "dependencies": { "@types/http-errors": "*", - "@types/mime": "*", - "@types/node": "*" - } + "@types/node": "*", + "@types/send": "*" + } }, "node_modules/@types/sockjs": { "version": "0.3.36", @@ -3734,9 +3691,9 @@ "integrity": "sha512-XQtKy9lmkKlV+c3Jelo7kxNPw7qOqIq3GcnOhywGZHF7zw5D5m+Ssigbmf3Turbe/A8Ur+lRh8TYjuxXKvyivw==" }, "node_modules/@types/ws": { - "version": "8.5.10", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz", - "integrity": "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==", + "version": "8.5.12", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.12.tgz", + "integrity": "sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ==", "dev": true, "dependencies": { "@types/node": "*" @@ -3777,26 +3734,11 @@ } } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, "bin": { "semver": "bin/semver.js" }, @@ -3804,22 +3746,16 @@ "node": ">=10" } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/@typescript-eslint/parser": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.14.0.tgz", - "integrity": "sha512-QjToC14CKacd4Pa7JK4GeB/vHmWFJckec49FR4hmIRf97+KXole0T97xxu9IFiPxVQ1DBWrQ5wreLwAGwWAVQA==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz", + "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "6.14.0", - "@typescript-eslint/types": "6.14.0", - "@typescript-eslint/typescript-estree": "6.14.0", - "@typescript-eslint/visitor-keys": "6.14.0", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", "debug": "^4.3.4" }, "engines": { @@ -3839,13 +3775,13 @@ } }, "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.14.0.tgz", - "integrity": "sha512-VT7CFWHbZipPncAZtuALr9y3EuzY1b1t1AEkIq2bTXUPKw+pHoXflGNG5L+Gv6nKul1cz1VH8fz16IThIU0tdg==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz", + "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.14.0", - "@typescript-eslint/visitor-keys": "6.14.0" + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0" }, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -3856,12 +3792,12 @@ } }, "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.14.0.tgz", - "integrity": "sha512-fB5cw6GRhJUz03MrROVuj5Zm/Q+XWlVdIsFj+Zb1Hvqouc8t+XP2H5y53QYU/MGtd2dPg6/vJJlhoX3xc2ehfw==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz", + "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.14.0", + "@typescript-eslint/types": "6.21.0", "eslint-visitor-keys": "^3.4.1" }, "engines": { @@ -3872,6 +3808,18 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@typescript-eslint/parser/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/@typescript-eslint/scope-manager": { "version": "6.20.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.20.0.tgz", @@ -3970,50 +3918,11 @@ } } }, - "node_modules/@typescript-eslint/type-utils/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/@typescript-eslint/type-utils/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, "bin": { "semver": "bin/semver.js" }, @@ -4021,16 +3930,10 @@ "node": ">=10" } }, - "node_modules/@typescript-eslint/type-utils/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/@typescript-eslint/types": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.14.0.tgz", - "integrity": "sha512-uty9H2K4Xs8E47z3SnXEPRNDfsis8JO27amp2GNCnzGETEW3yTqEIVg5+AI7U276oGF/tw6ZA+UesxeQ104ceA==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz", + "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==", "dev": true, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -4041,16 +3944,17 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.14.0.tgz", - "integrity": "sha512-yPkaLwK0yH2mZKFE/bXkPAkkFgOv15GJAUzgUVonAbv0Hr4PK/N2yaA/4XQbTZQdygiDkpt5DkxPELqHguNvyw==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz", + "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.14.0", - "@typescript-eslint/visitor-keys": "6.14.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", + "minimatch": "9.0.3", "semver": "^7.5.4", "ts-api-utils": "^1.0.1" }, @@ -4068,12 +3972,12 @@ } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/@typescript-eslint/visitor-keys": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.14.0.tgz", - "integrity": "sha512-fB5cw6GRhJUz03MrROVuj5Zm/Q+XWlVdIsFj+Zb1Hvqouc8t+XP2H5y53QYU/MGtd2dPg6/vJJlhoX3xc2ehfw==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz", + "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.14.0", + "@typescript-eslint/types": "6.21.0", "eslint-visitor-keys": "^3.4.1" }, "engines": { @@ -4084,26 +3988,23 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "node_modules/@typescript-eslint/typescript-estree/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, "engines": { - "node": ">=10" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, "bin": { "semver": "bin/semver.js" }, @@ -4111,12 +4012,6 @@ "node": ">=10" } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/@typescript-eslint/utils": { "version": "6.20.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.20.0.tgz", @@ -4183,50 +4078,11 @@ } } }, - "node_modules/@typescript-eslint/utils/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/@typescript-eslint/utils/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, "bin": { "semver": "bin/semver.js" }, @@ -4234,12 +4090,6 @@ "node": ">=10" } }, - "node_modules/@typescript-eslint/utils/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/@typescript-eslint/visitor-keys": { "version": "6.20.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.20.0.tgz", @@ -4270,6 +4120,18 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/@uiw/codemirror-extensions-basic-setup": { "version": "4.23.0", "resolved": "https://registry.npmjs.org/@uiw/codemirror-extensions-basic-setup/-/codemirror-extensions-basic-setup-4.23.0.tgz", @@ -4336,9 +4198,9 @@ } }, "node_modules/@webassemblyjs/ast": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", - "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", + "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", "dev": true, "dependencies": { "@webassemblyjs/helper-numbers": "1.11.6", @@ -4358,9 +4220,9 @@ "dev": true }, "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", - "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", + "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==", "dev": true }, "node_modules/@webassemblyjs/helper-numbers": { @@ -4381,15 +4243,15 @@ "dev": true }, "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", - "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", + "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6" + "@webassemblyjs/wasm-gen": "1.12.1" } }, "node_modules/@webassemblyjs/ieee754": { @@ -4417,28 +4279,28 @@ "dev": true }, "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", - "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", + "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/helper-wasm-section": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-opt": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6", - "@webassemblyjs/wast-printer": "1.11.6" + "@webassemblyjs/helper-wasm-section": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-opt": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1", + "@webassemblyjs/wast-printer": "1.12.1" } }, "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", - "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", + "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/ast": "1.12.1", "@webassemblyjs/helper-wasm-bytecode": "1.11.6", "@webassemblyjs/ieee754": "1.11.6", "@webassemblyjs/leb128": "1.11.6", @@ -4446,24 +4308,24 @@ } }, "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", - "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", + "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1" } }, "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", - "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", + "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/ast": "1.12.1", "@webassemblyjs/helper-api-error": "1.11.6", "@webassemblyjs/helper-wasm-bytecode": "1.11.6", "@webassemblyjs/ieee754": "1.11.6", @@ -4472,12 +4334,12 @@ } }, "node_modules/@webassemblyjs/wast-printer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", - "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", + "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/ast": "1.12.1", "@xtuc/long": "4.2.2" } }, @@ -4551,9 +4413,9 @@ } }, "node_modules/acorn": { - "version": "8.11.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", - "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -4614,15 +4476,15 @@ } }, "node_modules/ajv-formats/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, "dependencies": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "require-from-string": "^2.0.2" }, "funding": { "type": "github", @@ -4705,34 +4567,38 @@ } }, "node_modules/array-buffer-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", - "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "is-array-buffer": "^3.0.1" + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/array-flatten": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", - "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", "dev": true }, "node_modules/array-includes": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", - "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", + "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", "is-string": "^1.0.7" }, "engines": { @@ -4752,16 +4618,17 @@ } }, "node_modules/array.prototype.findlastindex": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz", - "integrity": "sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", + "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.2.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -4807,30 +4674,34 @@ } }, "node_modules/array.prototype.tosorted": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.2.tgz", - "integrity": "sha512-HuQCHOlk1Weat5jzStICBCd83NxiIMwqDg/dHEsoefabn/hJRj5pVdWcPUSpRrwhwxZOsQassMpgN/xRYFBMIg==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.2.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" } }, "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", - "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", "dev": true, "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "is-array-buffer": "^3.0.2", + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", "is-shared-array-buffer": "^1.0.2" }, "engines": { @@ -4846,20 +4717,14 @@ "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", "dev": true }, - "node_modules/asynciterator.prototype": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz", - "integrity": "sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.3" - } - }, "node_modules/available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", "dev": true, + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, "engines": { "node": ">= 0.4" }, @@ -4877,12 +4742,12 @@ } }, "node_modules/axobject-query": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.2.1.tgz", - "integrity": "sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.2.4.tgz", + "integrity": "sha512-aPTElBrbifBU1krmZxGZOlBkslORe7Ll7+BDnI50Wy4LgOt69luMgevkDfTq1O/ZgprooPCtWpjCwKSZw/iZ4A==", "dev": true, - "dependencies": { - "dequal": "^2.0.3" + "engines": { + "node": ">= 0.4" } }, "node_modules/babel-loader": { @@ -4917,13 +4782,13 @@ } }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.8", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.8.tgz", - "integrity": "sha512-OtIuQfafSzpo/LhnJaykc0R/MMnuLSSVjVYy9mHArIZ9qTCSZ6TpWCuEKZYVoN//t8HqBNScHrOtCrIK5IaGLg==", + "version": "0.4.11", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz", + "integrity": "sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==", "dev": true, "dependencies": { "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.5.0", + "@babel/helper-define-polyfill-provider": "^0.6.2", "semver": "^6.3.1" }, "peerDependencies": { @@ -4943,6 +4808,22 @@ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, + "node_modules/babel-plugin-polyfill-corejs3/node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.5.0.tgz", + "integrity": "sha512-NovQquuQLAQ5HuyjCz7WQP9MjRj7dx++yspwiyUiGl9ZyadHRSql1HZh5ogRd8W8w6YM6EQ/NTB8rgjLt5W65Q==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, "node_modules/babel-plugin-polyfill-regenerator": { "version": "0.5.5", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.5.tgz", @@ -4955,6 +4836,22 @@ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, + "node_modules/babel-plugin-polyfill-regenerator/node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.5.0.tgz", + "integrity": "sha512-NovQquuQLAQ5HuyjCz7WQP9MjRj7dx++yspwiyUiGl9ZyadHRSql1HZh5ogRd8W8w6YM6EQ/NTB8rgjLt5W65Q==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -4973,12 +4870,15 @@ "dev": true }, "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", "dev": true, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/body-parser": { @@ -5042,34 +4942,31 @@ "dev": true }, "node_modules/bonjour-service": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.1.1.tgz", - "integrity": "sha512-Z/5lQRMOG9k7W+FkeGTNjh7htqn/2LMnfOvBZ8pynNZCM9MwkQkI3zeI4oz09uWdcgmgHugVvBqxGg4VQJ5PCg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.2.1.tgz", + "integrity": "sha512-oSzCS2zV14bh2kji6vNe7vrpJYCHGvcZnlffFQ1MEoX/WOeQ/teD8SYWKR942OI3INjq8OMNJlbPK5LLLUxFDw==", "dev": true, "dependencies": { - "array-flatten": "^2.1.2", - "dns-equal": "^1.0.0", "fast-deep-equal": "^3.1.3", "multicast-dns": "^7.2.5" } }, "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "balanced-match": "^1.0.0" } }, "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, "dependencies": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" }, "engines": { "node": ">=8" @@ -5084,9 +4981,9 @@ } }, "node_modules/browserslist": { - "version": "4.22.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz", - "integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==", + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz", + "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==", "dev": true, "funding": [ { @@ -5103,10 +5000,10 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001565", - "electron-to-chromium": "^1.4.601", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.13" + "caniuse-lite": "^1.0.30001646", + "electron-to-chromium": "^1.5.4", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.0" }, "bin": { "browserslist": "cli.js" @@ -5134,34 +5031,19 @@ } }, "node_modules/builtins": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", - "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.1.0.tgz", + "integrity": "sha512-SW9lzGTLvWTP1AY8xeAMZimqDrIaSdLQUcVr9DMef51niJ022Ri87SwRRKYm4A6iHfkPaiVUu/Duw2Wc4J7kKg==", "dev": true, "dependencies": { "semver": "^7.0.0" } }, - "node_modules/builtins/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/builtins/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, "bin": { "semver": "bin/semver.js" }, @@ -5169,12 +5051,6 @@ "node": ">=10" } }, - "node_modules/builtins/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/bytes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", @@ -5211,9 +5087,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001568", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001568.tgz", - "integrity": "sha512-vSUkH84HontZJ88MiNrOau1EBrCqEQYgkC5gIySiDlpsm8sGVrhU7Kx4V6h0tnqaHzIHZv08HlJIwPbL4XL9+A==", + "version": "1.0.30001651", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001651.tgz", + "integrity": "sha512-9Cf+Xv1jJNe1xPZLGuUXLNkE1BoDkqRqYyFJ9TDYSqhduqA4hu4oR9HluGoWYQC/aj8WHjsGVV+bwkh0+tegRg==", "dev": true, "funding": [ { @@ -5244,16 +5120,10 @@ } }, "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -5266,6 +5136,9 @@ "engines": { "node": ">= 8.10.0" }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, "optionalDependencies": { "fsevents": "~2.3.2" } @@ -5283,9 +5156,9 @@ } }, "node_modules/chrome-trace-event": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", + "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", "dev": true, "engines": { "node": ">=6.0" @@ -5418,6 +5291,12 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, + "node_modules/compression/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -5445,26 +5324,6 @@ "node": ">= 0.6" } }, - "node_modules/content-disposition/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, "node_modules/content-type": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", @@ -5475,9 +5334,10 @@ } }, "node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true }, "node_modules/cookie": { "version": "0.6.0", @@ -5495,12 +5355,12 @@ "dev": true }, "node_modules/core-js-compat": { - "version": "3.35.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.35.1.tgz", - "integrity": "sha512-sftHa5qUJY3rs9Zht1WEnmkvXputCyDBczPnr7QDgL8n3qrF3CMXY4VPSYtOLLiOUJcah2WNXREd48iOl6mQIw==", + "version": "3.38.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.38.0.tgz", + "integrity": "sha512-75LAicdLa4OJVwFxFbQR3NdnZjNgX6ILpVcVzcC4T2smerB5lELMrJQQQoWV6TiuC/vlaFqgU2tKQx9w5s0e0A==", "dev": true, "dependencies": { - "browserslist": "^4.22.2" + "browserslist": "^4.23.3" }, "funding": { "type": "opencollective", @@ -6046,6 +5906,57 @@ "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", "dev": true }, + "node_modules/data-view-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", + "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", + "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", + "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/date-fns": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-3.6.0.tgz", @@ -6056,10 +5967,9 @@ } }, "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", "dependencies": { "ms": "2.1.2" }, @@ -6219,12 +6129,6 @@ "redux": "^4.2.0" } }, - "node_modules/dns-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==", - "dev": true - }, "node_modules/dns-packet": { "version": "5.6.1", "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", @@ -6265,9 +6169,9 @@ "dev": true }, "node_modules/electron-to-chromium": { - "version": "1.4.610", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.610.tgz", - "integrity": "sha512-mqi2oL1mfeHYtOdCxbPQYV/PL7YrQlxbvFEZ0Ee8GbDdShimqt2/S6z2RWqysuvlwdOrQdqvE0KZrBTipAeJzg==", + "version": "1.5.11", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.11.tgz", + "integrity": "sha512-R1CccCDYqndR25CaXFd6hp/u9RaaMcftMkphmvuepXr5b1vfLkRml6aWVeBhXJ7rbevHkKEMJtz8XqPf7ffmew==", "dev": true }, "node_modules/emoji-regex": { @@ -6286,9 +6190,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", - "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", + "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", "dev": true, "dependencies": { "graceful-fs": "^4.2.4", @@ -6299,9 +6203,9 @@ } }, "node_modules/envinfo": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.11.0.tgz", - "integrity": "sha512-G9/6xF1FPbIw0TtalAMaVPpiq2aDEuKLXM314jPVAO9r2fo2a4BLqMNkmRS7O/xPPZ+COAhGIz3ETvHEV3eUcg==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.13.0.tgz", + "integrity": "sha512-cvcaMr7KqXVh4nyzGTVqTum+gAiL265x5jUWQIDLq//zOGbW+gSW/C+OWLleY/rs9Qole6AZLMXPbtIFQbqu+Q==", "dev": true, "bin": { "envinfo": "dist/cli.js" @@ -6319,50 +6223,57 @@ } }, "node_modules/es-abstract": { - "version": "1.22.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz", - "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==", + "version": "1.23.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", + "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", "dev": true, "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "arraybuffer.prototype.slice": "^1.0.2", - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.5", - "es-set-tostringtag": "^2.0.1", + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "data-view-buffer": "^1.0.1", + "data-view-byte-length": "^1.0.1", + "data-view-byte-offset": "^1.0.0", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.0.3", "es-to-primitive": "^1.2.1", "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.2", - "get-symbol-description": "^1.0.0", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", "globalthis": "^1.0.3", "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", "has-symbols": "^1.0.3", - "hasown": "^2.0.0", - "internal-slot": "^1.0.5", - "is-array-buffer": "^3.0.2", + "hasown": "^2.0.2", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", + "is-data-view": "^1.0.1", + "is-negative-zero": "^2.0.3", "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", + "is-shared-array-buffer": "^1.0.3", "is-string": "^1.0.7", - "is-typed-array": "^1.1.12", + "is-typed-array": "^1.1.13", "is-weakref": "^1.0.2", "object-inspect": "^1.13.1", "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.1", - "safe-array-concat": "^1.0.1", - "safe-regex-test": "^1.0.0", - "string.prototype.trim": "^1.2.8", - "string.prototype.trimend": "^1.0.7", - "string.prototype.trimstart": "^1.0.7", - "typed-array-buffer": "^1.0.0", - "typed-array-byte-length": "^1.0.0", - "typed-array-byte-offset": "^1.0.0", - "typed-array-length": "^1.0.4", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.2", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.9", + "string.prototype.trimend": "^1.0.8", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.6", "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.13" + "which-typed-array": "^1.1.15" }, "engines": { "node": ">= 0.4" @@ -6391,42 +6302,57 @@ } }, "node_modules/es-iterator-helpers": { - "version": "1.0.15", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.15.tgz", - "integrity": "sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g==", + "version": "1.0.19", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.19.tgz", + "integrity": "sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==", "dev": true, "dependencies": { - "asynciterator.prototype": "^1.0.0", - "call-bind": "^1.0.2", + "call-bind": "^1.0.7", "define-properties": "^1.2.1", - "es-abstract": "^1.22.1", - "es-set-tostringtag": "^2.0.1", - "function-bind": "^1.1.1", - "get-intrinsic": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.3", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", "globalthis": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.5", + "internal-slot": "^1.0.7", "iterator.prototype": "^1.1.2", - "safe-array-concat": "^1.0.1" + "safe-array-concat": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" } }, "node_modules/es-module-lexer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz", - "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==", + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", + "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", "dev": true }, + "node_modules/es-object-atoms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es-set-tostringtag": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz", - "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", "dev": true, "dependencies": { - "get-intrinsic": "^1.2.2", - "has-tostringtag": "^1.0.0", - "hasown": "^2.0.0" + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" }, "engines": { "node": ">= 0.4" @@ -6459,9 +6385,9 @@ } }, "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", "dev": true, "engines": { "node": ">=6" @@ -6537,10 +6463,13 @@ } }, "node_modules/eslint-compat-utils": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.1.2.tgz", - "integrity": "sha512-Jia4JDldWnFNIru1Ehx1H5s9/yxiRHY/TimCuUc0jNexew3cF1gI6CYZil1ociakfWO3rRqFjl1mskBblB3RYg==", + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.5.1.tgz", + "integrity": "sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==", "dev": true, + "dependencies": { + "semver": "^7.5.4" + }, "engines": { "node": ">=12" }, @@ -6548,6 +6477,18 @@ "eslint": ">=6.0.0" } }, + "node_modules/eslint-compat-utils/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/eslint-config-prettier": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", @@ -6593,6 +6534,7 @@ "version": "43.0.1", "resolved": "https://registry.npmjs.org/eslint-config-standard-with-typescript/-/eslint-config-standard-with-typescript-43.0.1.tgz", "integrity": "sha512-WfZ986+qzIzX6dcr4yGUyVb/l9N3Z8wPXCc5z/70fljs3UbWhhV+WxrfgsqMToRzuuyX9MqZ974pq2UPhDTOcA==", + "deprecated": "Please use eslint-config-love, instead.", "dev": true, "dependencies": { "@typescript-eslint/parser": "^6.4.0", @@ -6628,9 +6570,9 @@ } }, "node_modules/eslint-module-utils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", - "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz", + "integrity": "sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==", "dev": true, "dependencies": { "debug": "^3.2.7" @@ -6654,21 +6596,22 @@ } }, "node_modules/eslint-plugin-es-x": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.5.0.tgz", - "integrity": "sha512-ODswlDSO0HJDzXU0XvgZ3lF3lS3XAZEossh15Q2UHjwrJggWeBoKqqEsLTZLXl+dh5eOAozG0zRcYtuE35oTuQ==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.8.0.tgz", + "integrity": "sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==", "dev": true, + "funding": [ + "https://github.com/sponsors/ota-meshi", + "https://opencollective.com/eslint" + ], "dependencies": { "@eslint-community/eslint-utils": "^4.1.2", - "@eslint-community/regexpp": "^4.6.0", - "eslint-compat-utils": "^0.1.2" + "@eslint-community/regexpp": "^4.11.0", + "eslint-compat-utils": "^0.5.1" }, "engines": { "node": "^14.18.0 || >=16.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ota-meshi" - }, "peerDependencies": { "eslint": ">=8" } @@ -6704,6 +6647,16 @@ "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" } }, + "node_modules/eslint-plugin-import/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "node_modules/eslint-plugin-import/node_modules/debug": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", @@ -6725,6 +6678,18 @@ "node": ">=0.10.0" } }, + "node_modules/eslint-plugin-import/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/eslint-plugin-jsx-a11y": { "version": "6.8.0", "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.8.0.tgz", @@ -6755,6 +6720,28 @@ "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" } }, + "node_modules/eslint-plugin-jsx-a11y/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint-plugin-jsx-a11y/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/eslint-plugin-n": { "version": "16.6.2", "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-16.6.2.tgz", @@ -6783,6 +6770,16 @@ "eslint": ">=7.0.0" } }, + "node_modules/eslint-plugin-n/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "node_modules/eslint-plugin-n/node_modules/globals": { "version": "13.24.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", @@ -6798,26 +6795,23 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint-plugin-n/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "node_modules/eslint-plugin-n/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "dependencies": { - "yallist": "^4.0.0" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=10" + "node": "*" } }, "node_modules/eslint-plugin-n/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, "bin": { "semver": "bin/semver.js" }, @@ -6825,12 +6819,6 @@ "node": ">=10" } }, - "node_modules/eslint-plugin-n/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/eslint-plugin-promise": { "version": "6.1.1", "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.1.1.tgz", @@ -6885,6 +6873,16 @@ "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" } }, + "node_modules/eslint-plugin-react/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "node_modules/eslint-plugin-react/node_modules/doctrine": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", @@ -6897,6 +6895,18 @@ "node": ">=0.10.0" } }, + "node_modules/eslint-plugin-react/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/eslint-plugin-react/node_modules/resolve": { "version": "2.0.0-next.5", "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", @@ -6915,31 +6925,34 @@ } }, "node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, "dependencies": { "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" + "estraverse": "^4.1.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">=8.0.0" + } + }, + "node_modules/eslint-scope/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" } }, "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", "dev": true, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">=10" } }, "node_modules/eslint/node_modules/ansi-styles": { @@ -6957,6 +6970,16 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "node_modules/eslint/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -7003,6 +7026,34 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/eslint/node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/eslint/node_modules/globals": { "version": "13.24.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", @@ -7027,6 +7078,18 @@ "node": ">=8" } }, + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/eslint/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -7056,10 +7119,22 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", "dev": true, "dependencies": { "estraverse": "^5.1.0" @@ -7192,12 +7267,6 @@ "node": ">= 0.10.0" } }, - "node_modules/express/node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "dev": true - }, "node_modules/express/node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -7213,26 +7282,6 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, - "node_modules/express/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -7278,6 +7327,12 @@ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true }, + "node_modules/fast-uri": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.1.tgz", + "integrity": "sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==", + "dev": true + }, "node_modules/fastest-levenshtein": { "version": "1.0.16", "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", @@ -7288,9 +7343,9 @@ } }, "node_modules/fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", "dev": true, "dependencies": { "reusify": "^1.0.4" @@ -7321,9 +7376,9 @@ } }, "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, "dependencies": { "to-regex-range": "^5.0.1" @@ -7431,9 +7486,9 @@ "integrity": "sha512-97PMG/aywoYpB4IvbvUJi0RQi8vearvU0oov1WW3k0WZPBMrTQVqekSX5CjSG/M4Q3i6A/0FKXC7RyAoAUUSPw==" }, "node_modules/flatted": { - "version": "3.2.9", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", - "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", "dev": true }, "node_modules/follow-redirects": { @@ -7489,9 +7544,9 @@ "integrity": "sha512-Ov8XdJpP6X+hernpF89CzkDHBiXEsBzFUX2ftmG2QLw+2ZqiK2RirUbUy2IABxBXZrBzHgzm8GZyZ5rd+cAU5Q==" }, "node_modules/fs-monkey": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.5.tgz", - "integrity": "sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.6.tgz", + "integrity": "sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==", "dev": true }, "node_modules/fs.realpath": { @@ -7500,6 +7555,20 @@ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "dev": true }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, "node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", @@ -7574,13 +7643,14 @@ } }, "node_modules/get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" }, "engines": { "node": ">= 0.4" @@ -7590,9 +7660,9 @@ } }, "node_modules/get-tsconfig": { - "version": "4.7.2", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.2.tgz", - "integrity": "sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==", + "version": "4.7.6", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.6.tgz", + "integrity": "sha512-ZAqrLlu18NbDdRaHq+AKXzAmqIUPswPWKUchfytdAjiRFnCe5ojG2bstg6mRiZabkKfCoL/e98pbBELIV/YCeA==", "dev": true, "dependencies": { "resolve-pkg-maps": "^1.0.0" @@ -7605,6 +7675,7 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "dependencies": { "fs.realpath": "^1.0.0", @@ -7639,22 +7710,44 @@ "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", "dev": true }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, "engines": { "node": ">=4" } }, "node_modules/globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", "dev": true, "dependencies": { - "define-properties": "^1.1.3" + "define-properties": "^1.2.1", + "gopd": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -7741,9 +7834,9 @@ } }, "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", "engines": { "node": ">= 0.4" }, @@ -7763,11 +7856,11 @@ } }, "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dependencies": { - "has-symbols": "^1.0.2" + "has-symbols": "^1.0.3" }, "engines": { "node": ">= 0.4" @@ -7777,9 +7870,9 @@ } }, "node_modules/hasown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", - "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "dependencies": { "function-bind": "^1.1.2" }, @@ -7807,10 +7900,46 @@ "wbuf": "^1.1.0" } }, + "node_modules/hpack.js/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/hpack.js/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/hpack.js/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/hpack.js/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/html-entities": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.4.0.tgz", - "integrity": "sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ==", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.5.2.tgz", + "integrity": "sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==", "dev": true, "funding": [ { @@ -7910,9 +8039,9 @@ } }, "node_modules/ignore": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", - "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, "engines": { "node": ">= 4" @@ -7934,9 +8063,9 @@ } }, "node_modules/import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", + "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", "dev": true, "dependencies": { "pkg-dir": "^4.2.0", @@ -8029,6 +8158,7 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", "dev": true, "dependencies": { "once": "^1.3.0", @@ -8042,12 +8172,12 @@ "dev": true }, "node_modules/internal-slot": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz", - "integrity": "sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", "dev": true, "dependencies": { - "get-intrinsic": "^1.2.2", + "es-errors": "^1.3.0", "hasown": "^2.0.0", "side-channel": "^1.0.4" }, @@ -8084,9 +8214,9 @@ } }, "node_modules/ipaddr.js": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz", - "integrity": "sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz", + "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==", "dev": true, "engines": { "node": ">= 10" @@ -8108,14 +8238,16 @@ } }, "node_modules/is-array-buffer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", - "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -8209,11 +8341,29 @@ } }, "node_modules/is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.0.tgz", + "integrity": "sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==", "dependencies": { - "hasown": "^2.0.0" + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", + "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", + "dev": true, + "dependencies": { + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -8297,18 +8447,21 @@ } }, "node_modules/is-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", - "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", "dev": true, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", "dev": true, "engines": { "node": ">= 0.4" @@ -8390,21 +8543,27 @@ } }, "node_modules/is-set": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", - "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", "dev": true, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2" + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -8453,12 +8612,12 @@ } }, "node_modules/is-typed-array": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", - "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", "dev": true, "dependencies": { - "which-typed-array": "^1.1.11" + "which-typed-array": "^1.1.14" }, "engines": { "node": ">= 0.4" @@ -8468,10 +8627,13 @@ } }, "node_modules/is-weakmap": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", - "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", "dev": true, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -8489,13 +8651,16 @@ } }, "node_modules/is-weakset": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", - "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", + "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -8606,7 +8771,6 @@ "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true, "bin": { "jsesc": "bin/jsesc" }, @@ -8688,9 +8852,9 @@ "integrity": "sha512-cn9vpa5YLWF8WtgCzrWu9nII9O2AB5gXMpbrAPuDjlytPVdopnPBBAGyoa6101EHIy2ZyII+w0BeG4mWc5RyEg==" }, "node_modules/language-subtag-registry": { - "version": "0.3.22", - "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz", - "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==", + "version": "0.3.23", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz", + "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==", "dev": true }, "node_modules/language-tags": { @@ -8706,9 +8870,9 @@ } }, "node_modules/launch-editor": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.1.tgz", - "integrity": "sha512-eB/uXmFVpY4zezmGp5XtU21kwo7GBbKB+EQ+UZeWtGb9yAM5xt/Evk+lYH3eRNAtId+ej4u7TYPFZ07w4s7rRw==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.8.1.tgz", + "integrity": "sha512-elBx2l/tp9z99X5H/qev8uyDywVh0VXAwEbjk8kJhnc5grOFkGh7aW6q55me9xnYbss261XtnUrysZ+XvGbhQA==", "dev": true, "dependencies": { "picocolors": "^1.0.0", @@ -8851,12 +9015,12 @@ } }, "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", + "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", "dev": true, "dependencies": { - "braces": "^3.0.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" }, "engines": { @@ -8912,15 +9076,18 @@ "dev": true }, "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", "dev": true, "dependencies": { - "brace-expansion": "^1.1.7" + "brace-expansion": "^2.0.1" }, "engines": { - "node": "*" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/minimist": { @@ -8935,8 +9102,7 @@ "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/multicast-dns": { "version": "7.2.5", @@ -8982,9 +9148,9 @@ } }, "node_modules/node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", "dev": true }, "node_modules/normalize-path": { @@ -9017,10 +9183,13 @@ } }, "node_modules/object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", "dev": true, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -9067,28 +9236,29 @@ } }, "node_modules/object.entries": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.7.tgz", - "integrity": "sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==", + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz", + "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" } }, "node_modules/object.fromentries": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", - "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -9098,39 +9268,45 @@ } }, "node_modules/object.groupby": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.1.tgz", - "integrity": "sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" } }, "node_modules/object.hasown": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.3.tgz", - "integrity": "sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.4.tgz", + "integrity": "sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg==", "dev": true, "dependencies": { - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/object.values": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", - "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", + "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -9208,17 +9384,17 @@ } }, "node_modules/optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, "dependencies": { - "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" }, "engines": { "node": ">= 0.8.0" @@ -9379,10 +9555,9 @@ } }, "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==" }, "node_modules/picomatch": { "version": "2.3.1", @@ -9482,9 +9657,9 @@ } }, "node_modules/pkg-dir/node_modules/yocto-queue": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", - "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.1.1.tgz", + "integrity": "sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==", "dev": true, "engines": { "node": ">=12.20" @@ -9506,6 +9681,15 @@ "tinyqueue": "^2.0.3" } }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -9981,26 +10165,19 @@ } }, "node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dev": true, "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" } }, - "node_modules/readable-stream/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, "node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -10034,15 +10211,16 @@ } }, "node_modules/reflect.getprototypeof": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.4.tgz", - "integrity": "sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz", + "integrity": "sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.1", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", "globalthis": "^1.0.3", "which-builtin-type": "^1.1.3" }, @@ -10072,9 +10250,9 @@ } }, "node_modules/regenerator-runtime": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", - "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==" + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" }, "node_modules/regenerator-transform": { "version": "0.15.2", @@ -10086,13 +10264,14 @@ } }, "node_modules/regexp.prototype.flags": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", - "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "set-function-name": "^2.0.0" + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" }, "engines": { "node": ">= 0.4" @@ -10231,6 +10410,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, "dependencies": { "glob": "^7.1.3" @@ -10276,13 +10456,13 @@ "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==" }, "node_modules/safe-array-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz", - "integrity": "sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", + "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1", + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", "has-symbols": "^1.0.3", "isarray": "^2.0.5" }, @@ -10294,21 +10474,38 @@ } }, "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] }, "node_modules/safe-regex-test": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", "is-regex": "^1.1.4" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -10324,9 +10521,9 @@ "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==" }, "node_modules/scheduler": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", - "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", "dependencies": { "loose-envify": "^1.1.0" } @@ -10351,15 +10548,15 @@ } }, "node_modules/schema-utils/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, "dependencies": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "require-from-string": "^2.0.2" }, "funding": { "type": "github", @@ -10581,13 +10778,14 @@ } }, "node_modules/set-function-name": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", - "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", "dependencies": { - "define-data-property": "^1.0.1", + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.0" + "has-property-descriptors": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -10642,14 +10840,18 @@ } }, "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", "dev": true, "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -10752,20 +10954,6 @@ "wbuf": "^1.7.3" } }, - "node_modules/spdy-transport/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/statuses": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", @@ -10776,43 +10964,50 @@ } }, "node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "dev": true, "dependencies": { - "safe-buffer": "~5.1.0" + "safe-buffer": "~5.2.0" } }, "node_modules/string.prototype.matchall": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz", - "integrity": "sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==", + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz", + "integrity": "sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.5", - "regexp.prototype.flags": "^1.5.0", - "set-function-name": "^2.0.0", - "side-channel": "^1.0.4" + "internal-slot": "^1.0.7", + "regexp.prototype.flags": "^1.5.2", + "set-function-name": "^2.0.2", + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trim": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", - "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", + "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -10822,28 +11017,31 @@ } }, "node_modules/string.prototype.trimend": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", - "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", + "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimstart": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", - "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -10952,9 +11150,9 @@ } }, "node_modules/terser": { - "version": "5.27.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.27.0.tgz", - "integrity": "sha512-bi1HRwVRskAjheeYl291n3JC4GgO/Ty4z1nVs5AAsmonJulGxpSektecnNedrwK9C7vpvVtcX3cw00VSLt7U2A==", + "version": "5.31.6", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.6.tgz", + "integrity": "sha512-PQ4DAriWzKj+qgehQ7LK5bQqCFNMmlhjR2PFFLuqGCpuCAauxemVBWwWOxo3UIwWQx8+Pr61Df++r76wDmkQBg==", "dev": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", @@ -11092,12 +11290,12 @@ } }, "node_modules/ts-api-utils": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz", - "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", + "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", "dev": true, "engines": { - "node": ">=16.13.0" + "node": ">=16" }, "peerDependencies": { "typescript": ">=4.2.0" @@ -11170,29 +11368,30 @@ } }, "node_modules/typed-array-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", - "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1", - "is-typed-array": "^1.1.10" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" } }, "node_modules/typed-array-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", - "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" @@ -11202,16 +11401,17 @@ } }, "node_modules/typed-array-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", - "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", "dev": true, "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" @@ -11221,14 +11421,20 @@ } }, "node_modules/typed-array-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", - "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", + "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "is-typed-array": "^1.1.9" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -11263,9 +11469,9 @@ } }, "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "version": "6.19.6", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.6.tgz", + "integrity": "sha512-e/vggGopEfTKSvj4ihnOLTsqhrKRN3LeO6qSN/GxohhuRv8qH9bNQ4B8W7e/vFL+0XTnmHPB4/kegunZGA4Org==", "devOptional": true }, "node_modules/unicode-canonical-property-names-ecmascript": { @@ -11336,9 +11542,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", + "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", "dev": true, "funding": [ { @@ -11355,8 +11561,8 @@ } ], "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" + "escalade": "^3.1.2", + "picocolors": "^1.0.1" }, "bin": { "update-browserslist-db": "cli.js" @@ -11500,9 +11706,9 @@ } }, "node_modules/watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", + "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", "dev": true, "dependencies": { "glob-to-regexp": "^0.4.1", @@ -11727,28 +11933,6 @@ "node": ">=10.13.0" } }, - "node_modules/webpack/node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/webpack/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, "node_modules/webpack/node_modules/schema-utils": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", @@ -11822,13 +12006,13 @@ } }, "node_modules/which-builtin-type": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz", - "integrity": "sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.4.tgz", + "integrity": "sha512-bppkmBSsHFmIMSl8BO9TbsyzsvGjVoppt8xUiGzwiu/bhDCGxnpOKCxgqj6GuyHE0mINMDecBFPlOm2hzY084w==", "dev": true, "dependencies": { - "function.prototype.name": "^1.1.5", - "has-tostringtag": "^1.0.0", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", "is-async-function": "^2.0.0", "is-date-object": "^1.0.5", "is-finalizationregistry": "^1.0.2", @@ -11837,8 +12021,8 @@ "is-weakref": "^1.0.2", "isarray": "^2.0.5", "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.9" + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.15" }, "engines": { "node": ">= 0.4" @@ -11848,31 +12032,34 @@ } }, "node_modules/which-collection": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", - "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", "dev": true, "dependencies": { - "is-map": "^2.0.1", - "is-set": "^2.0.1", - "is-weakmap": "^2.0.1", - "is-weakset": "^2.0.1" + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/which-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz", - "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==", + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", + "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", "dev": true, "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", "for-each": "^0.3.3", "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -11887,6 +12074,15 @@ "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", "dev": true }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -11894,9 +12090,9 @@ "dev": true }, "node_modules/ws": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.15.0.tgz", - "integrity": "sha512-H/Z3H55mrcrgjFwI+5jKavgXvwQLtfPCUEp6pi35VhoB0pfcHnSoyuTzkBEZpzq49g1193CUEwIvmsjcotenYw==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", "dev": true, "engines": { "node": ">=10.0.0" diff --git a/src/Kentico.Xperience.Lucene.Admin/Client/src/templates/LuceneIndexConfigurationFormComponent.tsx b/src/Kentico.Xperience.Lucene.Admin/Client/src/templates/LuceneIndexConfigurationFormComponent.tsx index 22d1a8a..daa9647 100644 --- a/src/Kentico.Xperience.Lucene.Admin/Client/src/templates/LuceneIndexConfigurationFormComponent.tsx +++ b/src/Kentico.Xperience.Lucene.Admin/Client/src/templates/LuceneIndexConfigurationFormComponent.tsx @@ -419,9 +419,9 @@ export const LuceneIndexConfigurationFormComponent = ( isMulti closeMenuOnSelect={false} defaultValue={contentTypesValue} + placeholder="Select content types" options={options} onChange={selectContentTypes} - placeholder="Select a tag type" styles={customStyle} hideSelectedOptions={false} components={{ MultiValueRemove, ClearIndicator, Option }} diff --git a/src/Kentico.Xperience.Lucene.Admin/LuceneConfigurationModel.cs b/src/Kentico.Xperience.Lucene.Admin/LuceneConfigurationModel.cs index 3fa43e5..c2d9546 100644 --- a/src/Kentico.Xperience.Lucene.Admin/LuceneConfigurationModel.cs +++ b/src/Kentico.Xperience.Lucene.Admin/LuceneConfigurationModel.cs @@ -1,68 +1,73 @@ -using System.ComponentModel.DataAnnotations; - -using Kentico.Xperience.Admin.Base.FormAnnotations; -using Kentico.Xperience.Admin.Base.Forms; -using Kentico.Xperience.Lucene.Admin.Providers; -using Kentico.Xperience.Lucene.Core.Indexing; - -namespace Kentico.Xperience.Lucene.Admin; - -public class LuceneConfigurationModel -{ - public int Id { get; set; } - - [TextInputComponent( - Label = "Index Name", - ExplanationText = "Changing this value on an existing index without changing application code will cause the search experience to stop working.", - Order = 1)] - [Required] - [MinLength(1)] - public string IndexName { get; set; } = ""; - - [GeneralSelectorComponent(dataProviderType: typeof(LanguageOptionsProvider), Label = "Indexed Languages", Order = 2)] - public IEnumerable LanguageNames { get; set; } = Enumerable.Empty(); - - [DropDownComponent(Label = "Channel Name", DataProviderType = typeof(ChannelOptionsProvider), Order = 3)] - public string ChannelName { get; set; } = ""; - - [DropDownComponent(Label = "Indexing Strategy", DataProviderType = typeof(IndexingStrategyOptionsProvider), Order = 4)] - public string StrategyName { get; set; } = ""; - - [DropDownComponent(Label = "Lucene Analyzer", DataProviderType = typeof(AnalyzerOptionsProvider), Order = 5)] - public string AnalyzerName { get; set; } = ""; - - [TextInputComponent(Label = "Rebuild Hook")] - public string RebuildHook { get; set; } = ""; - - [LuceneIndexConfigurationComponent(Label = "Included Paths")] - public IEnumerable Paths { get; set; } = Enumerable.Empty(); - - public LuceneConfigurationModel() { } - - public LuceneConfigurationModel( - LuceneIndexModel luceneModel - ) - { - Id = luceneModel.Id; - IndexName = luceneModel.IndexName; - LanguageNames = luceneModel.LanguageNames; - ChannelName = luceneModel.ChannelName; - StrategyName = luceneModel.StrategyName; - AnalyzerName = luceneModel.AnalyzerName; - RebuildHook = luceneModel.RebuildHook; - Paths = luceneModel.Paths; - } - - public LuceneIndexModel ToLuceneModel() => - new() - { - Id = Id, - IndexName = IndexName, - LanguageNames = LanguageNames, - ChannelName = ChannelName, - AnalyzerName = AnalyzerName, - StrategyName = StrategyName, - RebuildHook = RebuildHook, - Paths = Paths - }; -} +using System.ComponentModel.DataAnnotations; + +using Kentico.Xperience.Admin.Base.FormAnnotations; +using Kentico.Xperience.Admin.Base.Forms; +using Kentico.Xperience.Lucene.Admin.Providers; +using Kentico.Xperience.Lucene.Core.Indexing; + +namespace Kentico.Xperience.Lucene.Admin; + +public class LuceneConfigurationModel +{ + public int Id { get; set; } + + [TextInputComponent( + Label = "Index Name", + ExplanationText = "Changing this value on an existing index without changing application code will cause the search experience to stop working.", + Order = 1)] + [Required] + [MinLength(1)] + public string IndexName { get; set; } = ""; + + [LuceneIndexConfigurationComponent(Label = "Included Paths", Order = 2)] + public IEnumerable Paths { get; set; } = Enumerable.Empty(); + + [GeneralSelectorComponent(dataProviderType: typeof(ReusableContentOptionsProvider), Label = "Included Reusable Content Types", Order = 3)] + public IEnumerable ReusableContentTypeNames { get; set; } = Enumerable.Empty(); + + [GeneralSelectorComponent(dataProviderType: typeof(LanguageOptionsProvider), Label = "Indexed Languages", Order = 4)] + public IEnumerable LanguageNames { get; set; } = Enumerable.Empty(); + + [DropDownComponent(Label = "Channel Name", DataProviderType = typeof(ChannelOptionsProvider), Order = 5)] + public string ChannelName { get; set; } = ""; + + [DropDownComponent(Label = "Indexing Strategy", DataProviderType = typeof(IndexingStrategyOptionsProvider), Order = 6)] + public string StrategyName { get; set; } = ""; + + [DropDownComponent(Label = "Lucene Analyzer", DataProviderType = typeof(AnalyzerOptionsProvider), Order = 7)] + public string AnalyzerName { get; set; } = ""; + + [TextInputComponent(Label = "Rebuild Hook", Order = 8)] + public string RebuildHook { get; set; } = ""; + + public LuceneConfigurationModel() { } + + public LuceneConfigurationModel( + LuceneIndexModel luceneModel + ) + { + Id = luceneModel.Id; + IndexName = luceneModel.IndexName; + LanguageNames = luceneModel.LanguageNames; + ChannelName = luceneModel.ChannelName; + StrategyName = luceneModel.StrategyName; + AnalyzerName = luceneModel.AnalyzerName; + RebuildHook = luceneModel.RebuildHook; + Paths = luceneModel.Paths; + ReusableContentTypeNames = luceneModel.ReusableContentTypeNames; + } + + public LuceneIndexModel ToLuceneModel() => + new() + { + Id = Id, + IndexName = IndexName, + LanguageNames = LanguageNames, + ChannelName = ChannelName, + AnalyzerName = AnalyzerName, + StrategyName = StrategyName, + RebuildHook = RebuildHook, + Paths = Paths, + ReusableContentTypeNames = ReusableContentTypeNames + }; +} diff --git a/src/Kentico.Xperience.Lucene.Admin/Providers/ReusableContentOptionsProvider.cs b/src/Kentico.Xperience.Lucene.Admin/Providers/ReusableContentOptionsProvider.cs new file mode 100644 index 0000000..7c8172a --- /dev/null +++ b/src/Kentico.Xperience.Lucene.Admin/Providers/ReusableContentOptionsProvider.cs @@ -0,0 +1,68 @@ +using CMS.DataEngine; + +using Kentico.Xperience.Admin.Base.FormAnnotations; +using Kentico.Xperience.Admin.Base.Forms; + +namespace Kentico.Xperience.Lucene.Admin.Providers; +internal class ReusableContentOptionsProvider : IGeneralSelectorDataProvider +{ + public async Task> GetItemsAsync(string searchTerm, int pageIndex, CancellationToken cancellationToken) + { + // Prepares a query for retrieving objects + var itemQuery = DataClassInfoProvider.ProviderObject + .Get() + .WhereEquals(nameof(DataClassInfo.ClassContentTypeType), "Reusable"); + // If a search term is entered, only loads data whose first name starts with the term + if (!string.IsNullOrEmpty(searchTerm)) + { + itemQuery.WhereStartsWith(nameof(DataClassInfo.ClassDisplayName), searchTerm); + } + + // Ensures paging of items + itemQuery.Page(pageIndex, 20); + + // Retrieves the reusable content types and converts them into ObjectSelectorListItem options + var items = (await itemQuery.GetEnumerableTypedResultAsync()).Select(x => new ObjectSelectorListItem() + { + Value = x.ClassName, + Text = x.ClassDisplayName, + IsValid = true + }); + + return new PagedSelectListItems() + { + NextPageAvailable = itemQuery.NextPageAvailable, + Items = items + }; + } + + // Returns ObjectSelectorListItem options for all item values that are currently selected + public async Task>> GetSelectedItemsAsync(IEnumerable selectedValues, CancellationToken cancellationToken) + { + var itemQuery = DataClassInfoProvider.ProviderObject + .Get() + .WhereEquals(nameof(DataClassInfo.ClassContentTypeType), "Reusable"); + + var items = (await itemQuery.GetEnumerableTypedResultAsync()).Select(x => new ObjectSelectorListItem() + { + Value = x.ClassName, + Text = x.ClassDisplayName, + IsValid = true + }); + + var selectedItems = new List>(); + if (selectedValues is not null) + { + foreach (string? value in selectedValues) + { + var item = items.FirstOrDefault(x => x.Value == value); + + if (item != default) + { + selectedItems.Add(item); + } + } + } + return selectedItems; + } +} diff --git a/src/Kentico.Xperience.Lucene.Admin/UIPages/BaseIndexEditPage.cs b/src/Kentico.Xperience.Lucene.Admin/UIPages/BaseIndexEditPage.cs index 2fb85c1..0047f2c 100644 --- a/src/Kentico.Xperience.Lucene.Admin/UIPages/BaseIndexEditPage.cs +++ b/src/Kentico.Xperience.Lucene.Admin/UIPages/BaseIndexEditPage.cs @@ -1,75 +1,75 @@ -using System.Text; - -using Kentico.Xperience.Admin.Base; -using Kentico.Xperience.Admin.Base.Forms; -using Kentico.Xperience.Lucene.Core.Indexing; - -using IFormItemCollectionProvider = Kentico.Xperience.Admin.Base.Forms.Internal.IFormItemCollectionProvider; - -namespace Kentico.Xperience.Lucene.Admin; - -internal abstract class BaseIndexEditPage : ModelEditPage -{ - protected readonly ILuceneConfigurationStorageService StorageService; - - private readonly ILuceneIndexManager indexManager; - - protected BaseIndexEditPage( - IFormItemCollectionProvider formItemCollectionProvider, - IFormDataBinder formDataBinder, - ILuceneConfigurationStorageService storageService, - ILuceneIndexManager indexManager) - : base(formItemCollectionProvider, formDataBinder) - { - this.indexManager = indexManager; - StorageService = storageService; - } - - protected async Task ValidateAndProcess(LuceneConfigurationModel configuration) - { - configuration.IndexName = RemoveWhitespacesUsingStringBuilder(configuration.IndexName ?? ""); - - if (StorageService.GetIndexIds().Exists(x => x == configuration.Id)) - { - bool edited = await StorageService.TryEditIndexAsync(configuration.ToLuceneModel()); - - if (edited) - { - return IndexModificationResult.Success; - } - - return IndexModificationResult.Failure; - } - else - { - if (!string.IsNullOrWhiteSpace(configuration.IndexName)) - { - indexManager.AddIndex(configuration.ToLuceneModel()); - - return IndexModificationResult.Success; - } - - return IndexModificationResult.Failure; - } - } - - protected static string RemoveWhitespacesUsingStringBuilder(string source) - { - var builder = new StringBuilder(source.Length); - for (int i = 0; i < source.Length; i++) - { - char c = source[i]; - if (!char.IsWhiteSpace(c)) - { - builder.Append(c); - } - } - return source.Length == builder.Length ? source : builder.ToString(); - } -} - -internal enum IndexModificationResult -{ - Success, - Failure -} +using System.Text; + +using Kentico.Xperience.Admin.Base; +using Kentico.Xperience.Admin.Base.Forms; +using Kentico.Xperience.Lucene.Core.Indexing; + +using IFormItemCollectionProvider = Kentico.Xperience.Admin.Base.Forms.Internal.IFormItemCollectionProvider; + +namespace Kentico.Xperience.Lucene.Admin; + +internal abstract class BaseIndexEditPage : ModelEditPage +{ + protected readonly ILuceneConfigurationStorageService StorageService; + + private readonly ILuceneIndexManager indexManager; + + protected BaseIndexEditPage( + IFormItemCollectionProvider formItemCollectionProvider, + IFormDataBinder formDataBinder, + ILuceneConfigurationStorageService storageService, + ILuceneIndexManager indexManager) + : base(formItemCollectionProvider, formDataBinder) + { + this.indexManager = indexManager; + StorageService = storageService; + } + + protected async Task ValidateAndProcess(LuceneConfigurationModel configuration) + { + configuration.IndexName = RemoveWhitespacesUsingStringBuilder(configuration.IndexName ?? string.Empty); + + if (StorageService.GetIndexIds().Exists(x => x == configuration.Id)) + { + bool edited = await StorageService.TryEditIndexAsync(configuration.ToLuceneModel()); + + if (edited) + { + return IndexModificationResult.Success; + } + + return IndexModificationResult.Failure; + } + else + { + if (!string.IsNullOrWhiteSpace(configuration.IndexName)) + { + indexManager.AddIndex(configuration.ToLuceneModel()); + + return IndexModificationResult.Success; + } + + return IndexModificationResult.Failure; + } + } + + protected static string RemoveWhitespacesUsingStringBuilder(string source) + { + var builder = new StringBuilder(source.Length); + for (int i = 0; i < source.Length; i++) + { + char c = source[i]; + if (!char.IsWhiteSpace(c)) + { + builder.Append(c); + } + } + return source.Length == builder.Length ? source : builder.ToString(); + } +} + +internal enum IndexModificationResult +{ + Success, + Failure +} diff --git a/src/Kentico.Xperience.Lucene.Core/Indexing/DefaultLuceneClient.cs b/src/Kentico.Xperience.Lucene.Core/Indexing/DefaultLuceneClient.cs index 11e5b80..42fbf10 100644 --- a/src/Kentico.Xperience.Lucene.Core/Indexing/DefaultLuceneClient.cs +++ b/src/Kentico.Xperience.Lucene.Core/Indexing/DefaultLuceneClient.cs @@ -1,349 +1,392 @@ -using CMS.ContentEngine; -using CMS.Core; -using CMS.DataEngine; -using CMS.Helpers; -using CMS.Helpers.Caching.Abstractions; -using CMS.Websites; - -using Kentico.Xperience.Lucene.Core.Search; - -using Lucene.Net.Documents; -using Lucene.Net.Index; -using Lucene.Net.Search; - -using Microsoft.Extensions.DependencyInjection; - -namespace Kentico.Xperience.Lucene.Core.Indexing; - -/// -/// Default implementation of . -/// -internal class DefaultLuceneClient : ILuceneClient -{ - private readonly ILuceneIndexService luceneIndexService; - private readonly ILuceneSearchService luceneSearchService; - private readonly IContentQueryExecutor executor; - private readonly IServiceProvider serviceProvider; - private readonly IInfoProvider languageProvider; - private readonly IInfoProvider channelProvider; - private readonly IConversionService conversionService; - private readonly IProgressiveCache cache; - private readonly IEventLogService log; - private readonly ICacheAccessor cacheAccessor; - private readonly ILuceneIndexManager indexManager; - - internal const string CACHEKEY_STATISTICS = "Lucene|ListIndices"; - - public DefaultLuceneClient( - ICacheAccessor cacheAccessor, - ILuceneIndexService luceneIndexService, - ILuceneSearchService luceneSearchService, - IContentQueryExecutor executor, - IServiceProvider serviceProvider, - IInfoProvider languageProvider, - IInfoProvider channelProvider, - IConversionService conversionService, - IProgressiveCache cache, - IEventLogService log, - ILuceneIndexManager indexManager - ) - { - this.cacheAccessor = cacheAccessor; - this.luceneIndexService = luceneIndexService; - this.luceneSearchService = luceneSearchService; - this.executor = executor; - this.serviceProvider = serviceProvider; - this.languageProvider = languageProvider; - this.channelProvider = channelProvider; - this.conversionService = conversionService; - this.cache = cache; - this.log = log; - this.indexManager = indexManager; - this.indexManager = indexManager; - } - - /// - public Task DeleteRecords(IEnumerable itemGuids, string indexName) - { - if (string.IsNullOrEmpty(indexName)) - { - throw new ArgumentNullException(nameof(indexName)); - } - - if (itemGuids == null || !itemGuids.Any()) - { - return Task.FromResult(0); - } - - return DeleteRecordsInternal(itemGuids, indexName); - } - - - /// - public Task> GetStatistics(CancellationToken cancellationToken) - { - var stats = indexManager.GetAllIndices().Select(i => - { - var statistics = luceneSearchService.UseSearcher(i, s => new LuceneIndexStatisticsModel() - { - Name = i.IndexName, - Entries = s.IndexReader.NumDocs - }); - - var dir = new DirectoryInfo(i.StorageContext.GetPublishedIndex().Path); - statistics.UpdatedAt = dir.LastWriteTime; - return statistics; - }).ToList(); - - return Task.FromResult>(stats); - } - - /// - public Task Rebuild(string indexName, CancellationToken? cancellationToken) - { - if (string.IsNullOrEmpty(indexName)) - { - throw new ArgumentNullException(nameof(indexName)); - } - - var luceneIndex = indexManager.GetRequiredIndex(indexName); - return RebuildInternal(luceneIndex, cancellationToken); - } - - - /// - public Task UpsertRecords(IEnumerable documents, string indexName, CancellationToken cancellationToken) - { - if (string.IsNullOrEmpty(indexName)) - { - throw new ArgumentNullException(nameof(indexName)); - } - - if (documents == null || !documents.Any()) - { - return Task.FromResult(0); - } - - return UpsertRecordsInternal(documents, indexName); - } - - private Task DeleteRecordsInternal(IEnumerable itemGuids, string indexName) - { - var index = indexManager.GetIndex(indexName); - if (index != null) - { - luceneIndexService.UseWriter(index, (writer) => - { - var booleanQuery = new BooleanQuery(); - foreach (string guid in itemGuids) - { - var termQuery = new TermQuery(new Term(nameof(IIndexEventItemModel.ItemGuid), guid)); - booleanQuery.Add(termQuery, Occur.SHOULD); // Match any of the object IDs - } - writer.DeleteDocuments(booleanQuery); - return "OK"; - }, index.StorageContext.GetLastGeneration(true)); - } - return Task.FromResult(0); - } - - private async Task RebuildInternal(LuceneIndex luceneIndex, CancellationToken? cancellationToken) - { - // Clear statistics cache so listing displays updated data after rebuild - cacheAccessor.Remove(CACHEKEY_STATISTICS); - - luceneIndexService.ResetIndex(luceneIndex); - - var indexedItems = new List(); - foreach (var includedPathAttribute in luceneIndex.IncludedPaths) - { - var pathMatch = - includedPathAttribute.AliasPath.EndsWith("/%", StringComparison.OrdinalIgnoreCase) - ? PathMatch.Children(includedPathAttribute.AliasPath[..^2]) - : PathMatch.Single(includedPathAttribute.AliasPath); - - foreach (string language in luceneIndex.LanguageNames) - { - var queryBuilder = new ContentItemQueryBuilder(); - - if (includedPathAttribute.ContentTypes != null && includedPathAttribute.ContentTypes.Count > 0) - { - foreach (var contentType in includedPathAttribute.ContentTypes) - { - queryBuilder.ForContentType(contentType.ContentTypeName, config => config.ForWebsite(luceneIndex.WebSiteChannelName, includeUrlPath: true, pathMatch: pathMatch)); - } - } - queryBuilder.InLanguage(language); - - var webpages = await executor.GetWebPageResult(queryBuilder, container => container, cancellationToken: cancellationToken ?? default); - - foreach (var page in webpages) - { - var item = await MapToEventItem(page); - indexedItems.Add(item); - } - } - } - - log.LogInformation( - "Kentico.Xperience.Lucene", - "INDEX_REBUILD", - $"Rebuilding index [{luceneIndex.IndexName}]. {indexedItems.Count} web page items queued for re-indexing" - ); - - indexedItems.ForEach(item => LuceneQueueWorker.EnqueueLuceneQueueItem(new LuceneQueueItem(item, LuceneTaskType.PUBLISH_INDEX, luceneIndex.IndexName))); - } - - private async Task MapToEventItem(IWebPageContentQueryDataContainer content) - { - var languages = await GetAllLanguages(); - - string languageName = languages.FirstOrDefault(l => l.ContentLanguageID == content.ContentItemCommonDataContentLanguageID)?.ContentLanguageName ?? ""; - - var websiteChannels = await GetAllWebsiteChannels(); - - string channelName = websiteChannels.FirstOrDefault(c => c.WebsiteChannelID == content.WebPageItemWebsiteChannelID).ChannelName ?? ""; - - var item = new IndexEventWebPageItemModel( - content.WebPageItemID, - content.WebPageItemGUID, - languageName, - content.ContentTypeName, - content.WebPageItemName, - content.ContentItemIsSecured, - content.ContentItemContentTypeID, - content.ContentItemCommonDataContentLanguageID, - channelName, - content.WebPageItemTreePath, - content.WebPageItemOrder); - - return item; - } - - private Task UpsertRecordsInternal(IEnumerable documents, string indexName) - { - var index = indexManager.GetIndex(indexName); - if (index != null) - { - var strategy = serviceProvider.GetRequiredStrategy(index); - // indexing facet requires separate index for toxonomy - if (strategy.FacetsConfigFactory() is { } facetsConfig) - { - int result = luceneIndexService.UseIndexAndTaxonomyWriter(index, (writer, taxonomyWriter) => - { - int count = 0; - foreach (var document in documents) - { - // for now all changes are creates, update to be done later - // delete old document, there is no upsert nor update in Lucene - - string? id = document.Get(nameof(IIndexEventItemModel.ItemGuid)); - string? language = document.Get(nameof(IIndexEventItemModel.LanguageName)); - if (id is not null && language is not null) - { - // for now all changes are creates, update to be done later - // delete old document, there is no upsert nor update in Lucene - var multiTermQuery = new BooleanQuery - { - { new TermQuery(new Term(nameof(IIndexEventItemModel.ItemGuid), id)), Occur.MUST }, - { new TermQuery(new Term(nameof(IIndexEventItemModel.LanguageName), language)), Occur.MUST } - }; - - writer.DeleteDocuments(multiTermQuery); - } - - // add new one -#pragma warning disable S2589 // Boolean expressions should not be gratuitous - if (document is not null) - { - writer.AddDocument(facetsConfig.Build(taxonomyWriter, document)); - count++; - } -#pragma warning restore S2589 // Boolean expressions should not be gratuitous -#pragma warning disable S2583 // Conditionally executed code should be reachable - if (count % 1000 == 0) - { - taxonomyWriter.Commit(); - } -#pragma warning restore S2583 // Conditionally executed code should be reachable - } - taxonomyWriter.Commit(); - - return count; - }, index.StorageContext.GetLastGeneration(true)); - - return Task.FromResult(result); - } - else // no facets, only index writer opened - { - int result = luceneIndexService.UseWriter(index, (writer) => - { - int count = 0; - foreach (var document in documents) - { - string? id = document.Get(nameof(IIndexEventItemModel.ItemGuid)); - string? language = document.Get(nameof(IIndexEventItemModel.LanguageName)); - if (id is not null && language is not null) - { - // for now all changes are creates, update to be done later - // delete old document, there is no upsert nor update in Lucene - var multiTermQuery = new BooleanQuery - { - { new TermQuery(new Term(nameof(IIndexEventItemModel.ItemGuid), id)), Occur.MUST }, - { new TermQuery(new Term(nameof(IIndexEventItemModel.LanguageName), language)), Occur.MUST } - }; - - writer.DeleteDocuments(multiTermQuery); - } - // add new one -#pragma warning disable S2589 // Boolean expressions should not be gratuitous - if (document is not null) - { - writer.AddDocument(document); - count++; - } -#pragma warning restore S2589 // Boolean expressions should not be gratuitous - } - return count; - }, index.StorageContext.GetLastGeneration(true)); - - return Task.FromResult(result); - } - } - return Task.FromResult(0); - } - - private Task> GetAllLanguages() => - cache.LoadAsync(async cs => - { - var results = await languageProvider.Get().GetEnumerableTypedResultAsync(); - - cs.GetCacheDependency = () => CacheHelper.GetCacheDependency($"{ContentLanguageInfo.OBJECT_TYPE}|all"); - - return results; - }, new CacheSettings(5, nameof(DefaultLuceneClient), nameof(GetAllLanguages))); - - private Task> GetAllWebsiteChannels() => - cache.LoadAsync(async cs => - { - - var results = await channelProvider.Get() - .Source(s => s.Join(nameof(ChannelInfo.ChannelID), nameof(WebsiteChannelInfo.WebsiteChannelChannelID))) - .Columns(nameof(WebsiteChannelInfo.WebsiteChannelID), nameof(ChannelInfo.ChannelName)) - .GetDataContainerResultAsync(); - - cs.GetCacheDependency = () => CacheHelper.GetCacheDependency(new[] { $"{ChannelInfo.OBJECT_TYPE}|all", $"{WebsiteChannelInfo.OBJECT_TYPE}|all" }); - - var items = new List<(int WebsiteChannelID, string ChannelName)>(); - - foreach (var item in results) - { - if (item.TryGetValue(nameof(WebsiteChannelInfo.WebsiteChannelID), out object channelID) && item.TryGetValue(nameof(ChannelInfo.ChannelName), out object channelName)) - { - items.Add(new(conversionService.GetInteger(channelID, 0), conversionService.GetString(channelName, ""))); - } - } - - return items.AsEnumerable(); - }, new CacheSettings(5, nameof(DefaultLuceneClient), nameof(GetAllWebsiteChannels))); -} +using CMS.ContentEngine; +using CMS.Core; +using CMS.DataEngine; +using CMS.Helpers; +using CMS.Helpers.Caching.Abstractions; +using CMS.Websites; + +using Kentico.Xperience.Lucene.Core.Search; + +using Lucene.Net.Documents; +using Lucene.Net.Index; +using Lucene.Net.Search; + +using Microsoft.Extensions.DependencyInjection; + +namespace Kentico.Xperience.Lucene.Core.Indexing; + +/// +/// Default implementation of . +/// +internal class DefaultLuceneClient : ILuceneClient +{ + private readonly ILuceneIndexService luceneIndexService; + private readonly ILuceneSearchService luceneSearchService; + private readonly IContentQueryExecutor executor; + private readonly IServiceProvider serviceProvider; + private readonly IInfoProvider languageProvider; + private readonly IInfoProvider channelProvider; + private readonly IConversionService conversionService; + private readonly IProgressiveCache cache; + private readonly IEventLogService log; + private readonly ICacheAccessor cacheAccessor; + private readonly ILuceneIndexManager indexManager; + + internal const string CACHEKEY_STATISTICS = "Lucene|ListIndices"; + + public DefaultLuceneClient( + ICacheAccessor cacheAccessor, + ILuceneIndexService luceneIndexService, + ILuceneSearchService luceneSearchService, + IContentQueryExecutor executor, + IServiceProvider serviceProvider, + IInfoProvider languageProvider, + IInfoProvider channelProvider, + IConversionService conversionService, + IProgressiveCache cache, + IEventLogService log, + ILuceneIndexManager indexManager + ) + { + this.cacheAccessor = cacheAccessor; + this.luceneIndexService = luceneIndexService; + this.luceneSearchService = luceneSearchService; + this.executor = executor; + this.serviceProvider = serviceProvider; + this.languageProvider = languageProvider; + this.channelProvider = channelProvider; + this.conversionService = conversionService; + this.cache = cache; + this.log = log; + this.indexManager = indexManager; + this.indexManager = indexManager; + } + + /// + public Task DeleteRecords(IEnumerable itemGuids, string indexName) + { + if (string.IsNullOrEmpty(indexName)) + { + throw new ArgumentNullException(nameof(indexName)); + } + + if (itemGuids == null || !itemGuids.Any()) + { + return Task.FromResult(0); + } + + return DeleteRecordsInternal(itemGuids, indexName); + } + + + /// + public Task> GetStatistics(CancellationToken cancellationToken) + { + var stats = indexManager.GetAllIndices().Select(i => + { + var statistics = luceneSearchService.UseSearcher(i, s => new LuceneIndexStatisticsModel() + { + Name = i.IndexName, + Entries = s.IndexReader.NumDocs + }); + + var dir = new DirectoryInfo(i.StorageContext.GetPublishedIndex().Path); + statistics.UpdatedAt = dir.LastWriteTime; + return statistics; + }).ToList(); + + return Task.FromResult>(stats); + } + + /// + public Task Rebuild(string indexName, CancellationToken? cancellationToken) + { + if (string.IsNullOrEmpty(indexName)) + { + throw new ArgumentNullException(nameof(indexName)); + } + + var luceneIndex = indexManager.GetRequiredIndex(indexName); + return RebuildInternal(luceneIndex, cancellationToken); + } + + + /// + public Task UpsertRecords(IEnumerable documents, string indexName, CancellationToken cancellationToken) + { + if (string.IsNullOrEmpty(indexName)) + { + throw new ArgumentNullException(nameof(indexName)); + } + + if (documents == null || !documents.Any()) + { + return Task.FromResult(0); + } + + return UpsertRecordsInternal(documents, indexName); + } + + private Task DeleteRecordsInternal(IEnumerable itemGuids, string indexName) + { + var index = indexManager.GetIndex(indexName); + if (index != null) + { + luceneIndexService.UseWriter(index, (writer) => + { + var booleanQuery = new BooleanQuery(); + foreach (string guid in itemGuids) + { + var termQuery = new TermQuery(new Term(nameof(IIndexEventItemModel.ItemGuid), guid)); + booleanQuery.Add(termQuery, Occur.SHOULD); // Match any of the object IDs + } + writer.DeleteDocuments(booleanQuery); + return "OK"; + }, index.StorageContext.GetLastGeneration(true)); + } + return Task.FromResult(0); + } + + private async Task RebuildInternal(LuceneIndex luceneIndex, CancellationToken? cancellationToken) + { + // Clear statistics cache so listing displays updated data after rebuild + cacheAccessor.Remove(CACHEKEY_STATISTICS); + + luceneIndexService.ResetIndex(luceneIndex); + + var indexedItems = new List(); + foreach (var includedPathAttribute in luceneIndex.IncludedPaths) + { + var pathMatch = + includedPathAttribute.AliasPath.EndsWith("/%", StringComparison.OrdinalIgnoreCase) + ? PathMatch.Children(includedPathAttribute.AliasPath[..^2]) + : PathMatch.Single(includedPathAttribute.AliasPath); + + foreach (string language in luceneIndex.LanguageNames) + { + if (includedPathAttribute.ContentTypes != null && includedPathAttribute.ContentTypes.Count > 0) + { + var queryBuilder = new ContentItemQueryBuilder(); + + foreach (var contentType in includedPathAttribute.ContentTypes) + { + queryBuilder.ForContentType(contentType.ContentTypeName, config => config.ForWebsite(luceneIndex.WebSiteChannelName, includeUrlPath: true, pathMatch: pathMatch)); + } + + queryBuilder.InLanguage(language); + + var webpages = await executor.GetWebPageResult(queryBuilder, container => container, cancellationToken: cancellationToken ?? default); + + foreach (var page in webpages) + { + var item = await MapToEventItem(page); + indexedItems.Add(item); + } + } + } + } + + foreach (string language in luceneIndex.LanguageNames) + { + if (luceneIndex.IncludedReusableContentTypes != null && luceneIndex.IncludedReusableContentTypes.Count > 0) + { + var queryBuilder = new ContentItemQueryBuilder(); + + foreach (string reusableContentType in luceneIndex.IncludedReusableContentTypes) + { + queryBuilder.ForContentType(reusableContentType); + } + + queryBuilder.InLanguage(language); + + var reusableItems = await executor.GetResult(queryBuilder, result => result, cancellationToken: cancellationToken ?? default); + + foreach (var reusableItem in reusableItems) + { + var item = await MapToEventReusableItem(reusableItem); + indexedItems.Add(item); + } + } + } + + log.LogInformation( + "Kentico.Xperience.Lucene", + "INDEX_REBUILD", + $"Rebuilding index [{luceneIndex.IndexName}]. {indexedItems.Count} web page items queued for re-indexing" + ); + + indexedItems.ForEach(item => LuceneQueueWorker.EnqueueLuceneQueueItem(new LuceneQueueItem(item, LuceneTaskType.PUBLISH_INDEX, luceneIndex.IndexName))); + } + + private async Task MapToEventItem(IWebPageContentQueryDataContainer content) + { + var languages = await GetAllLanguages(); + + string languageName = languages.FirstOrDefault(l => l.ContentLanguageID == content.ContentItemCommonDataContentLanguageID)?.ContentLanguageName ?? string.Empty; + + var websiteChannels = await GetAllWebsiteChannels(); + + string channelName = websiteChannels.FirstOrDefault(c => c.WebsiteChannelID == content.WebPageItemWebsiteChannelID).ChannelName ?? string.Empty; + + var item = new IndexEventWebPageItemModel( + content.WebPageItemID, + content.WebPageItemGUID, + languageName, + content.ContentTypeName, + content.WebPageItemName, + content.ContentItemIsSecured, + content.ContentItemContentTypeID, + content.ContentItemCommonDataContentLanguageID, + channelName, + content.WebPageItemTreePath, + content.WebPageItemOrder); + + return item; + } + + private async Task MapToEventReusableItem(IContentQueryDataContainer content) + { + var languages = await GetAllLanguages(); + + string languageName = languages.FirstOrDefault(l => l.ContentLanguageID == content.ContentItemCommonDataContentLanguageID)?.ContentLanguageName ?? string.Empty; + + var item = new IndexEventReusableItemModel( + content.ContentItemID, + content.ContentItemGUID, + languageName, + content.ContentTypeName, + content.ContentItemName, + content.ContentItemIsSecured, + content.ContentItemContentTypeID, + content.ContentItemCommonDataContentLanguageID); + + return item; + } + + private Task UpsertRecordsInternal(IEnumerable documents, string indexName) + { + var index = indexManager.GetIndex(indexName); + if (index != null) + { + var strategy = serviceProvider.GetRequiredStrategy(index); + // indexing facet requires separate index for toxonomy + if (strategy.FacetsConfigFactory() is { } facetsConfig) + { + int result = luceneIndexService.UseIndexAndTaxonomyWriter(index, (writer, taxonomyWriter) => + { + int count = 0; + foreach (var document in documents) + { + // for now all changes are creates, update to be done later + // delete old document, there is no upsert nor update in Lucene + + string? id = document.Get(nameof(IIndexEventItemModel.ItemGuid)); + string? language = document.Get(nameof(IIndexEventItemModel.LanguageName)); + if (id is not null && language is not null) + { + // for now all changes are creates, update to be done later + // delete old document, there is no upsert nor update in Lucene + var multiTermQuery = new BooleanQuery + { + { new TermQuery(new Term(nameof(IIndexEventItemModel.ItemGuid), id)), Occur.MUST }, + { new TermQuery(new Term(nameof(IIndexEventItemModel.LanguageName), language)), Occur.MUST } + }; + + writer.DeleteDocuments(multiTermQuery); + } + + // add new one +#pragma warning disable S2589 // Boolean expressions should not be gratuitous + if (document is not null) + { + writer.AddDocument(facetsConfig.Build(taxonomyWriter, document)); + count++; + } +#pragma warning restore S2589 // Boolean expressions should not be gratuitous +#pragma warning disable S2583 // Conditionally executed code should be reachable + if (count % 1000 == 0) + { + taxonomyWriter.Commit(); + } +#pragma warning restore S2583 // Conditionally executed code should be reachable + } + taxonomyWriter.Commit(); + + return count; + }, index.StorageContext.GetLastGeneration(true)); + + return Task.FromResult(result); + } + else // no facets, only index writer opened + { + int result = luceneIndexService.UseWriter(index, (writer) => + { + int count = 0; + foreach (var document in documents) + { + string? id = document.Get(nameof(IIndexEventItemModel.ItemGuid)); + string? language = document.Get(nameof(IIndexEventItemModel.LanguageName)); + if (id is not null && language is not null) + { + // for now all changes are creates, update to be done later + // delete old document, there is no upsert nor update in Lucene + var multiTermQuery = new BooleanQuery + { + { new TermQuery(new Term(nameof(IIndexEventItemModel.ItemGuid), id)), Occur.MUST }, + { new TermQuery(new Term(nameof(IIndexEventItemModel.LanguageName), language)), Occur.MUST } + }; + + writer.DeleteDocuments(multiTermQuery); + } + // add new one +#pragma warning disable S2589 // Boolean expressions should not be gratuitous + if (document is not null) + { + writer.AddDocument(document); + count++; + } +#pragma warning restore S2589 // Boolean expressions should not be gratuitous + } + return count; + }, index.StorageContext.GetLastGeneration(true)); + + return Task.FromResult(result); + } + } + return Task.FromResult(0); + } + + private Task> GetAllLanguages() => + cache.LoadAsync(async cs => + { + var results = await languageProvider.Get().GetEnumerableTypedResultAsync(); + + cs.GetCacheDependency = () => CacheHelper.GetCacheDependency($"{ContentLanguageInfo.OBJECT_TYPE}|all"); + + return results; + }, new CacheSettings(5, nameof(DefaultLuceneClient), nameof(GetAllLanguages))); + + private Task> GetAllWebsiteChannels() => + cache.LoadAsync(async cs => + { + + var results = await channelProvider.Get() + .Source(s => s.Join(nameof(ChannelInfo.ChannelID), nameof(WebsiteChannelInfo.WebsiteChannelChannelID))) + .Columns(nameof(WebsiteChannelInfo.WebsiteChannelID), nameof(ChannelInfo.ChannelName)) + .GetDataContainerResultAsync(); + + cs.GetCacheDependency = () => CacheHelper.GetCacheDependency(new[] { $"{ChannelInfo.OBJECT_TYPE}|all", $"{WebsiteChannelInfo.OBJECT_TYPE}|all" }); + + var items = new List<(int WebsiteChannelID, string ChannelName)>(); + + foreach (var item in results) + { + if (item.TryGetValue(nameof(WebsiteChannelInfo.WebsiteChannelID), out object channelID) && item.TryGetValue(nameof(ChannelInfo.ChannelName), out object channelName)) + { + items.Add(new(conversionService.GetInteger(channelID, 0), conversionService.GetString(channelName, string.Empty))); + } + } + + return items.AsEnumerable(); + }, new CacheSettings(5, nameof(DefaultLuceneClient), nameof(GetAllWebsiteChannels))); +} diff --git a/src/Kentico.Xperience.Lucene.Core/Indexing/DefaultLuceneConfigurationStorageService.cs b/src/Kentico.Xperience.Lucene.Core/Indexing/DefaultLuceneConfigurationStorageService.cs index 5fd6b5f..f2363c2 100644 --- a/src/Kentico.Xperience.Lucene.Core/Indexing/DefaultLuceneConfigurationStorageService.cs +++ b/src/Kentico.Xperience.Lucene.Core/Indexing/DefaultLuceneConfigurationStorageService.cs @@ -1,407 +1,474 @@ -using System.Text; - -using CMS.Base; -using CMS.DataEngine; - -namespace Kentico.Xperience.Lucene.Core.Indexing; - -internal class DefaultLuceneConfigurationStorageService : ILuceneConfigurationStorageService -{ - private readonly ILuceneIndexItemInfoProvider indexProvider; - private readonly ILuceneIncludedPathItemInfoProvider pathProvider; - private readonly ILuceneContentTypeItemInfoProvider contentTypeProvider; - private readonly ILuceneIndexLanguageItemInfoProvider languageProvider; - - public DefaultLuceneConfigurationStorageService( - ILuceneIndexItemInfoProvider indexProvider, - ILuceneIncludedPathItemInfoProvider pathProvider, - ILuceneContentTypeItemInfoProvider contentTypeProvider, - ILuceneIndexLanguageItemInfoProvider languageProvider - ) - { - this.indexProvider = indexProvider; - this.pathProvider = pathProvider; - this.contentTypeProvider = contentTypeProvider; - this.languageProvider = languageProvider; - } - - public bool TryCreateIndex(LuceneIndexModel configuration) - { - var existingIndex = indexProvider.Get() - .WhereEquals(nameof(LuceneIndexItemInfo.LuceneIndexItemIndexName), configuration.IndexName) - .TopN(1) - .FirstOrDefault(); - - if (existingIndex is not null) - { - return false; - } - - var newInfo = new LuceneIndexItemInfo() - { - LuceneIndexItemIndexName = configuration.IndexName ?? "", - LuceneIndexItemChannelName = configuration.ChannelName ?? "", - LuceneIndexItemStrategyName = configuration.StrategyName ?? "", - LuceneIndexItemAnalyzerName = configuration.AnalyzerName ?? "", - LuceneIndexItemRebuildHook = configuration.RebuildHook ?? "" - }; - - indexProvider.Set(newInfo); - - configuration.Id = newInfo.LuceneIndexItemId; - - if (configuration.LanguageNames is not null) - { - foreach (string? language in configuration.LanguageNames) - { - var languageInfo = new LuceneIndexLanguageItemInfo() - { - LuceneIndexLanguageItemName = language, - LuceneIndexLanguageItemIndexItemId = newInfo.LuceneIndexItemId - }; - - languageInfo.Insert(); - } - } - - if (configuration.Paths is not null) - { - foreach (var path in configuration.Paths) - { - var pathInfo = new LuceneIncludedPathItemInfo() - { - LuceneIncludedPathItemAliasPath = path.AliasPath, - LuceneIncludedPathItemIndexItemId = newInfo.LuceneIndexItemId - }; - pathProvider.Set(pathInfo); - - if (path.ContentTypes is not null) - { - foreach (var contentType in path.ContentTypes) - { - var contentInfo = new LuceneContentTypeItemInfo() - { - LuceneContentTypeItemContentTypeName = contentType.ContentTypeName, - LuceneContentTypeItemIncludedPathItemId = pathInfo.LuceneIncludedPathItemId, - LuceneContentTypeItemIndexItemId = newInfo.LuceneIndexItemId - }; - contentInfo.Insert(); - } - } - } - } - - return true; - } - - - public async Task GetIndexDataOrNullAsync(int indexId) - { - var indexInfo = indexProvider.Get().WithID(indexId).FirstOrDefault(); - if (indexInfo == default) - { - return default; - } - - var paths = pathProvider.Get().WhereEquals(nameof(LuceneIncludedPathItemInfo.LuceneIncludedPathItemIndexItemId), indexInfo.LuceneIndexItemId).GetEnumerableTypedResult(); - - var contentTypes = await GetLuceneContentTypesAsync(); - - var languages = languageProvider.Get().WhereEquals(nameof(LuceneIndexLanguageItemInfo.LuceneIndexLanguageItemIndexItemId), indexInfo.LuceneIndexItemId).GetEnumerableTypedResult(); - - return new LuceneIndexModel(indexInfo, languages, paths, contentTypes); - } - - - public async Task GetIndexDataOrNullAsync(string indexName) - { - var indexInfo = indexProvider.Get().WhereEquals(nameof(LuceneIndexItemInfo.LuceneIndexItemIndexName), indexName).FirstOrDefault(); - if (indexInfo == default) - { - return default; - } - - var paths = pathProvider.Get().WhereEquals(nameof(LuceneIncludedPathItemInfo.LuceneIncludedPathItemIndexItemId), indexInfo.LuceneIndexItemId).GetEnumerableTypedResult(); - - var contentTypes = await GetLuceneContentTypesAsync(); - - var languages = languageProvider.Get().WhereEquals(nameof(LuceneIndexLanguageItemInfo.LuceneIndexLanguageItemIndexItemId), indexInfo.LuceneIndexItemId).GetEnumerableTypedResult(); - - return new LuceneIndexModel(indexInfo, languages, paths, contentTypes); - } - - - public List GetExistingIndexNames() => indexProvider.Get().Select(x => x.LuceneIndexItemIndexName).ToList(); - - - public List GetIndexIds() => indexProvider.Get().Select(x => x.LuceneIndexItemId).ToList(); - - - public async Task> GetAllIndexDataAsync() - { - var indexInfos = indexProvider.Get().GetEnumerableTypedResult().ToList(); - if (indexInfos.Count == 0) - { - return []; - } - - var paths = pathProvider.Get().ToList(); - - var contentTypes = await GetLuceneContentTypesAsync(); - - var languages = languageProvider.Get().ToList(); - - return indexInfos.Select(index => new LuceneIndexModel(index, languages, paths, contentTypes)); - } - - - public async Task TryEditIndexAsync(LuceneIndexModel configuration) - { - configuration.IndexName = RemoveWhitespacesUsingStringBuilder(configuration.IndexName ?? ""); - - var indexInfo = indexProvider.Get() - .WhereEquals(nameof(LuceneIndexItemInfo.LuceneIndexItemId), configuration.Id) - .TopN(1) - .FirstOrDefault(); - - if (indexInfo is null) - { - return false; - } - - indexInfo.LuceneIndexItemRebuildHook = configuration.RebuildHook ?? ""; - indexInfo.LuceneIndexItemStrategyName = configuration.StrategyName ?? ""; - indexInfo.LuceneIndexItemAnalyzerName = configuration.AnalyzerName ?? ""; - indexInfo.LuceneIndexItemChannelName = configuration.ChannelName ?? ""; - indexInfo.LuceneIndexItemIndexName = configuration.IndexName ?? ""; - - indexProvider.Set(indexInfo); - - RemoveUnusedIndexLanguages(configuration); - await SetNewIndexLanguagesAsync(configuration, indexInfo); - - await RemoveUnusedIndexPathsAsync(configuration); - var existingPaths = await GetExistingIndexPathsAsync(configuration); - SetNewIndexPaths(configuration, existingPaths, indexInfo); - UpdateEditedIndexPaths(configuration, existingPaths); - - var existingContentTypes = await GetExistingIndexContentTypesAsync(configuration); - RemoveUnusedIndexContentTypesFromEditedPaths(existingContentTypes, configuration); - SetNewIndexContentTypes(configuration, indexInfo, existingPaths, existingContentTypes); - - return true; - } - - - public bool TryDeleteIndex(int id) - { - indexProvider.BulkDelete(new WhereCondition($"{nameof(LuceneIndexItemInfo.LuceneIndexItemId)} = {id}")); - pathProvider.BulkDelete(new WhereCondition($"{nameof(LuceneIncludedPathItemInfo.LuceneIncludedPathItemIndexItemId)} = {id}")); - languageProvider.BulkDelete(new WhereCondition($"{nameof(LuceneIndexLanguageItemInfo.LuceneIndexLanguageItemIndexItemId)} = {id}")); - contentTypeProvider.BulkDelete(new WhereCondition($"{nameof(LuceneContentTypeItemInfo.LuceneContentTypeItemIndexItemId)} = {id}")); - - return true; - } - - - public bool TryDeleteIndex(LuceneIndexModel configuration) - { - indexProvider.BulkDelete(new WhereCondition($"{nameof(LuceneIndexItemInfo.LuceneIndexItemId)} = {configuration.Id}")); - pathProvider.BulkDelete(new WhereCondition($"{nameof(LuceneIncludedPathItemInfo.LuceneIncludedPathItemIndexItemId)} = {configuration.Id}")); - languageProvider.BulkDelete(new WhereCondition($"{nameof(LuceneIndexLanguageItemInfo.LuceneIndexLanguageItemIndexItemId)} = {configuration.Id}")); - contentTypeProvider.BulkDelete(new WhereCondition($"{nameof(LuceneContentTypeItemInfo.LuceneContentTypeItemIndexItemId)} = {configuration.Id}")); - - return true; - } - - - private async Task> GetLuceneContentTypesAsync() - => await contentTypeProvider - .Get().Source(x => - x.InnerJoin( - nameof(LuceneContentTypeItemInfo.LuceneContentTypeItemContentTypeName), - nameof(DataClassInfo.ClassName)) - ) - .Columns(nameof(LuceneContentTypeItemInfo.LuceneContentTypeItemContentTypeName), - nameof(DataClassInfo.ClassDisplayName), - nameof(LuceneContentTypeItemInfo.LuceneContentTypeItemIncludedPathItemId)) - .GetEnumerableTypedResultAsync(x => - { - var dataContainer = new DataRecordContainer(x); - return new LuceneIndexContentType( - (string)dataContainer[nameof(LuceneContentTypeItemInfo.LuceneContentTypeItemContentTypeName)], - (string)dataContainer[nameof(DataClassInfo.ClassDisplayName)], - (int)dataContainer[nameof(LuceneContentTypeItemInfo.LuceneContentTypeItemIncludedPathItemId)]); - }); - - - private void RemoveUnusedIndexLanguages(LuceneIndexModel configuration) - { - var removeLanguagesQuery = languageProvider - .Get() - .WhereEquals(nameof(LuceneIndexLanguageItemInfo.LuceneIndexLanguageItemIndexItemId), configuration.Id) - .WhereNotIn(nameof(LuceneIndexLanguageItemInfo.LuceneIndexLanguageItemName), configuration.LanguageNames.ToArray()); - - languageProvider.BulkDelete(new WhereCondition(removeLanguagesQuery)); - } - - - private async Task> GetNewLanguagesOnIndexAsync(LuceneIndexModel configuration) - { - var existingLanguages = await languageProvider - .Get() - .WhereEquals(nameof(LuceneIndexLanguageItemInfo.LuceneIndexLanguageItemIndexItemId), configuration.Id) - .GetEnumerableTypedResultAsync(); - - return configuration.LanguageNames.Where(x => !existingLanguages.Any(y => y.LuceneIndexLanguageItemName == x)); - } - - - private async Task SetNewIndexLanguagesAsync(LuceneIndexModel configuration, LuceneIndexItemInfo indexInfo) - { - var newLanguages = await GetNewLanguagesOnIndexAsync(configuration); - - foreach (string? language in newLanguages) - { - var languageInfo = new LuceneIndexLanguageItemInfo() - { - LuceneIndexLanguageItemName = language, - LuceneIndexLanguageItemIndexItemId = indexInfo.LuceneIndexItemId, - }; - - languageProvider.Set(languageInfo); - } - } - - - private async Task RemoveUnusedIndexPathsAsync(LuceneIndexModel configuration) - { - var removePathsQuery = pathProvider - .Get() - .WhereEquals(nameof(LuceneIncludedPathItemInfo.LuceneIncludedPathItemIndexItemId), configuration.Id) - .WhereNotIn(nameof(LuceneIncludedPathItemInfo.LuceneIncludedPathItemId), configuration.Paths.Select(x => x.Identifier ?? 0).ToArray()); - - var removedPaths = await removePathsQuery.GetEnumerableTypedResultAsync(); - - pathProvider.BulkDelete(removePathsQuery); - - RemoveUnusedIndexContentTypes(removedPaths); - } - - - private async Task> GetExistingIndexPathsAsync(LuceneIndexModel configuration) - => await pathProvider - .Get() - .WhereEquals(nameof(LuceneIncludedPathItemInfo.LuceneIncludedPathItemIndexItemId), configuration.Id) - .GetEnumerableTypedResultAsync(); - - - private void SetNewIndexPaths(LuceneIndexModel configuration, IEnumerable existingPaths, LuceneIndexItemInfo indexInfo) - { - var newPaths = configuration.Paths.Where(x => !existingPaths.Any(y => y.LuceneIncludedPathItemId == x.Identifier)); - - foreach (var path in newPaths) - { - var pathInfo = new LuceneIncludedPathItemInfo() - { - LuceneIncludedPathItemAliasPath = path.AliasPath, - LuceneIncludedPathItemIndexItemId = indexInfo.LuceneIndexItemId, - }; - pathProvider.Set(pathInfo); - - if (path.ContentTypes != null) - { - foreach (var contentType in path.ContentTypes) - { - var contentInfo = new LuceneContentTypeItemInfo() - { - LuceneContentTypeItemContentTypeName = contentType.ContentTypeName ?? "", - LuceneContentTypeItemIncludedPathItemId = pathInfo.LuceneIncludedPathItemId, - LuceneContentTypeItemIndexItemId = indexInfo.LuceneIndexItemId, - }; - contentInfo.Insert(); - } - } - } - } - - - private void RemoveUnusedIndexContentTypes(IEnumerable removedPaths) - { - var removeContentTypesQuery = contentTypeProvider - .Get() - .WhereIn(nameof(LuceneContentTypeItemInfo.LuceneContentTypeItemIncludedPathItemId), removedPaths.Select(x => x.LuceneIncludedPathItemId).ToArray()); - - contentTypeProvider.BulkDelete(removeContentTypesQuery); - } - - - private async Task> GetExistingIndexContentTypesAsync(LuceneIndexModel configuration) - => await contentTypeProvider - .Get() - .WhereIn(nameof(LuceneContentTypeItemInfo.LuceneContentTypeItemIncludedPathItemId), configuration.Paths.Select(x => x.Identifier ?? 0).ToArray()) - .GetEnumerableTypedResultAsync(); - - - private void RemoveUnusedIndexContentTypesFromEditedPaths(IEnumerable allExistingContentTypes, LuceneIndexModel configuration) - { - int[] removedContentTypeIdsFromEditedPaths = allExistingContentTypes - .Where(x => !configuration.Paths - .Any(y => y.ContentTypes - .Exists(z => x.LuceneContentTypeItemIncludedPathItemId == y.Identifier && x.LuceneContentTypeItemContentTypeName == z.ContentTypeName)) - ) - .Select(x => x.LuceneContentTypeItemId) - .ToArray(); - - contentTypeProvider.BulkDelete(contentTypeProvider.Get().WhereIn(nameof(LuceneContentTypeItemInfo.LuceneContentTypeItemId), removedContentTypeIdsFromEditedPaths)); - } - - - private void UpdateEditedIndexPaths(LuceneIndexModel configuration, IEnumerable existingPaths) - { - foreach (var path in existingPaths) - { - path.LuceneIncludedPathItemAliasPath = configuration.Paths.Single(x => x.Identifier == path.LuceneIncludedPathItemId).AliasPath; - path.Update(); - } - } - - - private void SetNewIndexContentTypes(LuceneIndexModel configuration, LuceneIndexItemInfo indexInfo, IEnumerable existingPaths, IEnumerable existingContentTypes) - { - foreach (var path in existingPaths) - { - foreach (var contentType in configuration.Paths - .Single(x => x.Identifier == path.LuceneIncludedPathItemId) - .ContentTypes - .Where(x => !existingContentTypes - .Any(y => y.LuceneContentTypeItemContentTypeName == x.ContentTypeName && y.LuceneContentTypeItemIncludedPathItemId == path.LuceneIncludedPathItemId) - ) - ) - { - var contentInfo = new LuceneContentTypeItemInfo() - { - LuceneContentTypeItemContentTypeName = contentType.ContentTypeName ?? "", - LuceneContentTypeItemIncludedPathItemId = path.LuceneIncludedPathItemId, - LuceneContentTypeItemIndexItemId = indexInfo.LuceneIndexItemId, - }; - contentInfo.Insert(); - } - } - } - - - private static string RemoveWhitespacesUsingStringBuilder(string source) - { - var builder = new StringBuilder(source.Length); - for (int i = 0; i < source.Length; i++) - { - char c = source[i]; - if (!char.IsWhiteSpace(c)) - { - builder.Append(c); - } - } - return source.Length == builder.Length ? source : builder.ToString(); - } -} +using System.Text; + +using CMS.Base; +using CMS.DataEngine; + +namespace Kentico.Xperience.Lucene.Core.Indexing; + +internal class DefaultLuceneConfigurationStorageService : ILuceneConfigurationStorageService +{ + private readonly IInfoProvider indexProvider; + private readonly IInfoProvider pathProvider; + private readonly IInfoProvider contentTypeProvider; + private readonly IInfoProvider reusableContentTypeProvider; + private readonly IInfoProvider languageProvider; + + public DefaultLuceneConfigurationStorageService( + IInfoProvider indexProvider, + IInfoProvider pathProvider, + IInfoProvider contentTypeProvider, + IInfoProvider reusableContentTypeProvider, + IInfoProvider languageProvider + ) + { + this.indexProvider = indexProvider; + this.pathProvider = pathProvider; + this.contentTypeProvider = contentTypeProvider; + this.languageProvider = languageProvider; + this.reusableContentTypeProvider = reusableContentTypeProvider; + } + + public bool TryCreateIndex(LuceneIndexModel configuration) + { + var existingIndex = indexProvider.Get() + .WhereEquals(nameof(LuceneIndexItemInfo.LuceneIndexItemIndexName), configuration.IndexName) + .TopN(1) + .FirstOrDefault(); + + if (existingIndex is not null) + { + return false; + } + + var newInfo = new LuceneIndexItemInfo() + { + LuceneIndexItemIndexName = configuration.IndexName ?? string.Empty, + LuceneIndexItemChannelName = configuration.ChannelName ?? string.Empty, + LuceneIndexItemStrategyName = configuration.StrategyName ?? string.Empty, + LuceneIndexItemAnalyzerName = configuration.AnalyzerName ?? string.Empty, + LuceneIndexItemRebuildHook = configuration.RebuildHook ?? string.Empty + }; + + indexProvider.Set(newInfo); + + configuration.Id = newInfo.LuceneIndexItemId; + + if (configuration.LanguageNames is not null) + { + foreach (string? language in configuration.LanguageNames) + { + var languageInfo = new LuceneIndexLanguageItemInfo() + { + LuceneIndexLanguageItemName = language, + LuceneIndexLanguageItemIndexItemId = newInfo.LuceneIndexItemId + }; + + languageInfo.Insert(); + } + } + + if (configuration.Paths is not null) + { + foreach (var path in configuration.Paths) + { + var pathInfo = new LuceneIncludedPathItemInfo() + { + LuceneIncludedPathItemAliasPath = path.AliasPath, + LuceneIncludedPathItemIndexItemId = newInfo.LuceneIndexItemId + }; + pathProvider.Set(pathInfo); + + if (path.ContentTypes is not null) + { + foreach (var contentType in path.ContentTypes) + { + var contentInfo = new LuceneContentTypeItemInfo() + { + LuceneContentTypeItemContentTypeName = contentType.ContentTypeName, + LuceneContentTypeItemIncludedPathItemId = pathInfo.LuceneIncludedPathItemId, + LuceneContentTypeItemIndexItemId = newInfo.LuceneIndexItemId + }; + contentInfo.Insert(); + } + } + } + } + + if (configuration.ReusableContentTypeNames is not null) + { + foreach (string? reusableContentTypeName in configuration.ReusableContentTypeNames) + { + var reusableContentTypeItemInfo = new LuceneReusableContentTypeItemInfo() + { + LuceneReusableContentTypeItemContentTypeName = reusableContentTypeName, + LuceneReusableContentTypeItemIndexItemId = newInfo.LuceneIndexItemId + }; + + reusableContentTypeItemInfo.Insert(); + } + } + + return true; + } + + + public async Task GetIndexDataOrNullAsync(int indexId) + { + var indexInfo = indexProvider.Get().WithID(indexId).FirstOrDefault(); + if (indexInfo == default) + { + return default; + } + + var paths = pathProvider.Get().WhereEquals(nameof(LuceneIncludedPathItemInfo.LuceneIncludedPathItemIndexItemId), indexInfo.LuceneIndexItemId).GetEnumerableTypedResult(); + + var webPageContentTypes = await GetLuceneWebPageContentTypesAsync(); + + var languages = languageProvider.Get().WhereEquals(nameof(LuceneIndexLanguageItemInfo.LuceneIndexLanguageItemIndexItemId), indexInfo.LuceneIndexItemId).GetEnumerableTypedResult(); + + var reusableContentTypes = reusableContentTypeProvider.Get().WhereEquals(nameof(LuceneReusableContentTypeItemInfo.LuceneReusableContentTypeItemIndexItemId), indexInfo.LuceneIndexItemId).GetEnumerableTypedResult(); + + return new LuceneIndexModel(indexInfo, languages, paths, webPageContentTypes, reusableContentTypes); + } + + + public async Task GetIndexDataOrNullAsync(string indexName) + { + var indexInfo = indexProvider.Get().WhereEquals(nameof(LuceneIndexItemInfo.LuceneIndexItemIndexName), indexName).FirstOrDefault(); + if (indexInfo == default) + { + return default; + } + + var paths = pathProvider.Get().WhereEquals(nameof(LuceneIncludedPathItemInfo.LuceneIncludedPathItemIndexItemId), indexInfo.LuceneIndexItemId).GetEnumerableTypedResult(); + + var webPageContentTypes = await GetLuceneWebPageContentTypesAsync(); + + var languages = languageProvider.Get().WhereEquals(nameof(LuceneIndexLanguageItemInfo.LuceneIndexLanguageItemIndexItemId), indexInfo.LuceneIndexItemId).GetEnumerableTypedResult(); + + var reusableContentTypes = reusableContentTypeProvider.Get().WhereEquals(nameof(LuceneReusableContentTypeItemInfo.LuceneReusableContentTypeItemIndexItemId), indexInfo.LuceneIndexItemId).GetEnumerableTypedResult(); + + return new LuceneIndexModel(indexInfo, languages, paths, webPageContentTypes, reusableContentTypes); + } + + + public List GetExistingIndexNames() => indexProvider.Get().Select(x => x.LuceneIndexItemIndexName).ToList(); + + + public List GetIndexIds() => indexProvider.Get().Select(x => x.LuceneIndexItemId).ToList(); + + + public async Task> GetAllIndexDataAsync() + { + var indexInfos = indexProvider.Get().GetEnumerableTypedResult().ToList(); + if (indexInfos.Count == 0) + { + return []; + } + + var paths = pathProvider.Get().ToList(); + + var webPageContentTypes = await GetLuceneWebPageContentTypesAsync(); + + var languages = languageProvider.Get().ToList(); + + var reusableContentTypes = reusableContentTypeProvider.Get().ToList(); + + return indexInfos.Select(index => new LuceneIndexModel(index, languages, paths, webPageContentTypes, reusableContentTypes)); + } + + + public async Task TryEditIndexAsync(LuceneIndexModel configuration) + { + configuration.IndexName = RemoveWhitespacesUsingStringBuilder(configuration.IndexName ?? string.Empty); + + var indexInfo = indexProvider.Get() + .WhereEquals(nameof(LuceneIndexItemInfo.LuceneIndexItemId), configuration.Id) + .TopN(1) + .FirstOrDefault(); + + if (indexInfo is null) + { + return false; + } + + indexInfo.LuceneIndexItemRebuildHook = configuration.RebuildHook ?? string.Empty; + indexInfo.LuceneIndexItemStrategyName = configuration.StrategyName ?? string.Empty; + indexInfo.LuceneIndexItemAnalyzerName = configuration.AnalyzerName ?? string.Empty; + indexInfo.LuceneIndexItemChannelName = configuration.ChannelName ?? string.Empty; + indexInfo.LuceneIndexItemIndexName = configuration.IndexName ?? string.Empty; + + indexProvider.Set(indexInfo); + + RemoveUnusedIndexLanguages(configuration); + await SetNewIndexLanguagesAsync(configuration, indexInfo); + + RemoveUnusedReusableContentTypes(configuration); + await SetNewIndexReusableContentTypeItemsAsync(configuration, indexInfo); + + await RemoveUnusedIndexPathsAsync(configuration); + var existingPaths = await GetExistingIndexPathsAsync(configuration); + SetNewIndexPaths(configuration, existingPaths, indexInfo); + UpdateEditedIndexPaths(configuration, existingPaths); + + var existingContentTypes = await GetExistingIndexContentTypesAsync(configuration); + RemoveUnusedIndexContentTypesFromEditedPaths(existingContentTypes, configuration); + SetNewIndexContentTypes(configuration, indexInfo, existingPaths, existingContentTypes); + + return true; + } + + + public bool TryDeleteIndex(int id) + { + indexProvider.BulkDelete(new WhereCondition($"{nameof(LuceneIndexItemInfo.LuceneIndexItemId)} = {id}")); + pathProvider.BulkDelete(new WhereCondition($"{nameof(LuceneIncludedPathItemInfo.LuceneIncludedPathItemIndexItemId)} = {id}")); + languageProvider.BulkDelete(new WhereCondition($"{nameof(LuceneIndexLanguageItemInfo.LuceneIndexLanguageItemIndexItemId)} = {id}")); + contentTypeProvider.BulkDelete(new WhereCondition($"{nameof(LuceneContentTypeItemInfo.LuceneContentTypeItemIndexItemId)} = {id}")); + reusableContentTypeProvider.BulkDelete(new WhereCondition($"{nameof(LuceneReusableContentTypeItemInfo.LuceneReusableContentTypeItemIndexItemId)} = {id}")); + + return true; + } + + + public bool TryDeleteIndex(LuceneIndexModel configuration) + { + indexProvider.BulkDelete(new WhereCondition($"{nameof(LuceneIndexItemInfo.LuceneIndexItemId)} = {configuration.Id}")); + pathProvider.BulkDelete(new WhereCondition($"{nameof(LuceneIncludedPathItemInfo.LuceneIncludedPathItemIndexItemId)} = {configuration.Id}")); + languageProvider.BulkDelete(new WhereCondition($"{nameof(LuceneIndexLanguageItemInfo.LuceneIndexLanguageItemIndexItemId)} = {configuration.Id}")); + contentTypeProvider.BulkDelete(new WhereCondition($"{nameof(LuceneContentTypeItemInfo.LuceneContentTypeItemIndexItemId)} = {configuration.Id}")); + reusableContentTypeProvider.BulkDelete(new WhereCondition($"{nameof(LuceneReusableContentTypeItemInfo.LuceneReusableContentTypeItemIndexItemId)} = {configuration.Id}")); + + return true; + } + + + private async Task> GetLuceneWebPageContentTypesAsync() + => await contentTypeProvider + .Get().Source(x => + x.InnerJoin( + nameof(LuceneContentTypeItemInfo.LuceneContentTypeItemContentTypeName), + nameof(DataClassInfo.ClassName)) + ) + .Columns(nameof(LuceneContentTypeItemInfo.LuceneContentTypeItemContentTypeName), + nameof(DataClassInfo.ClassDisplayName), + nameof(LuceneContentTypeItemInfo.LuceneContentTypeItemIncludedPathItemId)) + .GetEnumerableTypedResultAsync(x => + { + var dataContainer = new DataRecordContainer(x); + return new LuceneIndexContentType( + (string)dataContainer[nameof(LuceneContentTypeItemInfo.LuceneContentTypeItemContentTypeName)], + (string)dataContainer[nameof(DataClassInfo.ClassDisplayName)], + (int)dataContainer[nameof(LuceneContentTypeItemInfo.LuceneContentTypeItemIncludedPathItemId)]); + }); + + + private void RemoveUnusedIndexLanguages(LuceneIndexModel configuration) + { + var removeLanguagesQuery = languageProvider + .Get() + .WhereEquals(nameof(LuceneIndexLanguageItemInfo.LuceneIndexLanguageItemIndexItemId), configuration.Id) + .WhereNotIn(nameof(LuceneIndexLanguageItemInfo.LuceneIndexLanguageItemName), configuration.LanguageNames.ToArray()); + + languageProvider.BulkDelete(new WhereCondition(removeLanguagesQuery)); + } + + + private void RemoveUnusedReusableContentTypes(LuceneIndexModel configuration) + { + var removeReusableContentTypesQuery = reusableContentTypeProvider + .Get() + .WhereEquals(nameof(LuceneReusableContentTypeItemInfo.LuceneReusableContentTypeItemIndexItemId), configuration.Id) + .WhereNotIn(nameof(LuceneReusableContentTypeItemInfo.LuceneReusableContentTypeItemContentTypeName), configuration.ReusableContentTypeNames.ToArray()); + + reusableContentTypeProvider.BulkDelete(new WhereCondition(removeReusableContentTypesQuery)); + } + + + private async Task> GetNewLanguagesOnIndexAsync(LuceneIndexModel configuration) + { + var existingLanguages = await languageProvider + .Get() + .WhereEquals(nameof(LuceneIndexLanguageItemInfo.LuceneIndexLanguageItemIndexItemId), configuration.Id) + .GetEnumerableTypedResultAsync(); + + return configuration.LanguageNames.Where(x => !existingLanguages.Any(y => y.LuceneIndexLanguageItemName == x)); + } + + + private async Task> GetNewReusableContentTypesOnIndexAsync(LuceneIndexModel configuration) + { + var existingReusableContentTypes = await reusableContentTypeProvider + .Get() + .WhereEquals(nameof(LuceneReusableContentTypeItemInfo.LuceneReusableContentTypeItemIndexItemId), configuration.Id) + .GetEnumerableTypedResultAsync(); + + return configuration.ReusableContentTypeNames.Where(x => !existingReusableContentTypes.Any(y => y.LuceneReusableContentTypeItemContentTypeName == x)); + } + + + private async Task SetNewIndexLanguagesAsync(LuceneIndexModel configuration, LuceneIndexItemInfo indexInfo) + { + var newLanguages = await GetNewLanguagesOnIndexAsync(configuration); + + foreach (string? language in newLanguages) + { + var languageInfo = new LuceneIndexLanguageItemInfo() + { + LuceneIndexLanguageItemName = language, + LuceneIndexLanguageItemIndexItemId = indexInfo.LuceneIndexItemId, + }; + + languageProvider.Set(languageInfo); + } + } + + + private async Task SetNewIndexReusableContentTypeItemsAsync(LuceneIndexModel configuration, LuceneIndexItemInfo indexInfo) + { + var newReusableContentTypes = await GetNewReusableContentTypesOnIndexAsync(configuration); + + foreach (string? reusableContentType in newReusableContentTypes) + { + var reusableContentTypeInfo = new LuceneReusableContentTypeItemInfo() + { + LuceneReusableContentTypeItemContentTypeName = reusableContentType, + LuceneReusableContentTypeItemIndexItemId = indexInfo.LuceneIndexItemId, + }; + + reusableContentTypeProvider.Set(reusableContentTypeInfo); + } + } + + + private async Task RemoveUnusedIndexPathsAsync(LuceneIndexModel configuration) + { + var removePathsQuery = pathProvider + .Get() + .WhereEquals(nameof(LuceneIncludedPathItemInfo.LuceneIncludedPathItemIndexItemId), configuration.Id) + .WhereNotIn(nameof(LuceneIncludedPathItemInfo.LuceneIncludedPathItemId), configuration.Paths.Select(x => x.Identifier ?? 0).ToArray()); + + var removedPaths = await removePathsQuery.GetEnumerableTypedResultAsync(); + + pathProvider.BulkDelete(removePathsQuery); + + RemoveUnusedIndexContentTypes(removedPaths); + } + + + private async Task> GetExistingIndexPathsAsync(LuceneIndexModel configuration) + => await pathProvider + .Get() + .WhereEquals(nameof(LuceneIncludedPathItemInfo.LuceneIncludedPathItemIndexItemId), configuration.Id) + .GetEnumerableTypedResultAsync(); + + + private void SetNewIndexPaths(LuceneIndexModel configuration, IEnumerable existingPaths, LuceneIndexItemInfo indexInfo) + { + var newPaths = configuration.Paths.Where(x => !existingPaths.Any(y => y.LuceneIncludedPathItemId == x.Identifier)); + + foreach (var path in newPaths) + { + var pathInfo = new LuceneIncludedPathItemInfo() + { + LuceneIncludedPathItemAliasPath = path.AliasPath, + LuceneIncludedPathItemIndexItemId = indexInfo.LuceneIndexItemId, + }; + pathProvider.Set(pathInfo); + + if (path.ContentTypes != null) + { + foreach (var contentType in path.ContentTypes) + { + var contentInfo = new LuceneContentTypeItemInfo() + { + LuceneContentTypeItemContentTypeName = contentType.ContentTypeName ?? string.Empty, + LuceneContentTypeItemIncludedPathItemId = pathInfo.LuceneIncludedPathItemId, + LuceneContentTypeItemIndexItemId = indexInfo.LuceneIndexItemId, + }; + contentInfo.Insert(); + } + } + } + } + + + private void RemoveUnusedIndexContentTypes(IEnumerable removedPaths) + { + var removeContentTypesQuery = contentTypeProvider + .Get() + .WhereIn(nameof(LuceneContentTypeItemInfo.LuceneContentTypeItemIncludedPathItemId), removedPaths.Select(x => x.LuceneIncludedPathItemId).ToArray()); + + contentTypeProvider.BulkDelete(removeContentTypesQuery); + } + + + private async Task> GetExistingIndexContentTypesAsync(LuceneIndexModel configuration) + => await contentTypeProvider + .Get() + .WhereIn(nameof(LuceneContentTypeItemInfo.LuceneContentTypeItemIncludedPathItemId), configuration.Paths.Select(x => x.Identifier ?? 0).ToArray()) + .GetEnumerableTypedResultAsync(); + + + private void RemoveUnusedIndexContentTypesFromEditedPaths(IEnumerable allExistingContentTypes, LuceneIndexModel configuration) + { + int[] removedContentTypeIdsFromEditedPaths = allExistingContentTypes + .Where(x => !configuration.Paths + .Any(y => y.ContentTypes + .Exists(z => x.LuceneContentTypeItemIncludedPathItemId == y.Identifier && x.LuceneContentTypeItemContentTypeName == z.ContentTypeName)) + ) + .Select(x => x.LuceneContentTypeItemId) + .ToArray(); + + contentTypeProvider.BulkDelete(contentTypeProvider.Get().WhereIn(nameof(LuceneContentTypeItemInfo.LuceneContentTypeItemId), removedContentTypeIdsFromEditedPaths)); + } + + + private void UpdateEditedIndexPaths(LuceneIndexModel configuration, IEnumerable existingPaths) + { + foreach (var path in existingPaths) + { + path.LuceneIncludedPathItemAliasPath = configuration.Paths.Single(x => x.Identifier == path.LuceneIncludedPathItemId).AliasPath; + path.Update(); + } + } + + + private void SetNewIndexContentTypes(LuceneIndexModel configuration, LuceneIndexItemInfo indexInfo, IEnumerable existingPaths, IEnumerable existingContentTypes) + { + foreach (var path in existingPaths) + { + foreach (var contentType in configuration.Paths + .Single(x => x.Identifier == path.LuceneIncludedPathItemId) + .ContentTypes + .Where(x => !existingContentTypes + .Any(y => y.LuceneContentTypeItemContentTypeName == x.ContentTypeName && y.LuceneContentTypeItemIncludedPathItemId == path.LuceneIncludedPathItemId) + ) + ) + { + var contentInfo = new LuceneContentTypeItemInfo() + { + LuceneContentTypeItemContentTypeName = contentType.ContentTypeName ?? string.Empty, + LuceneContentTypeItemIncludedPathItemId = path.LuceneIncludedPathItemId, + LuceneContentTypeItemIndexItemId = indexInfo.LuceneIndexItemId, + }; + contentInfo.Insert(); + } + } + } + + + private static string RemoveWhitespacesUsingStringBuilder(string source) + { + var builder = new StringBuilder(source.Length); + for (int i = 0; i < source.Length; i++) + { + char c = source[i]; + if (!char.IsWhiteSpace(c)) + { + builder.Append(c); + } + } + return source.Length == builder.Length ? source : builder.ToString(); + } +} diff --git a/src/Kentico.Xperience.Lucene.Core/Indexing/DefaultLuceneTaskProcessor.cs b/src/Kentico.Xperience.Lucene.Core/Indexing/DefaultLuceneTaskProcessor.cs index 477c5eb..159b752 100644 --- a/src/Kentico.Xperience.Lucene.Core/Indexing/DefaultLuceneTaskProcessor.cs +++ b/src/Kentico.Xperience.Lucene.Core/Indexing/DefaultLuceneTaskProcessor.cs @@ -1,154 +1,154 @@ -using CMS.Base; -using CMS.Core; -using CMS.Websites; - -using Lucene.Net.Documents; -using Lucene.Net.Documents.Extensions; - -using Microsoft.Extensions.DependencyInjection; - -namespace Kentico.Xperience.Lucene.Core.Indexing; - -internal class LuceneBatchResult -{ - internal int SuccessfulOperations { get; set; } = 0; - internal HashSet PublishedIndices { get; set; } = []; -} - -internal class DefaultLuceneTaskProcessor : ILuceneTaskProcessor -{ - private readonly IWebPageUrlRetriever urlRetriever; - private readonly IServiceProvider serviceProvider; - private readonly ILuceneClient luceneClient; - private readonly IEventLogService eventLogService; - private readonly ILuceneIndexManager indexManager; - - public DefaultLuceneTaskProcessor( - ILuceneClient luceneClient, - IEventLogService eventLogService, - IWebPageUrlRetriever urlRetriever, - IServiceProvider serviceProvider, - ILuceneIndexManager indexManager) - { - this.luceneClient = luceneClient; - this.eventLogService = eventLogService; - this.urlRetriever = urlRetriever; - this.serviceProvider = serviceProvider; - this.indexManager = indexManager; - } - - /// - public async Task ProcessLuceneTasks(IEnumerable queueItems, CancellationToken cancellationToken, int maximumBatchSize = 100) - { - LuceneBatchResult batchResults = new(); - - var batches = queueItems.Batch(maximumBatchSize); - - foreach (var batch in batches) - { - await ProcessLuceneBatch(batch, batchResults, cancellationToken); - } - - foreach (var index in batchResults.PublishedIndices) - { - var storage = index.StorageContext.GetNextOrOpenNextGeneration(); - index.StorageContext.PublishIndex(storage); - } - - return batchResults.SuccessfulOperations; - } - - private async Task ProcessLuceneBatch(IEnumerable queueItems, LuceneBatchResult previousBatchResults, CancellationToken cancellationToken) - { - - var groups = queueItems.GroupBy(item => item.IndexName); - - foreach (var group in groups) - { - try - { - var deleteIds = new List(); - var deleteTasks = group.Where(queueItem => queueItem.TaskType == LuceneTaskType.DELETE).ToList(); - - var updateTasks = group.Where(queueItem => queueItem.TaskType is LuceneTaskType.PUBLISH_INDEX or LuceneTaskType.UPDATE); - var upsertData = new List(); - foreach (var queueItem in updateTasks) - { - var document = await GetDocument(queueItem); - if (document is not null) - { - upsertData.Add(document); - } - else - { - deleteTasks.Add(queueItem); - } - } - deleteIds.AddRange(GetIdsToDelete(deleteTasks ?? []).Where(x => x is not null).Select(x => x ?? "")); - if (indexManager.GetIndex(group.Key) is { } index) - { - previousBatchResults.SuccessfulOperations += await luceneClient.DeleteRecords(deleteIds, group.Key); - previousBatchResults.SuccessfulOperations += await luceneClient.UpsertRecords(upsertData, group.Key, cancellationToken); - - if (group.Any(t => t.TaskType == LuceneTaskType.PUBLISH_INDEX) && !previousBatchResults.PublishedIndices.Any(x => x.IndexName == index.IndexName)) - { - previousBatchResults.PublishedIndices.Add(index); - } - } - else - { - eventLogService.LogError(nameof(DefaultLuceneTaskProcessor), nameof(ProcessLuceneTasks), "Index instance not exists"); - } - } - catch (Exception ex) - { - eventLogService.LogError(nameof(DefaultLuceneTaskProcessor), nameof(ProcessLuceneTasks), ex.Message); - } - } - } - - private static IEnumerable GetIdsToDelete(IEnumerable deleteTasks) => deleteTasks.Select(queueItem => queueItem.ItemToIndex.ItemGuid.ToString()); - - /// - public async Task GetDocument(LuceneQueueItem queueItem) - { - var luceneIndex = indexManager.GetRequiredIndex(queueItem.IndexName); - - var strategy = serviceProvider.GetRequiredStrategy(luceneIndex); - - var data = await strategy.MapToLuceneDocumentOrNull(queueItem.ItemToIndex); - - if (data is null) - { - return null; - } - - await AddBaseProperties(queueItem.ItemToIndex, data!); - - return data; - } - - private async Task AddBaseProperties(IIndexEventItemModel item, Document document) - { - document.AddStringField(BaseDocumentProperties.CONTENT_TYPE_NAME, item.ContentTypeName, Field.Store.YES); - document.AddStringField(BaseDocumentProperties.LANGUAGE_NAME, item.LanguageName, Field.Store.YES); - document.AddStringField(BaseDocumentProperties.ITEM_GUID, item.ItemGuid.ToString(), Field.Store.YES); - - if (item is IndexEventWebPageItemModel webpageItem && !document.Any(x => string.Equals(x.Name, BaseDocumentProperties.URL, StringComparison.OrdinalIgnoreCase))) - { - string url = string.Empty; - try - { - url = (await urlRetriever.Retrieve(webpageItem.WebPageItemTreePath, webpageItem.WebsiteChannelName, webpageItem.LanguageName)).RelativePath; - } - catch (Exception) - { - // Retrieve can throw an exception when processing a page update LuceneQueueItem - // and the page was deleted before the update task has processed. In this case, upsert an - // empty URL - } - - document.AddStringField(BaseDocumentProperties.URL, url, Field.Store.YES); - } - } -} +using CMS.Base; +using CMS.Core; +using CMS.Websites; + +using Lucene.Net.Documents; +using Lucene.Net.Documents.Extensions; + +using Microsoft.Extensions.DependencyInjection; + +namespace Kentico.Xperience.Lucene.Core.Indexing; + +internal class LuceneBatchResult +{ + internal int SuccessfulOperations { get; set; } = 0; + internal HashSet PublishedIndices { get; set; } = []; +} + +internal class DefaultLuceneTaskProcessor : ILuceneTaskProcessor +{ + private readonly IWebPageUrlRetriever urlRetriever; + private readonly IServiceProvider serviceProvider; + private readonly ILuceneClient luceneClient; + private readonly IEventLogService eventLogService; + private readonly ILuceneIndexManager indexManager; + + public DefaultLuceneTaskProcessor( + ILuceneClient luceneClient, + IEventLogService eventLogService, + IWebPageUrlRetriever urlRetriever, + IServiceProvider serviceProvider, + ILuceneIndexManager indexManager) + { + this.luceneClient = luceneClient; + this.eventLogService = eventLogService; + this.urlRetriever = urlRetriever; + this.serviceProvider = serviceProvider; + this.indexManager = indexManager; + } + + /// + public async Task ProcessLuceneTasks(IEnumerable queueItems, CancellationToken cancellationToken, int maximumBatchSize = 100) + { + LuceneBatchResult batchResults = new(); + + var batches = queueItems.Batch(maximumBatchSize); + + foreach (var batch in batches) + { + await ProcessLuceneBatch(batch, batchResults, cancellationToken); + } + + foreach (var index in batchResults.PublishedIndices) + { + var storage = index.StorageContext.GetNextOrOpenNextGeneration(); + index.StorageContext.PublishIndex(storage); + } + + return batchResults.SuccessfulOperations; + } + + private async Task ProcessLuceneBatch(IEnumerable queueItems, LuceneBatchResult previousBatchResults, CancellationToken cancellationToken) + { + + var groups = queueItems.GroupBy(item => item.IndexName); + + foreach (var group in groups) + { + try + { + var deleteIds = new List(); + var deleteTasks = group.Where(queueItem => queueItem.TaskType == LuceneTaskType.DELETE).ToList(); + + var updateTasks = group.Where(queueItem => queueItem.TaskType is LuceneTaskType.PUBLISH_INDEX or LuceneTaskType.UPDATE); + var upsertData = new List(); + foreach (var queueItem in updateTasks) + { + var document = await GetDocument(queueItem); + if (document is not null) + { + upsertData.Add(document); + } + else + { + deleteTasks.Add(queueItem); + } + } + deleteIds.AddRange(GetIdsToDelete(deleteTasks ?? []).Where(x => x is not null).Select(x => x ?? string.Empty)); + if (indexManager.GetIndex(group.Key) is { } index) + { + previousBatchResults.SuccessfulOperations += await luceneClient.DeleteRecords(deleteIds, group.Key); + previousBatchResults.SuccessfulOperations += await luceneClient.UpsertRecords(upsertData, group.Key, cancellationToken); + + if (group.Any(t => t.TaskType == LuceneTaskType.PUBLISH_INDEX) && !previousBatchResults.PublishedIndices.Any(x => x.IndexName == index.IndexName)) + { + previousBatchResults.PublishedIndices.Add(index); + } + } + else + { + eventLogService.LogError(nameof(DefaultLuceneTaskProcessor), nameof(ProcessLuceneTasks), "Index instance not exists"); + } + } + catch (Exception ex) + { + eventLogService.LogError(nameof(DefaultLuceneTaskProcessor), nameof(ProcessLuceneTasks), ex.Message); + } + } + } + + private static IEnumerable GetIdsToDelete(IEnumerable deleteTasks) => deleteTasks.Select(queueItem => queueItem.ItemToIndex.ItemGuid.ToString()); + + /// + public async Task GetDocument(LuceneQueueItem queueItem) + { + var luceneIndex = indexManager.GetRequiredIndex(queueItem.IndexName); + + var strategy = serviceProvider.GetRequiredStrategy(luceneIndex); + + var data = await strategy.MapToLuceneDocumentOrNull(queueItem.ItemToIndex); + + if (data is null) + { + return null; + } + + await AddBaseProperties(queueItem.ItemToIndex, data!); + + return data; + } + + private async Task AddBaseProperties(IIndexEventItemModel item, Document document) + { + document.AddStringField(BaseDocumentProperties.CONTENT_TYPE_NAME, item.ContentTypeName, Field.Store.YES); + document.AddStringField(BaseDocumentProperties.LANGUAGE_NAME, item.LanguageName, Field.Store.YES); + document.AddStringField(BaseDocumentProperties.ITEM_GUID, item.ItemGuid.ToString(), Field.Store.YES); + + if (item is IndexEventWebPageItemModel webpageItem && !document.Any(x => string.Equals(x.Name, BaseDocumentProperties.URL, StringComparison.OrdinalIgnoreCase))) + { + string url = string.Empty; + try + { + url = (await urlRetriever.Retrieve(webpageItem.WebPageItemTreePath, webpageItem.WebsiteChannelName, webpageItem.LanguageName)).RelativePath; + } + catch (Exception) + { + // Retrieve can throw an exception when processing a page update LuceneQueueItem + // and the page was deleted before the update task has processed. In this case, upsert an + // empty URL + } + + document.AddStringField(BaseDocumentProperties.URL, url, Field.Store.YES); + } + } +} diff --git a/src/Kentico.Xperience.Lucene.Core/Indexing/IIndexEventItemModel.cs b/src/Kentico.Xperience.Lucene.Core/Indexing/IIndexEventItemModel.cs index 5837dae..7ddf82d 100644 --- a/src/Kentico.Xperience.Lucene.Core/Indexing/IIndexEventItemModel.cs +++ b/src/Kentico.Xperience.Lucene.Core/Indexing/IIndexEventItemModel.cs @@ -1,152 +1,152 @@ -using CMS.ContentEngine; -using CMS.Websites; - -namespace Kentico.Xperience.Lucene.Core.Indexing; - -/// -/// Abstraction of different types of events generated from content modifications -/// -public interface IIndexEventItemModel -{ - /// - /// The identifier of the item - /// - int ItemID { get; set; } - Guid ItemGuid { get; set; } - string LanguageName { get; set; } - string ContentTypeName { get; set; } - string Name { get; set; } - bool IsSecured { get; set; } - int ContentTypeID { get; set; } - int ContentLanguageID { get; set; } -} - -/// -/// Represents a modification to a web page -/// -public class IndexEventWebPageItemModel : IIndexEventItemModel -{ - /// - /// The - /// - public int ItemID { get; set; } - /// - /// The - /// - public Guid ItemGuid { get; set; } - public string LanguageName { get; set; } = string.Empty; - public string ContentTypeName { get; set; } = string.Empty; - /// - /// The - /// - public string Name { get; set; } = string.Empty; - public bool IsSecured { get; set; } - public int ContentTypeID { get; set; } - public int ContentLanguageID { get; set; } - - public string WebsiteChannelName { get; set; } = string.Empty; - public string WebPageItemTreePath { get; set; } = string.Empty; - public int? ParentID { get; set; } - public int Order { get; set; } - public IndexEventWebPageItemModel() { } - public IndexEventWebPageItemModel( - int itemID, - Guid itemGuid, - string languageName, - string contentTypeName, - string name, - bool isSecured, - int contentTypeID, - int contentLanguageID, - string websiteChannelName, - string webPageItemTreePath, - int parentID, - int order - ) - { - ItemID = itemID; - ItemGuid = itemGuid; - LanguageName = languageName; - ContentTypeName = contentTypeName; - WebsiteChannelName = websiteChannelName; - WebPageItemTreePath = webPageItemTreePath; - ParentID = parentID; - Order = order; - Name = name; - IsSecured = isSecured; - ContentTypeID = contentTypeID; - ContentLanguageID = contentLanguageID; - } - - public IndexEventWebPageItemModel( - int itemID, - Guid itemGuid, - string languageName, - string contentTypeName, - string name, - bool isSecured, - int contentTypeID, - int contentLanguageID, - string websiteChannelName, - string webPageItemTreePath, - int order - ) - { - ItemID = itemID; - ItemGuid = itemGuid; - LanguageName = languageName; - ContentTypeName = contentTypeName; - WebsiteChannelName = websiteChannelName; - WebPageItemTreePath = webPageItemTreePath; - Order = order; - Name = name; - IsSecured = isSecured; - ContentTypeID = contentTypeID; - ContentLanguageID = contentLanguageID; - } -} - -/// -/// Represents a modification to a reusable content item -/// -public class IndexEventReusableItemModel : IIndexEventItemModel -{ - /// - /// The - /// - public int ItemID { get; set; } - /// - /// The - /// - public Guid ItemGuid { get; set; } - public string LanguageName { get; set; } = string.Empty; - public string ContentTypeName { get; set; } = string.Empty; - /// - /// The - /// - public string Name { get; set; } = string.Empty; - public bool IsSecured { get; set; } - public int ContentTypeID { get; set; } - public int ContentLanguageID { get; set; } - public IndexEventReusableItemModel() { } - public IndexEventReusableItemModel( - int itemID, - Guid itemGuid, - string languageName, - string contentTypeName, - string name, - bool isSecured, - int contentTypeID, - int contentLanguageID - ) - { - ItemID = itemID; - ItemGuid = itemGuid; - LanguageName = languageName; - ContentTypeName = contentTypeName; - Name = name; - IsSecured = isSecured; - ContentTypeID = contentTypeID; - ContentLanguageID = contentLanguageID; - } -} +using CMS.ContentEngine; +using CMS.Websites; + +namespace Kentico.Xperience.Lucene.Core.Indexing; + +/// +/// Abstraction of different types of events generated from content modifications +/// +public interface IIndexEventItemModel +{ + /// + /// The identifier of the item + /// + int ItemID { get; set; } + Guid ItemGuid { get; set; } + string LanguageName { get; set; } + string ContentTypeName { get; set; } + string Name { get; set; } + bool IsSecured { get; set; } + int ContentTypeID { get; set; } + int ContentLanguageID { get; set; } +} + +/// +/// Represents a modification to a web page +/// +public class IndexEventWebPageItemModel : IIndexEventItemModel +{ + /// + /// The + /// + public int ItemID { get; set; } + /// + /// The + /// + public Guid ItemGuid { get; set; } + public string LanguageName { get; set; } = string.Empty; + public string ContentTypeName { get; set; } = string.Empty; + /// + /// The + /// + public string Name { get; set; } = string.Empty; + public bool IsSecured { get; set; } + public int ContentTypeID { get; set; } + public int ContentLanguageID { get; set; } + + public string WebsiteChannelName { get; set; } = string.Empty; + public string WebPageItemTreePath { get; set; } = string.Empty; + public int? ParentID { get; set; } + public int Order { get; set; } + public IndexEventWebPageItemModel() { } + public IndexEventWebPageItemModel( + int itemID, + Guid itemGuid, + string languageName, + string contentTypeName, + string name, + bool isSecured, + int contentTypeID, + int contentLanguageID, + string websiteChannelName, + string webPageItemTreePath, + int parentID, + int order + ) + { + ItemID = itemID; + ItemGuid = itemGuid; + LanguageName = languageName; + ContentTypeName = contentTypeName; + WebsiteChannelName = websiteChannelName; + WebPageItemTreePath = webPageItemTreePath; + ParentID = parentID; + Order = order; + Name = name; + IsSecured = isSecured; + ContentTypeID = contentTypeID; + ContentLanguageID = contentLanguageID; + } + + public IndexEventWebPageItemModel( + int itemID, + Guid itemGuid, + string languageName, + string contentTypeName, + string name, + bool isSecured, + int contentTypeID, + int contentLanguageID, + string websiteChannelName, + string webPageItemTreePath, + int order + ) + { + ItemID = itemID; + ItemGuid = itemGuid; + LanguageName = languageName; + ContentTypeName = contentTypeName; + WebsiteChannelName = websiteChannelName; + WebPageItemTreePath = webPageItemTreePath; + Order = order; + Name = name; + IsSecured = isSecured; + ContentTypeID = contentTypeID; + ContentLanguageID = contentLanguageID; + } +} + +/// +/// Represents a modification to a reusable content item +/// +public class IndexEventReusableItemModel : IIndexEventItemModel +{ + /// + /// The + /// + public int ItemID { get; set; } + /// + /// The + /// + public Guid ItemGuid { get; set; } + public string LanguageName { get; set; } = string.Empty; + public string ContentTypeName { get; set; } = string.Empty; + /// + /// The + /// + public string Name { get; set; } = string.Empty; + public bool IsSecured { get; set; } + public int ContentTypeID { get; set; } + public int ContentLanguageID { get; set; } + public IndexEventReusableItemModel() { } + public IndexEventReusableItemModel( + int itemID, + Guid itemGuid, + string languageName, + string contentTypeName, + string name, + bool isSecured, + int contentTypeID, + int contentLanguageID + ) + { + ItemID = itemID; + ItemGuid = itemGuid; + LanguageName = languageName; + ContentTypeName = contentTypeName; + Name = name; + IsSecured = isSecured; + ContentTypeID = contentTypeID; + ContentLanguageID = contentLanguageID; + } +} diff --git a/src/Kentico.Xperience.Lucene.Core/Indexing/LuceneIndex.cs b/src/Kentico.Xperience.Lucene.Core/Indexing/LuceneIndex.cs index 1c6734f..a4e5615 100644 --- a/src/Kentico.Xperience.Lucene.Core/Indexing/LuceneIndex.cs +++ b/src/Kentico.Xperience.Lucene.Core/Indexing/LuceneIndex.cs @@ -1,84 +1,90 @@ -using Lucene.Net.Analysis; -using Lucene.Net.Analysis.Standard; -using Lucene.Net.Util; - -namespace Kentico.Xperience.Lucene.Core.Indexing; - -/// -/// Represents the configuration of an Lucene index. -/// -public sealed class LuceneIndex -{ - /// - /// An arbitrary ID used to identify the Lucene index in the admin UI. - /// - public int Identifier { get; set; } - - /// - /// The code name of the Lucene index. - /// - public string IndexName { get; } - - /// - /// The Name of the WebSiteChannel. - /// - public string WebSiteChannelName { get; } - - /// - /// The Language used on the WebSite on the Channel which is indexed. - /// - public List LanguageNames { get; } - - /// - /// Lucene Analyzer used for indexing. - /// - public Analyzer LuceneAnalyzer { get; } - - /// - /// The type of the class which extends . - /// - public Type LuceneIndexingStrategyType { get; } - - /// - /// Index storage context, employs picked storage strategy - /// - public IndexStorageContext StorageContext { get; } - - internal IEnumerable IncludedPaths { get; set; } - - internal LuceneIndex(LuceneIndexModel indexConfiguration, Dictionary strategies, Dictionary analyzers, LuceneVersion matchVersion) - { - Identifier = indexConfiguration.Id; - IndexName = indexConfiguration.IndexName; - WebSiteChannelName = indexConfiguration.ChannelName; - LanguageNames = indexConfiguration.LanguageNames.ToList(); - IncludedPaths = indexConfiguration.Paths; - - var strategy = typeof(DefaultLuceneIndexingStrategy); - - if (strategies.ContainsKey(indexConfiguration.StrategyName)) - { - strategy = strategies[indexConfiguration.StrategyName]; - } - - var analyzerType = typeof(StandardAnalyzer); - - if (analyzers.ContainsKey(indexConfiguration.AnalyzerName)) - { - analyzerType = analyzers[indexConfiguration.AnalyzerName]; - } - - var constructorParameters = analyzerType.GetConstructors().Select(x => new - { - Constructor = x, - Parameters = x.GetParameters() - }); - var constructor = constructorParameters.First(x => x.Parameters.Length == 1 && x.Parameters.Single().ParameterType == typeof(LuceneVersion)).Constructor; - LuceneAnalyzer = (Analyzer)constructor.Invoke([matchVersion]); - - LuceneIndexingStrategyType = strategy; - - string indexStoragePath = Path.Combine(Environment.CurrentDirectory, "App_Data", "LuceneSearch", indexConfiguration.IndexName); - StorageContext = new IndexStorageContext(new GenerationStorageStrategy(), indexStoragePath, new IndexRetentionPolicy(4)); - } -} +using Lucene.Net.Analysis; +using Lucene.Net.Analysis.Standard; +using Lucene.Net.Util; + +namespace Kentico.Xperience.Lucene.Core.Indexing; + +/// +/// Represents the configuration of an Lucene index. +/// +public sealed class LuceneIndex +{ + /// + /// An arbitrary ID used to identify the Lucene index in the admin UI. + /// + public int Identifier { get; set; } + + /// + /// The code name of the Lucene index. + /// + public string IndexName { get; } + + /// + /// The Name of the WebSiteChannel. + /// + public string WebSiteChannelName { get; } + + /// + /// The Language used on the WebSite on the Channel which is indexed. + /// + public List LanguageNames { get; } + + /// + /// A list of reusable content types that will be indexed. + /// + public List IncludedReusableContentTypes { get; } + + /// + /// Lucene Analyzer used for indexing. + /// + public Analyzer LuceneAnalyzer { get; } + + /// + /// The type of the class which extends . + /// + public Type LuceneIndexingStrategyType { get; } + + /// + /// Index storage context, employs picked storage strategy + /// + public IndexStorageContext StorageContext { get; } + + internal IEnumerable IncludedPaths { get; set; } + + internal LuceneIndex(LuceneIndexModel indexConfiguration, Dictionary strategies, Dictionary analyzers, LuceneVersion matchVersion) + { + Identifier = indexConfiguration.Id; + IndexName = indexConfiguration.IndexName; + WebSiteChannelName = indexConfiguration.ChannelName; + LanguageNames = indexConfiguration.LanguageNames.ToList(); + IncludedReusableContentTypes = indexConfiguration.ReusableContentTypeNames.ToList(); + IncludedPaths = indexConfiguration.Paths; + + var strategy = typeof(DefaultLuceneIndexingStrategy); + + if (strategies.ContainsKey(indexConfiguration.StrategyName)) + { + strategy = strategies[indexConfiguration.StrategyName]; + } + + var analyzerType = typeof(StandardAnalyzer); + + if (analyzers.ContainsKey(indexConfiguration.AnalyzerName)) + { + analyzerType = analyzers[indexConfiguration.AnalyzerName]; + } + + var constructorParameters = analyzerType.GetConstructors().Select(x => new + { + Constructor = x, + Parameters = x.GetParameters() + }); + var constructor = constructorParameters.First(x => x.Parameters.Length == 1 && x.Parameters.Single().ParameterType == typeof(LuceneVersion)).Constructor; + LuceneAnalyzer = (Analyzer)constructor.Invoke([matchVersion]); + + LuceneIndexingStrategyType = strategy; + + string indexStoragePath = Path.Combine(Environment.CurrentDirectory, "App_Data", "LuceneSearch", indexConfiguration.IndexName); + StorageContext = new IndexStorageContext(new GenerationStorageStrategy(), indexStoragePath, new IndexRetentionPolicy(4)); + } +} diff --git a/src/Kentico.Xperience.Lucene.Core/Indexing/LuceneIndexModel.cs b/src/Kentico.Xperience.Lucene.Core/Indexing/LuceneIndexModel.cs index 3915b35..c3fcdd5 100644 --- a/src/Kentico.Xperience.Lucene.Core/Indexing/LuceneIndexModel.cs +++ b/src/Kentico.Xperience.Lucene.Core/Indexing/LuceneIndexModel.cs @@ -1,47 +1,54 @@ -namespace Kentico.Xperience.Lucene.Core.Indexing; - -public class LuceneIndexModel -{ - public int Id { get; set; } - - public string IndexName { get; set; } = ""; - - public IEnumerable LanguageNames { get; set; } = Enumerable.Empty(); - - public string ChannelName { get; set; } = ""; - - public string StrategyName { get; set; } = ""; - - public string AnalyzerName { get; set; } = ""; - - public string RebuildHook { get; set; } = ""; - - public IEnumerable Paths { get; set; } = Enumerable.Empty(); - - public LuceneIndexModel() { } - - public LuceneIndexModel( - LuceneIndexItemInfo index, - IEnumerable indexLanguages, - IEnumerable indexPaths, - IEnumerable contentTypes - ) - { - Id = index.LuceneIndexItemId; - IndexName = index.LuceneIndexItemIndexName; - ChannelName = index.LuceneIndexItemChannelName; - RebuildHook = index.LuceneIndexItemRebuildHook; - StrategyName = index.LuceneIndexItemStrategyName; - AnalyzerName = index.LuceneIndexItemAnalyzerName; - LanguageNames = indexLanguages - .Where(l => l.LuceneIndexLanguageItemIndexItemId == index.LuceneIndexItemId) - .Select(l => l.LuceneIndexLanguageItemName) - .ToList(); - Paths = indexPaths - .Where(p => p.LuceneIncludedPathItemIndexItemId == index.LuceneIndexItemId) - .Select(p => new LuceneIndexIncludedPath(p, - contentTypes.Where(x => x.LucenePathItemId == p.LuceneIncludedPathItemId)) - ) - .ToList(); - } -} +namespace Kentico.Xperience.Lucene.Core.Indexing; + +public class LuceneIndexModel +{ + public int Id { get; set; } + + public string IndexName { get; set; } = ""; + + public IEnumerable LanguageNames { get; set; } = Enumerable.Empty(); + + public string ChannelName { get; set; } = ""; + + public string StrategyName { get; set; } = ""; + + public string AnalyzerName { get; set; } = ""; + + public string RebuildHook { get; set; } = ""; + + public IEnumerable Paths { get; set; } = Enumerable.Empty(); + + public IEnumerable ReusableContentTypeNames { get; set; } = Enumerable.Empty(); + + public LuceneIndexModel() { } + + public LuceneIndexModel( + LuceneIndexItemInfo index, + IEnumerable indexLanguages, + IEnumerable indexPaths, + IEnumerable contentTypes, + IEnumerable reusableContentTypes + ) + { + Id = index.LuceneIndexItemId; + IndexName = index.LuceneIndexItemIndexName; + ChannelName = index.LuceneIndexItemChannelName; + RebuildHook = index.LuceneIndexItemRebuildHook; + StrategyName = index.LuceneIndexItemStrategyName; + AnalyzerName = index.LuceneIndexItemAnalyzerName; + LanguageNames = indexLanguages + .Where(l => l.LuceneIndexLanguageItemIndexItemId == index.LuceneIndexItemId) + .Select(l => l.LuceneIndexLanguageItemName) + .ToList(); + ReusableContentTypeNames = reusableContentTypes + .Where(c => c.LuceneReusableContentTypeItemIndexItemId == index.LuceneIndexItemId) + .Select(c => c.LuceneReusableContentTypeItemContentTypeName) + .ToList(); + Paths = indexPaths + .Where(p => p.LuceneIncludedPathItemIndexItemId == index.LuceneIndexItemId) + .Select(p => new LuceneIndexIncludedPath(p, + contentTypes.Where(x => x.LucenePathItemId == p.LuceneIncludedPathItemId)) + ) + .ToList(); + } +} diff --git a/src/Kentico.Xperience.Lucene.Core/InfoModels/LuceneContentTypeItem/ILuceneContentTypeItemInfoProvider.cs b/src/Kentico.Xperience.Lucene.Core/InfoModels/LuceneContentTypeItem/ILuceneContentTypeItemInfoProvider.cs deleted file mode 100644 index 4ed616a..0000000 --- a/src/Kentico.Xperience.Lucene.Core/InfoModels/LuceneContentTypeItem/ILuceneContentTypeItemInfoProvider.cs +++ /dev/null @@ -1,11 +0,0 @@ -using CMS.DataEngine; - -namespace Kentico.Xperience.Lucene.Core; - -/// -/// Declares members for management. -/// -public partial interface ILuceneContentTypeItemInfoProvider -{ - void BulkDelete(IWhereCondition where, BulkDeleteSettings? settings = null); -} diff --git a/src/Kentico.Xperience.Lucene.Core/InfoModels/LuceneContentTypeItem/ILuceneContentTypeItemInfoProvider.generated.cs b/src/Kentico.Xperience.Lucene.Core/InfoModels/LuceneContentTypeItem/ILuceneContentTypeItemInfoProvider.generated.cs deleted file mode 100644 index 9f1cc31..0000000 --- a/src/Kentico.Xperience.Lucene.Core/InfoModels/LuceneContentTypeItem/ILuceneContentTypeItemInfoProvider.generated.cs +++ /dev/null @@ -1,10 +0,0 @@ -using CMS.DataEngine; - -namespace Kentico.Xperience.Lucene.Core; - -/// -/// Declares members for management. -/// -public partial interface ILuceneContentTypeItemInfoProvider : IInfoProvider, IInfoByIdProvider, IInfoByNameProvider -{ -} diff --git a/src/Kentico.Xperience.Lucene.Core/InfoModels/LuceneContentTypeItem/LuceneContentTypeItemInfo.generated.cs b/src/Kentico.Xperience.Lucene.Core/InfoModels/LuceneContentTypeItem/LuceneContentTypeItemInfo.generated.cs index 46187f1..f7abc92 100644 --- a/src/Kentico.Xperience.Lucene.Core/InfoModels/LuceneContentTypeItem/LuceneContentTypeItemInfo.generated.cs +++ b/src/Kentico.Xperience.Lucene.Core/InfoModels/LuceneContentTypeItem/LuceneContentTypeItemInfo.generated.cs @@ -16,7 +16,7 @@ namespace Kentico.Xperience.Lucene.Core; /// Data container class for . /// [Serializable] -public partial class LuceneContentTypeItemInfo : AbstractInfo +public partial class LuceneContentTypeItemInfo : AbstractInfo> { /// /// Object type. @@ -27,7 +27,7 @@ public partial class LuceneContentTypeItemInfo : AbstractInfo /// Type information. /// - public static readonly ObjectTypeInfo TYPEINFO = new(typeof(LuceneContentTypeItemInfoProvider), OBJECT_TYPE, "KenticoLucene.LuceneContentTypeItem", nameof(LuceneContentTypeItemId), null, nameof(LuceneContentTypeItemGuid), null, null, null, null, null) + public static readonly ObjectTypeInfo TYPEINFO = new(typeof(IInfoProvider), OBJECT_TYPE, "KenticoLucene.LuceneContentTypeItem", nameof(LuceneContentTypeItemId), null, nameof(LuceneContentTypeItemGuid), null, null, null, null, null) { TouchCacheDependencies = true, DependsOn = new List() diff --git a/src/Kentico.Xperience.Lucene.Core/InfoModels/LuceneContentTypeItem/LuceneContentTypeItemInfoProvider.generated.cs b/src/Kentico.Xperience.Lucene.Core/InfoModels/LuceneContentTypeItem/LuceneContentTypeItemInfoProvider.generated.cs deleted file mode 100644 index 7434d99..0000000 --- a/src/Kentico.Xperience.Lucene.Core/InfoModels/LuceneContentTypeItem/LuceneContentTypeItemInfoProvider.generated.cs +++ /dev/null @@ -1,18 +0,0 @@ -using CMS.DataEngine; - -namespace Kentico.Xperience.Lucene.Core; - -/// -/// Class providing management. -/// -[ProviderInterface(typeof(ILuceneContentTypeItemInfoProvider))] -public partial class LuceneContentTypeItemInfoProvider : AbstractInfoProvider, ILuceneContentTypeItemInfoProvider -{ - /// - /// Initializes a new instance of the class. - /// - public LuceneContentTypeItemInfoProvider() - : base(LuceneContentTypeItemInfo.TYPEINFO) - { - } -} diff --git a/src/Kentico.Xperience.Lucene.Core/InfoModels/LuceneIncludedPathItem/ILuceneIncludedPathItemInfoProvider.cs b/src/Kentico.Xperience.Lucene.Core/InfoModels/LuceneIncludedPathItem/ILuceneIncludedPathItemInfoProvider.cs deleted file mode 100644 index fa055df..0000000 --- a/src/Kentico.Xperience.Lucene.Core/InfoModels/LuceneIncludedPathItem/ILuceneIncludedPathItemInfoProvider.cs +++ /dev/null @@ -1,8 +0,0 @@ -using CMS.DataEngine; - -namespace Kentico.Xperience.Lucene.Core; - -public partial interface ILuceneIncludedPathItemInfoProvider -{ - void BulkDelete(IWhereCondition where, BulkDeleteSettings? settings = null); -} diff --git a/src/Kentico.Xperience.Lucene.Core/InfoModels/LuceneIncludedPathItem/ILuceneIncludedPathItemInfoProvider.generated.cs b/src/Kentico.Xperience.Lucene.Core/InfoModels/LuceneIncludedPathItem/ILuceneIncludedPathItemInfoProvider.generated.cs deleted file mode 100644 index a8539f4..0000000 --- a/src/Kentico.Xperience.Lucene.Core/InfoModels/LuceneIncludedPathItem/ILuceneIncludedPathItemInfoProvider.generated.cs +++ /dev/null @@ -1,10 +0,0 @@ -using CMS.DataEngine; - -namespace Kentico.Xperience.Lucene.Core; - -/// -/// Declares members for management. -/// -public partial interface ILuceneIncludedPathItemInfoProvider : IInfoProvider, IInfoByIdProvider -{ -} diff --git a/src/Kentico.Xperience.Lucene.Core/InfoModels/LuceneIncludedPathItem/LuceneIncludedPathItemInfo.generated.cs b/src/Kentico.Xperience.Lucene.Core/InfoModels/LuceneIncludedPathItem/LuceneIncludedPathItemInfo.generated.cs index d272bc5..54009c3 100644 --- a/src/Kentico.Xperience.Lucene.Core/InfoModels/LuceneIncludedPathItem/LuceneIncludedPathItemInfo.generated.cs +++ b/src/Kentico.Xperience.Lucene.Core/InfoModels/LuceneIncludedPathItem/LuceneIncludedPathItemInfo.generated.cs @@ -15,7 +15,7 @@ namespace Kentico.Xperience.Lucene.Core; /// Data container class for . /// [Serializable] -public partial class LuceneIncludedPathItemInfo : AbstractInfo +public partial class LuceneIncludedPathItemInfo : AbstractInfo> { /// /// Object type. @@ -26,7 +26,7 @@ public partial class LuceneIncludedPathItemInfo : AbstractInfo /// Type information. /// - public static readonly ObjectTypeInfo TYPEINFO = new(typeof(LuceneIncludedPathItemInfoProvider), OBJECT_TYPE, "KenticoLucene.LuceneIncludedPathItem", nameof(LuceneIncludedPathItemId), null, nameof(LuceneIncludedPathItemGuid), null, null, null, null, null) + public static readonly ObjectTypeInfo TYPEINFO = new(typeof(IInfoProvider), OBJECT_TYPE, "KenticoLucene.LuceneIncludedPathItem", nameof(LuceneIncludedPathItemId), null, nameof(LuceneIncludedPathItemGuid), null, null, null, null, null) { TouchCacheDependencies = true, DependsOn = new List() diff --git a/src/Kentico.Xperience.Lucene.Core/InfoModels/LuceneIncludedPathItem/LuceneIncludedPathItemInfoProvider.generated.cs b/src/Kentico.Xperience.Lucene.Core/InfoModels/LuceneIncludedPathItem/LuceneIncludedPathItemInfoProvider.generated.cs deleted file mode 100644 index dc1615a..0000000 --- a/src/Kentico.Xperience.Lucene.Core/InfoModels/LuceneIncludedPathItem/LuceneIncludedPathItemInfoProvider.generated.cs +++ /dev/null @@ -1,18 +0,0 @@ -using CMS.DataEngine; - -namespace Kentico.Xperience.Lucene.Core; - -/// -/// Class providing management. -/// -[ProviderInterface(typeof(ILuceneIncludedPathItemInfoProvider))] -public partial class LuceneIncludedPathItemInfoProvider : AbstractInfoProvider, ILuceneIncludedPathItemInfoProvider -{ - /// - /// Initializes a new instance of the class. - /// - public LuceneIncludedPathItemInfoProvider() - : base(LuceneIncludedPathItemInfo.TYPEINFO) - { - } -} diff --git a/src/Kentico.Xperience.Lucene.Core/InfoModels/LuceneIndexItem/ILuceneIndexItemInfoProvider.cs b/src/Kentico.Xperience.Lucene.Core/InfoModels/LuceneIndexItem/ILuceneIndexItemInfoProvider.cs deleted file mode 100644 index 94194c5..0000000 --- a/src/Kentico.Xperience.Lucene.Core/InfoModels/LuceneIndexItem/ILuceneIndexItemInfoProvider.cs +++ /dev/null @@ -1,8 +0,0 @@ -using CMS.DataEngine; - -namespace Kentico.Xperience.Lucene.Core; - -public partial interface ILuceneIndexItemInfoProvider -{ - void BulkDelete(IWhereCondition where, BulkDeleteSettings? settings = null); -} diff --git a/src/Kentico.Xperience.Lucene.Core/InfoModels/LuceneIndexItem/ILuceneIndexItemInfoProvider.generated.cs b/src/Kentico.Xperience.Lucene.Core/InfoModels/LuceneIndexItem/ILuceneIndexItemInfoProvider.generated.cs deleted file mode 100644 index 3981b8f..0000000 --- a/src/Kentico.Xperience.Lucene.Core/InfoModels/LuceneIndexItem/ILuceneIndexItemInfoProvider.generated.cs +++ /dev/null @@ -1,10 +0,0 @@ -using CMS.DataEngine; - -namespace Kentico.Xperience.Lucene.Core; - -/// -/// Declares members for management. -/// -public partial interface ILuceneIndexItemInfoProvider : IInfoProvider, IInfoByIdProvider, IInfoByNameProvider -{ -} diff --git a/src/Kentico.Xperience.Lucene.Core/InfoModels/LuceneIndexItem/LuceneIndexItemInfo.generated.cs b/src/Kentico.Xperience.Lucene.Core/InfoModels/LuceneIndexItem/LuceneIndexItemInfo.generated.cs index 758a901..5197793 100644 --- a/src/Kentico.Xperience.Lucene.Core/InfoModels/LuceneIndexItem/LuceneIndexItemInfo.generated.cs +++ b/src/Kentico.Xperience.Lucene.Core/InfoModels/LuceneIndexItem/LuceneIndexItemInfo.generated.cs @@ -15,7 +15,7 @@ namespace Kentico.Xperience.Lucene.Core; /// Data container class for . /// [Serializable] -public partial class LuceneIndexItemInfo : AbstractInfo +public partial class LuceneIndexItemInfo : AbstractInfo> { /// /// Object type. @@ -26,7 +26,7 @@ public partial class LuceneIndexItemInfo : AbstractInfo /// Type information. /// - public static readonly ObjectTypeInfo TYPEINFO = new(typeof(LuceneIndexItemInfoProvider), OBJECT_TYPE, "KenticoLucene.LuceneIndexItem", nameof(LuceneIndexItemId), null, nameof(LuceneIndexItemGuid), nameof(LuceneIndexItemIndexName), null, null, null, null) + public static readonly ObjectTypeInfo TYPEINFO = new(typeof(IInfoProvider), OBJECT_TYPE, "KenticoLucene.LuceneIndexItem", nameof(LuceneIndexItemId), null, nameof(LuceneIndexItemGuid), nameof(LuceneIndexItemIndexName), null, null, null, null) { TouchCacheDependencies = true, ContinuousIntegrationSettings = diff --git a/src/Kentico.Xperience.Lucene.Core/InfoModels/LuceneIndexItem/LuceneIndexItemInfoProvider.generated.cs b/src/Kentico.Xperience.Lucene.Core/InfoModels/LuceneIndexItem/LuceneIndexItemInfoProvider.generated.cs deleted file mode 100644 index 96f8fe8..0000000 --- a/src/Kentico.Xperience.Lucene.Core/InfoModels/LuceneIndexItem/LuceneIndexItemInfoProvider.generated.cs +++ /dev/null @@ -1,18 +0,0 @@ -using CMS.DataEngine; - -namespace Kentico.Xperience.Lucene.Core; - -/// -/// Class providing management. -/// -[ProviderInterface(typeof(ILuceneIndexItemInfoProvider))] -public partial class LuceneIndexItemInfoProvider : AbstractInfoProvider, ILuceneIndexItemInfoProvider -{ - /// - /// Initializes a new instance of the class. - /// - public LuceneIndexItemInfoProvider() - : base(LuceneIndexItemInfo.TYPEINFO) - { - } -} diff --git a/src/Kentico.Xperience.Lucene.Core/InfoModels/LuceneIndexLanguageItem/ILuceneIndexLanguageItemInfoProvider.cs b/src/Kentico.Xperience.Lucene.Core/InfoModels/LuceneIndexLanguageItem/ILuceneIndexLanguageItemInfoProvider.cs deleted file mode 100644 index 4714da7..0000000 --- a/src/Kentico.Xperience.Lucene.Core/InfoModels/LuceneIndexLanguageItem/ILuceneIndexLanguageItemInfoProvider.cs +++ /dev/null @@ -1,11 +0,0 @@ -using CMS.DataEngine; - -namespace Kentico.Xperience.Lucene.Core; - -/// -/// Declares members for management. -/// -public partial interface ILuceneIndexLanguageItemInfoProvider -{ - void BulkDelete(IWhereCondition where, BulkDeleteSettings? settings = null); -} diff --git a/src/Kentico.Xperience.Lucene.Core/InfoModels/LuceneIndexLanguageItem/ILuceneIndexLanguageItemInfoProvider.generated.cs b/src/Kentico.Xperience.Lucene.Core/InfoModels/LuceneIndexLanguageItem/ILuceneIndexLanguageItemInfoProvider.generated.cs deleted file mode 100644 index d8d7639..0000000 --- a/src/Kentico.Xperience.Lucene.Core/InfoModels/LuceneIndexLanguageItem/ILuceneIndexLanguageItemInfoProvider.generated.cs +++ /dev/null @@ -1,10 +0,0 @@ -using CMS.DataEngine; - -namespace Kentico.Xperience.Lucene.Core; - -/// -/// Declares members for management. -/// -public partial interface ILuceneIndexLanguageItemInfoProvider : IInfoProvider, IInfoByIdProvider -{ -} diff --git a/src/Kentico.Xperience.Lucene.Core/InfoModels/LuceneIndexLanguageItem/LuceneIndexLanguageItemInfo.generated.cs b/src/Kentico.Xperience.Lucene.Core/InfoModels/LuceneIndexLanguageItem/LuceneIndexLanguageItemInfo.generated.cs index 131835f..bc11777 100644 --- a/src/Kentico.Xperience.Lucene.Core/InfoModels/LuceneIndexLanguageItem/LuceneIndexLanguageItemInfo.generated.cs +++ b/src/Kentico.Xperience.Lucene.Core/InfoModels/LuceneIndexLanguageItem/LuceneIndexLanguageItemInfo.generated.cs @@ -15,7 +15,7 @@ namespace Kentico.Xperience.Lucene.Core; /// Data container class for . /// [Serializable] -public partial class LuceneIndexLanguageItemInfo : AbstractInfo +public partial class LuceneIndexLanguageItemInfo : AbstractInfo> { /// /// Object type. @@ -26,7 +26,7 @@ public partial class LuceneIndexLanguageItemInfo : AbstractInfo /// Type information. /// - public static readonly ObjectTypeInfo TYPEINFO = new(typeof(LuceneIndexedLanguageInfoProvider), OBJECT_TYPE, "KenticoLucene.LuceneIndexLanguageItem", nameof(LuceneIndexLanguageItemID), null, nameof(LuceneIndexLanguageItemGuid), null, null, null, null, null) + public static readonly ObjectTypeInfo TYPEINFO = new(typeof(IInfoProvider), OBJECT_TYPE, "KenticoLucene.LuceneIndexLanguageItem", nameof(LuceneIndexLanguageItemID), null, nameof(LuceneIndexLanguageItemGuid), null, null, null, null, null) { TouchCacheDependencies = true, DependsOn = new List() diff --git a/src/Kentico.Xperience.Lucene.Core/InfoModels/LuceneIndexLanguageItem/LuceneIndexLanguageItemInfoProvider.generated.cs b/src/Kentico.Xperience.Lucene.Core/InfoModels/LuceneIndexLanguageItem/LuceneIndexLanguageItemInfoProvider.generated.cs deleted file mode 100644 index 2492aae..0000000 --- a/src/Kentico.Xperience.Lucene.Core/InfoModels/LuceneIndexLanguageItem/LuceneIndexLanguageItemInfoProvider.generated.cs +++ /dev/null @@ -1,18 +0,0 @@ -using CMS.DataEngine; - -namespace Kentico.Xperience.Lucene.Core; - -/// -/// Class providing management. -/// -[ProviderInterface(typeof(ILuceneIndexLanguageItemInfoProvider))] -public partial class LuceneIndexedLanguageInfoProvider : AbstractInfoProvider, ILuceneIndexLanguageItemInfoProvider -{ - /// - /// Initializes a new instance of the class. - /// - public LuceneIndexedLanguageInfoProvider() - : base(LuceneIndexLanguageItemInfo.TYPEINFO) - { - } -} diff --git a/src/Kentico.Xperience.Lucene.Core/InfoModels/LuceneReusableContentTypeItem/LuceneReusableContentTypeItemInfo.generated.cs b/src/Kentico.Xperience.Lucene.Core/InfoModels/LuceneReusableContentTypeItem/LuceneReusableContentTypeItemInfo.generated.cs new file mode 100644 index 0000000..f5705ba --- /dev/null +++ b/src/Kentico.Xperience.Lucene.Core/InfoModels/LuceneReusableContentTypeItem/LuceneReusableContentTypeItemInfo.generated.cs @@ -0,0 +1,134 @@ +using System.Data; +using System.Runtime.Serialization; + +using CMS; +using CMS.DataEngine; +using CMS.Helpers; + +using Kentico.Xperience.Lucene.Core; + + +[assembly: RegisterObjectType(typeof(LuceneReusableContentTypeItemInfo), LuceneReusableContentTypeItemInfo.OBJECT_TYPE)] + +namespace Kentico.Xperience.Lucene.Core; + +/// +/// Data container class for . +/// +[Serializable] +public partial class LuceneReusableContentTypeItemInfo : AbstractInfo> +{ + /// + /// Object type. + /// + public const string OBJECT_TYPE = "kenticolucene.lucenereusablecontenttypeitem"; + + + /// + /// Type information. + /// + public static readonly ObjectTypeInfo TYPEINFO = new(typeof(IInfoProvider), OBJECT_TYPE, "KenticoLucene.LuceneReusableContentTypeItem", nameof(LuceneReusableContentTypeItemId), null, nameof(LuceneReusableContentTypeItemGuid), null, null, null, null, null) + { + TouchCacheDependencies = true, + DependsOn = new List() + { + new(nameof(LuceneReusableContentTypeItemIndexItemId), LuceneIndexItemInfo.OBJECT_TYPE, ObjectDependencyEnum.Required), + }, + ContinuousIntegrationSettings = + { + Enabled = true + } + }; + + + /// + /// Lucene reusable content type item id. + /// + [DatabaseField] + public virtual int LuceneReusableContentTypeItemId + { + get => ValidationHelper.GetInteger(GetValue(nameof(LuceneReusableContentTypeItemId)), 0); + set => SetValue(nameof(LuceneReusableContentTypeItemId), value); + } + + + /// + /// Lucene reusable content type item guid. + /// + [DatabaseField] + public virtual Guid LuceneReusableContentTypeItemGuid + { + get => ValidationHelper.GetGuid(GetValue(nameof(LuceneReusableContentTypeItemGuid)), default); + set => SetValue(nameof(LuceneReusableContentTypeItemGuid), value); + } + + + /// + /// Reusable content type name. + /// + [DatabaseField] + public virtual string LuceneReusableContentTypeItemContentTypeName + { + get => ValidationHelper.GetString(GetValue(nameof(LuceneReusableContentTypeItemContentTypeName)), String.Empty); + set => SetValue(nameof(LuceneReusableContentTypeItemContentTypeName), value); + } + + + /// + /// Lucene index item id. + /// + [DatabaseField] + public virtual int LuceneReusableContentTypeItemIndexItemId + { + get => ValidationHelper.GetInteger(GetValue(nameof(LuceneReusableContentTypeItemIndexItemId)), 0); + set => SetValue(nameof(LuceneReusableContentTypeItemIndexItemId), value); + } + + + /// + /// Deletes the object using appropriate provider. + /// + protected override void DeleteObject() + { + Provider.Delete(this); + } + + + /// + /// Updates the object using appropriate provider. + /// + protected override void SetObject() + { + Provider.Set(this); + } + + + /// + /// Constructor for de-serialization. + /// + /// Serialization info. + /// Streaming context. + protected LuceneReusableContentTypeItemInfo(SerializationInfo info, StreamingContext context) + : base(info, context) + { + } + + + /// + /// Creates an empty instance of the class. + /// + public LuceneReusableContentTypeItemInfo() + : base(TYPEINFO) + { + } + + + /// + /// Creates a new instances of the class from the given . + /// + /// DataRow with the object data. + public LuceneReusableContentTypeItemInfo(DataRow dr) + : base(TYPEINFO, dr) + { + } +} diff --git a/src/Kentico.Xperience.Lucene.Core/LuceneModuleInstaller.cs b/src/Kentico.Xperience.Lucene.Core/LuceneModuleInstaller.cs index 16af4d7..15be7d7 100644 --- a/src/Kentico.Xperience.Lucene.Core/LuceneModuleInstaller.cs +++ b/src/Kentico.Xperience.Lucene.Core/LuceneModuleInstaller.cs @@ -1,335 +1,394 @@ -using CMS.DataEngine; -using CMS.FormEngine; -using CMS.Modules; - -namespace Kentico.Xperience.Lucene.Core; - -public class LuceneModuleInstaller(IInfoProvider resourceProvider) -{ - private readonly IInfoProvider resourceProvider = resourceProvider; - - public void Install() - { - var resource = resourceProvider.Get("CMS.Integration.Lucene") - // Handle v4.0.0 resource name manually until migrations are enabled - ?? resourceProvider.Get("Kentico.Xperience.Lucene") - ?? new ResourceInfo(); - - InitializeResource(resource); - InstallLuceneItemInfo(resource); - InstallLuceneLanguageInfo(resource); - InstallLuceneIndexPathItemInfo(resource); - InstallLuceneContentTypeItemInfo(resource); - } - - public ResourceInfo InitializeResource(ResourceInfo resource) - { - resource.ResourceDisplayName = "Kentico Integration - Lucene"; - - // Prefix ResourceName with "CMS" to prevent C# class generation - // Classes are already available through the library itself - resource.ResourceName = "CMS.Integration.Lucene"; - resource.ResourceDescription = "Kentico Lucene custom data"; - resource.ResourceIsInDevelopment = false; - if (resource.HasChanged) - { - resourceProvider.Set(resource); - } - - return resource; - } - - public void InstallLuceneItemInfo(ResourceInfo resource) - { - var info = DataClassInfoProvider.GetDataClassInfo(LuceneIndexItemInfo.OBJECT_TYPE) ?? DataClassInfo.New(LuceneIndexItemInfo.OBJECT_TYPE); - - info.ClassName = LuceneIndexItemInfo.TYPEINFO.ObjectClassName; - info.ClassTableName = LuceneIndexItemInfo.TYPEINFO.ObjectClassName.Replace(".", "_"); - info.ClassDisplayName = "Lucene Index Item"; - info.ClassType = ClassType.OTHER; - info.ClassResourceID = resource.ResourceID; - - var formInfo = FormHelper.GetBasicFormDefinition(nameof(LuceneIndexItemInfo.LuceneIndexItemId)); - - var formItem = new FormFieldInfo - { - Name = nameof(LuceneIndexItemInfo.LuceneIndexItemGuid), - AllowEmpty = false, - Visible = true, - Precision = 0, - DataType = "guid", - Enabled = true, - }; - formInfo.AddFormItem(formItem); - - formItem = new FormFieldInfo - { - Name = nameof(LuceneIndexItemInfo.LuceneIndexItemIndexName), - AllowEmpty = false, - Visible = true, - Precision = 0, - Size = 100, - DataType = "text", - Enabled = true - }; - formInfo.AddFormItem(formItem); - - formItem = new FormFieldInfo - { - Name = nameof(LuceneIndexItemInfo.LuceneIndexItemChannelName), - AllowEmpty = false, - Visible = true, - Precision = 0, - Size = 100, - DataType = "text", - Enabled = true - }; - formInfo.AddFormItem(formItem); - - formItem = new FormFieldInfo - { - Name = nameof(LuceneIndexItemInfo.LuceneIndexItemStrategyName), - AllowEmpty = false, - Visible = true, - Precision = 0, - Size = 100, - DataType = "text", - Enabled = true - }; - formInfo.AddFormItem(formItem); - - formItem = new FormFieldInfo - { - Name = nameof(LuceneIndexItemInfo.LuceneIndexItemAnalyzerName), - AllowEmpty = false, - Visible = true, - Precision = 0, - Size = 100, - DataType = "text", - Enabled = true - }; - formInfo.AddFormItem(formItem); - - formItem = new FormFieldInfo - { - Name = nameof(LuceneIndexItemInfo.LuceneIndexItemRebuildHook), - AllowEmpty = true, - Visible = true, - Precision = 0, - Size = 100, - DataType = "text", - Enabled = true - }; - formInfo.AddFormItem(formItem); - - SetFormDefinition(info, formInfo); - - if (info.HasChanged) - { - DataClassInfoProvider.SetDataClassInfo(info); - } - } - - public void InstallLuceneIndexPathItemInfo(ResourceInfo resource) - { - var info = DataClassInfoProvider.GetDataClassInfo(LuceneIncludedPathItemInfo.OBJECT_TYPE) ?? DataClassInfo.New(LuceneIncludedPathItemInfo.OBJECT_TYPE); - - info.ClassName = LuceneIncludedPathItemInfo.TYPEINFO.ObjectClassName; - info.ClassTableName = LuceneIncludedPathItemInfo.TYPEINFO.ObjectClassName.Replace(".", "_"); - info.ClassDisplayName = "Lucene Path Item"; - info.ClassType = ClassType.OTHER; - info.ClassResourceID = resource.ResourceID; - - var formInfo = FormHelper.GetBasicFormDefinition(nameof(LuceneIncludedPathItemInfo.LuceneIncludedPathItemId)); - - var formItem = new FormFieldInfo - { - Name = nameof(LuceneIncludedPathItemInfo.LuceneIncludedPathItemGuid), - AllowEmpty = false, - Visible = true, - Precision = 0, - DataType = "guid", - Enabled = true, - }; - formInfo.AddFormItem(formItem); - - formItem = new FormFieldInfo - { - Name = nameof(LuceneIncludedPathItemInfo.LuceneIncludedPathItemAliasPath), - AllowEmpty = false, - Visible = true, - Precision = 0, - Size = 100, - DataType = "text", - Enabled = true, - }; - formInfo.AddFormItem(formItem); - - formItem = new FormFieldInfo - { - Name = nameof(LuceneIncludedPathItemInfo.LuceneIncludedPathItemIndexItemId), - AllowEmpty = false, - Visible = true, - Precision = 0, - DataType = "integer", - ReferenceToObjectType = LuceneIndexItemInfo.OBJECT_TYPE, - ReferenceType = ObjectDependencyEnum.Required - }; - - formInfo.AddFormItem(formItem); - - SetFormDefinition(info, formInfo); - - if (info.HasChanged) - { - DataClassInfoProvider.SetDataClassInfo(info); - } - } - - public void InstallLuceneLanguageInfo(ResourceInfo resource) - { - var info = DataClassInfoProvider.GetDataClassInfo(LuceneIndexLanguageItemInfo.OBJECT_TYPE) ?? DataClassInfo.New(LuceneIndexLanguageItemInfo.OBJECT_TYPE); - - info.ClassName = LuceneIndexLanguageItemInfo.TYPEINFO.ObjectClassName; - info.ClassTableName = LuceneIndexLanguageItemInfo.TYPEINFO.ObjectClassName.Replace(".", "_"); - info.ClassDisplayName = "Lucene Indexed Language Item"; - info.ClassType = ClassType.OTHER; - info.ClassResourceID = resource.ResourceID; - - var formInfo = FormHelper.GetBasicFormDefinition(nameof(LuceneIndexLanguageItemInfo.LuceneIndexLanguageItemID)); - - var formItem = new FormFieldInfo - { - Name = nameof(LuceneIndexLanguageItemInfo.LuceneIndexLanguageItemName), - AllowEmpty = false, - Visible = true, - Precision = 0, - Size = 100, - DataType = "text", - Enabled = true, - }; - formInfo.AddFormItem(formItem); - - formItem = new FormFieldInfo - { - Name = nameof(LuceneIndexLanguageItemInfo.LuceneIndexLanguageItemGuid), - AllowEmpty = false, - Visible = true, - Precision = 0, - DataType = "guid", - Enabled = true - }; - - formInfo.AddFormItem(formItem); - - formItem = new FormFieldInfo - { - Name = nameof(LuceneIndexLanguageItemInfo.LuceneIndexLanguageItemIndexItemId), - AllowEmpty = false, - Visible = true, - Precision = 0, - DataType = "integer", - ReferenceToObjectType = LuceneIndexItemInfo.OBJECT_TYPE, - ReferenceType = ObjectDependencyEnum.Required, - }; - - formInfo.AddFormItem(formItem); - - SetFormDefinition(info, formInfo); - - if (info.HasChanged) - { - DataClassInfoProvider.SetDataClassInfo(info); - } - } - - public void InstallLuceneContentTypeItemInfo(ResourceInfo resource) - { - var info = DataClassInfoProvider.GetDataClassInfo(LuceneContentTypeItemInfo.OBJECT_TYPE) ?? DataClassInfo.New(LuceneContentTypeItemInfo.OBJECT_TYPE); - - info.ClassName = LuceneContentTypeItemInfo.TYPEINFO.ObjectClassName; - info.ClassTableName = LuceneContentTypeItemInfo.TYPEINFO.ObjectClassName.Replace(".", "_"); - info.ClassDisplayName = "Lucene Type Item"; - info.ClassType = ClassType.OTHER; - info.ClassResourceID = resource.ResourceID; - - var formInfo = FormHelper.GetBasicFormDefinition(nameof(LuceneContentTypeItemInfo.LuceneContentTypeItemId)); - - var formItem = new FormFieldInfo - { - Name = nameof(LuceneContentTypeItemInfo.LuceneContentTypeItemContentTypeName), - AllowEmpty = false, - Visible = true, - Precision = 0, - Size = 100, - DataType = "text", - Enabled = true, - IsUnique = false - }; - formInfo.AddFormItem(formItem); - - formItem = new FormFieldInfo - { - Name = nameof(LuceneContentTypeItemInfo.LuceneContentTypeItemIncludedPathItemId), - AllowEmpty = false, - Visible = true, - Precision = 0, - DataType = "integer", - ReferenceToObjectType = LuceneIncludedPathItemInfo.OBJECT_TYPE, - ReferenceType = ObjectDependencyEnum.Required, - }; - - formInfo.AddFormItem(formItem); - - formItem = new FormFieldInfo - { - Name = nameof(LuceneContentTypeItemInfo.LuceneContentTypeItemGuid), - Enabled = true, - AllowEmpty = false, - Visible = true, - Precision = 0, - DataType = "guid", - }; - - formInfo.AddFormItem(formItem); - - formItem = new FormFieldInfo - { - Name = nameof(LuceneContentTypeItemInfo.LuceneContentTypeItemIndexItemId), - AllowEmpty = false, - Visible = true, - Precision = 0, - DataType = "integer", - ReferenceToObjectType = LuceneIndexItemInfo.OBJECT_TYPE, - ReferenceType = ObjectDependencyEnum.Required - }; - - formInfo.AddFormItem(formItem); - - SetFormDefinition(info, formInfo); - - if (info.HasChanged) - { - DataClassInfoProvider.SetDataClassInfo(info); - } - } - - /// - /// Ensure that the form is upserted with any existing form - /// - /// - /// - private static void SetFormDefinition(DataClassInfo info, FormInfo form) - { - if (info.ClassID > 0) - { - var existingForm = new FormInfo(info.ClassFormDefinition); - existingForm.CombineWithForm(form, new()); - info.ClassFormDefinition = existingForm.GetXmlDefinition(); - } - else - { - info.ClassFormDefinition = form.GetXmlDefinition(); - } - } -} +using CMS.DataEngine; +using CMS.FormEngine; +using CMS.Modules; + +namespace Kentico.Xperience.Lucene.Core; + +public class LuceneModuleInstaller(IInfoProvider resourceProvider) +{ + private readonly IInfoProvider resourceProvider = resourceProvider; + + public void Install() + { + var resource = resourceProvider.Get("CMS.Integration.Lucene") + // Handle v4.0.0 resource name manually until migrations are enabled + ?? resourceProvider.Get("Kentico.Xperience.Lucene") + ?? new ResourceInfo(); + + InitializeResource(resource); + InstallLuceneItemInfo(resource); + InstallLuceneLanguageInfo(resource); + InstallLuceneIndexPathItemInfo(resource); + InstallLuceneContentTypeItemInfo(resource); + InstallLuceneReusableContentTypeItemInfo(resource); + } + + public ResourceInfo InitializeResource(ResourceInfo resource) + { + resource.ResourceDisplayName = "Kentico Integration - Lucene"; + + // Prefix ResourceName with "CMS" to prevent C# class generation + // Classes are already available through the library itself + resource.ResourceName = "CMS.Integration.Lucene"; + resource.ResourceDescription = "Kentico Lucene custom data"; + resource.ResourceIsInDevelopment = false; + if (resource.HasChanged) + { + resourceProvider.Set(resource); + } + + return resource; + } + + public void InstallLuceneItemInfo(ResourceInfo resource) + { + var info = DataClassInfoProvider.GetDataClassInfo(LuceneIndexItemInfo.OBJECT_TYPE) ?? DataClassInfo.New(LuceneIndexItemInfo.OBJECT_TYPE); + + info.ClassName = LuceneIndexItemInfo.TYPEINFO.ObjectClassName; + info.ClassTableName = LuceneIndexItemInfo.TYPEINFO.ObjectClassName.Replace(".", "_"); + info.ClassDisplayName = "Lucene Index Item"; + info.ClassType = ClassType.OTHER; + info.ClassResourceID = resource.ResourceID; + + var formInfo = FormHelper.GetBasicFormDefinition(nameof(LuceneIndexItemInfo.LuceneIndexItemId)); + + var formItem = new FormFieldInfo + { + Name = nameof(LuceneIndexItemInfo.LuceneIndexItemGuid), + AllowEmpty = false, + Visible = true, + Precision = 0, + DataType = "guid", + Enabled = true, + }; + formInfo.AddFormItem(formItem); + + formItem = new FormFieldInfo + { + Name = nameof(LuceneIndexItemInfo.LuceneIndexItemIndexName), + AllowEmpty = false, + Visible = true, + Precision = 0, + Size = 100, + DataType = "text", + Enabled = true + }; + formInfo.AddFormItem(formItem); + + formItem = new FormFieldInfo + { + Name = nameof(LuceneIndexItemInfo.LuceneIndexItemChannelName), + AllowEmpty = false, + Visible = true, + Precision = 0, + Size = 100, + DataType = "text", + Enabled = true + }; + formInfo.AddFormItem(formItem); + + formItem = new FormFieldInfo + { + Name = nameof(LuceneIndexItemInfo.LuceneIndexItemStrategyName), + AllowEmpty = false, + Visible = true, + Precision = 0, + Size = 100, + DataType = "text", + Enabled = true + }; + formInfo.AddFormItem(formItem); + + formItem = new FormFieldInfo + { + Name = nameof(LuceneIndexItemInfo.LuceneIndexItemAnalyzerName), + AllowEmpty = false, + Visible = true, + Precision = 0, + Size = 100, + DataType = "text", + Enabled = true + }; + formInfo.AddFormItem(formItem); + + formItem = new FormFieldInfo + { + Name = nameof(LuceneIndexItemInfo.LuceneIndexItemRebuildHook), + AllowEmpty = true, + Visible = true, + Precision = 0, + Size = 100, + DataType = "text", + Enabled = true + }; + formInfo.AddFormItem(formItem); + + SetFormDefinition(info, formInfo); + + if (info.HasChanged) + { + DataClassInfoProvider.SetDataClassInfo(info); + } + } + + public void InstallLuceneIndexPathItemInfo(ResourceInfo resource) + { + var info = DataClassInfoProvider.GetDataClassInfo(LuceneIncludedPathItemInfo.OBJECT_TYPE) ?? DataClassInfo.New(LuceneIncludedPathItemInfo.OBJECT_TYPE); + + info.ClassName = LuceneIncludedPathItemInfo.TYPEINFO.ObjectClassName; + info.ClassTableName = LuceneIncludedPathItemInfo.TYPEINFO.ObjectClassName.Replace(".", "_"); + info.ClassDisplayName = "Lucene Path Item"; + info.ClassType = ClassType.OTHER; + info.ClassResourceID = resource.ResourceID; + + var formInfo = FormHelper.GetBasicFormDefinition(nameof(LuceneIncludedPathItemInfo.LuceneIncludedPathItemId)); + + var formItem = new FormFieldInfo + { + Name = nameof(LuceneIncludedPathItemInfo.LuceneIncludedPathItemGuid), + AllowEmpty = false, + Visible = true, + Precision = 0, + DataType = "guid", + Enabled = true, + }; + formInfo.AddFormItem(formItem); + + formItem = new FormFieldInfo + { + Name = nameof(LuceneIncludedPathItemInfo.LuceneIncludedPathItemAliasPath), + AllowEmpty = false, + Visible = true, + Precision = 0, + Size = 100, + DataType = "text", + Enabled = true, + }; + formInfo.AddFormItem(formItem); + + formItem = new FormFieldInfo + { + Name = nameof(LuceneIncludedPathItemInfo.LuceneIncludedPathItemIndexItemId), + AllowEmpty = false, + Visible = true, + Precision = 0, + DataType = "integer", + ReferenceToObjectType = LuceneIndexItemInfo.OBJECT_TYPE, + ReferenceType = ObjectDependencyEnum.Required + }; + + formInfo.AddFormItem(formItem); + + SetFormDefinition(info, formInfo); + + if (info.HasChanged) + { + DataClassInfoProvider.SetDataClassInfo(info); + } + } + + public void InstallLuceneLanguageInfo(ResourceInfo resource) + { + var info = DataClassInfoProvider.GetDataClassInfo(LuceneIndexLanguageItemInfo.OBJECT_TYPE) ?? DataClassInfo.New(LuceneIndexLanguageItemInfo.OBJECT_TYPE); + + info.ClassName = LuceneIndexLanguageItemInfo.TYPEINFO.ObjectClassName; + info.ClassTableName = LuceneIndexLanguageItemInfo.TYPEINFO.ObjectClassName.Replace(".", "_"); + info.ClassDisplayName = "Lucene Indexed Language Item"; + info.ClassType = ClassType.OTHER; + info.ClassResourceID = resource.ResourceID; + + var formInfo = FormHelper.GetBasicFormDefinition(nameof(LuceneIndexLanguageItemInfo.LuceneIndexLanguageItemID)); + + var formItem = new FormFieldInfo + { + Name = nameof(LuceneIndexLanguageItemInfo.LuceneIndexLanguageItemName), + AllowEmpty = false, + Visible = true, + Precision = 0, + Size = 100, + DataType = "text", + Enabled = true, + }; + formInfo.AddFormItem(formItem); + + formItem = new FormFieldInfo + { + Name = nameof(LuceneIndexLanguageItemInfo.LuceneIndexLanguageItemGuid), + AllowEmpty = false, + Visible = true, + Precision = 0, + DataType = "guid", + Enabled = true + }; + + formInfo.AddFormItem(formItem); + + formItem = new FormFieldInfo + { + Name = nameof(LuceneIndexLanguageItemInfo.LuceneIndexLanguageItemIndexItemId), + AllowEmpty = false, + Visible = true, + Precision = 0, + DataType = "integer", + ReferenceToObjectType = LuceneIndexItemInfo.OBJECT_TYPE, + ReferenceType = ObjectDependencyEnum.Required, + }; + + formInfo.AddFormItem(formItem); + + SetFormDefinition(info, formInfo); + + if (info.HasChanged) + { + DataClassInfoProvider.SetDataClassInfo(info); + } + } + + public void InstallLuceneReusableContentTypeItemInfo(ResourceInfo resource) + { + var info = DataClassInfoProvider.GetDataClassInfo(LuceneReusableContentTypeItemInfo.OBJECT_TYPE) ?? DataClassInfo.New(LuceneReusableContentTypeItemInfo.OBJECT_TYPE); + + info.ClassName = LuceneReusableContentTypeItemInfo.TYPEINFO.ObjectClassName; + info.ClassTableName = LuceneReusableContentTypeItemInfo.TYPEINFO.ObjectClassName.Replace(".", "_"); + info.ClassDisplayName = "Lucene Reusable Content Type Item"; + info.ClassType = ClassType.OTHER; + info.ClassResourceID = resource.ResourceID; + + var formInfo = FormHelper.GetBasicFormDefinition(nameof(LuceneReusableContentTypeItemInfo.LuceneReusableContentTypeItemId)); + + var formItem = new FormFieldInfo + { + Name = nameof(LuceneReusableContentTypeItemInfo.LuceneReusableContentTypeItemContentTypeName), + AllowEmpty = false, + Visible = true, + Precision = 0, + Size = 100, + DataType = "text", + Enabled = true, + IsUnique = false + }; + formInfo.AddFormItem(formItem); + + formItem = new FormFieldInfo + { + Name = nameof(LuceneReusableContentTypeItemInfo.LuceneReusableContentTypeItemGuid), + Enabled = true, + AllowEmpty = false, + Visible = true, + Precision = 0, + DataType = "guid", + }; + + formInfo.AddFormItem(formItem); + + formItem = new FormFieldInfo + { + Name = nameof(LuceneReusableContentTypeItemInfo.LuceneReusableContentTypeItemIndexItemId), + AllowEmpty = false, + Visible = true, + Precision = 0, + DataType = "integer", + ReferenceToObjectType = LuceneIndexItemInfo.OBJECT_TYPE, + ReferenceType = ObjectDependencyEnum.Required + }; + + formInfo.AddFormItem(formItem); + + SetFormDefinition(info, formInfo); + + if (info.HasChanged) + { + DataClassInfoProvider.SetDataClassInfo(info); + } + } + + public void InstallLuceneContentTypeItemInfo(ResourceInfo resource) + { + var info = DataClassInfoProvider.GetDataClassInfo(LuceneContentTypeItemInfo.OBJECT_TYPE) ?? DataClassInfo.New(LuceneContentTypeItemInfo.OBJECT_TYPE); + + info.ClassName = LuceneContentTypeItemInfo.TYPEINFO.ObjectClassName; + info.ClassTableName = LuceneContentTypeItemInfo.TYPEINFO.ObjectClassName.Replace(".", "_"); + info.ClassDisplayName = "Lucene Type Item"; + info.ClassType = ClassType.OTHER; + info.ClassResourceID = resource.ResourceID; + + var formInfo = FormHelper.GetBasicFormDefinition(nameof(LuceneContentTypeItemInfo.LuceneContentTypeItemId)); + + var formItem = new FormFieldInfo + { + Name = nameof(LuceneContentTypeItemInfo.LuceneContentTypeItemContentTypeName), + AllowEmpty = false, + Visible = true, + Precision = 0, + Size = 100, + DataType = "text", + Enabled = true, + IsUnique = false + }; + formInfo.AddFormItem(formItem); + + formItem = new FormFieldInfo + { + Name = nameof(LuceneContentTypeItemInfo.LuceneContentTypeItemIncludedPathItemId), + AllowEmpty = false, + Visible = true, + Precision = 0, + DataType = "integer", + ReferenceToObjectType = LuceneIncludedPathItemInfo.OBJECT_TYPE, + ReferenceType = ObjectDependencyEnum.Required, + }; + + formInfo.AddFormItem(formItem); + + formItem = new FormFieldInfo + { + Name = nameof(LuceneContentTypeItemInfo.LuceneContentTypeItemGuid), + Enabled = true, + AllowEmpty = false, + Visible = true, + Precision = 0, + DataType = "guid", + }; + + formInfo.AddFormItem(formItem); + + formItem = new FormFieldInfo + { + Name = nameof(LuceneContentTypeItemInfo.LuceneContentTypeItemIndexItemId), + AllowEmpty = false, + Visible = true, + Precision = 0, + DataType = "integer", + ReferenceToObjectType = LuceneIndexItemInfo.OBJECT_TYPE, + ReferenceType = ObjectDependencyEnum.Required + }; + + formInfo.AddFormItem(formItem); + + SetFormDefinition(info, formInfo); + + if (info.HasChanged) + { + DataClassInfoProvider.SetDataClassInfo(info); + } + } + + /// + /// Ensure that the form is upserted with any existing form + /// + /// + /// + private static void SetFormDefinition(DataClassInfo info, FormInfo form) + { + if (info.ClassID > 0) + { + var existingForm = new FormInfo(info.ClassFormDefinition); + existingForm.CombineWithForm(form, new()); + info.ClassFormDefinition = existingForm.GetXmlDefinition(); + } + else + { + info.ClassFormDefinition = form.GetXmlDefinition(); + } + } +} From ddf8ec0f494208b3c38be06c82ee34c51dd8dcc3 Mon Sep 17 00:00:00 2001 From: Michal Jakubis <64188398+michalJakubis@users.noreply.github.com> Date: Wed, 4 Sep 2024 14:27:38 +0200 Subject: [PATCH 3/3] Bump to v9.0.0 --- Directory.Build.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Directory.Build.props b/Directory.Build.props index ac81d17..273fe92 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -5,7 +5,7 @@ $(Company) Copyright © $(Company) $([System.DateTime]::Now.Year) $(Company)™ - 8.1.0 + 9.0.0 MIT