diff --git a/.github/workflows/docs-prs.yml b/.github/workflows/docs-prs.yml index 3439f8d937..6e49f516c9 100644 --- a/.github/workflows/docs-prs.yml +++ b/.github/workflows/docs-prs.yml @@ -28,7 +28,7 @@ jobs: - uses: actions/setup-node@v4 name: Setup node with: - node-version: 18 + node-version: 20 - run: npm install -g cspell name: Install cSpell - run: cspell --config ./docs/cSpell.json "docs/**/*.md" diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index a805c35074..15f5f9d193 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -15,7 +15,7 @@ env: config: Release DOTNET_CLI_TELEMETRY_OPTOUT: 1 DOTNET_SKIP_FIRST_TIME_EXPERIENCE: 1 - node_version: 18.x + node_version: 20.x jobs: build-and-test-code: @@ -32,7 +32,7 @@ jobs: steps: - uses: actions/checkout@v4 - name: Install Node.js - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: node-version: ${{ env.node_version }} diff --git a/Directory.Build.props b/Directory.Build.props index 22cc45da96..bd4a11c998 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -1,7 +1,7 @@ - 7.5.0 + 7.8.0 12.0 Jeremy D. Miller;Babu Annamalai;Oskar Dudycz;Joona-Pekka Kokko https://martendb.io/logo.png diff --git a/docs/.vitepress/config.mts b/docs/.vitepress/config.mts index fbd56171c1..0ede3a8db5 100644 --- a/docs/.vitepress/config.mts +++ b/docs/.vitepress/config.mts @@ -84,13 +84,13 @@ const config: UserConfig = { text: 'Configuration', collapsed: false, items: [ - { text: 'Bootstrap with HostBuilder', link: '/configuration/hostbuilder' }, + { text: 'Bootstrapping Marten', link: '/configuration/hostbuilder' }, { text: 'Configuring Document Storage', link: '/configuration/storeoptions' }, { text: 'Json Serialization', link: '/configuration/json' }, { text: 'Resiliency Policies', link: '/configuration/retries' }, { text: 'Pre-Building Generated Types', link: '/configuration/prebuilding' }, { text: 'Command Line Tooling', link: '/configuration/cli' }, - { text: 'Development versus Production Usage', link: '/configuration/optimized_artifact_workflow' }, + { text: 'Optimized Development Workflow', link: '/configuration/optimized_artifact_workflow' }, { text: 'Multi-Tenancy with Database per Tenant', link: '/configuration/multitenancy' }, { text: 'Environment Checks', link: '/configuration/environment-checks' }, { text: 'Custom IoC Integration', link: '/configuration/ioc' }, @@ -108,7 +108,7 @@ const config: UserConfig = { { text: 'Storing Documents', link: '/documents/storing' }, { text: 'Deleting Documents', link: '/documents/deletes' }, { - text: 'Querying Documents', link: '/documents/querying/', collapsed: false, items: [ + text: 'Querying Documents', link: '/documents/querying/', collapsed: true, items: [ { text: 'Loading Documents by Id', link: '/documents/querying/byid' }, { text: 'Querying Documents with Linq', link: '/documents/querying/linq/' }, { text: 'Supported Linq Operators', link: '/documents/querying/linq/operators' }, @@ -130,7 +130,7 @@ const config: UserConfig = { }, { - text: 'Indexing Documents', link: '/documents/indexing/', collapsed: false, items: [ + text: 'Indexing Documents', link: '/documents/indexing/', collapsed: true, items: [ { text: 'Calculated Indexes', link: '/documents/indexing/computed-indexes' }, { text: 'Duplicated Fields', link: '/documents/indexing/duplicated-fields' }, { text: 'Unique Indexes', link: '/documents/indexing/unique' }, @@ -165,7 +165,7 @@ const config: UserConfig = { { text: 'Metadata', link: '/events/metadata' }, { text: 'Archiving Streams', link: '/events/archiving' }, { - text: 'Projections Overview', link: '/events/projections/', collapsed: false, items: [ + text: 'Projections Overview', link: '/events/projections/', collapsed: true, items: [ { text: 'Aggregate Projections', link: '/events/projections/aggregate-projections', items: [ { text: 'Live Aggregations', link: '/events/projections/live-aggregates' }, @@ -181,8 +181,11 @@ const config: UserConfig = { { text: 'Rebuilding Projections', link: '/events/projections/rebuilding' }, { text: 'Projections and IoC Services', link: '/events/projections/ioc' }, { text: 'Async Daemon HealthChecks', link: '/events/projections/healthchecks' },] + }, + { + text: 'Event Subscriptions', + link: '/events/subscriptions' }, - { text: 'Event Versioning', link: '/events/versioning' diff --git a/docs/configuration/hostbuilder.md b/docs/configuration/hostbuilder.md index 4bdef1b3b7..6518159bdd 100644 --- a/docs/configuration/hostbuilder.md +++ b/docs/configuration/hostbuilder.md @@ -1,13 +1,6 @@ -# Bootstrapping in .Net Applications +# Bootstrapping Marten -:::tip -The exact formula for bootstrapping .Net applications has changed quite a bit from early .Net Core to the latest `WebApplication` model in .Net 6.0 at the time this page was last updated. Regardless, the `IServiceCollection` abstraction for registering services in an IoC container has remained stable and everything in this page functions against that model. -::: - -As briefly shown in the [getting started](/) page, Marten comes with extension methods for the .Net Core standard `IServiceCollection` to quickly add Marten services to any .Net application that is bootstrapped by either the [Generic IHostBuilder abstraction](https://docs.microsoft.com/en-us/aspnet/core/fundamentals/host/generic-host) or the [ASP.Net Core IWebHostBuilder](https://docs.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.hosting.iwebhostbuilder) or the [.Net 6 WebApplication](https://docs.microsoft.com/en-us/aspnet/core/migration/50-to-60?view=aspnetcore-6.0&tabs=visual-studio#new-hosting-model) hosting models. - -Jumping right into a basic ASP.NET Core application using the out of the box Web API template, you'd have a class called `Startup` that holds most of the configuration for your application including -the IoC service registrations for your application in the `Startup.ConfigureServices()` method. To add Marten to your application, use the `AddMarten()` method as shown below: +As briefly shown in the [getting started](/) page, Marten comes with the `AddMarten()` extension method for the .NET `IServiceCollection` to quickly add Marten to any ASP.NET Core or Worker Service application: @@ -19,6 +12,9 @@ builder.Services.AddMarten(options => // Establish the connection string to your Marten database options.Connection(builder.Configuration.GetConnectionString("Marten")!); + // Specify that we want to use STJ as our serializer + options.UseSystemTextJsonForSerialization(); + // If we're running in development mode, let Marten just take care // of all necessary schema building and patching behind the scenes if (builder.Environment.IsDevelopment()) @@ -27,7 +23,7 @@ builder.Services.AddMarten(options => } }); ``` -snippet source | anchor +snippet source | anchor The `AddMarten()` method will add these service registrations to your application: @@ -46,9 +42,10 @@ At runtime, when your application needs to resolve `IDocumentStore` for the firs 1. Resolve a `StoreOptions` object from the initial `AddMarten()` configuration 2. Apply all registered `IConfigureMarten` services to alter that `StoreOptions` object -3. Reads the `IHostEnvironment` for the application if it exists to try to determine the main application assembly and paths for generated code output -4. Attaches any `IInitialData` services that were registered in the IoC container to the `StoreOptions` object -5. *Finally*, Marten builds a new `DocumentStore` object using the now configured `StoreOptions` object +3. Apply all registered `IAsyncConfigureMarten` services to alter that `StoreOptions` object +4. Reads the `IHostEnvironment` for the application if it exists to try to determine the main application assembly and paths for generated code output +5. Attaches any `IInitialData` services that were registered in the IoC container to the `StoreOptions` object +6. *Finally*, Marten builds a new `DocumentStore` object using the now configured `StoreOptions` object This model is comparable to the .Net `IOptions` model. @@ -215,7 +212,7 @@ public interface IConfigureMarten void Configure(IServiceProvider services, StoreOptions options); } ``` -snippet source | anchor +snippet source | anchor You could alternatively implement a custom `IConfigureMarten` (or `IConfigureMarten where T : IDocumentStore` if you're [working with multiple databases](#working-with-multiple-marten-databases)) class like so: @@ -258,7 +255,67 @@ public static IServiceCollection AddUserModule2(this IServiceCollection services snippet source | anchor -## Using Lightweight Sessions +### Using IoC Services for Configuring Marten + +There is also a newer mechanism called `IAsyncConfigureMarten` that was originally built to enable services +like the [Feature Management library from Microsoft](https://learn.microsoft.com/en-us/azure/azure-app-configuration/use-feature-flags-dotnet-core) to +be used to selectively configure Marten using potentially asynchronous methods and IoC resolved services. + +That interface signature is: + + + +```cs +/// +/// Mechanism to register additional Marten configuration that is applied after AddMarten() +/// configuration, but before DocumentStore is initialized when you need to utilize some +/// kind of asynchronous services like Microsoft's FeatureManagement feature to configure Marten +/// +public interface IAsyncConfigureMarten +{ + ValueTask Configure(StoreOptions options, CancellationToken cancellationToken); +} +``` +snippet source | anchor + + +As an example from the tests, here's a custom version that uses the Feature Management service: + + + +```cs +public class FeatureManagementUsingExtension: IAsyncConfigureMarten +{ + private readonly IFeatureManager _manager; + + public FeatureManagementUsingExtension(IFeatureManager manager) + { + _manager = manager; + } + + public async ValueTask Configure(StoreOptions options, CancellationToken cancellationToken) + { + if (await _manager.IsEnabledAsync("Module1")) + { + options.Events.MapEventType("module1:event"); + } + } +} +``` +snippet source | anchor + + +And lastly, these extensions can be registered directly against `IServiceCollection` like so: + + + +```cs +services.ConfigureMartenWithServices(); +``` +snippet source | anchor + + +## Using Lightweight Sessions ::: tip Most usages of Marten should default to the lightweight sessions for better performance diff --git a/docs/configuration/optimized_artifact_workflow.md b/docs/configuration/optimized_artifact_workflow.md index a85db5b9d4..cd99ee5e24 100644 --- a/docs/configuration/optimized_artifact_workflow.md +++ b/docs/configuration/optimized_artifact_workflow.md @@ -1,10 +1,4 @@ -# Development versus Production Usage - -:::tip -Marten V5.0 introduces the new `AddMarten().OptimizeArtifactWorkflow()` option -that helps users utilize Marten "best practices" for database and code generation -artifact creation. -::: +# Optimized Development Workflow The original point of Marten was to have a persistence option that mostly got out of your way and let developers just get things done without having to spend a lot of time fiddling with database diff --git a/docs/configuration/prebuilding.md b/docs/configuration/prebuilding.md index f2816ee952..13b922fc91 100644 --- a/docs/configuration/prebuilding.md +++ b/docs/configuration/prebuilding.md @@ -1,9 +1,9 @@ # Pre-Building Generated Types -Marten >= v4 extensively uses runtime code generation backed by [Roslyn runtime compilation](https://jeremydmiller.com/2018/06/04/compiling-code-at-runtime-with-lamar-part-1/) for dynamic code. +Marten uses runtime code generation backed by [Roslyn runtime compilation](https://jeremydmiller.com/2018/06/04/compiling-code-at-runtime-with-lamar-part-1/) for dynamic code. This is both much more powerful than [source generators](https://docs.microsoft.com/en-us/dotnet/csharp/roslyn-sdk/source-generators-overview) in what it allows us to actually do, but can have significant memory usage and “[cold start](https://en.wikipedia.org/wiki/Cold_start_(computing))” problems (seems to depend on exact configurations, so it’s not a given that you’ll have these issues). -Fear not though, Marten v4 introduced a facility to “generate ahead” the code to greatly optimize the "cold start" and memory usage in production scenarios. +Fear not though, Marten introduced a facility to “generate ahead” the code to greatly optimize the "cold start" and memory usage in production scenarios. The code generation for document storage, event handling, event projections, and additional document stores can be done with one of three modes as shown below: @@ -21,17 +21,17 @@ using var store = DocumentStore.For(opts => // Marten will only use types that are compiled into // the application assembly ahead of time. This is the - // V4 "pre-built" model + // "pre-built" model opts.GeneratedCodeMode = TypeLoadMode.Static; - // New for V5. More explanation in the docs:) + // Explained Below :) opts.GeneratedCodeMode = TypeLoadMode.Auto; }); ``` snippet source | anchor -The *Auto* mode is new for Marten V5 to alleviate usability issues for folks who did not find the command line options or pre-registration +The *Auto* mode was added alleviate usability issues for folks who did not find the command line options or pre-registration of document types to be practical. Using the `Marten.Testing.Documents.User` document from the Marten testing suite as an example, let's start a new document store with the `Auto` mode: @@ -80,7 +80,7 @@ into the actually deployed binaries for the system in production deployments. Of you will need to delete the generated code. :::tip -Just like ASP.Net MVC, Marten uses the `IHostEnvironment.ApplicationName` property to determine the main application assembly. If +Just like ASP.NET Core, Marten uses the `IHostEnvironment.ApplicationName` property to determine the main application assembly. If that value is missing, Marten falls back to the `Assembly.GetEntryAssembly()` value. ::: diff --git a/docs/diagnostics.md b/docs/diagnostics.md index c1b73af737..e878ee1773 100644 --- a/docs/diagnostics.md +++ b/docs/diagnostics.md @@ -89,7 +89,7 @@ public interface IDocumentSessionListener void DocumentAddedForStorage(object id, object document); } ``` -snippet source | anchor +snippet source | anchor You can build and inject your own listeners by adding them to the `StoreOptions` object you use to configure a `DocumentStore`: diff --git a/docs/documents/aspnetcore.md b/docs/documents/aspnetcore.md index 6692ad08d0..ac6f899098 100644 --- a/docs/documents/aspnetcore.md +++ b/docs/documents/aspnetcore.md @@ -4,7 +4,7 @@ For a little more context, see the blog post [Efficient Web Services with Marten V4](https://jeremydmiller.com/2021/09/28/efficient-web-services-with-marten-v4/). ::: -In Marten V4, there is a small new addon that adds helpers for ASP.Net Core development, expressly +Marten has a small addon that adds helpers for ASP.Net Core development, expressly the ability to very efficiently _stream_ the raw JSON of persisted documents straight to an HTTP response without every having to waste time with deserialization/serialization or even reading the data into a JSON string in memory. diff --git a/docs/documents/querying/advanced-sql.md b/docs/documents/querying/advanced-sql.md index 7ddca0c074..ec6d10a21b 100644 --- a/docs/documents/querying/advanced-sql.md +++ b/docs/documents/querying/advanced-sql.md @@ -35,11 +35,12 @@ Querying for a simple scalar value can be done like this: ```cs +var schema = session.DocumentStore.Options.Schema; var name = (await session.AdvancedSqlQueryAsync( - "select data ->> 'Name' from mt_doc_advanced_sql_query_docwithmeta limit 1", + $"select data ->> 'Name' from {schema.For()} limit 1", CancellationToken.None)).First(); ``` -snippet source | anchor +snippet source | anchor Or for multiple scalars returned as a tuple: @@ -51,7 +52,7 @@ var (number,text, boolean) = (await session.AdvancedSqlQueryAsyncsnippet source | anchor +snippet source | anchor You can also query for any arbitrary JSON that will get deserialized: @@ -63,7 +64,7 @@ var result = (await session.AdvancedSqlQueryAsync( "select row(json_build_object('Name', 'foo')), row(json_build_object('Name', 'bar')) from (values(1)) as dummy", CancellationToken.None)).First(); ``` -snippet source | anchor +snippet source | anchor Querying for documents requires to return the correct columns: @@ -71,11 +72,12 @@ Querying for documents requires to return the correct columns: ```cs +var schema = session.DocumentStore.Options.Schema; var docs = await session.AdvancedSqlQueryAsync( - "select id, data from mt_doc_advanced_sql_query_docwithoutmeta order by data ->> 'Name'", + $"select id, data from {schema.For()} order by data ->> 'Name'", CancellationToken.None); ``` -snippet source | anchor +snippet source | anchor If metadata are available, remember to add the correct metadata columns to the result. The order of the columns is @@ -84,11 +86,12 @@ important!: ```cs +var schema = session.DocumentStore.Options.Schema; var doc = (await session.AdvancedSqlQueryAsync( - "select id, data, mt_version from mt_doc_advanced_sql_query_docwithmeta where data ->> 'Name' = 'Max'", + $"select id, data, mt_version from {schema.For()} where data ->> 'Name' = 'Max'", CancellationToken.None)).First(); ``` -snippet source | anchor +snippet source | anchor You can also query for multiple related documents and scalar, e.g. for paging: @@ -106,17 +109,18 @@ session.Store(new DocWithMeta { Id = 4, Name = "Beatrix" }); session.Store(new DocDetailsWithMeta { Id = 4, Detail = "Likes to cook" }); await session.SaveChangesAsync(); +var schema = session.DocumentStore.Options.Schema; IReadOnlyList<(DocWithMeta doc, DocDetailsWithMeta detail, long totalResults)> results = await session.AdvancedSqlQueryAsync( - """ + $""" select row(a.id, a.data, a.mt_version), row(b.id, b.data, b.mt_version), row(count(*) over()) from - mt_doc_advanced_sql_query_docwithmeta a + {schema.For()} a left join - mt_doc_advanced_sql_query_docdetailswithmeta b on a.id = b.id + {schema.For()} b on a.id = b.id where (a.data ->> 'Id')::int > 1 order by @@ -132,7 +136,69 @@ results[0].detail.Detail.ShouldBe("Hates soap operas"); results[1].doc.Name.ShouldBe("Beatrix"); results[1].detail.Detail.ShouldBe("Likes to cook"); ``` -snippet source | anchor +snippet source | anchor For sync queries you can use the `AdvancedSqlQuery(...)` overloads. + +## Getting document and schema names + +Tables can be referenced with raw sql, but it is also possible to have marten tell you names of documents and aggregates. + +These names can be found on the `Schema` property of the StoreOptions: + + + +```cs +var schema = theSession.DocumentStore.Options.Schema; +``` +snippet source | anchor + + +Using this you can resolve schemas: + + + +```cs +var schema = theSession.DocumentStore.Options.Schema; + +schema.DatabaseSchemaName.ShouldBe("public"); +schema.EventsSchemaName.ShouldBe("public"); +``` +snippet source | anchor + + +And documents/aggregates: + + + +```cs +var schema = theSession.DocumentStore.Options.Schema; + +schema.For().ShouldBe("public.mt_doc_account"); +schema.For().ShouldBe("public.mt_doc_company"); +schema.For().ShouldBe("public.mt_doc_user"); + +// `qualified: false` returns the table name without schema +schema.For(qualified: false).ShouldBe("mt_doc_account"); +schema.For(qualified: false).ShouldBe("mt_doc_company"); +schema.For(qualified: false).ShouldBe("mt_doc_user"); +``` +snippet source | anchor + + +And also marten event tables: + + + +```cs +schema.ForStreams().ShouldBe("public.mt_streams"); +schema.ForEvents().ShouldBe("public.mt_events"); +schema.ForEventProgression().ShouldBe("public.mt_event_progression"); + +schema.ForStreams(qualified: false).ShouldBe("mt_streams"); +schema.ForEvents(qualified: false).ShouldBe("mt_events"); +schema.ForEventProgression(qualified: false).ShouldBe("mt_event_progression"); +``` +snippet source | anchor + diff --git a/docs/documents/sessions.md b/docs/documents/sessions.md index d9834d4b96..43b67a0e71 100644 --- a/docs/documents/sessions.md +++ b/docs/documents/sessions.md @@ -327,7 +327,7 @@ public void ConfigureCommandTimeout(IDocumentStore store) } } ``` -snippet source | anchor +snippet source | anchor ## Unit of Work Mechanics diff --git a/docs/events/multitenancy.md b/docs/events/multitenancy.md index cc0a06c905..134cbbc65c 100644 --- a/docs/events/multitenancy.md +++ b/docs/events/multitenancy.md @@ -1,10 +1,5 @@ # Event Store Multi-Tenancy -::: tip -The V4 version of the async daemon is able to fully support multi-tenanted event store projections -now. -::: - The event store feature in Marten supports an opt-in multi-tenancy model that captures events by the current tenant. Use this syntax to specify that: diff --git a/docs/events/streaming/index.md b/docs/events/streaming/index.md deleted file mode 100644 index 10be6e4b09..0000000000 --- a/docs/events/streaming/index.md +++ /dev/null @@ -1,3 +0,0 @@ -# TODO - -Add general introduction to the streaming/queuing concept and locate Marten inside that. diff --git a/docs/events/streaming/sink.md b/docs/events/streaming/sink.md deleted file mode 100644 index c9a0135af8..0000000000 --- a/docs/events/streaming/sink.md +++ /dev/null @@ -1,3 +0,0 @@ -# TODO - -Explain how to put data from queues to Marten diff --git a/docs/events/streaming/source.md b/docs/events/streaming/source.md deleted file mode 100644 index 2884a00cf5..0000000000 --- a/docs/events/streaming/source.md +++ /dev/null @@ -1,3 +0,0 @@ -# TODO - -Explain how to put data to queues to Marten diff --git a/docs/events/subscriptions.md b/docs/events/subscriptions.md new file mode 100644 index 0000000000..b71e2ca2f6 --- /dev/null +++ b/docs/events/subscriptions.md @@ -0,0 +1,35 @@ +# Event Subscriptions + +Hey folks, there will be much more on this topic soon. Right now, it's in Marten > 7.6, but part of the core Marten team is +working with a client to prove out this feature. When that's done, we'll fill in the docs and sample code. + + + +```cs +/// +/// Basic abstraction for custom subscriptions to Marten events through the async daemon. Use this in +/// order to do custom processing against an ordered stream of the events +/// +public interface ISubscription : IAsyncDisposable +{ + /// + /// Processes a page of events at a time + /// + /// + /// Use to log dead letter events that are skipped or to stop the subscription from processing based on an exception + /// Access to Marten queries and writes that will be committed with the progress update for this subscription + /// + /// + Task ProcessEventsAsync(EventRange page, ISubscriptionController controller, + IDocumentOperations operations, + CancellationToken cancellationToken); +} +``` +snippet source | anchor + + +## Registering Subscriptions + +## Event Filtering + +## Rewinding or Replaying Subscriptions diff --git a/docs/getting-started.md b/docs/getting-started.md index 33148942fd..7a344403ed 100644 --- a/docs/getting-started.md +++ b/docs/getting-started.md @@ -33,6 +33,9 @@ builder.Services.AddMarten(options => // Establish the connection string to your Marten database options.Connection(builder.Configuration.GetConnectionString("Marten")!); + // Specify that we want to use STJ as our serializer + options.UseSystemTextJsonForSerialization(); + // If we're running in development mode, let Marten just take care // of all necessary schema building and patching behind the scenes if (builder.Environment.IsDevelopment()) @@ -41,7 +44,7 @@ builder.Services.AddMarten(options => } }); ``` -snippet source | anchor +snippet source | anchor See [Bootstrapping with HostBuilder](/configuration/hostbuilder) for more information and options about this integration. @@ -52,7 +55,7 @@ Use of the `.AddMarten` integration is not mandatory, see [Creating a standalone ## Postgres -The next step is to get access to a PostgreSQL **9.6+** database schema. If you want to let Marten build database schema objects on the fly at development time, +The next step is to get access to a PostgreSQL **12+** database schema. If you want to let Marten build database schema objects on the fly at development time, make sure that your user account has rights to execute `CREATE TABLE/FUNCTION` statements. Marten uses the [Npgsql](http://www.npgsql.org) library to access PostgreSQL from .NET, so you'll likely want to read their [documentation on connection string syntax](http://www.npgsql.org/doc/connection-string-parameters.html). @@ -118,7 +121,7 @@ app.MapGet("/user/{id:guid}", return await session.LoadAsync(id, ct); }); ``` -snippet source | anchor +snippet source | anchor ::: tip INFO diff --git a/package-lock.json b/package-lock.json index 4468e657bf..fc43c40c64 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,12 +9,12 @@ "chai": "^4", "lodash": "^4.17.21", "mermaid": "^10", - "mocha": "^10.2.0", - "netlify-cli": "^17.13.1", + "mocha": "^10.4.0", + "netlify-cli": "^17.21.1", "npm-run-all": "^4.1.5", - "vitepress": "1.0.0-rc.36", + "vitepress": "1.0.2", "vitepress-plugin-mermaid": "2.0.16", - "vue": "^3.4.10" + "vue": "^3.4.21" } }, "node_modules/@algolia/autocomplete-core": { @@ -63,138 +63,157 @@ } }, "node_modules/@algolia/cache-browser-local-storage": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.22.1.tgz", - "integrity": "sha512-Sw6IAmOCvvP6QNgY9j+Hv09mvkvEIDKjYW8ow0UDDAxSXy664RBNQk3i/0nt7gvceOJ6jGmOTimaZoY1THmU7g==", + "version": "4.23.2", + "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.23.2.tgz", + "integrity": "sha512-PvRQdCmtiU22dw9ZcTJkrVKgNBVAxKgD0/cfiqyxhA5+PHzA2WDt6jOmZ9QASkeM2BpyzClJb/Wr1yt2/t78Kw==", "dev": true, "dependencies": { - "@algolia/cache-common": "4.22.1" + "@algolia/cache-common": "4.23.2" } }, "node_modules/@algolia/cache-common": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.22.1.tgz", - "integrity": "sha512-TJMBKqZNKYB9TptRRjSUtevJeQVXRmg6rk9qgFKWvOy8jhCPdyNZV1nB3SKGufzvTVbomAukFR8guu/8NRKBTA==", + "version": "4.23.2", + "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.23.2.tgz", + "integrity": "sha512-OUK/6mqr6CQWxzl/QY0/mwhlGvS6fMtvEPyn/7AHUx96NjqDA4X4+Ju7aXFQKh+m3jW9VPB0B9xvEQgyAnRPNw==", "dev": true }, "node_modules/@algolia/cache-in-memory": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.22.1.tgz", - "integrity": "sha512-ve+6Ac2LhwpufuWavM/aHjLoNz/Z/sYSgNIXsinGofWOysPilQZPUetqLj8vbvi+DHZZaYSEP9H5SRVXnpsNNw==", + "version": "4.23.2", + "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.23.2.tgz", + "integrity": "sha512-rfbi/SnhEa3MmlqQvgYz/9NNJ156NkU6xFxjbxBtLWnHbpj+qnlMoKd+amoiacHRITpajg6zYbLM9dnaD3Bczw==", "dev": true, "dependencies": { - "@algolia/cache-common": "4.22.1" + "@algolia/cache-common": "4.23.2" } }, "node_modules/@algolia/client-account": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.22.1.tgz", - "integrity": "sha512-k8m+oegM2zlns/TwZyi4YgCtyToackkOpE+xCaKCYfBfDtdGOaVZCM5YvGPtK+HGaJMIN/DoTL8asbM3NzHonw==", + "version": "4.23.2", + "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.23.2.tgz", + "integrity": "sha512-VbrOCLIN/5I7iIdskSoSw3uOUPF516k4SjDD4Qz3BFwa3of7D9A0lzBMAvQEJJEPHWdVraBJlGgdJq/ttmquJQ==", "dev": true, "dependencies": { - "@algolia/client-common": "4.22.1", - "@algolia/client-search": "4.22.1", - "@algolia/transporter": "4.22.1" + "@algolia/client-common": "4.23.2", + "@algolia/client-search": "4.23.2", + "@algolia/transporter": "4.23.2" } }, "node_modules/@algolia/client-analytics": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.22.1.tgz", - "integrity": "sha512-1ssi9pyxyQNN4a7Ji9R50nSdISIumMFDwKNuwZipB6TkauJ8J7ha/uO60sPJFqQyqvvI+px7RSNRQT3Zrvzieg==", + "version": "4.23.2", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.23.2.tgz", + "integrity": "sha512-lLj7irsAztGhMoEx/SwKd1cwLY6Daf1Q5f2AOsZacpppSvuFvuBrmkzT7pap1OD/OePjLKxicJS8wNA0+zKtuw==", "dev": true, "dependencies": { - "@algolia/client-common": "4.22.1", - "@algolia/client-search": "4.22.1", - "@algolia/requester-common": "4.22.1", - "@algolia/transporter": "4.22.1" + "@algolia/client-common": "4.23.2", + "@algolia/client-search": "4.23.2", + "@algolia/requester-common": "4.23.2", + "@algolia/transporter": "4.23.2" } }, "node_modules/@algolia/client-common": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.22.1.tgz", - "integrity": "sha512-IvaL5v9mZtm4k4QHbBGDmU3wa/mKokmqNBqPj0K7lcR8ZDKzUorhcGp/u8PkPC/e0zoHSTvRh7TRkGX3Lm7iOQ==", + "version": "4.23.2", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.23.2.tgz", + "integrity": "sha512-Q2K1FRJBern8kIfZ0EqPvUr3V29ICxCm/q42zInV+VJRjldAD9oTsMGwqUQ26GFMdFYmqkEfCbY4VGAiQhh22g==", "dev": true, "dependencies": { - "@algolia/requester-common": "4.22.1", - "@algolia/transporter": "4.22.1" + "@algolia/requester-common": "4.23.2", + "@algolia/transporter": "4.23.2" } }, "node_modules/@algolia/client-personalization": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.22.1.tgz", - "integrity": "sha512-sl+/klQJ93+4yaqZ7ezOttMQ/nczly/3GmgZXJ1xmoewP5jmdP/X/nV5U7EHHH3hCUEHeN7X1nsIhGPVt9E1cQ==", + "version": "4.23.2", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.23.2.tgz", + "integrity": "sha512-vwPsgnCGhUcHhhQG5IM27z8q7dWrN9itjdvgA6uKf2e9r7vB+WXt4OocK0CeoYQt3OGEAExryzsB8DWqdMK5wg==", "dev": true, "dependencies": { - "@algolia/client-common": "4.22.1", - "@algolia/requester-common": "4.22.1", - "@algolia/transporter": "4.22.1" + "@algolia/client-common": "4.23.2", + "@algolia/requester-common": "4.23.2", + "@algolia/transporter": "4.23.2" } }, "node_modules/@algolia/client-search": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.22.1.tgz", - "integrity": "sha512-yb05NA4tNaOgx3+rOxAmFztgMTtGBi97X7PC3jyNeGiwkAjOZc2QrdZBYyIdcDLoI09N0gjtpClcackoTN0gPA==", + "version": "4.23.2", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.23.2.tgz", + "integrity": "sha512-CxSB29OVGSE7l/iyoHvamMonzq7Ev8lnk/OkzleODZ1iBcCs3JC/XgTIKzN/4RSTrJ9QybsnlrN/bYCGufo7qw==", "dev": true, "dependencies": { - "@algolia/client-common": "4.22.1", - "@algolia/requester-common": "4.22.1", - "@algolia/transporter": "4.22.1" + "@algolia/client-common": "4.23.2", + "@algolia/requester-common": "4.23.2", + "@algolia/transporter": "4.23.2" } }, "node_modules/@algolia/logger-common": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.22.1.tgz", - "integrity": "sha512-OnTFymd2odHSO39r4DSWRFETkBufnY2iGUZNrMXpIhF5cmFE8pGoINNPzwg02QLBlGSaLqdKy0bM8S0GyqPLBg==", + "version": "4.23.2", + "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.23.2.tgz", + "integrity": "sha512-jGM49Q7626cXZ7qRAWXn0jDlzvoA1FvN4rKTi1g0hxKsTTSReyYk0i1ADWjChDPl3Q+nSDhJuosM2bBUAay7xw==", "dev": true }, "node_modules/@algolia/logger-console": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.22.1.tgz", - "integrity": "sha512-O99rcqpVPKN1RlpgD6H3khUWylU24OXlzkavUAMy6QZd1776QAcauE3oP8CmD43nbaTjBexZj2nGsBH9Tc0FVA==", + "version": "4.23.2", + "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.23.2.tgz", + "integrity": "sha512-oo+lnxxEmlhTBTFZ3fGz1O8PJ+G+8FiAoMY2Qo3Q4w23xocQev6KqDTA1JQAGPDxAewNA2VBwWOsVXeXFjrI/Q==", "dev": true, "dependencies": { - "@algolia/logger-common": "4.22.1" + "@algolia/logger-common": "4.23.2" + } + }, + "node_modules/@algolia/recommend": { + "version": "4.23.2", + "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-4.23.2.tgz", + "integrity": "sha512-Q75CjnzRCDzgIlgWfPnkLtrfF4t82JCirhalXkSSwe/c1GH5pWh4xUyDOR3KTMo+YxxX3zTlrL/FjHmUJEWEcg==", + "dev": true, + "dependencies": { + "@algolia/cache-browser-local-storage": "4.23.2", + "@algolia/cache-common": "4.23.2", + "@algolia/cache-in-memory": "4.23.2", + "@algolia/client-common": "4.23.2", + "@algolia/client-search": "4.23.2", + "@algolia/logger-common": "4.23.2", + "@algolia/logger-console": "4.23.2", + "@algolia/requester-browser-xhr": "4.23.2", + "@algolia/requester-common": "4.23.2", + "@algolia/requester-node-http": "4.23.2", + "@algolia/transporter": "4.23.2" } }, "node_modules/@algolia/requester-browser-xhr": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.22.1.tgz", - "integrity": "sha512-dtQGYIg6MteqT1Uay3J/0NDqD+UciHy3QgRbk7bNddOJu+p3hzjTRYESqEnoX/DpEkaNYdRHUKNylsqMpgwaEw==", + "version": "4.23.2", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.23.2.tgz", + "integrity": "sha512-TO9wLlp8+rvW9LnIfyHsu8mNAMYrqNdQ0oLF6eTWFxXfxG3k8F/Bh7nFYGk2rFAYty4Fw4XUtrv/YjeNDtM5og==", "dev": true, "dependencies": { - "@algolia/requester-common": "4.22.1" + "@algolia/requester-common": "4.23.2" } }, "node_modules/@algolia/requester-common": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.22.1.tgz", - "integrity": "sha512-dgvhSAtg2MJnR+BxrIFqlLtkLlVVhas9HgYKMk2Uxiy5m6/8HZBL40JVAMb2LovoPFs9I/EWIoFVjOrFwzn5Qg==", + "version": "4.23.2", + "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.23.2.tgz", + "integrity": "sha512-3EfpBS0Hri0lGDB5H/BocLt7Vkop0bTTLVUBB844HH6tVycwShmsV6bDR7yXbQvFP1uNpgePRD3cdBCjeHmk6Q==", "dev": true }, "node_modules/@algolia/requester-node-http": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.22.1.tgz", - "integrity": "sha512-JfmZ3MVFQkAU+zug8H3s8rZ6h0ahHZL/SpMaSasTCGYR5EEJsCc8SI5UZ6raPN2tjxa5bxS13BRpGSBUens7EA==", + "version": "4.23.2", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.23.2.tgz", + "integrity": "sha512-SVzgkZM/malo+2SB0NWDXpnT7nO5IZwuDTaaH6SjLeOHcya1o56LSWXk+3F3rNLz2GVH+I/rpYKiqmHhSOjerw==", "dev": true, "dependencies": { - "@algolia/requester-common": "4.22.1" + "@algolia/requester-common": "4.23.2" } }, "node_modules/@algolia/transporter": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.22.1.tgz", - "integrity": "sha512-kzWgc2c9IdxMa3YqA6TN0NW5VrKYYW/BELIn7vnLyn+U/RFdZ4lxxt9/8yq3DKV5snvoDzzO4ClyejZRdV3lMQ==", + "version": "4.23.2", + "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.23.2.tgz", + "integrity": "sha512-GY3aGKBy+8AK4vZh8sfkatDciDVKad5rTY2S10Aefyjh7e7UGBP4zigf42qVXwU8VOPwi7l/L7OACGMOFcjB0Q==", "dev": true, "dependencies": { - "@algolia/cache-common": "4.22.1", - "@algolia/logger-common": "4.22.1", - "@algolia/requester-common": "4.22.1" + "@algolia/cache-common": "4.23.2", + "@algolia/logger-common": "4.23.2", + "@algolia/requester-common": "4.23.2" } }, "node_modules/@babel/parser": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.6.tgz", - "integrity": "sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.1.tgz", + "integrity": "sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -210,30 +229,30 @@ "dev": true }, "node_modules/@docsearch/css": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.5.2.tgz", - "integrity": "sha512-SPiDHaWKQZpwR2siD0KQUwlStvIAnEyK6tAE2h2Wuoq8ue9skzhlyVQ1ddzOxX6khULnAALDiR/isSF3bnuciA==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.6.0.tgz", + "integrity": "sha512-+sbxb71sWre+PwDK7X2T8+bhS6clcVMLwBPznX45Qu6opJcgRjAp7gYSDzVFp187J+feSj5dNBN1mJoi6ckkUQ==", "dev": true }, "node_modules/@docsearch/js": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docsearch/js/-/js-3.5.2.tgz", - "integrity": "sha512-p1YFTCDflk8ieHgFJYfmyHBki1D61+U9idwrLh+GQQMrBSP3DLGKpy0XUJtPjAOPltcVbqsTjiPFfH7JImjUNg==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@docsearch/js/-/js-3.6.0.tgz", + "integrity": "sha512-QujhqINEElrkIfKwyyyTfbsfMAYCkylInLYMRqHy7PHc8xTBQCow73tlo/Kc7oIwBrCLf0P3YhjlOeV4v8hevQ==", "dev": true, "dependencies": { - "@docsearch/react": "3.5.2", + "@docsearch/react": "3.6.0", "preact": "^10.0.0" } }, "node_modules/@docsearch/react": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.5.2.tgz", - "integrity": "sha512-9Ahcrs5z2jq/DcAvYtvlqEBHImbm4YJI8M9y0x6Tqg598P40HTEkX7hsMcIuThI+hTFxRGZ9hll0Wygm2yEjng==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.6.0.tgz", + "integrity": "sha512-HUFut4ztcVNmqy9gp/wxNbC7pTOHhgVVkHVGCACTuLhUKUhKAF9KYHJtMiLUJxEqiFLQiuri1fWF8zqwM/cu1w==", "dev": true, "dependencies": { "@algolia/autocomplete-core": "1.9.3", "@algolia/autocomplete-preset-algolia": "1.9.3", - "@docsearch/css": "3.5.2", + "@docsearch/css": "3.6.0", "algoliasearch": "^4.19.1" }, "peerDependencies": { @@ -258,9 +277,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.11.tgz", - "integrity": "sha512-FnzU0LyE3ySQk7UntJO4+qIiQgI7KoODnZg5xzXIrFJlKd2P2gwHsHY4927xj9y5PJmJSzULiUCWmv7iWnNa7g==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz", + "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==", "cpu": [ "ppc64" ], @@ -274,9 +293,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.11.tgz", - "integrity": "sha512-5OVapq0ClabvKvQ58Bws8+wkLCV+Rxg7tUVbo9xu034Nm536QTII4YzhaFriQ7rMrorfnFKUsArD2lqKbFY4vw==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz", + "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==", "cpu": [ "arm" ], @@ -290,9 +309,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.11.tgz", - "integrity": "sha512-aiu7K/5JnLj//KOnOfEZ0D90obUkRzDMyqd/wNAUQ34m4YUPVhRZpnqKV9uqDGxT7cToSDnIHsGooyIczu9T+Q==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz", + "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==", "cpu": [ "arm64" ], @@ -306,9 +325,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.11.tgz", - "integrity": "sha512-eccxjlfGw43WYoY9QgB82SgGgDbibcqyDTlk3l3C0jOVHKxrjdc9CTwDUQd0vkvYg5um0OH+GpxYvp39r+IPOg==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz", + "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==", "cpu": [ "x64" ], @@ -322,9 +341,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.11.tgz", - "integrity": "sha512-ETp87DRWuSt9KdDVkqSoKoLFHYTrkyz2+65fj9nfXsaV3bMhTCjtQfw3y+um88vGRKRiF7erPrh/ZuIdLUIVxQ==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz", + "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==", "cpu": [ "arm64" ], @@ -338,9 +357,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.11.tgz", - "integrity": "sha512-fkFUiS6IUK9WYUO/+22omwetaSNl5/A8giXvQlcinLIjVkxwTLSktbF5f/kJMftM2MJp9+fXqZ5ezS7+SALp4g==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz", + "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==", "cpu": [ "x64" ], @@ -354,9 +373,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.11.tgz", - "integrity": "sha512-lhoSp5K6bxKRNdXUtHoNc5HhbXVCS8V0iZmDvyWvYq9S5WSfTIHU2UGjcGt7UeS6iEYp9eeymIl5mJBn0yiuxA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz", + "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==", "cpu": [ "arm64" ], @@ -370,9 +389,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.11.tgz", - "integrity": "sha512-JkUqn44AffGXitVI6/AbQdoYAq0TEullFdqcMY/PCUZ36xJ9ZJRtQabzMA+Vi7r78+25ZIBosLTOKnUXBSi1Kw==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz", + "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==", "cpu": [ "x64" ], @@ -386,9 +405,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.11.tgz", - "integrity": "sha512-3CRkr9+vCV2XJbjwgzjPtO8T0SZUmRZla+UL1jw+XqHZPkPgZiyWvbDvl9rqAN8Zl7qJF0O/9ycMtjU67HN9/Q==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz", + "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==", "cpu": [ "arm" ], @@ -402,9 +421,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.11.tgz", - "integrity": "sha512-LneLg3ypEeveBSMuoa0kwMpCGmpu8XQUh+mL8XXwoYZ6Be2qBnVtcDI5azSvh7vioMDhoJFZzp9GWp9IWpYoUg==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz", + "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==", "cpu": [ "arm64" ], @@ -418,9 +437,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.11.tgz", - "integrity": "sha512-caHy++CsD8Bgq2V5CodbJjFPEiDPq8JJmBdeyZ8GWVQMjRD0sU548nNdwPNvKjVpamYYVL40AORekgfIubwHoA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz", + "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==", "cpu": [ "ia32" ], @@ -434,9 +453,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.11.tgz", - "integrity": "sha512-ppZSSLVpPrwHccvC6nQVZaSHlFsvCQyjnvirnVjbKSHuE5N24Yl8F3UwYUUR1UEPaFObGD2tSvVKbvR+uT1Nrg==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz", + "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==", "cpu": [ "loong64" ], @@ -450,9 +469,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.11.tgz", - "integrity": "sha512-B5x9j0OgjG+v1dF2DkH34lr+7Gmv0kzX6/V0afF41FkPMMqaQ77pH7CrhWeR22aEeHKaeZVtZ6yFwlxOKPVFyg==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz", + "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==", "cpu": [ "mips64el" ], @@ -466,9 +485,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.11.tgz", - "integrity": "sha512-MHrZYLeCG8vXblMetWyttkdVRjQlQUb/oMgBNurVEnhj4YWOr4G5lmBfZjHYQHHN0g6yDmCAQRR8MUHldvvRDA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz", + "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==", "cpu": [ "ppc64" ], @@ -482,9 +501,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.11.tgz", - "integrity": "sha512-f3DY++t94uVg141dozDu4CCUkYW+09rWtaWfnb3bqe4w5NqmZd6nPVBm+qbz7WaHZCoqXqHz5p6CM6qv3qnSSQ==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz", + "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==", "cpu": [ "riscv64" ], @@ -498,9 +517,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.11.tgz", - "integrity": "sha512-A5xdUoyWJHMMlcSMcPGVLzYzpcY8QP1RtYzX5/bS4dvjBGVxdhuiYyFwp7z74ocV7WDc0n1harxmpq2ePOjI0Q==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz", + "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==", "cpu": [ "s390x" ], @@ -514,9 +533,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.11.tgz", - "integrity": "sha512-grbyMlVCvJSfxFQUndw5mCtWs5LO1gUlwP4CDi4iJBbVpZcqLVT29FxgGuBJGSzyOxotFG4LoO5X+M1350zmPA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz", + "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==", "cpu": [ "x64" ], @@ -530,9 +549,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.11.tgz", - "integrity": "sha512-13jvrQZJc3P230OhU8xgwUnDeuC/9egsjTkXN49b3GcS5BKvJqZn86aGM8W9pd14Kd+u7HuFBMVtrNGhh6fHEQ==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz", + "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==", "cpu": [ "x64" ], @@ -546,9 +565,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.11.tgz", - "integrity": "sha512-ysyOGZuTp6SNKPE11INDUeFVVQFrhcNDVUgSQVDzqsqX38DjhPEPATpid04LCoUr2WXhQTEZ8ct/EgJCUDpyNw==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz", + "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==", "cpu": [ "x64" ], @@ -562,9 +581,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.11.tgz", - "integrity": "sha512-Hf+Sad9nVwvtxy4DXCZQqLpgmRTQqyFyhT3bZ4F2XlJCjxGmRFF0Shwn9rzhOYRB61w9VMXUkxlBy56dk9JJiQ==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz", + "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==", "cpu": [ "x64" ], @@ -578,9 +597,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.11.tgz", - "integrity": "sha512-0P58Sbi0LctOMOQbpEOvOL44Ne0sqbS0XWHMvvrg6NE5jQ1xguCSSw9jQeUk2lfrXYsKDdOe6K+oZiwKPilYPQ==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz", + "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==", "cpu": [ "arm64" ], @@ -594,9 +613,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.11.tgz", - "integrity": "sha512-6YOrWS+sDJDmshdBIQU+Uoyh7pQKrdykdefC1avn76ss5c+RN6gut3LZA4E2cH5xUEp5/cA0+YxRaVtRAb0xBg==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz", + "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==", "cpu": [ "ia32" ], @@ -610,9 +629,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.11.tgz", - "integrity": "sha512-vfkhltrjCAb603XaFhqhAF4LGDi2M4OrCRrFusyQ+iTLQ/o60QQXxc9cZC/FFpihBI9N1Grn6SMKVJ4KP7Fuiw==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz", + "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==", "cpu": [ "x64" ], @@ -647,9 +666,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.9.5.tgz", - "integrity": "sha512-idWaG8xeSRCfRq9KpRysDHJ/rEHBEXcHuJ82XY0yYFIWnLMjZv9vF/7DOq8djQ2n3Lk6+3qfSH8AqlmHlmi1MA==", + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.13.1.tgz", + "integrity": "sha512-4C4UERETjXpC4WpBXDbkgNVgHyWfG3B/NKY46e7w5H134UDOFqUJKpsLm0UYmuupW+aJmRgeScrDNfvZ5WV80A==", "cpu": [ "arm" ], @@ -660,9 +679,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.9.5.tgz", - "integrity": "sha512-f14d7uhAMtsCGjAYwZGv6TwuS3IFaM4ZnGMUn3aCBgkcHAYErhV1Ad97WzBvS2o0aaDv4mVz+syiN0ElMyfBPg==", + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.13.1.tgz", + "integrity": "sha512-TrTaFJ9pXgfXEiJKQ3yQRelpQFqgRzVR9it8DbeRzG0RX7mKUy0bqhCFsgevwXLJepQKTnLl95TnPGf9T9AMOA==", "cpu": [ "arm64" ], @@ -673,9 +692,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.9.5.tgz", - "integrity": "sha512-ndoXeLx455FffL68OIUrVr89Xu1WLzAG4n65R8roDlCoYiQcGGg6MALvs2Ap9zs7AHg8mpHtMpwC8jBBjZrT/w==", + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.13.1.tgz", + "integrity": "sha512-fz7jN6ahTI3cKzDO2otQuybts5cyu0feymg0bjvYCBrZQ8tSgE8pc0sSNEuGvifrQJWiwx9F05BowihmLxeQKw==", "cpu": [ "arm64" ], @@ -686,9 +705,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.9.5.tgz", - "integrity": "sha512-UmElV1OY2m/1KEEqTlIjieKfVwRg0Zwg4PLgNf0s3glAHXBN99KLpw5A5lrSYCa1Kp63czTpVll2MAqbZYIHoA==", + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.13.1.tgz", + "integrity": "sha512-WTvdz7SLMlJpektdrnWRUN9C0N2qNHwNbWpNo0a3Tod3gb9leX+yrYdCeB7VV36OtoyiPAivl7/xZ3G1z5h20g==", "cpu": [ "x64" ], @@ -699,9 +718,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.9.5.tgz", - "integrity": "sha512-Q0LcU61v92tQB6ae+udZvOyZ0wfpGojtAKrrpAaIqmJ7+psq4cMIhT/9lfV6UQIpeItnq/2QDROhNLo00lOD1g==", + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.13.1.tgz", + "integrity": "sha512-dBHQl+7wZzBYcIF6o4k2XkAfwP2ks1mYW2q/Gzv9n39uDcDiAGDqEyml08OdY0BIct0yLSPkDTqn4i6czpBLLw==", "cpu": [ "arm" ], @@ -712,9 +731,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.9.5.tgz", - "integrity": "sha512-dkRscpM+RrR2Ee3eOQmRWFjmV/payHEOrjyq1VZegRUa5OrZJ2MAxBNs05bZuY0YCtpqETDy1Ix4i/hRqX98cA==", + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.13.1.tgz", + "integrity": "sha512-bur4JOxvYxfrAmocRJIW0SADs3QdEYK6TQ7dTNz6Z4/lySeu3Z1H/+tl0a4qDYv0bCdBpUYM0sYa/X+9ZqgfSQ==", "cpu": [ "arm64" ], @@ -725,9 +744,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.9.5.tgz", - "integrity": "sha512-QaKFVOzzST2xzY4MAmiDmURagWLFh+zZtttuEnuNn19AiZ0T3fhPyjPPGwLNdiDT82ZE91hnfJsUiDwF9DClIQ==", + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.13.1.tgz", + "integrity": "sha512-ssp77SjcDIUSoUyj7DU7/5iwM4ZEluY+N8umtCT9nBRs3u045t0KkW02LTyHouHDomnMXaXSZcCSr2bdMK63kA==", "cpu": [ "arm64" ], @@ -738,9 +757,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.9.5.tgz", - "integrity": "sha512-HeGqmRJuyVg6/X6MpE2ur7GbymBPS8Np0S/vQFHDmocfORT+Zt76qu+69NUoxXzGqVP1pzaY6QIi0FJWLC3OPA==", + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.13.1.tgz", + "integrity": "sha512-Jv1DkIvwEPAb+v25/Unrnnq9BO3F5cbFPT821n3S5litkz+O5NuXuNhqtPx5KtcwOTtaqkTsO+IVzJOsxd11aQ==", "cpu": [ "riscv64" ], @@ -750,10 +769,23 @@ "linux" ] }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.13.1.tgz", + "integrity": "sha512-U564BrhEfaNChdATQaEODtquCC7Ez+8Hxz1h5MAdMYj0AqD0GA9rHCpElajb/sQcaFL6NXmHc5O+7FXpWMa73Q==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.9.5.tgz", - "integrity": "sha512-Dq1bqBdLaZ1Gb/l2e5/+o3B18+8TI9ANlA1SkejZqDgdU/jK/ThYaMPMJpVMMXy2uRHvGKbkz9vheVGdq3cJfA==", + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.13.1.tgz", + "integrity": "sha512-zGRDulLTeDemR8DFYyFIQ8kMP02xpUsX4IBikc7lwL9PrwR3gWmX2NopqiGlI2ZVWMl15qZeUjumTwpv18N7sQ==", "cpu": [ "x64" ], @@ -764,9 +796,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.9.5.tgz", - "integrity": "sha512-ezyFUOwldYpj7AbkwyW9AJ203peub81CaAIVvckdkyH8EvhEIoKzaMFJj0G4qYJ5sw3BpqhFrsCc30t54HV8vg==", + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.13.1.tgz", + "integrity": "sha512-VTk/MveyPdMFkYJJPCkYBw07KcTkGU2hLEyqYMsU4NjiOfzoaDTW9PWGRsNwiOA3qI0k/JQPjkl/4FCK1smskQ==", "cpu": [ "x64" ], @@ -777,9 +809,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.9.5.tgz", - "integrity": "sha512-aHSsMnUw+0UETB0Hlv7B/ZHOGY5bQdwMKJSzGfDfvyhnpmVxLMGnQPGNE9wgqkLUs3+gbG1Qx02S2LLfJ5GaRQ==", + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.13.1.tgz", + "integrity": "sha512-L+hX8Dtibb02r/OYCsp4sQQIi3ldZkFI0EUkMTDwRfFykXBPptoz/tuuGqEd3bThBSLRWPR6wsixDSgOx/U3Zw==", "cpu": [ "arm64" ], @@ -790,9 +822,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.9.5.tgz", - "integrity": "sha512-AiqiLkb9KSf7Lj/o1U3SEP9Zn+5NuVKgFdRIZkvd4N0+bYrTOovVd0+LmYCPQGbocT4kvFyK+LXCDiXPBF3fyA==", + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.13.1.tgz", + "integrity": "sha512-+dI2jVPfM5A8zme8riEoNC7UKk0Lzc7jCj/U89cQIrOjrZTCWZl/+IXUeRT2rEZ5j25lnSA9G9H1Ob9azaF/KQ==", "cpu": [ "ia32" ], @@ -803,9 +835,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.9.5.tgz", - "integrity": "sha512-1q+mykKE3Vot1kaFJIDoUFv5TuW+QQVaf2FmTT9krg86pQrGStOSJJ0Zil7CFagyxDuouTepzt5Y5TVzyajOdQ==", + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.13.1.tgz", + "integrity": "sha512-YY1Exxo2viZ/O2dMHuwQvimJ0SqvL+OAWQLLY6rvXavgQKjhQUzn7nc1Dd29gjB5Fqi00nrBWctJBOyfVMIVxw==", "cpu": [ "x64" ], @@ -815,6 +847,21 @@ "win32" ] }, + "node_modules/@shikijs/core": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.2.1.tgz", + "integrity": "sha512-KaIS0H4EQ3KI2d++TjYqRNgwp8E3M/68e9veR4QtInzA7kKFgcjeiJqb80fuXW+blDy5fmd11PN9g9soz/3ANQ==", + "dev": true + }, + "node_modules/@shikijs/transformers": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@shikijs/transformers/-/transformers-1.2.1.tgz", + "integrity": "sha512-H7cVtrdv6BW2kx83t2IQgP5ri1IA50mE3QnzgJ0AvOKCGtCEieXu0JIP3245cgjNLrL+LBwb8DtTXdky1iQL9Q==", + "dev": true, + "dependencies": { + "shiki": "1.2.1" + } + }, "node_modules/@types/d3-scale": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.8.tgz", @@ -901,9 +948,9 @@ "dev": true }, "node_modules/@vitejs/plugin-vue": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.0.3.tgz", - "integrity": "sha512-b8S5dVS40rgHdDrw+DQi/xOM9ed+kSRZzfm1T74bMmBDCd8XO87NKlFYInzCtwvtWwXZvo1QxE2OSspTATWrbA==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.0.4.tgz", + "integrity": "sha512-WS3hevEszI6CEVEx28F8RjTX97k3KsrcY6kvTg7+Whm5y3oYvcqzVeGCU3hxSAn4uY2CLCkeokkGKpoctccilQ==", "dev": true, "engines": { "node": "^18.0.0 || >=20.0.0" @@ -914,129 +961,157 @@ } }, "node_modules/@vue/compiler-core": { - "version": "3.4.10", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.10.tgz", - "integrity": "sha512-53vxh7K9qbx+JILnGEhrFRyr7H7e4NdT8RuTNU3m6HhJKFvcAqFTNXpYMHnyuAzzRGdsbsYHBgQC3H6xEXTG6w==", + "version": "3.4.21", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.21.tgz", + "integrity": "sha512-MjXawxZf2SbZszLPYxaFCjxfibYrzr3eYbKxwpLR9EQN+oaziSu3qKVbwBERj1IFIB8OLUewxB5m/BFzi613og==", "dev": true, "dependencies": { - "@babel/parser": "^7.23.6", - "@vue/shared": "3.4.10", + "@babel/parser": "^7.23.9", + "@vue/shared": "3.4.21", "entities": "^4.5.0", "estree-walker": "^2.0.2", "source-map-js": "^1.0.2" } }, "node_modules/@vue/compiler-dom": { - "version": "3.4.10", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.10.tgz", - "integrity": "sha512-QAALBJksIFpXGYuo74rtMgnwpVZDvd3kYbUa4gYX9s/5QiqEvZSgbKtOdUGydXcxKPt3ifC+0/bhPVHXN2694A==", + "version": "3.4.21", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.21.tgz", + "integrity": "sha512-IZC6FKowtT1sl0CR5DpXSiEB5ayw75oT2bma1BEhV7RRR1+cfwLrxc2Z8Zq/RGFzJ8w5r9QtCOvTjQgdn0IKmA==", "dev": true, "dependencies": { - "@vue/compiler-core": "3.4.10", - "@vue/shared": "3.4.10" + "@vue/compiler-core": "3.4.21", + "@vue/shared": "3.4.21" } }, "node_modules/@vue/compiler-sfc": { - "version": "3.4.10", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.10.tgz", - "integrity": "sha512-sTOssaQySgrMjrhZxmAqdp6n+E51VteIVIDaOR537H2P63DyzMmig21U0XXFxiXmMIfrK91lAInnc+bIAYemGw==", + "version": "3.4.21", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.21.tgz", + "integrity": "sha512-me7epoTxYlY+2CUM7hy9PCDdpMPfIwrOvAXud2Upk10g4YLv9UBW7kL798TvMeDhPthkZ0CONNrK2GoeI1ODiQ==", "dev": true, "dependencies": { - "@babel/parser": "^7.23.6", - "@vue/compiler-core": "3.4.10", - "@vue/compiler-dom": "3.4.10", - "@vue/compiler-ssr": "3.4.10", - "@vue/shared": "3.4.10", + "@babel/parser": "^7.23.9", + "@vue/compiler-core": "3.4.21", + "@vue/compiler-dom": "3.4.21", + "@vue/compiler-ssr": "3.4.21", + "@vue/shared": "3.4.21", "estree-walker": "^2.0.2", - "magic-string": "^0.30.5", - "postcss": "^8.4.32", + "magic-string": "^0.30.7", + "postcss": "^8.4.35", "source-map-js": "^1.0.2" } }, "node_modules/@vue/compiler-ssr": { - "version": "3.4.10", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.10.tgz", - "integrity": "sha512-Y90TL1abretWbUiK5rv+9smS1thCHE5sSuhZgiLh6cxgZ2Pcy3BEvDd3reID0iwNcTdMbTeE6NI3Aq4Mux6hqQ==", + "version": "3.4.21", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.21.tgz", + "integrity": "sha512-M5+9nI2lPpAsgXOGQobnIueVqc9sisBFexh5yMIMRAPYLa7+5wEJs8iqOZc1WAa9WQbx9GR2twgznU8LTIiZ4Q==", "dev": true, "dependencies": { - "@vue/compiler-dom": "3.4.10", - "@vue/shared": "3.4.10" + "@vue/compiler-dom": "3.4.21", + "@vue/shared": "3.4.21" } }, "node_modules/@vue/devtools-api": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.5.1.tgz", - "integrity": "sha512-+KpckaAQyfbvshdDW5xQylLni1asvNSGme1JFs8I1+/H5pHEhqUKMEQD/qn3Nx5+/nycBq11qAEi8lk+LXI2dA==", - "dev": true + "version": "7.0.25", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-7.0.25.tgz", + "integrity": "sha512-fL6DlRp4MSXCLYcqYvKU7QhQZWE3Hfu7X8pC25BS74coJi7uJeSWs4tmrITcwFihNmC9S5GPiffkMdckkeWjzg==", + "dev": true, + "dependencies": { + "@vue/devtools-kit": "^7.0.25" + } + }, + "node_modules/@vue/devtools-kit": { + "version": "7.0.25", + "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-7.0.25.tgz", + "integrity": "sha512-wbLkSnOTsKHPb1mB9koFHUoSAF8Dp6Ii/ocR2+DeXFY4oKqIjCeJb/4Lihk4rgqEhCy1WwxLfTgNDo83VvDYkQ==", + "dev": true, + "dependencies": { + "@vue/devtools-shared": "^7.0.25", + "hookable": "^5.5.3", + "mitt": "^3.0.1", + "perfect-debounce": "^1.0.0", + "speakingurl": "^14.0.1" + }, + "peerDependencies": { + "vue": "^3.0.0" + } + }, + "node_modules/@vue/devtools-shared": { + "version": "7.0.25", + "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-7.0.25.tgz", + "integrity": "sha512-5+XYhcHSXuJSguYnNwL6/e6VTmXwCfryWQOkffh9ZU2zMByybqqqBrMWqvBkqTmMFCjPdzulo66xXbVbwLaElQ==", + "dev": true, + "dependencies": { + "rfdc": "^1.3.1" + } }, "node_modules/@vue/reactivity": { - "version": "3.4.10", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.10.tgz", - "integrity": "sha512-SmGGpo37LzPcAFTopHNIJRNVOQfma9YgyPkAzx9/TJ01lbCCYigS28hEcY1hjiJ1PRK8iVX62Ov5yzmUgYH/pQ==", + "version": "3.4.21", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.21.tgz", + "integrity": "sha512-UhenImdc0L0/4ahGCyEzc/pZNwVgcglGy9HVzJ1Bq2Mm9qXOpP8RyNTjookw/gOCUlXSEtuZ2fUg5nrHcoqJcw==", "dev": true, "dependencies": { - "@vue/shared": "3.4.10" + "@vue/shared": "3.4.21" } }, "node_modules/@vue/runtime-core": { - "version": "3.4.10", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.10.tgz", - "integrity": "sha512-Ri2Cz9sFr66AEUewGUK8IXhIUAhshTHVUGuJR8pqMbtjIds+zPa8QPO5UZImGMQ8HTY7eEpKwztCct9V3+Iqug==", + "version": "3.4.21", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.21.tgz", + "integrity": "sha512-pQthsuYzE1XcGZznTKn73G0s14eCJcjaLvp3/DKeYWoFacD9glJoqlNBxt3W2c5S40t6CCcpPf+jG01N3ULyrA==", "dev": true, "dependencies": { - "@vue/reactivity": "3.4.10", - "@vue/shared": "3.4.10" + "@vue/reactivity": "3.4.21", + "@vue/shared": "3.4.21" } }, "node_modules/@vue/runtime-dom": { - "version": "3.4.10", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.10.tgz", - "integrity": "sha512-ROsdi5M2niRDmjXJNZ8KKiGwXyG1FO8l9n6sCN0kaJEHbjWkuigu96YAI3fK/AWUZPSXXEcMEBVPC6rL3mmUuA==", + "version": "3.4.21", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.21.tgz", + "integrity": "sha512-gvf+C9cFpevsQxbkRBS1NpU8CqxKw0ebqMvLwcGQrNpx6gqRDodqKqA+A2VZZpQ9RpK2f9yfg8VbW/EpdFUOJw==", "dev": true, "dependencies": { - "@vue/runtime-core": "3.4.10", - "@vue/shared": "3.4.10", + "@vue/runtime-core": "3.4.21", + "@vue/shared": "3.4.21", "csstype": "^3.1.3" } }, "node_modules/@vue/server-renderer": { - "version": "3.4.10", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.10.tgz", - "integrity": "sha512-WpCBAhesLq44JKWfdFqb+Bi4ACUW0d8x1z90GnE0spccsAlEDMXV5nm+pwXLyW0OdP2iPrO/n/QMJh4B1v9Ciw==", + "version": "3.4.21", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.21.tgz", + "integrity": "sha512-aV1gXyKSN6Rz+6kZ6kr5+Ll14YzmIbeuWe7ryJl5muJ4uwSwY/aStXTixx76TwkZFJLm1aAlA/HSWEJ4EyiMkg==", "dev": true, "dependencies": { - "@vue/compiler-ssr": "3.4.10", - "@vue/shared": "3.4.10" + "@vue/compiler-ssr": "3.4.21", + "@vue/shared": "3.4.21" }, "peerDependencies": { - "vue": "3.4.10" + "vue": "3.4.21" } }, "node_modules/@vue/shared": { - "version": "3.4.10", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.10.tgz", - "integrity": "sha512-C0mIVhwW1xQLMFyqMJxnhq6fWyE02lCgcE+TDdtGpg6B3H6kh/0YcqS54qYc76UJNlWegf3VgsLqgk6D9hBmzQ==", + "version": "3.4.21", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.21.tgz", + "integrity": "sha512-PuJe7vDIi6VYSinuEbUIQgMIRZGgM8e4R+G+/dQTk0X1NEdvgvvgv7m+rfmDH1gZzyA1OjjoWskvHlfRNfQf3g==", "dev": true }, "node_modules/@vueuse/core": { - "version": "10.7.1", - "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-10.7.1.tgz", - "integrity": "sha512-74mWHlaesJSWGp1ihg76vAnfVq9NTv1YT0SYhAQ6zwFNdBkkP+CKKJmVOEHcdSnLXCXYiL5e7MaewblfiYLP7g==", + "version": "10.9.0", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-10.9.0.tgz", + "integrity": "sha512-/1vjTol8SXnx6xewDEKfS0Ra//ncg4Hb0DaZiwKf7drgfMsKFExQ+FnnENcN6efPen+1kIzhLQoGSy0eDUVOMg==", "dev": true, "dependencies": { "@types/web-bluetooth": "^0.0.20", - "@vueuse/metadata": "10.7.1", - "@vueuse/shared": "10.7.1", - "vue-demi": ">=0.14.6" + "@vueuse/metadata": "10.9.0", + "@vueuse/shared": "10.9.0", + "vue-demi": ">=0.14.7" }, "funding": { "url": "https://github.com/sponsors/antfu" } }, "node_modules/@vueuse/core/node_modules/vue-demi": { - "version": "0.14.6", - "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.6.tgz", - "integrity": "sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==", + "version": "0.14.7", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.7.tgz", + "integrity": "sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==", "dev": true, "hasInstallScript": true, "bin": { @@ -1060,14 +1135,14 @@ } }, "node_modules/@vueuse/integrations": { - "version": "10.7.1", - "resolved": "https://registry.npmjs.org/@vueuse/integrations/-/integrations-10.7.1.tgz", - "integrity": "sha512-cKo5LEeKVHdBRBtMTOrDPdR0YNtrmN9IBfdcnY2P3m5LHVrsD0xiHUtAH1WKjHQRIErZG6rJUa6GA4tWZt89Og==", + "version": "10.9.0", + "resolved": "https://registry.npmjs.org/@vueuse/integrations/-/integrations-10.9.0.tgz", + "integrity": "sha512-acK+A01AYdWSvL4BZmCoJAcyHJ6EqhmkQEXbQLwev1MY7NBnS+hcEMx/BzVoR9zKI+UqEPMD9u6PsyAuiTRT4Q==", "dev": true, "dependencies": { - "@vueuse/core": "10.7.1", - "@vueuse/shared": "10.7.1", - "vue-demi": ">=0.14.6" + "@vueuse/core": "10.9.0", + "@vueuse/shared": "10.9.0", + "vue-demi": ">=0.14.7" }, "funding": { "url": "https://github.com/sponsors/antfu" @@ -1126,9 +1201,9 @@ } }, "node_modules/@vueuse/integrations/node_modules/vue-demi": { - "version": "0.14.6", - "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.6.tgz", - "integrity": "sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==", + "version": "0.14.7", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.7.tgz", + "integrity": "sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==", "dev": true, "hasInstallScript": true, "bin": { @@ -1152,30 +1227,30 @@ } }, "node_modules/@vueuse/metadata": { - "version": "10.7.1", - "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-10.7.1.tgz", - "integrity": "sha512-jX8MbX5UX067DYVsbtrmKn6eG6KMcXxLRLlurGkZku5ZYT3vxgBjui2zajvUZ18QLIjrgBkFRsu7CqTAg18QFw==", + "version": "10.9.0", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-10.9.0.tgz", + "integrity": "sha512-iddNbg3yZM0X7qFY2sAotomgdHK7YJ6sKUvQqbvwnf7TmaVPxS4EJydcNsVejNdS8iWCtDk+fYXr7E32nyTnGA==", "dev": true, "funding": { "url": "https://github.com/sponsors/antfu" } }, "node_modules/@vueuse/shared": { - "version": "10.7.1", - "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-10.7.1.tgz", - "integrity": "sha512-v0jbRR31LSgRY/C5i5X279A/WQjD6/JsMzGa+eqt658oJ75IvQXAeONmwvEMrvJQKnRElq/frzBR7fhmWY5uLw==", + "version": "10.9.0", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-10.9.0.tgz", + "integrity": "sha512-Uud2IWncmAfJvRaFYzv5OHDli+FbOzxiVEQdLCKQKLyhz94PIyFC3CHcH7EDMwIn8NPtD06+PNbC/PiO0LGLtw==", "dev": true, "dependencies": { - "vue-demi": ">=0.14.6" + "vue-demi": ">=0.14.7" }, "funding": { "url": "https://github.com/sponsors/antfu" } }, "node_modules/@vueuse/shared/node_modules/vue-demi": { - "version": "0.14.6", - "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.6.tgz", - "integrity": "sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==", + "version": "0.14.7", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.7.tgz", + "integrity": "sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==", "dev": true, "hasInstallScript": true, "bin": { @@ -1199,25 +1274,26 @@ } }, "node_modules/algoliasearch": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.22.1.tgz", - "integrity": "sha512-jwydKFQJKIx9kIZ8Jm44SdpigFwRGPESaxZBaHSV0XWN2yBJAOT4mT7ppvlrpA4UGzz92pqFnVKr/kaZXrcreg==", - "dev": true, - "dependencies": { - "@algolia/cache-browser-local-storage": "4.22.1", - "@algolia/cache-common": "4.22.1", - "@algolia/cache-in-memory": "4.22.1", - "@algolia/client-account": "4.22.1", - "@algolia/client-analytics": "4.22.1", - "@algolia/client-common": "4.22.1", - "@algolia/client-personalization": "4.22.1", - "@algolia/client-search": "4.22.1", - "@algolia/logger-common": "4.22.1", - "@algolia/logger-console": "4.22.1", - "@algolia/requester-browser-xhr": "4.22.1", - "@algolia/requester-common": "4.22.1", - "@algolia/requester-node-http": "4.22.1", - "@algolia/transporter": "4.22.1" + "version": "4.23.2", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.23.2.tgz", + "integrity": "sha512-8aCl055IsokLuPU8BzLjwzXjb7ty9TPcUFFOk0pYOwsE5DMVhE3kwCMFtsCFKcnoPZK7oObm+H5mbnSO/9ioxQ==", + "dev": true, + "dependencies": { + "@algolia/cache-browser-local-storage": "4.23.2", + "@algolia/cache-common": "4.23.2", + "@algolia/cache-in-memory": "4.23.2", + "@algolia/client-account": "4.23.2", + "@algolia/client-analytics": "4.23.2", + "@algolia/client-common": "4.23.2", + "@algolia/client-personalization": "4.23.2", + "@algolia/client-search": "4.23.2", + "@algolia/logger-common": "4.23.2", + "@algolia/logger-console": "4.23.2", + "@algolia/recommend": "4.23.2", + "@algolia/requester-browser-xhr": "4.23.2", + "@algolia/requester-common": "4.23.2", + "@algolia/requester-node-http": "4.23.2", + "@algolia/transporter": "4.23.2" } }, "node_modules/ansi-colors": { @@ -2230,9 +2306,9 @@ } }, "node_modules/esbuild": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.11.tgz", - "integrity": "sha512-HJ96Hev2hX/6i5cDVwcqiJBBtuo9+FeIJOtZ9W1kA5M6AMJRHUZlpYZ1/SbEwtO0ioNAW8rUooVpC/WehY2SfA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz", + "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==", "dev": true, "hasInstallScript": true, "bin": { @@ -2242,29 +2318,29 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.19.11", - "@esbuild/android-arm": "0.19.11", - "@esbuild/android-arm64": "0.19.11", - "@esbuild/android-x64": "0.19.11", - "@esbuild/darwin-arm64": "0.19.11", - "@esbuild/darwin-x64": "0.19.11", - "@esbuild/freebsd-arm64": "0.19.11", - "@esbuild/freebsd-x64": "0.19.11", - "@esbuild/linux-arm": "0.19.11", - "@esbuild/linux-arm64": "0.19.11", - "@esbuild/linux-ia32": "0.19.11", - "@esbuild/linux-loong64": "0.19.11", - "@esbuild/linux-mips64el": "0.19.11", - "@esbuild/linux-ppc64": "0.19.11", - "@esbuild/linux-riscv64": "0.19.11", - "@esbuild/linux-s390x": "0.19.11", - "@esbuild/linux-x64": "0.19.11", - "@esbuild/netbsd-x64": "0.19.11", - "@esbuild/openbsd-x64": "0.19.11", - "@esbuild/sunos-x64": "0.19.11", - "@esbuild/win32-arm64": "0.19.11", - "@esbuild/win32-ia32": "0.19.11", - "@esbuild/win32-x64": "0.19.11" + "@esbuild/aix-ppc64": "0.20.2", + "@esbuild/android-arm": "0.20.2", + "@esbuild/android-arm64": "0.20.2", + "@esbuild/android-x64": "0.20.2", + "@esbuild/darwin-arm64": "0.20.2", + "@esbuild/darwin-x64": "0.20.2", + "@esbuild/freebsd-arm64": "0.20.2", + "@esbuild/freebsd-x64": "0.20.2", + "@esbuild/linux-arm": "0.20.2", + "@esbuild/linux-arm64": "0.20.2", + "@esbuild/linux-ia32": "0.20.2", + "@esbuild/linux-loong64": "0.20.2", + "@esbuild/linux-mips64el": "0.20.2", + "@esbuild/linux-ppc64": "0.20.2", + "@esbuild/linux-riscv64": "0.20.2", + "@esbuild/linux-s390x": "0.20.2", + "@esbuild/linux-x64": "0.20.2", + "@esbuild/netbsd-x64": "0.20.2", + "@esbuild/openbsd-x64": "0.20.2", + "@esbuild/sunos-x64": "0.20.2", + "@esbuild/win32-arm64": "0.20.2", + "@esbuild/win32-ia32": "0.20.2", + "@esbuild/win32-x64": "0.20.2" } }, "node_modules/escalade": { @@ -2343,7 +2419,7 @@ "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "dev": true }, "node_modules/fsevents": { @@ -2415,20 +2491,19 @@ } }, "node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "minimatch": "^5.0.1", + "once": "^1.3.0" }, "engines": { - "node": "*" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -2446,6 +2521,27 @@ "node": ">= 6" } }, + "node_modules/glob/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/glob/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/graceful-fs": { "version": "4.2.9", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", @@ -2524,6 +2620,12 @@ "integrity": "sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==", "dev": true }, + "node_modules/hookable": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz", + "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==", + "dev": true + }, "node_modules/hosted-git-info": { "version": "2.8.9", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", @@ -2545,7 +2647,7 @@ "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "dev": true, "dependencies": { "once": "^1.3.0", @@ -2933,9 +3035,9 @@ } }, "node_modules/magic-string": { - "version": "0.30.5", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.5.tgz", - "integrity": "sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==", + "version": "0.30.8", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.8.tgz", + "integrity": "sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==", "dev": true, "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15" @@ -3484,10 +3586,16 @@ "integrity": "sha512-ihFnidEeU8iXzcVHy74dhkxh/dn8Dc08ERl0xwoMMGqp4+LvRSCgicb+zGqWthVokQKvCSxITlh3P08OzdTYCQ==", "dev": true }, + "node_modules/mitt": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", + "dev": true + }, "node_modules/mocha": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", - "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.4.0.tgz", + "integrity": "sha512-eqhGB8JKapEYcC4ytX/xrzKforgEc3j1pGlAXVy3eRwrtAy5/nIfT1SvgGzfN0XZZxeLq0aQWkOUAmqIJiv+bA==", "dev": true, "dependencies": { "ansi-colors": "4.1.1", @@ -3497,13 +3605,12 @@ "diff": "5.0.0", "escape-string-regexp": "4.0.0", "find-up": "5.0.0", - "glob": "7.2.0", + "glob": "8.1.0", "he": "1.2.0", "js-yaml": "4.1.0", "log-symbols": "4.1.0", "minimatch": "5.0.1", "ms": "2.1.3", - "nanoid": "3.3.3", "serialize-javascript": "6.0.0", "strip-json-comments": "3.1.1", "supports-color": "8.1.1", @@ -3518,10 +3625,6 @@ }, "engines": { "node": ">= 14.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mochajs" } }, "node_modules/mocha/node_modules/brace-expansion": { @@ -3561,10 +3664,16 @@ "dev": true }, "node_modules/nanoid": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", - "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -3573,24 +3682,25 @@ } }, "node_modules/netlify-cli": { - "version": "17.13.1", - "resolved": "https://registry.npmjs.org/netlify-cli/-/netlify-cli-17.13.1.tgz", - "integrity": "sha512-Ql+KQ/ag7fSwu7oj9oQpD7Lso2s3TplytOjXcZkLi2YIXJ11cGXv/WOmq2ZXyMp10J0gPg4iBTYKWsVjAzKISA==", + "version": "17.21.1", + "resolved": "https://registry.npmjs.org/netlify-cli/-/netlify-cli-17.21.1.tgz", + "integrity": "sha512-B8QveV55h2dFCTnk5LInVW1MiXPINTQ61IkEtih15CVYpvVSQy+he8M6hdpucq83VqaF/phaJkb3Si2ligOxxw==", "dev": true, "hasInstallScript": true, "hasShrinkwrap": true, "dependencies": { "@bugsnag/js": "7.20.2", "@fastify/static": "6.10.2", - "@netlify/blobs": "6.3.1", - "@netlify/build": "29.31.5", - "@netlify/build-info": "7.11.4", - "@netlify/config": "20.10.1", - "@netlify/edge-bundler": "11.0.0", + "@netlify/blobs": "7.0.1", + "@netlify/build": "29.36.6", + "@netlify/build-info": "7.13.2", + "@netlify/config": "20.12.1", + "@netlify/edge-bundler": "11.3.0", "@netlify/local-functions-proxy": "1.1.1", - "@netlify/zip-it-and-ship-it": "9.28.2", + "@netlify/zip-it-and-ship-it": "9.30.0", "@octokit/rest": "19.0.13", - "ansi-escapes": "6.2.0", + "@opentelemetry/api": "~1.8.0", + "ansi-escapes": "6.2.1", "ansi-styles": "6.2.1", "ansi-to-html": "0.7.2", "ascii-table": "0.0.9", @@ -3617,7 +3727,7 @@ "envinfo": "7.8.1", "etag": "1.8.1", "execa": "5.1.1", - "express": "4.18.2", + "express": "4.19.1", "express-logging": "1.1.1", "extract-zip": "2.0.1", "fastest-levenshtein": "1.0.16", @@ -3638,13 +3748,13 @@ "https-proxy-agent": "5.0.1", "inquirer": "6.5.2", "inquirer-autocomplete-prompt": "1.4.0", - "ipx": "2.0.1", + "ipx": "2.1.0", "is-docker": "3.0.0", "is-stream": "3.0.0", "is-wsl": "2.2.0", "isexe": "2.0.0", "js-yaml": "4.1.0", - "jsonwebtoken": "9.0.1", + "jsonwebtoken": "9.0.2", "jwt-decode": "3.1.2", "lambda-local": "2.1.2", "listr2": "7.0.2", @@ -3653,9 +3763,9 @@ "log-symbols": "5.1.0", "log-update": "5.0.1", "multiparty": "4.2.3", - "netlify": "13.1.12", - "netlify-headers-parser": "7.1.3", - "netlify-redirect-parser": "14.2.1", + "netlify": "13.1.14", + "netlify-headers-parser": "7.1.4", + "netlify-redirect-parser": "14.2.2", "netlify-redirector": "0.5.0", "node-fetch": "2.6.12", "node-version-alias": "3.4.1", @@ -3670,7 +3780,7 @@ "prettyjson": "1.2.5", "pump": "3.0.0", "raw-body": "2.5.2", - "read-pkg-up": "9.1.0", + "read-package-up": "11.0.0", "semver": "7.5.4", "source-map-support": "0.5.21", "strip-ansi-control-characters": "2.0.0", @@ -3857,9 +3967,9 @@ } }, "node_modules/netlify-cli/node_modules/@babel/parser": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", - "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.6.tgz", + "integrity": "sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -3869,9 +3979,9 @@ } }, "node_modules/netlify-cli/node_modules/@babel/types": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.5.tgz", - "integrity": "sha512-ON5kSOJwVO6xXVRTvOI0eOnWe7VdUcIpsovGo9U/Br4Ie4UVFQTboO2cYnDhAGU6Fp+UxSiT+pMft0SMHfuq6w==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.6.tgz", + "integrity": "sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==", "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.23.4", @@ -3985,6 +4095,374 @@ "node": ">=14" } }, + "node_modules/netlify-cli/node_modules/@esbuild/aix-ppc64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.11.tgz", + "integrity": "sha512-FnzU0LyE3ySQk7UntJO4+qIiQgI7KoODnZg5xzXIrFJlKd2P2gwHsHY4927xj9y5PJmJSzULiUCWmv7iWnNa7g==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/netlify-cli/node_modules/@esbuild/android-arm": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.11.tgz", + "integrity": "sha512-5OVapq0ClabvKvQ58Bws8+wkLCV+Rxg7tUVbo9xu034Nm536QTII4YzhaFriQ7rMrorfnFKUsArD2lqKbFY4vw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/netlify-cli/node_modules/@esbuild/android-arm64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.11.tgz", + "integrity": "sha512-aiu7K/5JnLj//KOnOfEZ0D90obUkRzDMyqd/wNAUQ34m4YUPVhRZpnqKV9uqDGxT7cToSDnIHsGooyIczu9T+Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/netlify-cli/node_modules/@esbuild/android-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.11.tgz", + "integrity": "sha512-eccxjlfGw43WYoY9QgB82SgGgDbibcqyDTlk3l3C0jOVHKxrjdc9CTwDUQd0vkvYg5um0OH+GpxYvp39r+IPOg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/netlify-cli/node_modules/@esbuild/darwin-arm64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.11.tgz", + "integrity": "sha512-ETp87DRWuSt9KdDVkqSoKoLFHYTrkyz2+65fj9nfXsaV3bMhTCjtQfw3y+um88vGRKRiF7erPrh/ZuIdLUIVxQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/netlify-cli/node_modules/@esbuild/darwin-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.11.tgz", + "integrity": "sha512-fkFUiS6IUK9WYUO/+22omwetaSNl5/A8giXvQlcinLIjVkxwTLSktbF5f/kJMftM2MJp9+fXqZ5ezS7+SALp4g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/netlify-cli/node_modules/@esbuild/freebsd-arm64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.11.tgz", + "integrity": "sha512-lhoSp5K6bxKRNdXUtHoNc5HhbXVCS8V0iZmDvyWvYq9S5WSfTIHU2UGjcGt7UeS6iEYp9eeymIl5mJBn0yiuxA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/netlify-cli/node_modules/@esbuild/freebsd-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.11.tgz", + "integrity": "sha512-JkUqn44AffGXitVI6/AbQdoYAq0TEullFdqcMY/PCUZ36xJ9ZJRtQabzMA+Vi7r78+25ZIBosLTOKnUXBSi1Kw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/netlify-cli/node_modules/@esbuild/linux-arm": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.11.tgz", + "integrity": "sha512-3CRkr9+vCV2XJbjwgzjPtO8T0SZUmRZla+UL1jw+XqHZPkPgZiyWvbDvl9rqAN8Zl7qJF0O/9ycMtjU67HN9/Q==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/netlify-cli/node_modules/@esbuild/linux-arm64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.11.tgz", + "integrity": "sha512-LneLg3ypEeveBSMuoa0kwMpCGmpu8XQUh+mL8XXwoYZ6Be2qBnVtcDI5azSvh7vioMDhoJFZzp9GWp9IWpYoUg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/netlify-cli/node_modules/@esbuild/linux-ia32": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.11.tgz", + "integrity": "sha512-caHy++CsD8Bgq2V5CodbJjFPEiDPq8JJmBdeyZ8GWVQMjRD0sU548nNdwPNvKjVpamYYVL40AORekgfIubwHoA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/netlify-cli/node_modules/@esbuild/linux-loong64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.11.tgz", + "integrity": "sha512-ppZSSLVpPrwHccvC6nQVZaSHlFsvCQyjnvirnVjbKSHuE5N24Yl8F3UwYUUR1UEPaFObGD2tSvVKbvR+uT1Nrg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/netlify-cli/node_modules/@esbuild/linux-mips64el": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.11.tgz", + "integrity": "sha512-B5x9j0OgjG+v1dF2DkH34lr+7Gmv0kzX6/V0afF41FkPMMqaQ77pH7CrhWeR22aEeHKaeZVtZ6yFwlxOKPVFyg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/netlify-cli/node_modules/@esbuild/linux-ppc64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.11.tgz", + "integrity": "sha512-MHrZYLeCG8vXblMetWyttkdVRjQlQUb/oMgBNurVEnhj4YWOr4G5lmBfZjHYQHHN0g6yDmCAQRR8MUHldvvRDA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/netlify-cli/node_modules/@esbuild/linux-riscv64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.11.tgz", + "integrity": "sha512-f3DY++t94uVg141dozDu4CCUkYW+09rWtaWfnb3bqe4w5NqmZd6nPVBm+qbz7WaHZCoqXqHz5p6CM6qv3qnSSQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/netlify-cli/node_modules/@esbuild/linux-s390x": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.11.tgz", + "integrity": "sha512-A5xdUoyWJHMMlcSMcPGVLzYzpcY8QP1RtYzX5/bS4dvjBGVxdhuiYyFwp7z74ocV7WDc0n1harxmpq2ePOjI0Q==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/netlify-cli/node_modules/@esbuild/linux-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.11.tgz", + "integrity": "sha512-grbyMlVCvJSfxFQUndw5mCtWs5LO1gUlwP4CDi4iJBbVpZcqLVT29FxgGuBJGSzyOxotFG4LoO5X+M1350zmPA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/netlify-cli/node_modules/@esbuild/netbsd-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.11.tgz", + "integrity": "sha512-13jvrQZJc3P230OhU8xgwUnDeuC/9egsjTkXN49b3GcS5BKvJqZn86aGM8W9pd14Kd+u7HuFBMVtrNGhh6fHEQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/netlify-cli/node_modules/@esbuild/openbsd-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.11.tgz", + "integrity": "sha512-ysyOGZuTp6SNKPE11INDUeFVVQFrhcNDVUgSQVDzqsqX38DjhPEPATpid04LCoUr2WXhQTEZ8ct/EgJCUDpyNw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/netlify-cli/node_modules/@esbuild/sunos-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.11.tgz", + "integrity": "sha512-Hf+Sad9nVwvtxy4DXCZQqLpgmRTQqyFyhT3bZ4F2XlJCjxGmRFF0Shwn9rzhOYRB61w9VMXUkxlBy56dk9JJiQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/netlify-cli/node_modules/@esbuild/win32-arm64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.11.tgz", + "integrity": "sha512-0P58Sbi0LctOMOQbpEOvOL44Ne0sqbS0XWHMvvrg6NE5jQ1xguCSSw9jQeUk2lfrXYsKDdOe6K+oZiwKPilYPQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/netlify-cli/node_modules/@esbuild/win32-ia32": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.11.tgz", + "integrity": "sha512-6YOrWS+sDJDmshdBIQU+Uoyh7pQKrdykdefC1avn76ss5c+RN6gut3LZA4E2cH5xUEp5/cA0+YxRaVtRAb0xBg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/netlify-cli/node_modules/@esbuild/win32-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.11.tgz", + "integrity": "sha512-vfkhltrjCAb603XaFhqhAF4LGDi2M4OrCRrFusyQ+iTLQ/o60QQXxc9cZC/FFpihBI9N1Grn6SMKVJ4KP7Fuiw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, "node_modules/netlify-cli/node_modules/@fastify/accept-negotiator": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@fastify/accept-negotiator/-/accept-negotiator-1.1.0.tgz", @@ -4231,6 +4709,12 @@ "node": ">=10.10.0" } }, + "node_modules/netlify-cli/node_modules/@iarna/toml": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/@iarna/toml/-/toml-2.2.5.tgz", + "integrity": "sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==", + "dev": true + }, "node_modules/netlify-cli/node_modules/@import-maps/resolve": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@import-maps/resolve/-/resolve-1.0.1.tgz", @@ -4390,33 +4874,32 @@ "dev": true }, "node_modules/netlify-cli/node_modules/@netlify/blobs": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/@netlify/blobs/-/blobs-6.3.1.tgz", - "integrity": "sha512-JjLz3WW7Wp6NVwQtDxPpWio4L3u9pnnDXnQ7Q16zgAFE9IA1rSjZVSsyOQrtkiBQIxaJ1Zr5eky8vrXJ5mdRWg==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@netlify/blobs/-/blobs-7.0.1.tgz", + "integrity": "sha512-TPx1QzdPcrtBLFXDsv+BOJg5ip/g4trKaot1MZIUV/uI6H0Islg3gU4AGuH5hAMZOr6VlRLWicFhGX7ihLz4eg==", "dev": true, "engines": { "node": "^14.16.0 || >=16.0.0" } }, "node_modules/netlify-cli/node_modules/@netlify/build": { - "version": "29.31.5", - "resolved": "https://registry.npmjs.org/@netlify/build/-/build-29.31.5.tgz", - "integrity": "sha512-NycFWMdCjCd0mPvWLpJucWzEedrxQSzeeMftA7lP00j3lGVRxqy+5WGfMGjEhAq6GNHTBoYUKTxdEeFJv3wesA==", + "version": "29.36.6", + "resolved": "https://registry.npmjs.org/@netlify/build/-/build-29.36.6.tgz", + "integrity": "sha512-crNoY5Vr7tAodBfYdz8weM+NTw5q6W6ArkowNw6QhKXa4iRXT5MY6H0c2ztsge9o5gAYs55bDhBpKiPcZlzDlA==", "dev": true, "dependencies": { "@bugsnag/js": "^7.0.0", - "@netlify/blobs": "^6.3.1", + "@netlify/blobs": "^6.5.0", "@netlify/cache-utils": "^5.1.5", - "@netlify/config": "^20.10.1", - "@netlify/edge-bundler": "10.1.3", - "@netlify/framework-info": "^9.8.10", - "@netlify/functions-utils": "^5.2.46", + "@netlify/config": "^20.12.1", + "@netlify/edge-bundler": "11.3.0", + "@netlify/framework-info": "^9.8.11", + "@netlify/functions-utils": "^5.2.51", "@netlify/git-utils": "^5.1.1", - "@netlify/opentelemetry-utils": "^1.0.1", - "@netlify/plugins-list": "^6.73.0", + "@netlify/opentelemetry-utils": "^1.0.3", + "@netlify/plugins-list": "^6.75.0", "@netlify/run-utils": "^5.1.1", - "@netlify/zip-it-and-ship-it": "9.28.2", - "@opentelemetry/api": "~1.6.0", + "@netlify/zip-it-and-ship-it": "9.29.2", "@sindresorhus/slugify": "^2.0.0", "ansi-escapes": "^6.0.0", "chalk": "^5.0.0", @@ -4470,7 +4953,8 @@ "node": "^14.16.0 || >=16.0.0" }, "peerDependencies": { - "@netlify/opentelemetry-sdk-setup": "^1.0.2" + "@netlify/opentelemetry-sdk-setup": "^1.0.5", + "@opentelemetry/api": "^1.7.0" }, "peerDependenciesMeta": { "@netlify/opentelemetry-sdk-setup": { @@ -4479,18 +4963,18 @@ } }, "node_modules/netlify-cli/node_modules/@netlify/build-info": { - "version": "7.11.4", - "resolved": "https://registry.npmjs.org/@netlify/build-info/-/build-info-7.11.4.tgz", - "integrity": "sha512-4TvH/oIzow6wlpw+6wGsEyoApws1lzXNxwpArgSS5roCCWZ2NvoF1m7dsTEy+bN1bl1XkwOlK3L6YBJzs4khtg==", + "version": "7.13.2", + "resolved": "https://registry.npmjs.org/@netlify/build-info/-/build-info-7.13.2.tgz", + "integrity": "sha512-smzhIgcms6Z/v2cct90l8ncBbnA5kvknj5/quhwyM6UHUycgMKFlA22qkB0KLj9shwL1Lkh7iQW751JwhSaP9g==", "dev": true, "dependencies": { "@bugsnag/js": "^7.20.0", + "@iarna/toml": "^2.2.5", "dot-prop": "^7.2.0", "find-up": "^6.3.0", "minimatch": "^9.0.0", "read-pkg": "^7.1.0", "semver": "^7.3.8", - "toml": "^3.0.0", "yaml": "^2.1.3", "yargs": "^17.6.0" }, @@ -4556,408 +5040,86 @@ } }, "node_modules/netlify-cli/node_modules/@netlify/build-info/node_modules/yaml": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz", - "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.1.tgz", + "integrity": "sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg==", "dev": true, + "bin": { + "yaml": "bin.mjs" + }, "engines": { "node": ">= 14" } }, - "node_modules/netlify-cli/node_modules/@netlify/build/node_modules/@esbuild/android-arm": { - "version": "0.19.6", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.6.tgz", - "integrity": "sha512-muPzBqXJKCbMYoNbb1JpZh/ynl0xS6/+pLjrofcR3Nad82SbsCogYzUE6Aq9QT3cLP0jR/IVK/NHC9b90mSHtg==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/netlify-cli/node_modules/@netlify/build/node_modules/@esbuild/android-arm64": { - "version": "0.19.6", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.6.tgz", - "integrity": "sha512-KQ/hbe9SJvIJ4sR+2PcZ41IBV+LPJyYp6V1K1P1xcMRup9iYsBoQn4MzE3mhMLOld27Au2eDcLlIREeKGUXpHQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/netlify-cli/node_modules/@netlify/build/node_modules/@esbuild/android-x64": { - "version": "0.19.6", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.6.tgz", - "integrity": "sha512-VVJVZQ7p5BBOKoNxd0Ly3xUM78Y4DyOoFKdkdAe2m11jbh0LEU4bPles4e/72EMl4tapko8o915UalN/5zhspg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/netlify-cli/node_modules/@netlify/build/node_modules/@esbuild/darwin-arm64": { - "version": "0.19.6", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.6.tgz", - "integrity": "sha512-91LoRp/uZAKx6ESNspL3I46ypwzdqyDLXZH7x2QYCLgtnaU08+AXEbabY2yExIz03/am0DivsTtbdxzGejfXpA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/netlify-cli/node_modules/@netlify/build/node_modules/@esbuild/darwin-x64": { - "version": "0.19.6", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.6.tgz", - "integrity": "sha512-QCGHw770ubjBU1J3ZkFJh671MFajGTYMZumPs9E/rqU52md6lIil97BR0CbPq6U+vTh3xnTNDHKRdR8ggHnmxQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/netlify-cli/node_modules/@netlify/build/node_modules/@esbuild/freebsd-arm64": { - "version": "0.19.6", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.6.tgz", - "integrity": "sha512-J53d0jGsDcLzWk9d9SPmlyF+wzVxjXpOH7jVW5ae7PvrDst4kiAz6sX+E8btz0GB6oH12zC+aHRD945jdjF2Vg==", - "cpu": [ - "arm64" - ], + "node_modules/netlify-cli/node_modules/@netlify/build/node_modules/@netlify/blobs": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@netlify/blobs/-/blobs-6.5.0.tgz", + "integrity": "sha512-wRFlNnL/Qv3WNLZd3OT/YYqF1zb6iPSo8T31sl9ccL1ahBxW1fBqKgF4b1XL7Z+6mRIkatvcsVPkWBcO+oJMNA==", "dev": true, - "optional": true, - "os": [ - "freebsd" - ], "engines": { - "node": ">=12" - } - }, - "node_modules/netlify-cli/node_modules/@netlify/build/node_modules/@esbuild/freebsd-x64": { - "version": "0.19.6", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.6.tgz", - "integrity": "sha512-hn9qvkjHSIB5Z9JgCCjED6YYVGCNpqB7dEGavBdG6EjBD8S/UcNUIlGcB35NCkMETkdYwfZSvD9VoDJX6VeUVA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/netlify-cli/node_modules/@netlify/build/node_modules/@esbuild/linux-arm": { - "version": "0.19.6", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.6.tgz", - "integrity": "sha512-G8IR5zFgpXad/Zp7gr7ZyTKyqZuThU6z1JjmRyN1vSF8j0bOlGzUwFSMTbctLAdd7QHpeyu0cRiuKrqK1ZTwvQ==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/netlify-cli/node_modules/@netlify/build/node_modules/@esbuild/linux-arm64": { - "version": "0.19.6", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.6.tgz", - "integrity": "sha512-HQCOrk9XlH3KngASLaBfHpcoYEGUt829A9MyxaI8RMkfRA8SakG6YQEITAuwmtzFdEu5GU4eyhKcpv27dFaOBg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/netlify-cli/node_modules/@netlify/build/node_modules/@esbuild/linux-ia32": { - "version": "0.19.6", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.6.tgz", - "integrity": "sha512-22eOR08zL/OXkmEhxOfshfOGo8P69k8oKHkwkDrUlcB12S/sw/+COM4PhAPT0cAYW/gpqY2uXp3TpjQVJitz7w==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/netlify-cli/node_modules/@netlify/build/node_modules/@esbuild/linux-loong64": { - "version": "0.19.6", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.6.tgz", - "integrity": "sha512-82RvaYAh/SUJyjWA8jDpyZCHQjmEggL//sC7F3VKYcBMumQjUL3C5WDl/tJpEiKtt7XrWmgjaLkrk205zfvwTA==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/netlify-cli/node_modules/@netlify/build/node_modules/@esbuild/linux-mips64el": { - "version": "0.19.6", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.6.tgz", - "integrity": "sha512-8tvnwyYJpR618vboIv2l8tK2SuK/RqUIGMfMENkeDGo3hsEIrpGldMGYFcWxWeEILe5Fi72zoXLmhZ7PR23oQA==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/netlify-cli/node_modules/@netlify/build/node_modules/@esbuild/linux-ppc64": { - "version": "0.19.6", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.6.tgz", - "integrity": "sha512-Qt+D7xiPajxVNk5tQiEJwhmarNnLPdjXAoA5uWMpbfStZB0+YU6a3CtbWYSy+sgAsnyx4IGZjWsTzBzrvg/fMA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/netlify-cli/node_modules/@netlify/build/node_modules/@esbuild/linux-riscv64": { - "version": "0.19.6", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.6.tgz", - "integrity": "sha512-lxRdk0iJ9CWYDH1Wpnnnc640ajF4RmQ+w6oHFZmAIYu577meE9Ka/DCtpOrwr9McMY11ocbp4jirgGgCi7Ls/g==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/netlify-cli/node_modules/@netlify/build/node_modules/@esbuild/linux-s390x": { - "version": "0.19.6", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.6.tgz", - "integrity": "sha512-MopyYV39vnfuykHanRWHGRcRC3AwU7b0QY4TI8ISLfAGfK+tMkXyFuyT1epw/lM0pflQlS53JoD22yN83DHZgA==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/netlify-cli/node_modules/@netlify/build/node_modules/@esbuild/linux-x64": { - "version": "0.19.6", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.6.tgz", - "integrity": "sha512-UWcieaBzsN8WYbzFF5Jq7QULETPcQvlX7KL4xWGIB54OknXJjBO37sPqk7N82WU13JGWvmDzFBi1weVBajPovg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/netlify-cli/node_modules/@netlify/build/node_modules/@esbuild/netbsd-x64": { - "version": "0.19.6", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.6.tgz", - "integrity": "sha512-EpWiLX0fzvZn1wxtLxZrEW+oQED9Pwpnh+w4Ffv8ZLuMhUoqR9q9rL4+qHW8F4Mg5oQEKxAoT0G+8JYNqCiR6g==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/netlify-cli/node_modules/@netlify/build/node_modules/@esbuild/openbsd-x64": { - "version": "0.19.6", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.6.tgz", - "integrity": "sha512-fFqTVEktM1PGs2sLKH4M5mhAVEzGpeZJuasAMRnvDZNCV0Cjvm1Hu35moL2vC0DOrAQjNTvj4zWrol/lwQ8Deg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/netlify-cli/node_modules/@netlify/build/node_modules/@esbuild/sunos-x64": { - "version": "0.19.6", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.6.tgz", - "integrity": "sha512-M+XIAnBpaNvaVAhbe3uBXtgWyWynSdlww/JNZws0FlMPSBy+EpatPXNIlKAdtbFVII9OpX91ZfMb17TU3JKTBA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/netlify-cli/node_modules/@netlify/build/node_modules/@esbuild/win32-arm64": { - "version": "0.19.6", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.6.tgz", - "integrity": "sha512-2DchFXn7vp/B6Tc2eKdTsLzE0ygqKkNUhUBCNtMx2Llk4POIVMUq5rUYjdcedFlGLeRe1uLCpVvCmE+G8XYybA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/netlify-cli/node_modules/@netlify/build/node_modules/@esbuild/win32-ia32": { - "version": "0.19.6", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.6.tgz", - "integrity": "sha512-PBo/HPDQllyWdjwAVX+Gl2hH0dfBydL97BAH/grHKC8fubqp02aL4S63otZ25q3sBdINtOBbz1qTZQfXbP4VBg==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/netlify-cli/node_modules/@netlify/build/node_modules/@esbuild/win32-x64": { - "version": "0.19.6", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.6.tgz", - "integrity": "sha512-OE7yIdbDif2kKfrGa+V0vx/B3FJv2L4KnIiLlvtibPyO9UkgO3rzYE0HhpREo2vmJ1Ixq1zwm9/0er+3VOSZJA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" + "node": "^14.16.0 || >=16.0.0" } }, - "node_modules/netlify-cli/node_modules/@netlify/build/node_modules/@netlify/edge-bundler": { - "version": "10.1.3", - "resolved": "https://registry.npmjs.org/@netlify/edge-bundler/-/edge-bundler-10.1.3.tgz", - "integrity": "sha512-+cFFUrdbkhbtmpvQlRam4CmNguKBjte7usNXO1IxDmExeYxdwkDWWBCjOO4zd/D12TIC3HSJGJjT76GkF+RwTg==", + "node_modules/netlify-cli/node_modules/@netlify/build/node_modules/@netlify/zip-it-and-ship-it": { + "version": "9.29.2", + "resolved": "https://registry.npmjs.org/@netlify/zip-it-and-ship-it/-/zip-it-and-ship-it-9.29.2.tgz", + "integrity": "sha512-9o/4lsFWuyPpe38Rhk/00JyccKSBRGM9Av3DINnh/QrpTeIC6esfJsaJNQ4JQ+gU4XXAwxPY9Uk+16WMPs/zkg==", "dev": true, "dependencies": { - "@import-maps/resolve": "^1.0.1", - "@vercel/nft": "^0.24.3", - "ajv": "^8.11.2", - "ajv-errors": "^3.0.0", - "better-ajv-errors": "^1.2.0", + "@babel/parser": "^7.22.5", + "@babel/types": "7.23.6", + "@netlify/binary-info": "^1.0.0", + "@netlify/serverless-functions-api": "^1.14.0", + "@vercel/nft": "^0.23.0", + "archiver": "^6.0.0", "common-path-prefix": "^3.0.0", - "env-paths": "^3.0.0", - "esbuild": "0.19.6", + "cp-file": "^10.0.0", + "es-module-lexer": "^1.0.0", + "esbuild": "0.19.11", "execa": "^6.0.0", - "find-up": "^6.3.0", - "get-package-name": "^2.2.0", - "get-port": "^6.1.2", + "fast-glob": "^3.3.2", + "filter-obj": "^5.0.0", + "find-up": "^6.0.0", + "glob": "^8.0.3", + "is-builtin-module": "^3.1.0", "is-path-inside": "^4.0.0", - "jsonc-parser": "^3.2.0", - "node-fetch": "^3.1.1", - "node-stream-zip": "^1.15.0", - "p-retry": "^5.1.1", - "p-wait-for": "^4.1.0", - "path-key": "^4.0.0", - "regexp-tree": "^0.1.24", + "junk": "^4.0.0", + "locate-path": "^7.0.0", + "merge-options": "^3.0.4", + "minimatch": "^9.0.0", + "normalize-path": "^3.0.0", + "p-map": "^5.0.0", + "path-exists": "^5.0.0", + "precinct": "^11.0.0", + "require-package-name": "^2.0.1", + "resolve": "^2.0.0-next.1", "semver": "^7.3.8", - "tmp-promise": "^3.0.3", + "tmp-promise": "^3.0.2", + "toml": "^3.0.0", + "unixify": "^1.0.0", "urlpattern-polyfill": "8.0.2", - "uuid": "^9.0.0" + "yargs": "^17.0.0" + }, + "bin": { + "zip-it-and-ship-it": "dist/bin.js" }, "engines": { - "node": "^14.16.0 || >=16.0.0" + "node": "^14.18.0 || >=16.0.0" } }, - "node_modules/netlify-cli/node_modules/@netlify/build/node_modules/@opentelemetry/api": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.6.0.tgz", - "integrity": "sha512-OWlrQAnWn9577PhVgqjUvMr1pg57Bc4jv0iL4w0PRuOSRvq67rvHW9Ie/dZVMvCzhSCB+UxhcY/PmCmFj33Q+g==", + "node_modules/netlify-cli/node_modules/@netlify/build/node_modules/@netlify/zip-it-and-ship-it/node_modules/p-map": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-5.5.0.tgz", + "integrity": "sha512-VFqfGDHlx87K66yZrNdI4YGtD70IRyd+zSvgks6mzHPRNkoKy+9EKP4SFC77/vTTQYmRmti7dvqC+m5jBrBAcg==", "dev": true, + "dependencies": { + "aggregate-error": "^4.0.0" + }, "engines": { - "node": ">=8.0.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/netlify-cli/node_modules/@netlify/build/node_modules/@sindresorhus/is": { @@ -4984,54 +5146,13 @@ "node": ">=14.16" } }, - "node_modules/netlify-cli/node_modules/@netlify/build/node_modules/@vercel/nft": { - "version": "0.24.4", - "resolved": "https://registry.npmjs.org/@vercel/nft/-/nft-0.24.4.tgz", - "integrity": "sha512-KjYAZty7boH5fi5udp6p+lNu6nawgs++pHW+3koErMgbRkkHuToGX/FwjN5clV1FcaM3udfd4zW/sUapkMgpZw==", - "dev": true, - "dependencies": { - "@mapbox/node-pre-gyp": "^1.0.5", - "@rollup/pluginutils": "^4.0.0", - "acorn": "^8.6.0", - "async-sema": "^3.1.1", - "bindings": "^1.4.0", - "estree-walker": "2.0.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.2", - "node-gyp-build": "^4.2.2", - "resolve-from": "^5.0.0" - }, - "bin": { - "nft": "out/cli.js" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/netlify-cli/node_modules/@netlify/build/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "node_modules/netlify-cli/node_modules/@netlify/build/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": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/netlify-cli/node_modules/@netlify/build/node_modules/ajv-errors": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-3.0.0.tgz", - "integrity": "sha512-V3wD15YHfHz6y0KdhYFjyy9vWtEVALT9UrxfN3zqlI6dMioHnJrqOYfyPKol3oqrnCM9uwkcdCwkJ0WUcbLMTQ==", - "dev": true, - "peerDependencies": { - "ajv": "^8.0.1" + "balanced-match": "^1.0.0" } }, "node_modules/netlify-cli/node_modules/@netlify/build/node_modules/cacheable-lookup": { @@ -5067,43 +5188,6 @@ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", "dev": true }, - "node_modules/netlify-cli/node_modules/@netlify/build/node_modules/esbuild": { - "version": "0.19.6", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.6.tgz", - "integrity": "sha512-Xl7dntjA2OEIvpr9j0DVxxnog2fyTGnyVoQXAMQI6eR3mf9zCQds7VIKUDCotDgE/p4ncTgeRqgX8t5d6oP4Gw==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/android-arm": "0.19.6", - "@esbuild/android-arm64": "0.19.6", - "@esbuild/android-x64": "0.19.6", - "@esbuild/darwin-arm64": "0.19.6", - "@esbuild/darwin-x64": "0.19.6", - "@esbuild/freebsd-arm64": "0.19.6", - "@esbuild/freebsd-x64": "0.19.6", - "@esbuild/linux-arm": "0.19.6", - "@esbuild/linux-arm64": "0.19.6", - "@esbuild/linux-ia32": "0.19.6", - "@esbuild/linux-loong64": "0.19.6", - "@esbuild/linux-mips64el": "0.19.6", - "@esbuild/linux-ppc64": "0.19.6", - "@esbuild/linux-riscv64": "0.19.6", - "@esbuild/linux-s390x": "0.19.6", - "@esbuild/linux-x64": "0.19.6", - "@esbuild/netbsd-x64": "0.19.6", - "@esbuild/openbsd-x64": "0.19.6", - "@esbuild/sunos-x64": "0.19.6", - "@esbuild/win32-arm64": "0.19.6", - "@esbuild/win32-ia32": "0.19.6", - "@esbuild/win32-x64": "0.19.6" - } - }, "node_modules/netlify-cli/node_modules/@netlify/build/node_modules/escape-string-regexp": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", @@ -5155,16 +5239,35 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/netlify-cli/node_modules/@netlify/build/node_modules/get-port": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/get-port/-/get-port-6.1.2.tgz", - "integrity": "sha512-BrGGraKm2uPqurfGVj/z97/zv8dPleC6x9JBNRTrDNtCkkRF4rPwrQXFgL7+I+q8QSdU4ntLQX2D7KIxSy8nGw==", + "node_modules/netlify-cli/node_modules/@netlify/build/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/netlify-cli/node_modules/@netlify/build/node_modules/glob/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" } }, "node_modules/netlify-cli/node_modules/@netlify/build/node_modules/got": { @@ -5238,12 +5341,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/netlify-cli/node_modules/@netlify/build/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, "node_modules/netlify-cli/node_modules/@netlify/build/node_modules/lowercase-keys": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", @@ -5280,6 +5377,21 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/netlify-cli/node_modules/@netlify/build/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/netlify-cli/node_modules/@netlify/build/node_modules/node-fetch": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", @@ -5299,9 +5411,9 @@ } }, "node_modules/netlify-cli/node_modules/@netlify/build/node_modules/normalize-url": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.0.tgz", - "integrity": "sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.1.tgz", + "integrity": "sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==", "dev": true, "engines": { "node": ">=14.16" @@ -5311,9 +5423,9 @@ } }, "node_modules/netlify-cli/node_modules/@netlify/build/node_modules/npm-run-path": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.2.0.tgz", - "integrity": "sha512-W4/tgAXFqFA0iL7fk0+uQ3g7wkL8xJmx3XdK0VGb4cHW//eZTtKGvFBBoRKVTpY7n6ze4NL9ly7rgXcHufqXKg==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", "dev": true, "dependencies": { "path-key": "^4.0.0" @@ -5391,33 +5503,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/netlify-cli/node_modules/@netlify/build/node_modules/p-timeout": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-5.1.0.tgz", - "integrity": "sha512-auFDyzzzGZZZdHz3BtET9VEz0SE/uMEAx7uWfGPucfzEwwe/xH0iVeZibQmANYE/hp9T2+UUZT5m+BKyrDp3Ew==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/netlify-cli/node_modules/@netlify/build/node_modules/p-wait-for": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-wait-for/-/p-wait-for-4.1.0.tgz", - "integrity": "sha512-i8nE5q++9h8oaQHWltS1Tnnv4IoMDOlqN7C0KFG2OdbK0iFJIt6CROZ8wfBM+K4Pxqfnq4C4lkkpXqTEpB5DZw==", - "dev": true, - "dependencies": { - "p-timeout": "^5.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/netlify-cli/node_modules/@netlify/build/node_modules/path-exists": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", @@ -5570,11 +5655,12 @@ } }, "node_modules/netlify-cli/node_modules/@netlify/config": { - "version": "20.10.1", - "resolved": "https://registry.npmjs.org/@netlify/config/-/config-20.10.1.tgz", - "integrity": "sha512-ZKNdJAeDs7c9Z5OERoW75ZLeU2NZOS4WjD87IEVjDDYg020A9RcvJBZtc4ZKeF8TaJlYhlRlet6xX2AwOL1gNA==", + "version": "20.12.1", + "resolved": "https://registry.npmjs.org/@netlify/config/-/config-20.12.1.tgz", + "integrity": "sha512-sziuaOA9XfeQjQf6Yru7S9k9xTMy9GAJSPJL02WFld0cFDA5dgDyAFLN34jedIbgl7jVV+g7Vb2nOJocfgibbg==", "dev": true, "dependencies": { + "@iarna/toml": "^2.2.5", "chalk": "^5.0.0", "cron-parser": "^4.1.0", "deepmerge": "^4.2.2", @@ -5588,14 +5674,13 @@ "is-plain-obj": "^4.0.0", "js-yaml": "^4.0.0", "map-obj": "^5.0.0", - "netlify": "^13.1.12", - "netlify-headers-parser": "^7.1.3", - "netlify-redirect-parser": "^14.2.1", + "netlify": "^13.1.14", + "netlify-headers-parser": "^7.1.4", + "netlify-redirect-parser": "^14.2.2", "node-fetch": "^3.3.1", "omit.js": "^2.0.2", "p-locate": "^6.0.0", "path-type": "^5.0.0", - "toml": "^3.0.0", "tomlify-j0.4": "^3.0.0", "validate-npm-package-name": "^4.0.0", "yargs": "^17.6.0" @@ -5806,19 +5891,19 @@ } }, "node_modules/netlify-cli/node_modules/@netlify/edge-bundler": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/@netlify/edge-bundler/-/edge-bundler-11.0.0.tgz", - "integrity": "sha512-DPFkzQmdZR/1a3jUaZMbxk79N6PEtqhxEvx6x5wISegqkeM9DPNe+PQIBFXpsAwIeb9MB1RU7vliT1hIRt8DBg==", + "version": "11.3.0", + "resolved": "https://registry.npmjs.org/@netlify/edge-bundler/-/edge-bundler-11.3.0.tgz", + "integrity": "sha512-ROyjrrOCe4TYdBf9Eky8EFrSFENcKdsHHqGe0nSwbyLKDfbe9gPNwN9LoXt9QhxmPyJCOGwxz12kDX2rqFc+Mw==", "dev": true, "dependencies": { "@import-maps/resolve": "^1.0.1", - "@vercel/nft": "^0.24.3", + "@vercel/nft": "^0.26.0", "ajv": "^8.11.2", "ajv-errors": "^3.0.0", "better-ajv-errors": "^1.2.0", "common-path-prefix": "^3.0.0", "env-paths": "^3.0.0", - "esbuild": "0.19.9", + "esbuild": "0.20.0", "execa": "^6.0.0", "find-up": "^6.3.0", "get-package-name": "^2.2.0", @@ -5830,7 +5915,6 @@ "p-retry": "^5.1.1", "p-wait-for": "^4.1.0", "path-key": "^4.0.0", - "regexp-tree": "^0.1.24", "semver": "^7.3.8", "tmp-promise": "^3.0.3", "urlpattern-polyfill": "8.0.2", @@ -5840,10 +5924,26 @@ "node": "^14.16.0 || >=16.0.0" } }, + "node_modules/netlify-cli/node_modules/@netlify/edge-bundler/node_modules/@esbuild/aix-ppc64": { + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.0.tgz", + "integrity": "sha512-fGFDEctNh0CcSwsiRPxiaqX0P5rq+AqE0SRhYGZ4PX46Lg1FNR6oCxJghf8YgY0WQEgQuh3lErUFE4KxLeRmmw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, "node_modules/netlify-cli/node_modules/@netlify/edge-bundler/node_modules/@esbuild/android-arm": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.9.tgz", - "integrity": "sha512-jkYjjq7SdsWuNI6b5quymW0oC83NN5FdRPuCbs9HZ02mfVdAP8B8eeqLSYU3gb6OJEaY5CQabtTFbqBf26H3GA==", + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.0.tgz", + "integrity": "sha512-3bMAfInvByLHfJwYPJRlpTeaQA75n8C/QKpEaiS4HrFWFiJlNI0vzq/zCjBrhAYcPyVPG7Eo9dMrcQXuqmNk5g==", "cpu": [ "arm" ], @@ -5857,9 +5957,9 @@ } }, "node_modules/netlify-cli/node_modules/@netlify/edge-bundler/node_modules/@esbuild/android-arm64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.9.tgz", - "integrity": "sha512-q4cR+6ZD0938R19MyEW3jEsMzbb/1rulLXiNAJQADD/XYp7pT+rOS5JGxvpRW8dFDEfjW4wLgC/3FXIw4zYglQ==", + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.0.tgz", + "integrity": "sha512-aVpnM4lURNkp0D3qPoAzSG92VXStYmoVPOgXveAUoQBWRSuQzt51yvSju29J6AHPmwY1BjH49uR29oyfH1ra8Q==", "cpu": [ "arm64" ], @@ -5873,9 +5973,9 @@ } }, "node_modules/netlify-cli/node_modules/@netlify/edge-bundler/node_modules/@esbuild/android-x64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.9.tgz", - "integrity": "sha512-KOqoPntWAH6ZxDwx1D6mRntIgZh9KodzgNOy5Ebt9ghzffOk9X2c1sPwtM9P+0eXbefnDhqYfkh5PLP5ULtWFA==", + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.0.tgz", + "integrity": "sha512-uK7wAnlRvjkCPzh8jJ+QejFyrP8ObKuR5cBIsQZ+qbMunwR8sbd8krmMbxTLSrDhiPZaJYKQAU5Y3iMDcZPhyQ==", "cpu": [ "x64" ], @@ -5889,9 +5989,9 @@ } }, "node_modules/netlify-cli/node_modules/@netlify/edge-bundler/node_modules/@esbuild/darwin-arm64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.9.tgz", - "integrity": "sha512-KBJ9S0AFyLVx2E5D8W0vExqRW01WqRtczUZ8NRu+Pi+87opZn5tL4Y0xT0mA4FtHctd0ZgwNoN639fUUGlNIWw==", + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.0.tgz", + "integrity": "sha512-AjEcivGAlPs3UAcJedMa9qYg9eSfU6FnGHJjT8s346HSKkrcWlYezGE8VaO2xKfvvlZkgAhyvl06OJOxiMgOYQ==", "cpu": [ "arm64" ], @@ -5905,9 +6005,9 @@ } }, "node_modules/netlify-cli/node_modules/@netlify/edge-bundler/node_modules/@esbuild/darwin-x64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.9.tgz", - "integrity": "sha512-vE0VotmNTQaTdX0Q9dOHmMTao6ObjyPm58CHZr1UK7qpNleQyxlFlNCaHsHx6Uqv86VgPmR4o2wdNq3dP1qyDQ==", + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.0.tgz", + "integrity": "sha512-bsgTPoyYDnPv8ER0HqnJggXK6RyFy4PH4rtsId0V7Efa90u2+EifxytE9pZnsDgExgkARy24WUQGv9irVbTvIw==", "cpu": [ "x64" ], @@ -5921,9 +6021,9 @@ } }, "node_modules/netlify-cli/node_modules/@netlify/edge-bundler/node_modules/@esbuild/freebsd-arm64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.9.tgz", - "integrity": "sha512-uFQyd/o1IjiEk3rUHSwUKkqZwqdvuD8GevWF065eqgYfexcVkxh+IJgwTaGZVu59XczZGcN/YMh9uF1fWD8j1g==", + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.0.tgz", + "integrity": "sha512-kQ7jYdlKS335mpGbMW5tEe3IrQFIok9r84EM3PXB8qBFJPSc6dpWfrtsC/y1pyrz82xfUIn5ZrnSHQQsd6jebQ==", "cpu": [ "arm64" ], @@ -5937,9 +6037,9 @@ } }, "node_modules/netlify-cli/node_modules/@netlify/edge-bundler/node_modules/@esbuild/freebsd-x64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.9.tgz", - "integrity": "sha512-WMLgWAtkdTbTu1AWacY7uoj/YtHthgqrqhf1OaEWnZb7PQgpt8eaA/F3LkV0E6K/Lc0cUr/uaVP/49iE4M4asA==", + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.0.tgz", + "integrity": "sha512-uG8B0WSepMRsBNVXAQcHf9+Ko/Tr+XqmK7Ptel9HVmnykupXdS4J7ovSQUIi0tQGIndhbqWLaIL/qO/cWhXKyQ==", "cpu": [ "x64" ], @@ -5953,9 +6053,9 @@ } }, "node_modules/netlify-cli/node_modules/@netlify/edge-bundler/node_modules/@esbuild/linux-arm": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.9.tgz", - "integrity": "sha512-C/ChPohUYoyUaqn1h17m/6yt6OB14hbXvT8EgM1ZWaiiTYz7nWZR0SYmMnB5BzQA4GXl3BgBO1l8MYqL/He3qw==", + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.0.tgz", + "integrity": "sha512-2ezuhdiZw8vuHf1HKSf4TIk80naTbP9At7sOqZmdVwvvMyuoDiZB49YZKLsLOfKIr77+I40dWpHVeY5JHpIEIg==", "cpu": [ "arm" ], @@ -5969,9 +6069,9 @@ } }, "node_modules/netlify-cli/node_modules/@netlify/edge-bundler/node_modules/@esbuild/linux-arm64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.9.tgz", - "integrity": "sha512-PiPblfe1BjK7WDAKR1Cr9O7VVPqVNpwFcPWgfn4xu0eMemzRp442hXyzF/fSwgrufI66FpHOEJk0yYdPInsmyQ==", + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.0.tgz", + "integrity": "sha512-uTtyYAP5veqi2z9b6Gr0NUoNv9F/rOzI8tOD5jKcCvRUn7T60Bb+42NDBCWNhMjkQzI0qqwXkQGo1SY41G52nw==", "cpu": [ "arm64" ], @@ -5985,9 +6085,9 @@ } }, "node_modules/netlify-cli/node_modules/@netlify/edge-bundler/node_modules/@esbuild/linux-ia32": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.9.tgz", - "integrity": "sha512-f37i/0zE0MjDxijkPSQw1CO/7C27Eojqb+r3BbHVxMLkj8GCa78TrBZzvPyA/FNLUMzP3eyHCVkAopkKVja+6Q==", + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.0.tgz", + "integrity": "sha512-c88wwtfs8tTffPaoJ+SQn3y+lKtgTzyjkD8NgsyCtCmtoIC8RDL7PrJU05an/e9VuAke6eJqGkoMhJK1RY6z4w==", "cpu": [ "ia32" ], @@ -6001,9 +6101,9 @@ } }, "node_modules/netlify-cli/node_modules/@netlify/edge-bundler/node_modules/@esbuild/linux-loong64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.9.tgz", - "integrity": "sha512-t6mN147pUIf3t6wUt3FeumoOTPfmv9Cc6DQlsVBpB7eCpLOqQDyWBP1ymXn1lDw4fNUSb/gBcKAmvTP49oIkaA==", + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.0.tgz", + "integrity": "sha512-lR2rr/128/6svngnVta6JN4gxSXle/yZEZL3o4XZ6esOqhyR4wsKyfu6qXAL04S4S5CgGfG+GYZnjFd4YiG3Aw==", "cpu": [ "loong64" ], @@ -6017,9 +6117,9 @@ } }, "node_modules/netlify-cli/node_modules/@netlify/edge-bundler/node_modules/@esbuild/linux-mips64el": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.9.tgz", - "integrity": "sha512-jg9fujJTNTQBuDXdmAg1eeJUL4Jds7BklOTkkH80ZgQIoCTdQrDaHYgbFZyeTq8zbY+axgptncko3v9p5hLZtw==", + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.0.tgz", + "integrity": "sha512-9Sycc+1uUsDnJCelDf6ZNqgZQoK1mJvFtqf2MUz4ujTxGhvCWw+4chYfDLPepMEvVL9PDwn6HrXad5yOrNzIsQ==", "cpu": [ "mips64el" ], @@ -6033,9 +6133,9 @@ } }, "node_modules/netlify-cli/node_modules/@netlify/edge-bundler/node_modules/@esbuild/linux-ppc64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.9.tgz", - "integrity": "sha512-tkV0xUX0pUUgY4ha7z5BbDS85uI7ABw3V1d0RNTii7E9lbmV8Z37Pup2tsLV46SQWzjOeyDi1Q7Wx2+QM8WaCQ==", + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.0.tgz", + "integrity": "sha512-CoWSaaAXOZd+CjbUTdXIJE/t7Oz+4g90A3VBCHLbfuc5yUQU/nFDLOzQsN0cdxgXd97lYW/psIIBdjzQIwTBGw==", "cpu": [ "ppc64" ], @@ -6049,9 +6149,9 @@ } }, "node_modules/netlify-cli/node_modules/@netlify/edge-bundler/node_modules/@esbuild/linux-riscv64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.9.tgz", - "integrity": "sha512-DfLp8dj91cufgPZDXr9p3FoR++m3ZJ6uIXsXrIvJdOjXVREtXuQCjfMfvmc3LScAVmLjcfloyVtpn43D56JFHg==", + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.0.tgz", + "integrity": "sha512-mlb1hg/eYRJUpv8h/x+4ShgoNLL8wgZ64SUr26KwglTYnwAWjkhR2GpoKftDbPOCnodA9t4Y/b68H4J9XmmPzA==", "cpu": [ "riscv64" ], @@ -6065,9 +6165,9 @@ } }, "node_modules/netlify-cli/node_modules/@netlify/edge-bundler/node_modules/@esbuild/linux-s390x": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.9.tgz", - "integrity": "sha512-zHbglfEdC88KMgCWpOl/zc6dDYJvWGLiUtmPRsr1OgCViu3z5GncvNVdf+6/56O2Ca8jUU+t1BW261V6kp8qdw==", + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.0.tgz", + "integrity": "sha512-fgf9ubb53xSnOBqyvWEY6ukBNRl1mVX1srPNu06B6mNsNK20JfH6xV6jECzrQ69/VMiTLvHMicQR/PgTOgqJUQ==", "cpu": [ "s390x" ], @@ -6081,9 +6181,9 @@ } }, "node_modules/netlify-cli/node_modules/@netlify/edge-bundler/node_modules/@esbuild/linux-x64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.9.tgz", - "integrity": "sha512-JUjpystGFFmNrEHQnIVG8hKwvA2DN5o7RqiO1CVX8EN/F/gkCjkUMgVn6hzScpwnJtl2mPR6I9XV1oW8k9O+0A==", + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.0.tgz", + "integrity": "sha512-H9Eu6MGse++204XZcYsse1yFHmRXEWgadk2N58O/xd50P9EvFMLJTQLg+lB4E1cF2xhLZU5luSWtGTb0l9UeSg==", "cpu": [ "x64" ], @@ -6097,9 +6197,9 @@ } }, "node_modules/netlify-cli/node_modules/@netlify/edge-bundler/node_modules/@esbuild/netbsd-x64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.9.tgz", - "integrity": "sha512-GThgZPAwOBOsheA2RUlW5UeroRfESwMq/guy8uEe3wJlAOjpOXuSevLRd70NZ37ZrpO6RHGHgEHvPg1h3S1Jug==", + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.0.tgz", + "integrity": "sha512-lCT675rTN1v8Fo+RGrE5KjSnfY0x9Og4RN7t7lVrN3vMSjy34/+3na0q7RIfWDAj0e0rCh0OL+P88lu3Rt21MQ==", "cpu": [ "x64" ], @@ -6113,9 +6213,9 @@ } }, "node_modules/netlify-cli/node_modules/@netlify/edge-bundler/node_modules/@esbuild/openbsd-x64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.9.tgz", - "integrity": "sha512-Ki6PlzppaFVbLnD8PtlVQfsYw4S9n3eQl87cqgeIw+O3sRr9IghpfSKY62mggdt1yCSZ8QWvTZ9jo9fjDSg9uw==", + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.0.tgz", + "integrity": "sha512-HKoUGXz/TOVXKQ+67NhxyHv+aDSZf44QpWLa3I1lLvAwGq8x1k0T+e2HHSRvxWhfJrFxaaqre1+YyzQ99KixoA==", "cpu": [ "x64" ], @@ -6129,9 +6229,9 @@ } }, "node_modules/netlify-cli/node_modules/@netlify/edge-bundler/node_modules/@esbuild/sunos-x64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.9.tgz", - "integrity": "sha512-MLHj7k9hWh4y1ddkBpvRj2b9NCBhfgBt3VpWbHQnXRedVun/hC7sIyTGDGTfsGuXo4ebik2+3ShjcPbhtFwWDw==", + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.0.tgz", + "integrity": "sha512-GDwAqgHQm1mVoPppGsoq4WJwT3vhnz/2N62CzhvApFD1eJyTroob30FPpOZabN+FgCjhG+AgcZyOPIkR8dfD7g==", "cpu": [ "x64" ], @@ -6145,9 +6245,9 @@ } }, "node_modules/netlify-cli/node_modules/@netlify/edge-bundler/node_modules/@esbuild/win32-arm64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.9.tgz", - "integrity": "sha512-GQoa6OrQ8G08guMFgeXPH7yE/8Dt0IfOGWJSfSH4uafwdC7rWwrfE6P9N8AtPGIjUzdo2+7bN8Xo3qC578olhg==", + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.0.tgz", + "integrity": "sha512-0vYsP8aC4TvMlOQYozoksiaxjlvUcQrac+muDqj1Fxy6jh9l9CZJzj7zmh8JGfiV49cYLTorFLxg7593pGldwQ==", "cpu": [ "arm64" ], @@ -6161,9 +6261,9 @@ } }, "node_modules/netlify-cli/node_modules/@netlify/edge-bundler/node_modules/@esbuild/win32-ia32": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.9.tgz", - "integrity": "sha512-UOozV7Ntykvr5tSOlGCrqU3NBr3d8JqPes0QWN2WOXfvkWVGRajC+Ym0/Wj88fUgecUCLDdJPDF0Nna2UK3Qtg==", + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.0.tgz", + "integrity": "sha512-p98u4rIgfh4gdpV00IqknBD5pC84LCub+4a3MO+zjqvU5MVXOc3hqR2UgT2jI2nh3h8s9EQxmOsVI3tyzv1iFg==", "cpu": [ "ia32" ], @@ -6177,9 +6277,9 @@ } }, "node_modules/netlify-cli/node_modules/@netlify/edge-bundler/node_modules/@esbuild/win32-x64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.9.tgz", - "integrity": "sha512-oxoQgglOP7RH6iasDrhY+R/3cHrfwIDvRlT4CGChflq6twk8iENeVvMJjmvBb94Ik1Z+93iGO27err7w6l54GQ==", + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.0.tgz", + "integrity": "sha512-NgJnesu1RtWihtTtXGFMU5YSE6JyyHPMxCwBZK7a6/8d31GuSo9l0Ss7w1Jw5QnKUawG6UEehs883kcXf5fYwg==", "cpu": [ "x64" ], @@ -6193,14 +6293,15 @@ } }, "node_modules/netlify-cli/node_modules/@netlify/edge-bundler/node_modules/@vercel/nft": { - "version": "0.24.3", - "resolved": "https://registry.npmjs.org/@vercel/nft/-/nft-0.24.3.tgz", - "integrity": "sha512-IyBdIxmFAeGZnEfMgt4QrGK7XX4lWazlQj34HEi9dw04/WeDBJ7r1yaOIO5tTf9pbfvwUFodj9b0H+NDGGoOMg==", + "version": "0.26.4", + "resolved": "https://registry.npmjs.org/@vercel/nft/-/nft-0.26.4.tgz", + "integrity": "sha512-j4jCOOXke2t8cHZCIxu1dzKLHLcFmYzC3yqAK6MfZznOL1QIJKd0xcFsXK3zcqzU7ScsE2zWkiMMNHGMHgp+FA==", "dev": true, "dependencies": { "@mapbox/node-pre-gyp": "^1.0.5", "@rollup/pluginutils": "^4.0.0", "acorn": "^8.6.0", + "acorn-import-attributes": "^1.9.2", "async-sema": "^3.1.1", "bindings": "^1.4.0", "estree-walker": "2.0.2", @@ -6243,9 +6344,9 @@ } }, "node_modules/netlify-cli/node_modules/@netlify/edge-bundler/node_modules/esbuild": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.9.tgz", - "integrity": "sha512-U9CHtKSy+EpPsEBa+/A2gMs/h3ylBC0H0KSqIg7tpztHerLi6nrrcoUJAkNCEPumx8yJ+Byic4BVwHgRbN0TBg==", + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.0.tgz", + "integrity": "sha512-6iwE3Y2RVYCME1jLpBqq7LQWK3MW6vjV2bZy6gt/WrqkY+WE74Spyc0ThAOYpMtITvnjX09CrC6ym7A/m9mebA==", "dev": true, "hasInstallScript": true, "bin": { @@ -6255,28 +6356,29 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/android-arm": "0.19.9", - "@esbuild/android-arm64": "0.19.9", - "@esbuild/android-x64": "0.19.9", - "@esbuild/darwin-arm64": "0.19.9", - "@esbuild/darwin-x64": "0.19.9", - "@esbuild/freebsd-arm64": "0.19.9", - "@esbuild/freebsd-x64": "0.19.9", - "@esbuild/linux-arm": "0.19.9", - "@esbuild/linux-arm64": "0.19.9", - "@esbuild/linux-ia32": "0.19.9", - "@esbuild/linux-loong64": "0.19.9", - "@esbuild/linux-mips64el": "0.19.9", - "@esbuild/linux-ppc64": "0.19.9", - "@esbuild/linux-riscv64": "0.19.9", - "@esbuild/linux-s390x": "0.19.9", - "@esbuild/linux-x64": "0.19.9", - "@esbuild/netbsd-x64": "0.19.9", - "@esbuild/openbsd-x64": "0.19.9", - "@esbuild/sunos-x64": "0.19.9", - "@esbuild/win32-arm64": "0.19.9", - "@esbuild/win32-ia32": "0.19.9", - "@esbuild/win32-x64": "0.19.9" + "@esbuild/aix-ppc64": "0.20.0", + "@esbuild/android-arm": "0.20.0", + "@esbuild/android-arm64": "0.20.0", + "@esbuild/android-x64": "0.20.0", + "@esbuild/darwin-arm64": "0.20.0", + "@esbuild/darwin-x64": "0.20.0", + "@esbuild/freebsd-arm64": "0.20.0", + "@esbuild/freebsd-x64": "0.20.0", + "@esbuild/linux-arm": "0.20.0", + "@esbuild/linux-arm64": "0.20.0", + "@esbuild/linux-ia32": "0.20.0", + "@esbuild/linux-loong64": "0.20.0", + "@esbuild/linux-mips64el": "0.20.0", + "@esbuild/linux-ppc64": "0.20.0", + "@esbuild/linux-riscv64": "0.20.0", + "@esbuild/linux-s390x": "0.20.0", + "@esbuild/linux-x64": "0.20.0", + "@esbuild/netbsd-x64": "0.20.0", + "@esbuild/openbsd-x64": "0.20.0", + "@esbuild/sunos-x64": "0.20.0", + "@esbuild/win32-arm64": "0.20.0", + "@esbuild/win32-ia32": "0.20.0", + "@esbuild/win32-x64": "0.20.0" } }, "node_modules/netlify-cli/node_modules/@netlify/edge-bundler/node_modules/execa": { @@ -6360,9 +6462,9 @@ } }, "node_modules/netlify-cli/node_modules/@netlify/edge-bundler/node_modules/npm-run-path": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", - "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", "dev": true, "dependencies": { "path-key": "^4.0.0" @@ -6429,9 +6531,9 @@ } }, "node_modules/netlify-cli/node_modules/@netlify/framework-info": { - "version": "9.8.10", - "resolved": "https://registry.npmjs.org/@netlify/framework-info/-/framework-info-9.8.10.tgz", - "integrity": "sha512-VT8ejAaB/XU2xRpdpQinHUO1YL3+BMx6LJ49wJk2u9Yq/VI1/gYCi5VqbqTHBQXJUlOi84YuiRlrDBsLpPr8eg==", + "version": "9.8.11", + "resolved": "https://registry.npmjs.org/@netlify/framework-info/-/framework-info-9.8.11.tgz", + "integrity": "sha512-8NuvzQQVeU36PRilWqijiIWmjy6JZcqbKooGQ4bNgH/26YNdS+tN5gOWGWVYnRHgdmBUCycyYrM5h1Srwnq3hQ==", "dev": true, "dependencies": { "ajv": "^8.12.0", @@ -6514,12 +6616,12 @@ } }, "node_modules/netlify-cli/node_modules/@netlify/functions-utils": { - "version": "5.2.46", - "resolved": "https://registry.npmjs.org/@netlify/functions-utils/-/functions-utils-5.2.46.tgz", - "integrity": "sha512-fbruHy8nQRhqJ1jCsQN1kU6tZIYQvdSwYZkgkj5r6/rsyzZe5F0gaIE8FmlkUCSmw38GOPUuk78jR2MCmwNzGw==", + "version": "5.2.51", + "resolved": "https://registry.npmjs.org/@netlify/functions-utils/-/functions-utils-5.2.51.tgz", + "integrity": "sha512-A4XLQOE2pfcOHcCTs97G6FDVQg20zGoROCAZcpnNd8bMvBDDVgziC/xoFxm4xGC36u0YogSECsLoIbSKSxLloA==", "dev": true, "dependencies": { - "@netlify/zip-it-and-ship-it": "9.28.2", + "@netlify/zip-it-and-ship-it": "9.29.2", "cpy": "^9.0.0", "path-exists": "^5.0.0" }, @@ -6527,6 +6629,182 @@ "node": "^14.16.0 || >=16.0.0" } }, + "node_modules/netlify-cli/node_modules/@netlify/functions-utils/node_modules/@netlify/zip-it-and-ship-it": { + "version": "9.29.2", + "resolved": "https://registry.npmjs.org/@netlify/zip-it-and-ship-it/-/zip-it-and-ship-it-9.29.2.tgz", + "integrity": "sha512-9o/4lsFWuyPpe38Rhk/00JyccKSBRGM9Av3DINnh/QrpTeIC6esfJsaJNQ4JQ+gU4XXAwxPY9Uk+16WMPs/zkg==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.22.5", + "@babel/types": "7.23.6", + "@netlify/binary-info": "^1.0.0", + "@netlify/serverless-functions-api": "^1.14.0", + "@vercel/nft": "^0.23.0", + "archiver": "^6.0.0", + "common-path-prefix": "^3.0.0", + "cp-file": "^10.0.0", + "es-module-lexer": "^1.0.0", + "esbuild": "0.19.11", + "execa": "^6.0.0", + "fast-glob": "^3.3.2", + "filter-obj": "^5.0.0", + "find-up": "^6.0.0", + "glob": "^8.0.3", + "is-builtin-module": "^3.1.0", + "is-path-inside": "^4.0.0", + "junk": "^4.0.0", + "locate-path": "^7.0.0", + "merge-options": "^3.0.4", + "minimatch": "^9.0.0", + "normalize-path": "^3.0.0", + "p-map": "^5.0.0", + "path-exists": "^5.0.0", + "precinct": "^11.0.0", + "require-package-name": "^2.0.1", + "resolve": "^2.0.0-next.1", + "semver": "^7.3.8", + "tmp-promise": "^3.0.2", + "toml": "^3.0.0", + "unixify": "^1.0.0", + "urlpattern-polyfill": "8.0.2", + "yargs": "^17.0.0" + }, + "bin": { + "zip-it-and-ship-it": "dist/bin.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + } + }, + "node_modules/netlify-cli/node_modules/@netlify/functions-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/netlify-cli/node_modules/@netlify/functions-utils/node_modules/execa": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-6.1.0.tgz", + "integrity": "sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.1", + "human-signals": "^3.0.1", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^3.0.7", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/netlify-cli/node_modules/@netlify/functions-utils/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/netlify-cli/node_modules/@netlify/functions-utils/node_modules/glob/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/netlify-cli/node_modules/@netlify/functions-utils/node_modules/human-signals": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-3.0.1.tgz", + "integrity": "sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ==", + "dev": true, + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/netlify-cli/node_modules/@netlify/functions-utils/node_modules/is-path-inside": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-4.0.0.tgz", + "integrity": "sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/netlify-cli/node_modules/@netlify/functions-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/netlify-cli/node_modules/@netlify/functions-utils/node_modules/npm-run-path": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", + "dev": true, + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/netlify-cli/node_modules/@netlify/functions-utils/node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/netlify-cli/node_modules/@netlify/functions-utils/node_modules/path-exists": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", @@ -6536,6 +6814,18 @@ "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, + "node_modules/netlify-cli/node_modules/@netlify/functions-utils/node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/netlify-cli/node_modules/@netlify/git-utils": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/@netlify/git-utils/-/git-utils-5.1.1.tgz", @@ -6869,36 +7159,30 @@ } }, "node_modules/netlify-cli/node_modules/@netlify/open-api": { - "version": "2.26.0", - "resolved": "https://registry.npmjs.org/@netlify/open-api/-/open-api-2.26.0.tgz", - "integrity": "sha512-B7q+ySzQm6rJhaGbY0Pzqnb1p3FsBqwiPLnLtA17JgTsqmXgQ7j6OQImW9fRJy/Al1ob9M6Oxng/FA2c7aIW1g==", - "dev": true - }, - "node_modules/netlify-cli/node_modules/@netlify/opentelemetry-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@netlify/opentelemetry-utils/-/opentelemetry-utils-1.0.1.tgz", - "integrity": "sha512-mL8vhn4tUpdkHg1+WuqEhguULNeN0kQWZtel6lFEEZ36G41Vxm1gv6n7RcOanNLHxQEnaLS4J8zRVUSuwj6iTQ==", + "version": "2.28.0", + "resolved": "https://registry.npmjs.org/@netlify/open-api/-/open-api-2.28.0.tgz", + "integrity": "sha512-lSx9yVn5mzTS7u9aevQyDRoWaHJYNl15B7CU373g8We39wW8fGh4sdNY7ciPWshf42FblOVlBdoasn/LpzquXg==", "dev": true, - "dependencies": { - "@opentelemetry/api": "~1.6.0" - }, "engines": { - "node": ">=18.0.0" + "node": ">=14" } }, - "node_modules/netlify-cli/node_modules/@netlify/opentelemetry-utils/node_modules/@opentelemetry/api": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.6.0.tgz", - "integrity": "sha512-OWlrQAnWn9577PhVgqjUvMr1pg57Bc4jv0iL4w0PRuOSRvq67rvHW9Ie/dZVMvCzhSCB+UxhcY/PmCmFj33Q+g==", + "node_modules/netlify-cli/node_modules/@netlify/opentelemetry-utils": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@netlify/opentelemetry-utils/-/opentelemetry-utils-1.0.3.tgz", + "integrity": "sha512-1kpJ9lrCXkdhRy4DXf7H0MySOQ8K+8aAwl1aJGztMrq62luoN9qOAbZ5cnTpQHzBUfxveikWB32YuryNA42B8g==", "dev": true, "engines": { - "node": ">=8.0.0" + "node": ">=18.0.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.7.0" } }, "node_modules/netlify-cli/node_modules/@netlify/plugins-list": { - "version": "6.74.0", - "resolved": "https://registry.npmjs.org/@netlify/plugins-list/-/plugins-list-6.74.0.tgz", - "integrity": "sha512-cWZ9vQ0LgKowjlSG4vkLAQ+P41aB8KFrRRId2WCvYeK3g2pUJpseceZtYzTuQvvsOtBZh5qVkqRz1Ye/AfSP+A==", + "version": "6.75.0", + "resolved": "https://registry.npmjs.org/@netlify/plugins-list/-/plugins-list-6.75.0.tgz", + "integrity": "sha512-xH5UWc6v6oOu53kaNhJI6o0vESVECoGBjD5hW5nmjFaIkEJFDfbtHj/gSQ2hCcwIzTlGYRGIyGVBMY+e7ki6bw==", "dev": true, "engines": { "node": "^14.14.0 || >=16.0.0" @@ -6991,9 +7275,9 @@ } }, "node_modules/netlify-cli/node_modules/@netlify/serverless-functions-api": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/@netlify/serverless-functions-api/-/serverless-functions-api-1.13.0.tgz", - "integrity": "sha512-H3SMpHw24jWjnEMqbXgILWdo3/Iv/2DRzOZZevqqEswRTOWcQJGlU35Dth72VAOxhPyWXjulogG1zJNRw8m2sQ==", + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/@netlify/serverless-functions-api/-/serverless-functions-api-1.14.0.tgz", + "integrity": "sha512-HUNETLNvNiC2J+SB/YuRwJA9+agPrc0azSoWVk8H85GC+YE114hcS5JW+dstpKwVerp2xILE3vNWN7IMXP5Q5Q==", "dev": true, "dependencies": { "@netlify/node-cookies": "^0.1.0", @@ -7004,21 +7288,21 @@ } }, "node_modules/netlify-cli/node_modules/@netlify/zip-it-and-ship-it": { - "version": "9.28.2", - "resolved": "https://registry.npmjs.org/@netlify/zip-it-and-ship-it/-/zip-it-and-ship-it-9.28.2.tgz", - "integrity": "sha512-tNv/SXjoWWwrO22fYSxYsB7oIs/h0MDYNnoy8tt/X1AyFF0qIF+7ppNZCwNzh6QGVkGwDHPRz2c6HL2k+pZLIg==", + "version": "9.30.0", + "resolved": "https://registry.npmjs.org/@netlify/zip-it-and-ship-it/-/zip-it-and-ship-it-9.30.0.tgz", + "integrity": "sha512-R0v1/vDjjizB4em4YvigqIRj4ZAdcp18svajvcDp6OhB6pt76LZ/RlPEEPq4sGfpQRUpdmapNdnQDNHHReyXug==", "dev": true, "dependencies": { "@babel/parser": "^7.22.5", - "@babel/types": "7.23.5", + "@babel/types": "7.23.6", "@netlify/binary-info": "^1.0.0", - "@netlify/serverless-functions-api": "^1.13.0", + "@netlify/serverless-functions-api": "^1.14.0", "@vercel/nft": "^0.23.0", "archiver": "^6.0.0", "common-path-prefix": "^3.0.0", "cp-file": "^10.0.0", "es-module-lexer": "^1.0.0", - "esbuild": "0.19.9", + "esbuild": "0.19.11", "execa": "^6.0.0", "fast-glob": "^3.3.2", "filter-obj": "^5.0.0", @@ -7050,358 +7334,6 @@ "node": "^14.18.0 || >=16.0.0" } }, - "node_modules/netlify-cli/node_modules/@netlify/zip-it-and-ship-it/node_modules/@esbuild/android-arm": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.9.tgz", - "integrity": "sha512-jkYjjq7SdsWuNI6b5quymW0oC83NN5FdRPuCbs9HZ02mfVdAP8B8eeqLSYU3gb6OJEaY5CQabtTFbqBf26H3GA==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/netlify-cli/node_modules/@netlify/zip-it-and-ship-it/node_modules/@esbuild/android-arm64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.9.tgz", - "integrity": "sha512-q4cR+6ZD0938R19MyEW3jEsMzbb/1rulLXiNAJQADD/XYp7pT+rOS5JGxvpRW8dFDEfjW4wLgC/3FXIw4zYglQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/netlify-cli/node_modules/@netlify/zip-it-and-ship-it/node_modules/@esbuild/android-x64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.9.tgz", - "integrity": "sha512-KOqoPntWAH6ZxDwx1D6mRntIgZh9KodzgNOy5Ebt9ghzffOk9X2c1sPwtM9P+0eXbefnDhqYfkh5PLP5ULtWFA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/netlify-cli/node_modules/@netlify/zip-it-and-ship-it/node_modules/@esbuild/darwin-arm64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.9.tgz", - "integrity": "sha512-KBJ9S0AFyLVx2E5D8W0vExqRW01WqRtczUZ8NRu+Pi+87opZn5tL4Y0xT0mA4FtHctd0ZgwNoN639fUUGlNIWw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/netlify-cli/node_modules/@netlify/zip-it-and-ship-it/node_modules/@esbuild/darwin-x64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.9.tgz", - "integrity": "sha512-vE0VotmNTQaTdX0Q9dOHmMTao6ObjyPm58CHZr1UK7qpNleQyxlFlNCaHsHx6Uqv86VgPmR4o2wdNq3dP1qyDQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/netlify-cli/node_modules/@netlify/zip-it-and-ship-it/node_modules/@esbuild/freebsd-arm64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.9.tgz", - "integrity": "sha512-uFQyd/o1IjiEk3rUHSwUKkqZwqdvuD8GevWF065eqgYfexcVkxh+IJgwTaGZVu59XczZGcN/YMh9uF1fWD8j1g==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/netlify-cli/node_modules/@netlify/zip-it-and-ship-it/node_modules/@esbuild/freebsd-x64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.9.tgz", - "integrity": "sha512-WMLgWAtkdTbTu1AWacY7uoj/YtHthgqrqhf1OaEWnZb7PQgpt8eaA/F3LkV0E6K/Lc0cUr/uaVP/49iE4M4asA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/netlify-cli/node_modules/@netlify/zip-it-and-ship-it/node_modules/@esbuild/linux-arm": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.9.tgz", - "integrity": "sha512-C/ChPohUYoyUaqn1h17m/6yt6OB14hbXvT8EgM1ZWaiiTYz7nWZR0SYmMnB5BzQA4GXl3BgBO1l8MYqL/He3qw==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/netlify-cli/node_modules/@netlify/zip-it-and-ship-it/node_modules/@esbuild/linux-arm64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.9.tgz", - "integrity": "sha512-PiPblfe1BjK7WDAKR1Cr9O7VVPqVNpwFcPWgfn4xu0eMemzRp442hXyzF/fSwgrufI66FpHOEJk0yYdPInsmyQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/netlify-cli/node_modules/@netlify/zip-it-and-ship-it/node_modules/@esbuild/linux-ia32": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.9.tgz", - "integrity": "sha512-f37i/0zE0MjDxijkPSQw1CO/7C27Eojqb+r3BbHVxMLkj8GCa78TrBZzvPyA/FNLUMzP3eyHCVkAopkKVja+6Q==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/netlify-cli/node_modules/@netlify/zip-it-and-ship-it/node_modules/@esbuild/linux-loong64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.9.tgz", - "integrity": "sha512-t6mN147pUIf3t6wUt3FeumoOTPfmv9Cc6DQlsVBpB7eCpLOqQDyWBP1ymXn1lDw4fNUSb/gBcKAmvTP49oIkaA==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/netlify-cli/node_modules/@netlify/zip-it-and-ship-it/node_modules/@esbuild/linux-mips64el": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.9.tgz", - "integrity": "sha512-jg9fujJTNTQBuDXdmAg1eeJUL4Jds7BklOTkkH80ZgQIoCTdQrDaHYgbFZyeTq8zbY+axgptncko3v9p5hLZtw==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/netlify-cli/node_modules/@netlify/zip-it-and-ship-it/node_modules/@esbuild/linux-ppc64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.9.tgz", - "integrity": "sha512-tkV0xUX0pUUgY4ha7z5BbDS85uI7ABw3V1d0RNTii7E9lbmV8Z37Pup2tsLV46SQWzjOeyDi1Q7Wx2+QM8WaCQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/netlify-cli/node_modules/@netlify/zip-it-and-ship-it/node_modules/@esbuild/linux-riscv64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.9.tgz", - "integrity": "sha512-DfLp8dj91cufgPZDXr9p3FoR++m3ZJ6uIXsXrIvJdOjXVREtXuQCjfMfvmc3LScAVmLjcfloyVtpn43D56JFHg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/netlify-cli/node_modules/@netlify/zip-it-and-ship-it/node_modules/@esbuild/linux-s390x": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.9.tgz", - "integrity": "sha512-zHbglfEdC88KMgCWpOl/zc6dDYJvWGLiUtmPRsr1OgCViu3z5GncvNVdf+6/56O2Ca8jUU+t1BW261V6kp8qdw==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/netlify-cli/node_modules/@netlify/zip-it-and-ship-it/node_modules/@esbuild/linux-x64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.9.tgz", - "integrity": "sha512-JUjpystGFFmNrEHQnIVG8hKwvA2DN5o7RqiO1CVX8EN/F/gkCjkUMgVn6hzScpwnJtl2mPR6I9XV1oW8k9O+0A==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/netlify-cli/node_modules/@netlify/zip-it-and-ship-it/node_modules/@esbuild/netbsd-x64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.9.tgz", - "integrity": "sha512-GThgZPAwOBOsheA2RUlW5UeroRfESwMq/guy8uEe3wJlAOjpOXuSevLRd70NZ37ZrpO6RHGHgEHvPg1h3S1Jug==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/netlify-cli/node_modules/@netlify/zip-it-and-ship-it/node_modules/@esbuild/openbsd-x64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.9.tgz", - "integrity": "sha512-Ki6PlzppaFVbLnD8PtlVQfsYw4S9n3eQl87cqgeIw+O3sRr9IghpfSKY62mggdt1yCSZ8QWvTZ9jo9fjDSg9uw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/netlify-cli/node_modules/@netlify/zip-it-and-ship-it/node_modules/@esbuild/sunos-x64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.9.tgz", - "integrity": "sha512-MLHj7k9hWh4y1ddkBpvRj2b9NCBhfgBt3VpWbHQnXRedVun/hC7sIyTGDGTfsGuXo4ebik2+3ShjcPbhtFwWDw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/netlify-cli/node_modules/@netlify/zip-it-and-ship-it/node_modules/@esbuild/win32-arm64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.9.tgz", - "integrity": "sha512-GQoa6OrQ8G08guMFgeXPH7yE/8Dt0IfOGWJSfSH4uafwdC7rWwrfE6P9N8AtPGIjUzdo2+7bN8Xo3qC578olhg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/netlify-cli/node_modules/@netlify/zip-it-and-ship-it/node_modules/@esbuild/win32-ia32": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.9.tgz", - "integrity": "sha512-UOozV7Ntykvr5tSOlGCrqU3NBr3d8JqPes0QWN2WOXfvkWVGRajC+Ym0/Wj88fUgecUCLDdJPDF0Nna2UK3Qtg==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/netlify-cli/node_modules/@netlify/zip-it-and-ship-it/node_modules/@esbuild/win32-x64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.9.tgz", - "integrity": "sha512-oxoQgglOP7RH6iasDrhY+R/3cHrfwIDvRlT4CGChflq6twk8iENeVvMJjmvBb94Ik1Z+93iGO27err7w6l54GQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, "node_modules/netlify-cli/node_modules/@netlify/zip-it-and-ship-it/node_modules/brace-expansion": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", @@ -7411,43 +7343,6 @@ "balanced-match": "^1.0.0" } }, - "node_modules/netlify-cli/node_modules/@netlify/zip-it-and-ship-it/node_modules/esbuild": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.9.tgz", - "integrity": "sha512-U9CHtKSy+EpPsEBa+/A2gMs/h3ylBC0H0KSqIg7tpztHerLi6nrrcoUJAkNCEPumx8yJ+Byic4BVwHgRbN0TBg==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/android-arm": "0.19.9", - "@esbuild/android-arm64": "0.19.9", - "@esbuild/android-x64": "0.19.9", - "@esbuild/darwin-arm64": "0.19.9", - "@esbuild/darwin-x64": "0.19.9", - "@esbuild/freebsd-arm64": "0.19.9", - "@esbuild/freebsd-x64": "0.19.9", - "@esbuild/linux-arm": "0.19.9", - "@esbuild/linux-arm64": "0.19.9", - "@esbuild/linux-ia32": "0.19.9", - "@esbuild/linux-loong64": "0.19.9", - "@esbuild/linux-mips64el": "0.19.9", - "@esbuild/linux-ppc64": "0.19.9", - "@esbuild/linux-riscv64": "0.19.9", - "@esbuild/linux-s390x": "0.19.9", - "@esbuild/linux-x64": "0.19.9", - "@esbuild/netbsd-x64": "0.19.9", - "@esbuild/openbsd-x64": "0.19.9", - "@esbuild/sunos-x64": "0.19.9", - "@esbuild/win32-arm64": "0.19.9", - "@esbuild/win32-ia32": "0.19.9", - "@esbuild/win32-x64": "0.19.9" - } - }, "node_modules/netlify-cli/node_modules/@netlify/zip-it-and-ship-it/node_modules/execa": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/execa/-/execa-6.1.0.tgz", @@ -7471,22 +7366,6 @@ "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/netlify-cli/node_modules/@netlify/zip-it-and-ship-it/node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, "node_modules/netlify-cli/node_modules/@netlify/zip-it-and-ship-it/node_modules/glob": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", @@ -7555,9 +7434,9 @@ } }, "node_modules/netlify-cli/node_modules/@netlify/zip-it-and-ship-it/node_modules/npm-run-path": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.2.0.tgz", - "integrity": "sha512-W4/tgAXFqFA0iL7fk0+uQ3g7wkL8xJmx3XdK0VGb4cHW//eZTtKGvFBBoRKVTpY7n6ze4NL9ly7rgXcHufqXKg==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", "dev": true, "dependencies": { "path-key": "^4.0.0" @@ -7851,10 +7730,19 @@ "@octokit/openapi-types": "^13.11.0" } }, + "node_modules/netlify-cli/node_modules/@opentelemetry/api": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.8.0.tgz", + "integrity": "sha512-I/s6F7yKUDdtMsoBWXJe8Qz40Tui5vsuKCWJEWVL+5q9sSWRzzx6v2KeNsOBEwd94j0eWkpWCH4yB6rZg9Mf0w==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, "node_modules/netlify-cli/node_modules/@parcel/watcher": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.3.0.tgz", - "integrity": "sha512-pW7QaFiL11O0BphO+bq3MgqeX/INAk9jgBldVDYjlQPO4VddoZnF22TcF9onMhnLVHuNqBJeRf+Fj7eezi/+rQ==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.4.0.tgz", + "integrity": "sha512-XJLGVL0DEclX5pcWa2N9SX1jCGTDd8l972biNooLFtjneuGqodupPQh6XseXIBBeVIMaaJ7bTcs3qGvXwsp4vg==", "dev": true, "hasInstallScript": true, "dependencies": { @@ -7871,24 +7759,24 @@ "url": "https://opencollective.com/parcel" }, "optionalDependencies": { - "@parcel/watcher-android-arm64": "2.3.0", - "@parcel/watcher-darwin-arm64": "2.3.0", - "@parcel/watcher-darwin-x64": "2.3.0", - "@parcel/watcher-freebsd-x64": "2.3.0", - "@parcel/watcher-linux-arm-glibc": "2.3.0", - "@parcel/watcher-linux-arm64-glibc": "2.3.0", - "@parcel/watcher-linux-arm64-musl": "2.3.0", - "@parcel/watcher-linux-x64-glibc": "2.3.0", - "@parcel/watcher-linux-x64-musl": "2.3.0", - "@parcel/watcher-win32-arm64": "2.3.0", - "@parcel/watcher-win32-ia32": "2.3.0", - "@parcel/watcher-win32-x64": "2.3.0" + "@parcel/watcher-android-arm64": "2.4.0", + "@parcel/watcher-darwin-arm64": "2.4.0", + "@parcel/watcher-darwin-x64": "2.4.0", + "@parcel/watcher-freebsd-x64": "2.4.0", + "@parcel/watcher-linux-arm-glibc": "2.4.0", + "@parcel/watcher-linux-arm64-glibc": "2.4.0", + "@parcel/watcher-linux-arm64-musl": "2.4.0", + "@parcel/watcher-linux-x64-glibc": "2.4.0", + "@parcel/watcher-linux-x64-musl": "2.4.0", + "@parcel/watcher-win32-arm64": "2.4.0", + "@parcel/watcher-win32-ia32": "2.4.0", + "@parcel/watcher-win32-x64": "2.4.0" } }, "node_modules/netlify-cli/node_modules/@parcel/watcher-android-arm64": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.3.0.tgz", - "integrity": "sha512-f4o9eA3dgk0XRT3XhB0UWpWpLnKgrh1IwNJKJ7UJek7eTYccQ8LR7XUWFKqw6aEq5KUNlCcGvSzKqSX/vtWVVA==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.4.0.tgz", + "integrity": "sha512-+fPtO/GsbYX1LJnCYCaDVT3EOBjvSFdQN9Mrzh9zWAOOfvidPWyScTrHIZHHfJBvlHzNA0Gy0U3NXFA/M7PHUA==", "cpu": [ "arm64" ], @@ -7906,9 +7794,9 @@ } }, "node_modules/netlify-cli/node_modules/@parcel/watcher-darwin-arm64": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.3.0.tgz", - "integrity": "sha512-mKY+oijI4ahBMc/GygVGvEdOq0L4DxhYgwQqYAz/7yPzuGi79oXrZG52WdpGA1wLBPrYb0T8uBaGFo7I6rvSKw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.4.0.tgz", + "integrity": "sha512-T/At5pansFuQ8VJLRx0C6C87cgfqIYhW2N/kBfLCUvDhCah0EnLLwaD/6MW3ux+rpgkpQAnMELOCTKlbwncwiA==", "cpu": [ "arm64" ], @@ -7926,9 +7814,9 @@ } }, "node_modules/netlify-cli/node_modules/@parcel/watcher-darwin-x64": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.3.0.tgz", - "integrity": "sha512-20oBj8LcEOnLE3mgpy6zuOq8AplPu9NcSSSfyVKgfOhNAc4eF4ob3ldj0xWjGGbOF7Dcy1Tvm6ytvgdjlfUeow==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.4.0.tgz", + "integrity": "sha512-vZMv9jl+szz5YLsSqEGCMSllBl1gU1snfbRL5ysJU03MEa6gkVy9OMcvXV1j4g0++jHEcvzhs3Z3LpeEbVmY6Q==", "cpu": [ "x64" ], @@ -7946,9 +7834,9 @@ } }, "node_modules/netlify-cli/node_modules/@parcel/watcher-freebsd-x64": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.3.0.tgz", - "integrity": "sha512-7LftKlaHunueAEiojhCn+Ef2CTXWsLgTl4hq0pkhkTBFI3ssj2bJXmH2L67mKpiAD5dz66JYk4zS66qzdnIOgw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.4.0.tgz", + "integrity": "sha512-dHTRMIplPDT1M0+BkXjtMN+qLtqq24sLDUhmU+UxxLP2TEY2k8GIoqIJiVrGWGomdWsy5IO27aDV1vWyQ6gfHA==", "cpu": [ "x64" ], @@ -7966,9 +7854,9 @@ } }, "node_modules/netlify-cli/node_modules/@parcel/watcher-linux-arm-glibc": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.3.0.tgz", - "integrity": "sha512-1apPw5cD2xBv1XIHPUlq0cO6iAaEUQ3BcY0ysSyD9Kuyw4MoWm1DV+W9mneWI+1g6OeP6dhikiFE6BlU+AToTQ==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.4.0.tgz", + "integrity": "sha512-9NQXD+qk46RwATNC3/UB7HWurscY18CnAPMTFcI9Y8CTbtm63/eex1SNt+BHFinEQuLBjaZwR2Lp+n7pmEJPpQ==", "cpu": [ "arm" ], @@ -7986,9 +7874,9 @@ } }, "node_modules/netlify-cli/node_modules/@parcel/watcher-linux-arm64-glibc": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.3.0.tgz", - "integrity": "sha512-mQ0gBSQEiq1k/MMkgcSB0Ic47UORZBmWoAWlMrTW6nbAGoLZP+h7AtUM7H3oDu34TBFFvjy4JCGP43JlylkTQA==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.4.0.tgz", + "integrity": "sha512-QuJTAQdsd7PFW9jNGaV9Pw+ZMWV9wKThEzzlY3Lhnnwy7iW23qtQFPql8iEaSFMCVI5StNNmONUopk+MFKpiKg==", "cpu": [ "arm64" ], @@ -8006,9 +7894,9 @@ } }, "node_modules/netlify-cli/node_modules/@parcel/watcher-linux-arm64-musl": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.3.0.tgz", - "integrity": "sha512-LXZAExpepJew0Gp8ZkJ+xDZaTQjLHv48h0p0Vw2VMFQ8A+RKrAvpFuPVCVwKJCr5SE+zvaG+Etg56qXvTDIedw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.4.0.tgz", + "integrity": "sha512-oyN+uA9xcTDo/45bwsd6TFHa7Lc7hKujyMlvwrCLvSckvWogndCEoVYFNfZ6JJ2KNL/6fFiGPcbjp8jJmEh5Ng==", "cpu": [ "arm64" ], @@ -8026,9 +7914,9 @@ } }, "node_modules/netlify-cli/node_modules/@parcel/watcher-linux-x64-glibc": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.3.0.tgz", - "integrity": "sha512-P7Wo91lKSeSgMTtG7CnBS6WrA5otr1K7shhSjKHNePVmfBHDoAOHYRXgUmhiNfbcGk0uMCHVcdbfxtuiZCHVow==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.4.0.tgz", + "integrity": "sha512-KphV8awJmxU3q52JQvJot0QMu07CIyEjV+2Tb2ZtbucEgqyRcxOBDMsqp1JNq5nuDXtcCC0uHQICeiEz38dPBQ==", "cpu": [ "x64" ], @@ -8046,9 +7934,9 @@ } }, "node_modules/netlify-cli/node_modules/@parcel/watcher-linux-x64-musl": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.3.0.tgz", - "integrity": "sha512-+kiRE1JIq8QdxzwoYY+wzBs9YbJ34guBweTK8nlzLKimn5EQ2b2FSC+tAOpq302BuIMjyuUGvBiUhEcLIGMQ5g==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.4.0.tgz", + "integrity": "sha512-7jzcOonpXNWcSijPpKD5IbC6xC7yTibjJw9jviVzZostYLGxbz8LDJLUnLzLzhASPlPGgpeKLtFUMjAAzM+gSA==", "cpu": [ "x64" ], @@ -8066,9 +7954,9 @@ } }, "node_modules/netlify-cli/node_modules/@parcel/watcher-wasm": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-wasm/-/watcher-wasm-2.3.0.tgz", - "integrity": "sha512-ejBAX8H0ZGsD8lSICDNyMbSEtPMWgDL0WFCt/0z7hyf5v8Imz4rAM8xY379mBsECkq/Wdqa5WEDLqtjZ+6NxfA==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-wasm/-/watcher-wasm-2.4.0.tgz", + "integrity": "sha512-MNgQ4WCbBybqQ97KwR/hqJGYTg3+s8qHpgIyFWB2qJOBvoJWbXuJGmm4ZkPLq2bMaANqCZqrXwmKYagZTkMKZA==", "bundleDependencies": [ "napi-wasm" ], @@ -8093,9 +7981,9 @@ "license": "MIT" }, "node_modules/netlify-cli/node_modules/@parcel/watcher-win32-arm64": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.3.0.tgz", - "integrity": "sha512-35gXCnaz1AqIXpG42evcoP2+sNL62gZTMZne3IackM+6QlfMcJLy3DrjuL6Iks7Czpd3j4xRBzez3ADCj1l7Aw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.4.0.tgz", + "integrity": "sha512-NOej2lqlq8bQNYhUMnOD0nwvNql8ToQF+1Zhi9ULZoG+XTtJ9hNnCFfyICxoZLXor4bBPTOnzs/aVVoefYnjIg==", "cpu": [ "arm64" ], @@ -8113,9 +8001,9 @@ } }, "node_modules/netlify-cli/node_modules/@parcel/watcher-win32-ia32": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.3.0.tgz", - "integrity": "sha512-FJS/IBQHhRpZ6PiCjFt1UAcPr0YmCLHRbTc00IBTrelEjlmmgIVLeOx4MSXzx2HFEy5Jo5YdhGpxCuqCyDJ5ow==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.4.0.tgz", + "integrity": "sha512-IO/nM+K2YD/iwjWAfHFMBPz4Zqn6qBDqZxY4j2n9s+4+OuTSRM/y/irksnuqcspom5DjkSeF9d0YbO+qpys+JA==", "cpu": [ "ia32" ], @@ -8133,9 +8021,9 @@ } }, "node_modules/netlify-cli/node_modules/@parcel/watcher-win32-x64": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.3.0.tgz", - "integrity": "sha512-dLx+0XRdMnVI62kU3wbXvbIRhLck4aE28bIGKbRGS7BJNt54IIj9+c/Dkqb+7DJEbHUZAX1bwaoM8PqVlHJmCA==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.4.0.tgz", + "integrity": "sha512-pAUyUVjfFjWaf/pShmJpJmNxZhbMvJASUpdes9jL6bTEJ+gDxPRSpXTIemNyNsb9AtbiGXs9XduP1reThmd+dA==", "cpu": [ "x64" ], @@ -8414,9 +8302,9 @@ } }, "node_modules/netlify-cli/node_modules/@types/normalize-package-data": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", - "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", + "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", "dev": true }, "node_modules/netlify-cli/node_modules/@types/qs": { @@ -8876,9 +8764,9 @@ } }, "node_modules/netlify-cli/node_modules/acorn": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -8887,10 +8775,19 @@ "node": ">=0.4.0" } }, + "node_modules/netlify-cli/node_modules/acorn-import-attributes": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.2.tgz", + "integrity": "sha512-O+nfJwNolEA771IYJaiLWK1UAwjNsQmZbTRqqwBYxCgVQTmpFEMvBw6LOIQV0Me339L5UMVYFyRohGnGlQDdIQ==", + "dev": true, + "peerDependencies": { + "acorn": "^8" + } + }, "node_modules/netlify-cli/node_modules/acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", + "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", "dev": true, "engines": { "node": ">=0.4.0" @@ -9043,13 +8940,10 @@ } }, "node_modules/netlify-cli/node_modules/ansi-escapes": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.2.0.tgz", - "integrity": "sha512-kzRaCqXnpzWs+3z5ABPQiVke+iq0KXkHo8xiWV4RPTi5Yli0l97BEQuhXV1s7+aSU/fu1kUuxgS4MsQ0fRuygw==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.2.1.tgz", + "integrity": "sha512-4nJ3yixlEthEJ9Rk4vPcdBRkZvQZlYyu8j4/Mqz5sgIkddmEnH2Yj2ZrnP9S3tQOvSNRUIgVNF/1yPpRAGNRig==", "dev": true, - "dependencies": { - "type-fest": "^3.0.0" - }, "engines": { "node": ">=14.16" }, @@ -9121,26 +9015,6 @@ "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", "dev": true }, - "node_modules/netlify-cli/node_modules/arch": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", - "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==", - "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/netlify-cli/node_modules/archiver": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/archiver/-/archiver-6.0.1.tgz", @@ -9591,85 +9465,6 @@ "integrity": "sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w==", "dev": true }, - "node_modules/netlify-cli/node_modules/body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", - "dev": true, - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.1", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/netlify-cli/node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/netlify-cli/node_modules/body-parser/node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/netlify-cli/node_modules/body-parser/node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dev": true, - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/netlify-cli/node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/netlify-cli/node_modules/body-parser/node_modules/raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", - "dev": true, - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/netlify-cli/node_modules/boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", @@ -10001,9 +9796,9 @@ } }, "node_modules/netlify-cli/node_modules/citty": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/citty/-/citty-0.1.4.tgz", - "integrity": "sha512-Q3bK1huLxzQrvj7hImJ7Z1vKYJRPQCDnd0EjXfHMidcjecGOMuLrmuQmtWmFkuKLcMThlGh1yCKG8IEc6VeNXQ==", + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/citty/-/citty-0.1.6.tgz", + "integrity": "sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==", "dev": true, "dependencies": { "consola": "^3.2.3" @@ -10184,14 +9979,88 @@ "dev": true }, "node_modules/netlify-cli/node_modules/clipboardy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-3.0.0.tgz", - "integrity": "sha512-Su+uU5sr1jkUy1sGRpLKjKrvEOVXgSgiSInwa/qeID6aJ07yh+5NWc3h2QfjHjBnfX4LhtFcuAWKUsJ3r+fjbg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-4.0.0.tgz", + "integrity": "sha512-5mOlNS0mhX0707P2I0aZ2V/cmHUEO/fL7VFLqszkhUsxt7RwnmrInf/eEQKlf5GzvYeHIjT+Ov1HRfNmymlG0w==", "dev": true, "dependencies": { - "arch": "^2.2.0", - "execa": "^5.1.1", - "is-wsl": "^2.2.0" + "execa": "^8.0.1", + "is-wsl": "^3.1.0", + "is64bit": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/netlify-cli/node_modules/clipboardy/node_modules/execa": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/netlify-cli/node_modules/clipboardy/node_modules/get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "dev": true, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/netlify-cli/node_modules/clipboardy/node_modules/human-signals": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", + "dev": true, + "engines": { + "node": ">=16.17.0" + } + }, + "node_modules/netlify-cli/node_modules/clipboardy/node_modules/is-wsl": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", + "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", + "dev": true, + "dependencies": { + "is-inside-container": "^1.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/netlify-cli/node_modules/clipboardy/node_modules/npm-run-path": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.2.0.tgz", + "integrity": "sha512-W4/tgAXFqFA0iL7fk0+uQ3g7wkL8xJmx3XdK0VGb4cHW//eZTtKGvFBBoRKVTpY7n6ze4NL9ly7rgXcHufqXKg==", + "dev": true, + "dependencies": { + "path-key": "^4.0.0" }, "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" @@ -10200,6 +10069,45 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/netlify-cli/node_modules/clipboardy/node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/netlify-cli/node_modules/clipboardy/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/netlify-cli/node_modules/clipboardy/node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/netlify-cli/node_modules/clone": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", @@ -10931,6 +10839,12 @@ "node": ">=8" } }, + "node_modules/netlify-cli/node_modules/crossws": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/crossws/-/crossws-0.1.1.tgz", + "integrity": "sha512-c9c/o7bS3OjsdpSkvexpka0JNlesBF2JU9B2V1yNsYGwRbAafxhJQ7VI9b48D5bpONz/oxbPGMzBojy9sXoQIQ==", + "dev": true + }, "node_modules/netlify-cli/node_modules/crypto-random-string": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", @@ -11253,9 +11167,9 @@ } }, "node_modules/netlify-cli/node_modules/defu": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.3.tgz", - "integrity": "sha512-Vy2wmG3NTkmHNg/kzpuvHhkqeIx3ODWqasgCRbKtbXEN0G+HpEEv9BtJLp7ZG1CZloFaC41Ah3ZFbq7aqCqMeQ==", + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz", + "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==", "dev": true }, "node_modules/netlify-cli/node_modules/delegates": { @@ -11654,6 +11568,44 @@ "integrity": "sha512-HBL8I3mIki5C1Cc9QjKUenHtnG0A5/xA8Q/AllRcfiwl2CZFXGK7ddBiCoRwAix4i2KxcQfjtIVcrVbB3vbmwg==", "dev": true }, + "node_modules/netlify-cli/node_modules/esbuild": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.11.tgz", + "integrity": "sha512-HJ96Hev2hX/6i5cDVwcqiJBBtuo9+FeIJOtZ9W1kA5M6AMJRHUZlpYZ1/SbEwtO0ioNAW8rUooVpC/WehY2SfA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.19.11", + "@esbuild/android-arm": "0.19.11", + "@esbuild/android-arm64": "0.19.11", + "@esbuild/android-x64": "0.19.11", + "@esbuild/darwin-arm64": "0.19.11", + "@esbuild/darwin-x64": "0.19.11", + "@esbuild/freebsd-arm64": "0.19.11", + "@esbuild/freebsd-x64": "0.19.11", + "@esbuild/linux-arm": "0.19.11", + "@esbuild/linux-arm64": "0.19.11", + "@esbuild/linux-ia32": "0.19.11", + "@esbuild/linux-loong64": "0.19.11", + "@esbuild/linux-mips64el": "0.19.11", + "@esbuild/linux-ppc64": "0.19.11", + "@esbuild/linux-riscv64": "0.19.11", + "@esbuild/linux-s390x": "0.19.11", + "@esbuild/linux-x64": "0.19.11", + "@esbuild/netbsd-x64": "0.19.11", + "@esbuild/openbsd-x64": "0.19.11", + "@esbuild/sunos-x64": "0.19.11", + "@esbuild/win32-arm64": "0.19.11", + "@esbuild/win32-ia32": "0.19.11", + "@esbuild/win32-x64": "0.19.11" + } + }, "node_modules/netlify-cli/node_modules/escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -11958,17 +11910,17 @@ } }, "node_modules/netlify-cli/node_modules/express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.19.1.tgz", + "integrity": "sha512-K4w1/Bp7y8iSiVObmCrtq8Cs79XjJc/RU2YYkZQ7wpUu5ZyZ7MtPHkqoMz4pf+mgXfNvo2qft8D9OnrH2ABk9w==", "dev": true, "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.1", + "body-parser": "1.20.2", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.5.0", + "cookie": "0.6.0", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", @@ -12011,6 +11963,39 @@ "node": ">= 0.10.26" } }, + "node_modules/netlify-cli/node_modules/express/node_modules/body-parser": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/netlify-cli/node_modules/express/node_modules/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/netlify-cli/node_modules/express/node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -12247,9 +12232,9 @@ "dev": true }, "node_modules/netlify-cli/node_modules/fast-glob": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", - "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -12912,6 +12897,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/netlify-cli/node_modules/find-up-simple": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/find-up-simple/-/find-up-simple-1.0.0.tgz", + "integrity": "sha512-q7Us7kcjj2VMePAa02hDAF6d+MzsdsAWEwYyOpwUtlerRBkOEPBCRZrAV4XfcSN8fHAgaD0hP7miwoay6DCprw==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/netlify-cli/node_modules/find-up/node_modules/path-exists": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", @@ -13097,9 +13094,9 @@ "dev": true }, "node_modules/netlify-cli/node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "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, @@ -13218,9 +13215,9 @@ } }, "node_modules/netlify-cli/node_modules/get-port-please": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/get-port-please/-/get-port-please-3.1.1.tgz", - "integrity": "sha512-3UBAyM3u4ZBVYDsxOQfJDxEa6XTbpBDrOjp4mf7ExFRt5BKs/QywQQiJsh2B+hxcZLSapWqCRvElUe8DnKcFHA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/get-port-please/-/get-port-please-3.1.2.tgz", + "integrity": "sha512-Gxc29eLs1fbn6LQ4jSU4vXjlwyZhF5HsGuMAa7gqBP4Rw4yxxltyDUuF5MBclFzDTXO+ACchGQoeela4DSfzdQ==", "dev": true }, "node_modules/netlify-cli/node_modules/get-stream": { @@ -13402,19 +13399,20 @@ "dev": true }, "node_modules/netlify-cli/node_modules/h3": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/h3/-/h3-1.8.2.tgz", - "integrity": "sha512-1Ca0orJJlCaiFY68BvzQtP2lKLk46kcLAxVM8JgYbtm2cUg6IY7pjpYgWMwUvDO9QI30N5JAukOKoT8KD3Q0PQ==", + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/h3/-/h3-1.10.1.tgz", + "integrity": "sha512-UBAUp47hmm4BB5/njB4LrEa9gpuvZj4/Qf/ynSMzO6Ku2RXaouxEfiG2E2IFnv6fxbhAkzjasDxmo6DFdEeXRg==", "dev": true, "dependencies": { "cookie-es": "^1.0.0", - "defu": "^6.1.2", - "destr": "^2.0.1", - "iron-webcrypto": "^0.10.1", + "defu": "^6.1.4", + "destr": "^2.0.2", + "iron-webcrypto": "^1.0.0", + "ohash": "^1.1.3", "radix3": "^1.1.0", - "ufo": "^1.3.0", + "ufo": "^1.3.2", "uncrypto": "^0.1.3", - "unenv": "^1.7.4" + "unenv": "^1.9.0" } }, "node_modules/netlify-cli/node_modules/has": { @@ -13809,6 +13807,18 @@ "node": ">=0.8.19" } }, + "node_modules/netlify-cli/node_modules/index-to-position": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/index-to-position/-/index-to-position-0.1.2.tgz", + "integrity": "sha512-MWDKS3AS1bGCHLBA2VLImJz42f7bJh8wQsTGCzI3j519/CASStoDONUBVz2I/VID0MpiX3SGSnbOD2xUalbE5g==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/netlify-cli/node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -14149,36 +14159,127 @@ } }, "node_modules/netlify-cli/node_modules/ipx": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ipx/-/ipx-2.0.1.tgz", - "integrity": "sha512-+EyZiVNosYr3hu3F5+5GripTBLjKmSPTvcy3YdT4zxlhqHQJ2gUopLGxpfv9Wd11YgeiPh53ysbtG+ZNIOVF4A==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ipx/-/ipx-2.1.0.tgz", + "integrity": "sha512-AVnPGXJ8L41vjd11Z4akIF2yd14636Klxul3tBySxHA6PKfCOQPxBDkCFK5zcWh0z/keR6toh1eg8qzdBVUgdA==", "dev": true, "dependencies": { "@fastify/accept-negotiator": "^1.1.0", - "citty": "^0.1.4", + "citty": "^0.1.5", "consola": "^3.2.3", - "defu": "^6.1.3", + "defu": "^6.1.4", "destr": "^2.0.2", "etag": "^1.8.1", - "h3": "^1.8.2", + "h3": "^1.10.0", "image-meta": "^0.2.0", - "listhen": "^1.5.5", + "listhen": "^1.5.6", "ofetch": "^1.3.3", - "pathe": "^1.1.1", + "pathe": "^1.1.2", "sharp": "^0.32.6", - "svgo": "^3.0.2", - "ufo": "^1.3.1", - "unstorage": "^1.9.0", + "svgo": "^3.2.0", + "ufo": "^1.3.2", + "unstorage": "^1.10.1", "xss": "^1.0.14" }, "bin": { "ipx": "bin/ipx.mjs" } }, + "node_modules/netlify-cli/node_modules/ipx/node_modules/@netlify/blobs": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@netlify/blobs/-/blobs-6.5.0.tgz", + "integrity": "sha512-wRFlNnL/Qv3WNLZd3OT/YYqF1zb6iPSo8T31sl9ccL1ahBxW1fBqKgF4b1XL7Z+6mRIkatvcsVPkWBcO+oJMNA==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": "^14.16.0 || >=16.0.0" + } + }, + "node_modules/netlify-cli/node_modules/ipx/node_modules/lru-cache": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", + "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", + "dev": true, + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/netlify-cli/node_modules/ipx/node_modules/unstorage": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/unstorage/-/unstorage-1.10.1.tgz", + "integrity": "sha512-rWQvLRfZNBpF+x8D3/gda5nUCQL2PgXy2jNG4U7/Rc9BGEv9+CAJd0YyGCROUBKs9v49Hg8huw3aih5Bf5TAVw==", + "dev": true, + "dependencies": { + "anymatch": "^3.1.3", + "chokidar": "^3.5.3", + "destr": "^2.0.2", + "h3": "^1.8.2", + "ioredis": "^5.3.2", + "listhen": "^1.5.5", + "lru-cache": "^10.0.2", + "mri": "^1.2.0", + "node-fetch-native": "^1.4.1", + "ofetch": "^1.3.3", + "ufo": "^1.3.1" + }, + "peerDependencies": { + "@azure/app-configuration": "^1.4.1", + "@azure/cosmos": "^4.0.0", + "@azure/data-tables": "^13.2.2", + "@azure/identity": "^3.3.2", + "@azure/keyvault-secrets": "^4.7.0", + "@azure/storage-blob": "^12.16.0", + "@capacitor/preferences": "^5.0.6", + "@netlify/blobs": "^6.2.0", + "@planetscale/database": "^1.11.0", + "@upstash/redis": "^1.23.4", + "@vercel/kv": "^0.2.3", + "idb-keyval": "^6.2.1" + }, + "peerDependenciesMeta": { + "@azure/app-configuration": { + "optional": true + }, + "@azure/cosmos": { + "optional": true + }, + "@azure/data-tables": { + "optional": true + }, + "@azure/identity": { + "optional": true + }, + "@azure/keyvault-secrets": { + "optional": true + }, + "@azure/storage-blob": { + "optional": true + }, + "@capacitor/preferences": { + "optional": true + }, + "@netlify/blobs": { + "optional": true + }, + "@planetscale/database": { + "optional": true + }, + "@upstash/redis": { + "optional": true + }, + "@vercel/kv": { + "optional": true + }, + "idb-keyval": { + "optional": true + } + } + }, "node_modules/netlify-cli/node_modules/iron-webcrypto": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/iron-webcrypto/-/iron-webcrypto-0.10.1.tgz", - "integrity": "sha512-QGOS8MRMnj/UiOa+aMIgfyHcvkhqNUsUxb1XzskENvbo+rEfp6TOwqd1KPuDzXC4OnGHcMSVxDGRoilqB8ViqA==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/iron-webcrypto/-/iron-webcrypto-1.0.0.tgz", + "integrity": "sha512-anOK1Mktt8U1Xi7fCM3RELTuYbnFikQY5VtrDj7kPgpejV7d43tWKhzgioO0zpkazLEL/j/iayRqnJhrGfqUsg==", "dev": true, "funding": { "url": "https://github.com/sponsors/brc-dd" @@ -14353,6 +14454,24 @@ "node": ">=0.10.0" } }, + "node_modules/netlify-cli/node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "dev": true, + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/netlify-cli/node_modules/is-installed-globally": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", @@ -14549,6 +14668,21 @@ "node": ">=12" } }, + "node_modules/netlify-cli/node_modules/is64bit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is64bit/-/is64bit-2.0.0.tgz", + "integrity": "sha512-jv+8jaWCl0g2lSBkNSVXdzfBA0npK1HGC2KtWM9FumFRoGS94g3NbCCLVnCYHLjp4GrW2KZeeSTMo5ddtznmGw==", + "dev": true, + "dependencies": { + "system-architecture": "^0.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/netlify-cli/node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -14734,15 +14868,21 @@ } }, "node_modules/netlify-cli/node_modules/jsonwebtoken": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.1.tgz", - "integrity": "sha512-K8wx7eJ5TPvEjuiVSkv167EVboBDv9PZdDoF7BgeQnBLVvZWW9clr2PsQHVJDTKaEIH5JBIwHujGcHp7GgI2eg==", + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", + "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", "dev": true, "dependencies": { "jws": "^3.2.2", - "lodash": "^4.17.21", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", "ms": "^2.1.1", - "semver": "^7.3.8" + "semver": "^7.5.4" }, "engines": { "node": ">=12", @@ -14971,27 +15111,28 @@ "dev": true }, "node_modules/netlify-cli/node_modules/listhen": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/listhen/-/listhen-1.5.5.tgz", - "integrity": "sha512-LXe8Xlyh3gnxdv4tSjTjscD1vpr/2PRpzq8YIaMJgyKzRG8wdISlWVWnGThJfHnlJ6hmLt2wq1yeeix0TEbuoA==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/listhen/-/listhen-1.6.0.tgz", + "integrity": "sha512-z0RcEXVX5oTpY1bO02SKoTU/kmZSrFSngNNzHRM6KICR17PTq7ANush6AE6ztGJwJD4RLpBrVHd9GnV51J7s3w==", "dev": true, "dependencies": { - "@parcel/watcher": "^2.3.0", - "@parcel/watcher-wasm": "2.3.0", - "citty": "^0.1.4", - "clipboardy": "^3.0.0", + "@parcel/watcher": "^2.4.0", + "@parcel/watcher-wasm": "2.4.0", + "citty": "^0.1.5", + "clipboardy": "^4.0.0", "consola": "^3.2.3", - "defu": "^6.1.2", - "get-port-please": "^3.1.1", - "h3": "^1.8.1", + "crossws": "^0.1.0", + "defu": "^6.1.4", + "get-port-please": "^3.1.2", + "h3": "^1.10.1", "http-shutdown": "^1.2.2", - "jiti": "^1.20.0", - "mlly": "^1.4.2", + "jiti": "^1.21.0", + "mlly": "^1.5.0", "node-forge": "^1.3.1", - "pathe": "^1.1.1", - "std-env": "^3.4.3", - "ufo": "^1.3.0", - "untun": "^0.1.2", + "pathe": "^1.1.2", + "std-env": "^3.7.0", + "ufo": "^1.3.2", + "untun": "^0.1.3", "uqr": "^0.1.2" }, "bin": { @@ -15143,24 +15284,60 @@ "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==", "dev": true }, + "node_modules/netlify-cli/node_modules/lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==", + "dev": true + }, "node_modules/netlify-cli/node_modules/lodash.isarguments": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", "integrity": "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==", "dev": true }, + "node_modules/netlify-cli/node_modules/lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==", + "dev": true + }, "node_modules/netlify-cli/node_modules/lodash.isempty": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.isempty/-/lodash.isempty-4.4.0.tgz", "integrity": "sha1-b4bL7di+TsmHvpqvM8loTbGzHn4=", "dev": true }, + "node_modules/netlify-cli/node_modules/lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==", + "dev": true + }, + "node_modules/netlify-cli/node_modules/lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==", + "dev": true + }, "node_modules/netlify-cli/node_modules/lodash.isplainobject": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=", "dev": true }, + "node_modules/netlify-cli/node_modules/lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", + "dev": true + }, + "node_modules/netlify-cli/node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", + "dev": true + }, "node_modules/netlify-cli/node_modules/lodash.transform": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.transform/-/lodash.transform-4.6.0.tgz", @@ -15770,15 +15947,15 @@ "dev": true }, "node_modules/netlify-cli/node_modules/mlly": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.4.2.tgz", - "integrity": "sha512-i/Ykufi2t1EZ6NaPLdfnZk2AX8cs0d+mTzVKuPfqPKPatxLApaBoxJQ9x1/uckXtrS/U5oisPMDkNs0yQTaBRg==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.5.0.tgz", + "integrity": "sha512-NPVQvAY1xr1QoVeG0cy8yUYC7FQcOx6evl/RjT1wL5FvzPnzOysoqB/jmx/DhssT2dYa8nxECLAaFI/+gVLhDQ==", "dev": true, "dependencies": { - "acorn": "^8.10.0", - "pathe": "^1.1.1", + "acorn": "^8.11.3", + "pathe": "^1.1.2", "pkg-types": "^1.0.3", - "ufo": "^1.3.0" + "ufo": "^1.3.2" } }, "node_modules/netlify-cli/node_modules/module-definition": { @@ -15894,9 +16071,9 @@ "optional": true }, "node_modules/netlify-cli/node_modules/nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", "dev": true, "funding": [ { @@ -15955,12 +16132,12 @@ "dev": true }, "node_modules/netlify-cli/node_modules/netlify": { - "version": "13.1.12", - "resolved": "https://registry.npmjs.org/netlify/-/netlify-13.1.12.tgz", - "integrity": "sha512-SNS/ANjR+DE71MTi4ke0ejYEvM6uY676NPluueUhvW9mZCR4tLwb2vahqzIKML5WQ1Dx+xRtOJYVAnUkJag/6w==", + "version": "13.1.14", + "resolved": "https://registry.npmjs.org/netlify/-/netlify-13.1.14.tgz", + "integrity": "sha512-7vSq6so7lPjr3HEpjbtLyde0F3IXOzD0ocJs3s2wnJR+nX+8pWOAVGe+KN6S98odsClJBJxCkWG2rLjTBzW9pw==", "dev": true, "dependencies": { - "@netlify/open-api": "^2.26.0", + "@netlify/open-api": "^2.28.0", "lodash-es": "^4.17.21", "micro-api-client": "^3.3.0", "node-fetch": "^3.0.0", @@ -15973,17 +16150,17 @@ } }, "node_modules/netlify-cli/node_modules/netlify-headers-parser": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/netlify-headers-parser/-/netlify-headers-parser-7.1.3.tgz", - "integrity": "sha512-0iR1iWbknBLv6T7zzmMR2AtfO7G/0lMajRyAX3SXhc3U3MqpXsElXinWZteMWM7KeGb7PePQgEalEkk2T6kXSw==", + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/netlify-headers-parser/-/netlify-headers-parser-7.1.4.tgz", + "integrity": "sha512-fTVQf8u65vS4YTP2Qt1K6Np01q3yecRKXf6VMONMlWbfl5n3M/on7pZlZISNAXHNOtnVt+6Kpwfl+RIeALC8Kg==", "dev": true, "dependencies": { + "@iarna/toml": "^2.2.5", "escape-string-regexp": "^5.0.0", "fast-safe-stringify": "^2.0.7", "is-plain-obj": "^4.0.0", "map-obj": "^5.0.0", - "path-exists": "^5.0.0", - "toml": "^3.0.0" + "path-exists": "^5.0.0" }, "engines": { "node": "^14.16.0 || >=16.0.0" @@ -16023,16 +16200,16 @@ } }, "node_modules/netlify-cli/node_modules/netlify-redirect-parser": { - "version": "14.2.1", - "resolved": "https://registry.npmjs.org/netlify-redirect-parser/-/netlify-redirect-parser-14.2.1.tgz", - "integrity": "sha512-poQgLGh+YATMHatzf/1TaWcbKQIBhszebhJV7btc6Ysw4xmnUedaE8nCscfdDH2PygT6Y+IHZkyMU4gvTFffVA==", + "version": "14.2.2", + "resolved": "https://registry.npmjs.org/netlify-redirect-parser/-/netlify-redirect-parser-14.2.2.tgz", + "integrity": "sha512-LS3cbHZfATtfZFeJr8RLBREAjCE1rEG1CybKnA6dTLgXez0lGJE/QTPzjn6GqfNmiMowo15YQe4+UjRhbzQ04w==", "dev": true, "dependencies": { + "@iarna/toml": "^2.2.5", "fast-safe-stringify": "^2.1.1", "filter-obj": "^5.0.0", "is-plain-obj": "^4.0.0", - "path-exists": "^5.0.0", - "toml": "^3.0.0" + "path-exists": "^5.0.0" }, "engines": { "node": "^14.16.0 || >=16.0.0" @@ -16111,10 +16288,13 @@ } }, "node_modules/netlify-cli/node_modules/node-addon-api": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.0.0.tgz", - "integrity": "sha512-vgbBJTS4m5/KkE16t5Ly0WW9hz46swAstv0hYYwMtbG7AznRhNyfLRe8HZAiWIpcHzoO7HxhLuBQj9rJ/Ho0ZA==", - "dev": true + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.0.tgz", + "integrity": "sha512-mNcltoe1R8o7STTegSOHdnJNN7s5EUvhoS7ShnTHDyOSd+8H+UdWODq6qSv67PjC8Zc5JRT8+oLAMCr0SIXw7g==", + "dev": true, + "engines": { + "node": "^16 || ^18 || >= 20" + } }, "node_modules/netlify-cli/node_modules/node-domexception": { "version": "1.0.0", @@ -16156,9 +16336,9 @@ } }, "node_modules/netlify-cli/node_modules/node-fetch-native": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.4.1.tgz", - "integrity": "sha512-NsXBU0UgBxo2rQLOeWNZqS3fvflWePMECr8CoSWoSTqCqGbVVsvl9vZu1HfQicYN0g5piV9Gh8RTEvo/uP752w==", + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.2.tgz", + "integrity": "sha512-69mtXOFZ6hSkYiXAVB5SqaRvrbITC/NPyqv7yuu/qw0nmgPyYbIMYYNIDhNtwPrzk0ptrimrLz/hhjvm4w5Z+w==", "dev": true }, "node_modules/netlify-cli/node_modules/node-forge": { @@ -16440,6 +16620,12 @@ "ufo": "^1.3.0" } }, + "node_modules/netlify-cli/node_modules/ohash": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/ohash/-/ohash-1.1.3.tgz", + "integrity": "sha512-zuHHiGTYTA1sYJ/wZN+t5HKZaH23i4yI1HMwbuXm24Nid7Dv0KcuRlKoNKS9UNfAVSBlnGLcuQrnOKWOZoEGaw==", + "dev": true + }, "node_modules/netlify-cli/node_modules/omit.js": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/omit.js/-/omit.js-2.0.2.tgz", @@ -17091,9 +17277,9 @@ } }, "node_modules/netlify-cli/node_modules/pathe": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.1.tgz", - "integrity": "sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", "dev": true }, "node_modules/netlify-cli/node_modules/peek-readable": { @@ -17154,9 +17340,9 @@ } }, "node_modules/netlify-cli/node_modules/postcss": { - "version": "8.4.31", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", - "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "version": "8.4.33", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.33.tgz", + "integrity": "sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg==", "dev": true, "funding": [ { @@ -17173,7 +17359,7 @@ } ], "dependencies": { - "nanoid": "^3.3.6", + "nanoid": "^3.3.7", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" }, @@ -17598,6 +17784,107 @@ "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", "dev": true }, + "node_modules/netlify-cli/node_modules/read-package-up": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/read-package-up/-/read-package-up-11.0.0.tgz", + "integrity": "sha512-MbgfoNPANMdb4oRBNg5eqLbB2t2r+o5Ua1pNt8BqGp4I0FJZhuVSOj3PaBPni4azWuSzEdNn2evevzVmEk1ohQ==", + "dev": true, + "dependencies": { + "find-up-simple": "^1.0.0", + "read-pkg": "^9.0.0", + "type-fest": "^4.6.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/netlify-cli/node_modules/read-package-up/node_modules/hosted-git-info": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.1.tgz", + "integrity": "sha512-+K84LB1DYwMHoHSgaOY/Jfhw3ucPmSET5v98Ke/HdNSw4a0UktWzyW1mjhjpuxxTqOOsfWT/7iVshHmVZ4IpOA==", + "dev": true, + "dependencies": { + "lru-cache": "^10.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/netlify-cli/node_modules/read-package-up/node_modules/lru-cache": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", + "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", + "dev": true, + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/netlify-cli/node_modules/read-package-up/node_modules/normalize-package-data": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.0.tgz", + "integrity": "sha512-UL7ELRVxYBHBgYEtZCXjxuD5vPxnmvMGq0jp/dGPKKrN7tfsBh2IY7TlJ15WWwdjRWD3RJbnsygUurTK3xkPkg==", + "dev": true, + "dependencies": { + "hosted-git-info": "^7.0.0", + "is-core-module": "^2.8.1", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/netlify-cli/node_modules/read-package-up/node_modules/parse-json": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-8.1.0.tgz", + "integrity": "sha512-rum1bPifK5SSar35Z6EKZuYPJx85pkNaFrxBK3mwdfSJ1/WKbYrjoW/zTPSjRRamfmVX1ACBIdFAO0VRErW/EA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.13", + "index-to-position": "^0.1.2", + "type-fest": "^4.7.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/netlify-cli/node_modules/read-package-up/node_modules/read-pkg": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-9.0.1.tgz", + "integrity": "sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA==", + "dev": true, + "dependencies": { + "@types/normalize-package-data": "^2.4.3", + "normalize-package-data": "^6.0.0", + "parse-json": "^8.0.0", + "type-fest": "^4.6.0", + "unicorn-magic": "^0.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/netlify-cli/node_modules/read-package-up/node_modules/type-fest": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.12.0.tgz", + "integrity": "sha512-5Y2/pp2wtJk8o08G0CMkuFPCO354FGwk/vbidxrdhRGZfd0tFnb4Qb8anp9XxXriwBgVPjdWbKpGl4J9lJY2jQ==", + "dev": true, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/netlify-cli/node_modules/read-pkg-up": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-9.1.0.tgz", @@ -17769,15 +18056,6 @@ "ret": "~0.1.10" } }, - "node_modules/netlify-cli/node_modules/regexp-tree": { - "version": "0.1.24", - "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.24.tgz", - "integrity": "sha512-s2aEVuLhvnVJW6s/iPgEGK6R+/xngd2jNQ+xy4bXNDKxZKJH6jpPHY6kVeVv1IeLCHgswRj+Kl3ELaDjG6V1iw==", - "dev": true, - "bin": { - "regexp-tree": "bin/regexp-tree" - } - }, "node_modules/netlify-cli/node_modules/registry-auth-token": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.0.2.tgz", @@ -18799,9 +19077,9 @@ } }, "node_modules/netlify-cli/node_modules/std-env": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.4.3.tgz", - "integrity": "sha512-f9aPhy8fYBuMN+sNfakZV18U39PbalgjXG3lLB9WkaYTxijru61wb57V9wxxNthXM5Sd88ETBWi29qLAsHO52Q==", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.7.0.tgz", + "integrity": "sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==", "dev": true }, "node_modules/netlify-cli/node_modules/stdin-discarder": { @@ -19036,15 +19314,16 @@ } }, "node_modules/netlify-cli/node_modules/svgo": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.0.2.tgz", - "integrity": "sha512-Z706C1U2pb1+JGP48fbazf3KxHrWOsLme6Rv7imFBn5EnuanDW1GPaA/P1/dvObE670JDePC3mnj0k0B7P0jjQ==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.2.0.tgz", + "integrity": "sha512-4PP6CMW/V7l/GmKRKzsLR8xxjdHTV4IMvhTnpuHwwBazSIlw5W/5SmPjN8Dwyt7lKbSJrRDgp4t9ph0HgChFBQ==", "dev": true, "dependencies": { "@trysound/sax": "0.2.0", "commander": "^7.2.0", "css-select": "^5.1.0", - "css-tree": "^2.2.1", + "css-tree": "^2.3.1", + "css-what": "^6.1.0", "csso": "^5.0.5", "picocolors": "^1.0.0" }, @@ -19068,6 +19347,18 @@ "node": ">= 10" } }, + "node_modules/netlify-cli/node_modules/system-architecture": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/system-architecture/-/system-architecture-0.1.0.tgz", + "integrity": "sha512-ulAk51I9UVUyJgxlv9M6lFot2WP3e7t8Kz9+IS6D4rVba1tR9kON+Ey69f+1R4Q8cd45Lod6a4IcJIxnzGc/zA==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/netlify-cli/node_modules/tabtab": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/tabtab/-/tabtab-3.0.2.tgz", @@ -19573,18 +19864,6 @@ "node": "*" } }, - "node_modules/netlify-cli/node_modules/type-fest": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", - "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==", - "dev": true, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/netlify-cli/node_modules/type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", @@ -19621,9 +19900,9 @@ } }, "node_modules/netlify-cli/node_modules/ufo": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.3.1.tgz", - "integrity": "sha512-uY/99gMLIOlJPwATcMVYfqDSxUR9//AUcgZMzwfSTJPDKzA1S8mX4VLqa+fiAtveraQUBCz4FFcwVZBGbwBXIw==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.4.0.tgz", + "integrity": "sha512-Hhy+BhRBleFjpJ2vchUNN40qgkh0366FWJGqVLYBHev0vpHTrXSA0ryT+74UiW6KWsldNurQMKGqCm1M2zBciQ==", "dev": true }, "node_modules/netlify-cli/node_modules/uid-safe": { @@ -19670,15 +19949,15 @@ "dev": true }, "node_modules/netlify-cli/node_modules/unenv": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/unenv/-/unenv-1.7.4.tgz", - "integrity": "sha512-fjYsXYi30It0YCQYqLOcT6fHfMXsBr2hw9XC7ycf8rTG7Xxpe3ZssiqUnD0khrjiZEmkBXWLwm42yCSCH46fMw==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/unenv/-/unenv-1.9.0.tgz", + "integrity": "sha512-QKnFNznRxmbOF1hDgzpqrlIf6NC5sbZ2OJ+5Wl3OX8uM+LUJXbj4TXvLJCtwbPTmbMHCLIz6JLKNinNsMShK9g==", "dev": true, "dependencies": { "consola": "^3.2.3", - "defu": "^6.1.2", + "defu": "^6.1.3", "mime": "^3.0.0", - "node-fetch-native": "^1.4.0", + "node-fetch-native": "^1.6.1", "pathe": "^1.1.1" } }, @@ -19694,6 +19973,18 @@ "node": ">=10.0.0" } }, + "node_modules/netlify-cli/node_modules/unicorn-magic": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", + "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/netlify-cli/node_modules/union-value": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", @@ -19835,82 +20126,6 @@ "node": ">=0.10.0" } }, - "node_modules/netlify-cli/node_modules/unstorage": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/unstorage/-/unstorage-1.9.0.tgz", - "integrity": "sha512-VpD8ZEYc/le8DZCrny3bnqKE4ZjioQxBRnWE+j5sGNvziPjeDlaS1NaFFHzl/kkXaO3r7UaF8MGQrs14+1B4pQ==", - "dev": true, - "dependencies": { - "anymatch": "^3.1.3", - "chokidar": "^3.5.3", - "destr": "^2.0.1", - "h3": "^1.7.1", - "ioredis": "^5.3.2", - "listhen": "^1.2.2", - "lru-cache": "^10.0.0", - "mri": "^1.2.0", - "node-fetch-native": "^1.2.0", - "ofetch": "^1.1.1", - "ufo": "^1.2.0" - }, - "peerDependencies": { - "@azure/app-configuration": "^1.4.1", - "@azure/cosmos": "^3.17.3", - "@azure/data-tables": "^13.2.2", - "@azure/identity": "^3.2.3", - "@azure/keyvault-secrets": "^4.7.0", - "@azure/storage-blob": "^12.14.0", - "@capacitor/preferences": "^5.0.0", - "@planetscale/database": "^1.8.0", - "@upstash/redis": "^1.22.0", - "@vercel/kv": "^0.2.2", - "idb-keyval": "^6.2.1" - }, - "peerDependenciesMeta": { - "@azure/app-configuration": { - "optional": true - }, - "@azure/cosmos": { - "optional": true - }, - "@azure/data-tables": { - "optional": true - }, - "@azure/identity": { - "optional": true - }, - "@azure/keyvault-secrets": { - "optional": true - }, - "@azure/storage-blob": { - "optional": true - }, - "@capacitor/preferences": { - "optional": true - }, - "@planetscale/database": { - "optional": true - }, - "@upstash/redis": { - "optional": true - }, - "@vercel/kv": { - "optional": true - }, - "idb-keyval": { - "optional": true - } - } - }, - "node_modules/netlify-cli/node_modules/unstorage/node_modules/lru-cache": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.1.tgz", - "integrity": "sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==", - "dev": true, - "engines": { - "node": "14 || >=16.14" - } - }, "node_modules/netlify-cli/node_modules/untildify": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/untildify/-/untildify-3.0.3.tgz", @@ -19921,12 +20136,12 @@ } }, "node_modules/netlify-cli/node_modules/untun": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/untun/-/untun-0.1.2.tgz", - "integrity": "sha512-wLAMWvxfqyTiBODA1lg3IXHQtjggYLeTK7RnSfqtOXixWJ3bAa2kK/HHmOOg19upteqO3muLvN6O/icbyQY33Q==", + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/untun/-/untun-0.1.3.tgz", + "integrity": "sha512-4luGP9LMYszMRZwsvyUd9MrxgEGZdZuZgpVQHEEX0lCYFESasVRvZd0EYpCkOIbJKHMuv0LskpXc/8Un+MJzEQ==", "dev": true, "dependencies": { - "citty": "^0.1.3", + "citty": "^0.1.5", "consola": "^3.2.3", "pathe": "^1.1.1" }, @@ -20741,7 +20956,7 @@ "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dev": true, "dependencies": { "wrappy": "1" @@ -20799,15 +21014,6 @@ "node": ">=8" } }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/path-key": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", @@ -20844,6 +21050,12 @@ "node": "*" } }, + "node_modules/perfect-debounce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz", + "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==", + "dev": true + }, "node_modules/picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", @@ -20884,9 +21096,9 @@ } }, "node_modules/postcss": { - "version": "8.4.33", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.33.tgz", - "integrity": "sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg==", + "version": "8.4.38", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", + "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", "dev": true, "funding": [ { @@ -20905,34 +21117,16 @@ "dependencies": { "nanoid": "^3.3.7", "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" + "source-map-js": "^1.2.0" }, "engines": { "node": "^10 || ^12 || >=14" } }, - "node_modules/postcss/node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, "node_modules/preact": { - "version": "10.19.3", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.19.3.tgz", - "integrity": "sha512-nHHTeFVBTHRGxJXKkKu5hT8C/YWBkPso4/Gad6xuj5dbptt9iF9NZr9pHbPhBrnT2klheu7mHTxTZ/LjwJiEiQ==", + "version": "10.20.1", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.20.1.tgz", + "integrity": "sha512-JIFjgFg9B2qnOoGiYMVBtrcFxHqn+dNXbq76bVmcaHYJFYR4lW67AOcXgAYQQTDYXDOg/kTZrKPNCdRgJ2UJmw==", "dev": true, "funding": { "type": "opencollective", @@ -21000,6 +21194,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/rfdc": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.1.tgz", + "integrity": "sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==", + "dev": true + }, "node_modules/robust-predicates": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.1.tgz", @@ -21007,9 +21207,9 @@ "dev": true }, "node_modules/rollup": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.9.5.tgz", - "integrity": "sha512-E4vQW0H/mbNMw2yLSqJyjtkHY9dslf/p0zuT1xehNRqUTBOFMqEjguDvqhXr7N7r/4ttb2jr4T41d3dncmIgbQ==", + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.13.1.tgz", + "integrity": "sha512-hFi+fU132IvJ2ZuihN56dwgpltpmLZHZWsx27rMCTZ2sYwrqlgL5sECGy1eeV2lAihD8EzChBVVhsXci0wD4Tg==", "dev": true, "dependencies": { "@types/estree": "1.0.5" @@ -21022,19 +21222,20 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.9.5", - "@rollup/rollup-android-arm64": "4.9.5", - "@rollup/rollup-darwin-arm64": "4.9.5", - "@rollup/rollup-darwin-x64": "4.9.5", - "@rollup/rollup-linux-arm-gnueabihf": "4.9.5", - "@rollup/rollup-linux-arm64-gnu": "4.9.5", - "@rollup/rollup-linux-arm64-musl": "4.9.5", - "@rollup/rollup-linux-riscv64-gnu": "4.9.5", - "@rollup/rollup-linux-x64-gnu": "4.9.5", - "@rollup/rollup-linux-x64-musl": "4.9.5", - "@rollup/rollup-win32-arm64-msvc": "4.9.5", - "@rollup/rollup-win32-ia32-msvc": "4.9.5", - "@rollup/rollup-win32-x64-msvc": "4.9.5", + "@rollup/rollup-android-arm-eabi": "4.13.1", + "@rollup/rollup-android-arm64": "4.13.1", + "@rollup/rollup-darwin-arm64": "4.13.1", + "@rollup/rollup-darwin-x64": "4.13.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.13.1", + "@rollup/rollup-linux-arm64-gnu": "4.13.1", + "@rollup/rollup-linux-arm64-musl": "4.13.1", + "@rollup/rollup-linux-riscv64-gnu": "4.13.1", + "@rollup/rollup-linux-s390x-gnu": "4.13.1", + "@rollup/rollup-linux-x64-gnu": "4.13.1", + "@rollup/rollup-linux-x64-musl": "4.13.1", + "@rollup/rollup-win32-arm64-msvc": "4.13.1", + "@rollup/rollup-win32-ia32-msvc": "4.13.1", + "@rollup/rollup-win32-x64-msvc": "4.13.1", "fsevents": "~2.3.2" } }, @@ -21134,28 +21335,13 @@ "integrity": "sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==", "dev": true }, - "node_modules/shikiji": { - "version": "0.9.18", - "resolved": "https://registry.npmjs.org/shikiji/-/shikiji-0.9.18.tgz", - "integrity": "sha512-/tFMIdV7UQklzN13VjF0/XFzmii6C606Jc878hNezvB8ZR8FG8FW9j0I4J9EJre0owlnPntgLVPpHqy27Gs+DQ==", - "dev": true, - "dependencies": { - "shikiji-core": "0.9.18" - } - }, - "node_modules/shikiji-core": { - "version": "0.9.18", - "resolved": "https://registry.npmjs.org/shikiji-core/-/shikiji-core-0.9.18.tgz", - "integrity": "sha512-PKTXptbrp/WEDjNHV8OFG9KkfhmR0pSd161kzlDDlgQ0HXAnqJYNDSjqsy1CYZMx5bSvLMy42yJj9oFTqmkNTQ==", - "dev": true - }, - "node_modules/shikiji-transformers": { - "version": "0.9.18", - "resolved": "https://registry.npmjs.org/shikiji-transformers/-/shikiji-transformers-0.9.18.tgz", - "integrity": "sha512-lvKVfgx1ETDqUNxqiUn+whlnjQiunsAg76DOpzjjxkHE/bLcwa+jrghcMxQhui86SLR1tzCdM4Imh+RxW0LI2Q==", + "node_modules/shiki": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.2.1.tgz", + "integrity": "sha512-u+XW6o0vCkUNlneZb914dLO+AayEIwK5tI62WeS//R5HIXBFiYaj/Hc5xcq27Yh83Grr4JbNtUBV8W6zyK4hWg==", "dev": true, "dependencies": { - "shikiji": "0.9.18" + "@shikijs/core": "1.2.1" } }, "node_modules/side-channel": { @@ -21173,9 +21359,9 @@ } }, "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", "dev": true, "engines": { "node": ">=0.10.0" @@ -21213,6 +21399,15 @@ "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==", "dev": true }, + "node_modules/speakingurl": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/speakingurl/-/speakingurl-14.0.1.tgz", + "integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -21442,14 +21637,14 @@ } }, "node_modules/vite": { - "version": "5.0.11", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.0.11.tgz", - "integrity": "sha512-XBMnDjZcNAw/G1gEiskiM1v6yzM4GE5aMGvhWTlHAYYhxb7S3/V1s3m2LDHa8Vh6yIWYYB0iJwsEaS523c4oYA==", + "version": "5.2.6", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.6.tgz", + "integrity": "sha512-FPtnxFlSIKYjZ2eosBQamz4CbyrTizbZ3hnGJlh/wMtCrlp1Hah6AzBLjGI5I2urTfNnpovpHdrL6YRuBOPnCA==", "dev": true, "dependencies": { - "esbuild": "^0.19.3", - "postcss": "^8.4.32", - "rollup": "^4.2.0" + "esbuild": "^0.20.1", + "postcss": "^8.4.36", + "rollup": "^4.13.0" }, "bin": { "vite": "bin/vite.js" @@ -21497,33 +21692,33 @@ } }, "node_modules/vitepress": { - "version": "1.0.0-rc.36", - "resolved": "https://registry.npmjs.org/vitepress/-/vitepress-1.0.0-rc.36.tgz", - "integrity": "sha512-2z4dpM9PplN/yvTifhavOIAazlCR6OJ5PvLoRbc+7LdcFeIlCsuDGENLX4HjMW18jQZF5/j7++PNqdBfeazxUA==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/vitepress/-/vitepress-1.0.2.tgz", + "integrity": "sha512-bEj9yTEdWyewJFOhEREZF+mXuAgOq27etuJZT6DZSp+J3XpQstXMJc5piSVwhZBtuj8OfA0iXy+jdP1c71KMYQ==", "dev": true, "dependencies": { - "@docsearch/css": "^3.5.2", - "@docsearch/js": "^3.5.2", + "@docsearch/css": "^3.6.0", + "@docsearch/js": "^3.6.0", + "@shikijs/core": "^1.2.0", + "@shikijs/transformers": "^1.2.0", "@types/markdown-it": "^13.0.7", - "@vitejs/plugin-vue": "^5.0.2", - "@vue/devtools-api": "^6.5.1", - "@vueuse/core": "^10.7.1", - "@vueuse/integrations": "^10.7.1", + "@vitejs/plugin-vue": "^5.0.4", + "@vue/devtools-api": "^7.0.16", + "@vueuse/core": "^10.9.0", + "@vueuse/integrations": "^10.9.0", "focus-trap": "^7.5.4", "mark.js": "8.11.1", "minisearch": "^6.3.0", - "shikiji": "^0.9.17", - "shikiji-core": "^0.9.17", - "shikiji-transformers": "^0.9.17", - "vite": "^5.0.11", - "vue": "^3.4.5" + "shiki": "^1.2.0", + "vite": "^5.2.2", + "vue": "^3.4.21" }, "bin": { "vitepress": "bin/vitepress.js" }, "peerDependencies": { - "markdown-it-mathjax3": "^4.3.2", - "postcss": "^8.4.33" + "markdown-it-mathjax3": "^4", + "postcss": "^8" }, "peerDependenciesMeta": { "markdown-it-mathjax3": { @@ -21548,16 +21743,16 @@ } }, "node_modules/vue": { - "version": "3.4.10", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.10.tgz", - "integrity": "sha512-c+O8qGqdWPF9joTCzMGeDDedViooh6c8RY3+eW5+6GCAIY8YjChmU06LsUu0PnMZbIk1oKUoJTqKzmghYtFypw==", + "version": "3.4.21", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.21.tgz", + "integrity": "sha512-5hjyV/jLEIKD/jYl4cavMcnzKwjMKohureP8ejn3hhEjwhWIhWeuzL2kJAjzl/WyVsgPY56Sy4Z40C3lVshxXA==", "dev": true, "dependencies": { - "@vue/compiler-dom": "3.4.10", - "@vue/compiler-sfc": "3.4.10", - "@vue/runtime-dom": "3.4.10", - "@vue/server-renderer": "3.4.10", - "@vue/shared": "3.4.10" + "@vue/compiler-dom": "3.4.21", + "@vue/compiler-sfc": "3.4.21", + "@vue/runtime-dom": "3.4.21", + "@vue/server-renderer": "3.4.21", + "@vue/shared": "3.4.21" }, "peerDependencies": { "typescript": "*" @@ -21616,7 +21811,7 @@ "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "dev": true }, "node_modules/y18n": { @@ -21720,138 +21915,157 @@ "requires": {} }, "@algolia/cache-browser-local-storage": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.22.1.tgz", - "integrity": "sha512-Sw6IAmOCvvP6QNgY9j+Hv09mvkvEIDKjYW8ow0UDDAxSXy664RBNQk3i/0nt7gvceOJ6jGmOTimaZoY1THmU7g==", + "version": "4.23.2", + "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.23.2.tgz", + "integrity": "sha512-PvRQdCmtiU22dw9ZcTJkrVKgNBVAxKgD0/cfiqyxhA5+PHzA2WDt6jOmZ9QASkeM2BpyzClJb/Wr1yt2/t78Kw==", "dev": true, "requires": { - "@algolia/cache-common": "4.22.1" + "@algolia/cache-common": "4.23.2" } }, "@algolia/cache-common": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.22.1.tgz", - "integrity": "sha512-TJMBKqZNKYB9TptRRjSUtevJeQVXRmg6rk9qgFKWvOy8jhCPdyNZV1nB3SKGufzvTVbomAukFR8guu/8NRKBTA==", + "version": "4.23.2", + "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.23.2.tgz", + "integrity": "sha512-OUK/6mqr6CQWxzl/QY0/mwhlGvS6fMtvEPyn/7AHUx96NjqDA4X4+Ju7aXFQKh+m3jW9VPB0B9xvEQgyAnRPNw==", "dev": true }, "@algolia/cache-in-memory": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.22.1.tgz", - "integrity": "sha512-ve+6Ac2LhwpufuWavM/aHjLoNz/Z/sYSgNIXsinGofWOysPilQZPUetqLj8vbvi+DHZZaYSEP9H5SRVXnpsNNw==", + "version": "4.23.2", + "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.23.2.tgz", + "integrity": "sha512-rfbi/SnhEa3MmlqQvgYz/9NNJ156NkU6xFxjbxBtLWnHbpj+qnlMoKd+amoiacHRITpajg6zYbLM9dnaD3Bczw==", "dev": true, "requires": { - "@algolia/cache-common": "4.22.1" + "@algolia/cache-common": "4.23.2" } }, "@algolia/client-account": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.22.1.tgz", - "integrity": "sha512-k8m+oegM2zlns/TwZyi4YgCtyToackkOpE+xCaKCYfBfDtdGOaVZCM5YvGPtK+HGaJMIN/DoTL8asbM3NzHonw==", + "version": "4.23.2", + "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.23.2.tgz", + "integrity": "sha512-VbrOCLIN/5I7iIdskSoSw3uOUPF516k4SjDD4Qz3BFwa3of7D9A0lzBMAvQEJJEPHWdVraBJlGgdJq/ttmquJQ==", "dev": true, "requires": { - "@algolia/client-common": "4.22.1", - "@algolia/client-search": "4.22.1", - "@algolia/transporter": "4.22.1" + "@algolia/client-common": "4.23.2", + "@algolia/client-search": "4.23.2", + "@algolia/transporter": "4.23.2" } }, "@algolia/client-analytics": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.22.1.tgz", - "integrity": "sha512-1ssi9pyxyQNN4a7Ji9R50nSdISIumMFDwKNuwZipB6TkauJ8J7ha/uO60sPJFqQyqvvI+px7RSNRQT3Zrvzieg==", + "version": "4.23.2", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.23.2.tgz", + "integrity": "sha512-lLj7irsAztGhMoEx/SwKd1cwLY6Daf1Q5f2AOsZacpppSvuFvuBrmkzT7pap1OD/OePjLKxicJS8wNA0+zKtuw==", "dev": true, "requires": { - "@algolia/client-common": "4.22.1", - "@algolia/client-search": "4.22.1", - "@algolia/requester-common": "4.22.1", - "@algolia/transporter": "4.22.1" + "@algolia/client-common": "4.23.2", + "@algolia/client-search": "4.23.2", + "@algolia/requester-common": "4.23.2", + "@algolia/transporter": "4.23.2" } }, "@algolia/client-common": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.22.1.tgz", - "integrity": "sha512-IvaL5v9mZtm4k4QHbBGDmU3wa/mKokmqNBqPj0K7lcR8ZDKzUorhcGp/u8PkPC/e0zoHSTvRh7TRkGX3Lm7iOQ==", + "version": "4.23.2", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.23.2.tgz", + "integrity": "sha512-Q2K1FRJBern8kIfZ0EqPvUr3V29ICxCm/q42zInV+VJRjldAD9oTsMGwqUQ26GFMdFYmqkEfCbY4VGAiQhh22g==", "dev": true, "requires": { - "@algolia/requester-common": "4.22.1", - "@algolia/transporter": "4.22.1" + "@algolia/requester-common": "4.23.2", + "@algolia/transporter": "4.23.2" } }, "@algolia/client-personalization": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.22.1.tgz", - "integrity": "sha512-sl+/klQJ93+4yaqZ7ezOttMQ/nczly/3GmgZXJ1xmoewP5jmdP/X/nV5U7EHHH3hCUEHeN7X1nsIhGPVt9E1cQ==", + "version": "4.23.2", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.23.2.tgz", + "integrity": "sha512-vwPsgnCGhUcHhhQG5IM27z8q7dWrN9itjdvgA6uKf2e9r7vB+WXt4OocK0CeoYQt3OGEAExryzsB8DWqdMK5wg==", "dev": true, "requires": { - "@algolia/client-common": "4.22.1", - "@algolia/requester-common": "4.22.1", - "@algolia/transporter": "4.22.1" + "@algolia/client-common": "4.23.2", + "@algolia/requester-common": "4.23.2", + "@algolia/transporter": "4.23.2" } }, "@algolia/client-search": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.22.1.tgz", - "integrity": "sha512-yb05NA4tNaOgx3+rOxAmFztgMTtGBi97X7PC3jyNeGiwkAjOZc2QrdZBYyIdcDLoI09N0gjtpClcackoTN0gPA==", + "version": "4.23.2", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.23.2.tgz", + "integrity": "sha512-CxSB29OVGSE7l/iyoHvamMonzq7Ev8lnk/OkzleODZ1iBcCs3JC/XgTIKzN/4RSTrJ9QybsnlrN/bYCGufo7qw==", "dev": true, "requires": { - "@algolia/client-common": "4.22.1", - "@algolia/requester-common": "4.22.1", - "@algolia/transporter": "4.22.1" + "@algolia/client-common": "4.23.2", + "@algolia/requester-common": "4.23.2", + "@algolia/transporter": "4.23.2" } }, "@algolia/logger-common": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.22.1.tgz", - "integrity": "sha512-OnTFymd2odHSO39r4DSWRFETkBufnY2iGUZNrMXpIhF5cmFE8pGoINNPzwg02QLBlGSaLqdKy0bM8S0GyqPLBg==", + "version": "4.23.2", + "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.23.2.tgz", + "integrity": "sha512-jGM49Q7626cXZ7qRAWXn0jDlzvoA1FvN4rKTi1g0hxKsTTSReyYk0i1ADWjChDPl3Q+nSDhJuosM2bBUAay7xw==", "dev": true }, "@algolia/logger-console": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.22.1.tgz", - "integrity": "sha512-O99rcqpVPKN1RlpgD6H3khUWylU24OXlzkavUAMy6QZd1776QAcauE3oP8CmD43nbaTjBexZj2nGsBH9Tc0FVA==", + "version": "4.23.2", + "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.23.2.tgz", + "integrity": "sha512-oo+lnxxEmlhTBTFZ3fGz1O8PJ+G+8FiAoMY2Qo3Q4w23xocQev6KqDTA1JQAGPDxAewNA2VBwWOsVXeXFjrI/Q==", + "dev": true, + "requires": { + "@algolia/logger-common": "4.23.2" + } + }, + "@algolia/recommend": { + "version": "4.23.2", + "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-4.23.2.tgz", + "integrity": "sha512-Q75CjnzRCDzgIlgWfPnkLtrfF4t82JCirhalXkSSwe/c1GH5pWh4xUyDOR3KTMo+YxxX3zTlrL/FjHmUJEWEcg==", "dev": true, "requires": { - "@algolia/logger-common": "4.22.1" + "@algolia/cache-browser-local-storage": "4.23.2", + "@algolia/cache-common": "4.23.2", + "@algolia/cache-in-memory": "4.23.2", + "@algolia/client-common": "4.23.2", + "@algolia/client-search": "4.23.2", + "@algolia/logger-common": "4.23.2", + "@algolia/logger-console": "4.23.2", + "@algolia/requester-browser-xhr": "4.23.2", + "@algolia/requester-common": "4.23.2", + "@algolia/requester-node-http": "4.23.2", + "@algolia/transporter": "4.23.2" } }, "@algolia/requester-browser-xhr": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.22.1.tgz", - "integrity": "sha512-dtQGYIg6MteqT1Uay3J/0NDqD+UciHy3QgRbk7bNddOJu+p3hzjTRYESqEnoX/DpEkaNYdRHUKNylsqMpgwaEw==", + "version": "4.23.2", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.23.2.tgz", + "integrity": "sha512-TO9wLlp8+rvW9LnIfyHsu8mNAMYrqNdQ0oLF6eTWFxXfxG3k8F/Bh7nFYGk2rFAYty4Fw4XUtrv/YjeNDtM5og==", "dev": true, "requires": { - "@algolia/requester-common": "4.22.1" + "@algolia/requester-common": "4.23.2" } }, "@algolia/requester-common": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.22.1.tgz", - "integrity": "sha512-dgvhSAtg2MJnR+BxrIFqlLtkLlVVhas9HgYKMk2Uxiy5m6/8HZBL40JVAMb2LovoPFs9I/EWIoFVjOrFwzn5Qg==", + "version": "4.23.2", + "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.23.2.tgz", + "integrity": "sha512-3EfpBS0Hri0lGDB5H/BocLt7Vkop0bTTLVUBB844HH6tVycwShmsV6bDR7yXbQvFP1uNpgePRD3cdBCjeHmk6Q==", "dev": true }, "@algolia/requester-node-http": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.22.1.tgz", - "integrity": "sha512-JfmZ3MVFQkAU+zug8H3s8rZ6h0ahHZL/SpMaSasTCGYR5EEJsCc8SI5UZ6raPN2tjxa5bxS13BRpGSBUens7EA==", + "version": "4.23.2", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.23.2.tgz", + "integrity": "sha512-SVzgkZM/malo+2SB0NWDXpnT7nO5IZwuDTaaH6SjLeOHcya1o56LSWXk+3F3rNLz2GVH+I/rpYKiqmHhSOjerw==", "dev": true, "requires": { - "@algolia/requester-common": "4.22.1" + "@algolia/requester-common": "4.23.2" } }, "@algolia/transporter": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.22.1.tgz", - "integrity": "sha512-kzWgc2c9IdxMa3YqA6TN0NW5VrKYYW/BELIn7vnLyn+U/RFdZ4lxxt9/8yq3DKV5snvoDzzO4ClyejZRdV3lMQ==", + "version": "4.23.2", + "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.23.2.tgz", + "integrity": "sha512-GY3aGKBy+8AK4vZh8sfkatDciDVKad5rTY2S10Aefyjh7e7UGBP4zigf42qVXwU8VOPwi7l/L7OACGMOFcjB0Q==", "dev": true, "requires": { - "@algolia/cache-common": "4.22.1", - "@algolia/logger-common": "4.22.1", - "@algolia/requester-common": "4.22.1" + "@algolia/cache-common": "4.23.2", + "@algolia/logger-common": "4.23.2", + "@algolia/requester-common": "4.23.2" } }, "@babel/parser": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.6.tgz", - "integrity": "sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.1.tgz", + "integrity": "sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg==", "dev": true }, "@braintree/sanitize-url": { @@ -21861,191 +22075,191 @@ "dev": true }, "@docsearch/css": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.5.2.tgz", - "integrity": "sha512-SPiDHaWKQZpwR2siD0KQUwlStvIAnEyK6tAE2h2Wuoq8ue9skzhlyVQ1ddzOxX6khULnAALDiR/isSF3bnuciA==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.6.0.tgz", + "integrity": "sha512-+sbxb71sWre+PwDK7X2T8+bhS6clcVMLwBPznX45Qu6opJcgRjAp7gYSDzVFp187J+feSj5dNBN1mJoi6ckkUQ==", "dev": true }, "@docsearch/js": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docsearch/js/-/js-3.5.2.tgz", - "integrity": "sha512-p1YFTCDflk8ieHgFJYfmyHBki1D61+U9idwrLh+GQQMrBSP3DLGKpy0XUJtPjAOPltcVbqsTjiPFfH7JImjUNg==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@docsearch/js/-/js-3.6.0.tgz", + "integrity": "sha512-QujhqINEElrkIfKwyyyTfbsfMAYCkylInLYMRqHy7PHc8xTBQCow73tlo/Kc7oIwBrCLf0P3YhjlOeV4v8hevQ==", "dev": true, "requires": { - "@docsearch/react": "3.5.2", + "@docsearch/react": "3.6.0", "preact": "^10.0.0" } }, "@docsearch/react": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.5.2.tgz", - "integrity": "sha512-9Ahcrs5z2jq/DcAvYtvlqEBHImbm4YJI8M9y0x6Tqg598P40HTEkX7hsMcIuThI+hTFxRGZ9hll0Wygm2yEjng==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.6.0.tgz", + "integrity": "sha512-HUFut4ztcVNmqy9gp/wxNbC7pTOHhgVVkHVGCACTuLhUKUhKAF9KYHJtMiLUJxEqiFLQiuri1fWF8zqwM/cu1w==", "dev": true, "requires": { "@algolia/autocomplete-core": "1.9.3", "@algolia/autocomplete-preset-algolia": "1.9.3", - "@docsearch/css": "3.5.2", + "@docsearch/css": "3.6.0", "algoliasearch": "^4.19.1" } }, "@esbuild/aix-ppc64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.11.tgz", - "integrity": "sha512-FnzU0LyE3ySQk7UntJO4+qIiQgI7KoODnZg5xzXIrFJlKd2P2gwHsHY4927xj9y5PJmJSzULiUCWmv7iWnNa7g==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz", + "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==", "dev": true, "optional": true }, "@esbuild/android-arm": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.11.tgz", - "integrity": "sha512-5OVapq0ClabvKvQ58Bws8+wkLCV+Rxg7tUVbo9xu034Nm536QTII4YzhaFriQ7rMrorfnFKUsArD2lqKbFY4vw==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz", + "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==", "dev": true, "optional": true }, "@esbuild/android-arm64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.11.tgz", - "integrity": "sha512-aiu7K/5JnLj//KOnOfEZ0D90obUkRzDMyqd/wNAUQ34m4YUPVhRZpnqKV9uqDGxT7cToSDnIHsGooyIczu9T+Q==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz", + "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==", "dev": true, "optional": true }, "@esbuild/android-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.11.tgz", - "integrity": "sha512-eccxjlfGw43WYoY9QgB82SgGgDbibcqyDTlk3l3C0jOVHKxrjdc9CTwDUQd0vkvYg5um0OH+GpxYvp39r+IPOg==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz", + "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==", "dev": true, "optional": true }, "@esbuild/darwin-arm64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.11.tgz", - "integrity": "sha512-ETp87DRWuSt9KdDVkqSoKoLFHYTrkyz2+65fj9nfXsaV3bMhTCjtQfw3y+um88vGRKRiF7erPrh/ZuIdLUIVxQ==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz", + "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==", "dev": true, "optional": true }, "@esbuild/darwin-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.11.tgz", - "integrity": "sha512-fkFUiS6IUK9WYUO/+22omwetaSNl5/A8giXvQlcinLIjVkxwTLSktbF5f/kJMftM2MJp9+fXqZ5ezS7+SALp4g==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz", + "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==", "dev": true, "optional": true }, "@esbuild/freebsd-arm64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.11.tgz", - "integrity": "sha512-lhoSp5K6bxKRNdXUtHoNc5HhbXVCS8V0iZmDvyWvYq9S5WSfTIHU2UGjcGt7UeS6iEYp9eeymIl5mJBn0yiuxA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz", + "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==", "dev": true, "optional": true }, "@esbuild/freebsd-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.11.tgz", - "integrity": "sha512-JkUqn44AffGXitVI6/AbQdoYAq0TEullFdqcMY/PCUZ36xJ9ZJRtQabzMA+Vi7r78+25ZIBosLTOKnUXBSi1Kw==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz", + "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==", "dev": true, "optional": true }, "@esbuild/linux-arm": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.11.tgz", - "integrity": "sha512-3CRkr9+vCV2XJbjwgzjPtO8T0SZUmRZla+UL1jw+XqHZPkPgZiyWvbDvl9rqAN8Zl7qJF0O/9ycMtjU67HN9/Q==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz", + "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==", "dev": true, "optional": true }, "@esbuild/linux-arm64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.11.tgz", - "integrity": "sha512-LneLg3ypEeveBSMuoa0kwMpCGmpu8XQUh+mL8XXwoYZ6Be2qBnVtcDI5azSvh7vioMDhoJFZzp9GWp9IWpYoUg==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz", + "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==", "dev": true, "optional": true }, "@esbuild/linux-ia32": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.11.tgz", - "integrity": "sha512-caHy++CsD8Bgq2V5CodbJjFPEiDPq8JJmBdeyZ8GWVQMjRD0sU548nNdwPNvKjVpamYYVL40AORekgfIubwHoA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz", + "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==", "dev": true, "optional": true }, "@esbuild/linux-loong64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.11.tgz", - "integrity": "sha512-ppZSSLVpPrwHccvC6nQVZaSHlFsvCQyjnvirnVjbKSHuE5N24Yl8F3UwYUUR1UEPaFObGD2tSvVKbvR+uT1Nrg==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz", + "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==", "dev": true, "optional": true }, "@esbuild/linux-mips64el": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.11.tgz", - "integrity": "sha512-B5x9j0OgjG+v1dF2DkH34lr+7Gmv0kzX6/V0afF41FkPMMqaQ77pH7CrhWeR22aEeHKaeZVtZ6yFwlxOKPVFyg==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz", + "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==", "dev": true, "optional": true }, "@esbuild/linux-ppc64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.11.tgz", - "integrity": "sha512-MHrZYLeCG8vXblMetWyttkdVRjQlQUb/oMgBNurVEnhj4YWOr4G5lmBfZjHYQHHN0g6yDmCAQRR8MUHldvvRDA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz", + "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==", "dev": true, "optional": true }, "@esbuild/linux-riscv64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.11.tgz", - "integrity": "sha512-f3DY++t94uVg141dozDu4CCUkYW+09rWtaWfnb3bqe4w5NqmZd6nPVBm+qbz7WaHZCoqXqHz5p6CM6qv3qnSSQ==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz", + "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==", "dev": true, "optional": true }, "@esbuild/linux-s390x": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.11.tgz", - "integrity": "sha512-A5xdUoyWJHMMlcSMcPGVLzYzpcY8QP1RtYzX5/bS4dvjBGVxdhuiYyFwp7z74ocV7WDc0n1harxmpq2ePOjI0Q==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz", + "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==", "dev": true, "optional": true }, "@esbuild/linux-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.11.tgz", - "integrity": "sha512-grbyMlVCvJSfxFQUndw5mCtWs5LO1gUlwP4CDi4iJBbVpZcqLVT29FxgGuBJGSzyOxotFG4LoO5X+M1350zmPA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz", + "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==", "dev": true, "optional": true }, "@esbuild/netbsd-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.11.tgz", - "integrity": "sha512-13jvrQZJc3P230OhU8xgwUnDeuC/9egsjTkXN49b3GcS5BKvJqZn86aGM8W9pd14Kd+u7HuFBMVtrNGhh6fHEQ==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz", + "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==", "dev": true, "optional": true }, "@esbuild/openbsd-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.11.tgz", - "integrity": "sha512-ysyOGZuTp6SNKPE11INDUeFVVQFrhcNDVUgSQVDzqsqX38DjhPEPATpid04LCoUr2WXhQTEZ8ct/EgJCUDpyNw==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz", + "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==", "dev": true, "optional": true }, "@esbuild/sunos-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.11.tgz", - "integrity": "sha512-Hf+Sad9nVwvtxy4DXCZQqLpgmRTQqyFyhT3bZ4F2XlJCjxGmRFF0Shwn9rzhOYRB61w9VMXUkxlBy56dk9JJiQ==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz", + "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==", "dev": true, "optional": true }, "@esbuild/win32-arm64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.11.tgz", - "integrity": "sha512-0P58Sbi0LctOMOQbpEOvOL44Ne0sqbS0XWHMvvrg6NE5jQ1xguCSSw9jQeUk2lfrXYsKDdOe6K+oZiwKPilYPQ==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz", + "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==", "dev": true, "optional": true }, "@esbuild/win32-ia32": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.11.tgz", - "integrity": "sha512-6YOrWS+sDJDmshdBIQU+Uoyh7pQKrdykdefC1avn76ss5c+RN6gut3LZA4E2cH5xUEp5/cA0+YxRaVtRAb0xBg==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz", + "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==", "dev": true, "optional": true }, "@esbuild/win32-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.11.tgz", - "integrity": "sha512-vfkhltrjCAb603XaFhqhAF4LGDi2M4OrCRrFusyQ+iTLQ/o60QQXxc9cZC/FFpihBI9N1Grn6SMKVJ4KP7Fuiw==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz", + "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==", "dev": true, "optional": true }, @@ -22071,96 +22285,118 @@ } }, "@rollup/rollup-android-arm-eabi": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.9.5.tgz", - "integrity": "sha512-idWaG8xeSRCfRq9KpRysDHJ/rEHBEXcHuJ82XY0yYFIWnLMjZv9vF/7DOq8djQ2n3Lk6+3qfSH8AqlmHlmi1MA==", + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.13.1.tgz", + "integrity": "sha512-4C4UERETjXpC4WpBXDbkgNVgHyWfG3B/NKY46e7w5H134UDOFqUJKpsLm0UYmuupW+aJmRgeScrDNfvZ5WV80A==", "dev": true, "optional": true }, "@rollup/rollup-android-arm64": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.9.5.tgz", - "integrity": "sha512-f14d7uhAMtsCGjAYwZGv6TwuS3IFaM4ZnGMUn3aCBgkcHAYErhV1Ad97WzBvS2o0aaDv4mVz+syiN0ElMyfBPg==", + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.13.1.tgz", + "integrity": "sha512-TrTaFJ9pXgfXEiJKQ3yQRelpQFqgRzVR9it8DbeRzG0RX7mKUy0bqhCFsgevwXLJepQKTnLl95TnPGf9T9AMOA==", "dev": true, "optional": true }, "@rollup/rollup-darwin-arm64": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.9.5.tgz", - "integrity": "sha512-ndoXeLx455FffL68OIUrVr89Xu1WLzAG4n65R8roDlCoYiQcGGg6MALvs2Ap9zs7AHg8mpHtMpwC8jBBjZrT/w==", + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.13.1.tgz", + "integrity": "sha512-fz7jN6ahTI3cKzDO2otQuybts5cyu0feymg0bjvYCBrZQ8tSgE8pc0sSNEuGvifrQJWiwx9F05BowihmLxeQKw==", "dev": true, "optional": true }, "@rollup/rollup-darwin-x64": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.9.5.tgz", - "integrity": "sha512-UmElV1OY2m/1KEEqTlIjieKfVwRg0Zwg4PLgNf0s3glAHXBN99KLpw5A5lrSYCa1Kp63czTpVll2MAqbZYIHoA==", + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.13.1.tgz", + "integrity": "sha512-WTvdz7SLMlJpektdrnWRUN9C0N2qNHwNbWpNo0a3Tod3gb9leX+yrYdCeB7VV36OtoyiPAivl7/xZ3G1z5h20g==", "dev": true, "optional": true }, "@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.9.5.tgz", - "integrity": "sha512-Q0LcU61v92tQB6ae+udZvOyZ0wfpGojtAKrrpAaIqmJ7+psq4cMIhT/9lfV6UQIpeItnq/2QDROhNLo00lOD1g==", + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.13.1.tgz", + "integrity": "sha512-dBHQl+7wZzBYcIF6o4k2XkAfwP2ks1mYW2q/Gzv9n39uDcDiAGDqEyml08OdY0BIct0yLSPkDTqn4i6czpBLLw==", "dev": true, "optional": true }, "@rollup/rollup-linux-arm64-gnu": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.9.5.tgz", - "integrity": "sha512-dkRscpM+RrR2Ee3eOQmRWFjmV/payHEOrjyq1VZegRUa5OrZJ2MAxBNs05bZuY0YCtpqETDy1Ix4i/hRqX98cA==", + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.13.1.tgz", + "integrity": "sha512-bur4JOxvYxfrAmocRJIW0SADs3QdEYK6TQ7dTNz6Z4/lySeu3Z1H/+tl0a4qDYv0bCdBpUYM0sYa/X+9ZqgfSQ==", "dev": true, "optional": true }, "@rollup/rollup-linux-arm64-musl": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.9.5.tgz", - "integrity": "sha512-QaKFVOzzST2xzY4MAmiDmURagWLFh+zZtttuEnuNn19AiZ0T3fhPyjPPGwLNdiDT82ZE91hnfJsUiDwF9DClIQ==", + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.13.1.tgz", + "integrity": "sha512-ssp77SjcDIUSoUyj7DU7/5iwM4ZEluY+N8umtCT9nBRs3u045t0KkW02LTyHouHDomnMXaXSZcCSr2bdMK63kA==", "dev": true, "optional": true }, "@rollup/rollup-linux-riscv64-gnu": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.9.5.tgz", - "integrity": "sha512-HeGqmRJuyVg6/X6MpE2ur7GbymBPS8Np0S/vQFHDmocfORT+Zt76qu+69NUoxXzGqVP1pzaY6QIi0FJWLC3OPA==", + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.13.1.tgz", + "integrity": "sha512-Jv1DkIvwEPAb+v25/Unrnnq9BO3F5cbFPT821n3S5litkz+O5NuXuNhqtPx5KtcwOTtaqkTsO+IVzJOsxd11aQ==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-s390x-gnu": { + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.13.1.tgz", + "integrity": "sha512-U564BrhEfaNChdATQaEODtquCC7Ez+8Hxz1h5MAdMYj0AqD0GA9rHCpElajb/sQcaFL6NXmHc5O+7FXpWMa73Q==", "dev": true, "optional": true }, "@rollup/rollup-linux-x64-gnu": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.9.5.tgz", - "integrity": "sha512-Dq1bqBdLaZ1Gb/l2e5/+o3B18+8TI9ANlA1SkejZqDgdU/jK/ThYaMPMJpVMMXy2uRHvGKbkz9vheVGdq3cJfA==", + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.13.1.tgz", + "integrity": "sha512-zGRDulLTeDemR8DFYyFIQ8kMP02xpUsX4IBikc7lwL9PrwR3gWmX2NopqiGlI2ZVWMl15qZeUjumTwpv18N7sQ==", "dev": true, "optional": true }, "@rollup/rollup-linux-x64-musl": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.9.5.tgz", - "integrity": "sha512-ezyFUOwldYpj7AbkwyW9AJ203peub81CaAIVvckdkyH8EvhEIoKzaMFJj0G4qYJ5sw3BpqhFrsCc30t54HV8vg==", + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.13.1.tgz", + "integrity": "sha512-VTk/MveyPdMFkYJJPCkYBw07KcTkGU2hLEyqYMsU4NjiOfzoaDTW9PWGRsNwiOA3qI0k/JQPjkl/4FCK1smskQ==", "dev": true, "optional": true }, "@rollup/rollup-win32-arm64-msvc": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.9.5.tgz", - "integrity": "sha512-aHSsMnUw+0UETB0Hlv7B/ZHOGY5bQdwMKJSzGfDfvyhnpmVxLMGnQPGNE9wgqkLUs3+gbG1Qx02S2LLfJ5GaRQ==", + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.13.1.tgz", + "integrity": "sha512-L+hX8Dtibb02r/OYCsp4sQQIi3ldZkFI0EUkMTDwRfFykXBPptoz/tuuGqEd3bThBSLRWPR6wsixDSgOx/U3Zw==", "dev": true, "optional": true }, "@rollup/rollup-win32-ia32-msvc": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.9.5.tgz", - "integrity": "sha512-AiqiLkb9KSf7Lj/o1U3SEP9Zn+5NuVKgFdRIZkvd4N0+bYrTOovVd0+LmYCPQGbocT4kvFyK+LXCDiXPBF3fyA==", + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.13.1.tgz", + "integrity": "sha512-+dI2jVPfM5A8zme8riEoNC7UKk0Lzc7jCj/U89cQIrOjrZTCWZl/+IXUeRT2rEZ5j25lnSA9G9H1Ob9azaF/KQ==", "dev": true, "optional": true }, "@rollup/rollup-win32-x64-msvc": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.9.5.tgz", - "integrity": "sha512-1q+mykKE3Vot1kaFJIDoUFv5TuW+QQVaf2FmTT9krg86pQrGStOSJJ0Zil7CFagyxDuouTepzt5Y5TVzyajOdQ==", + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.13.1.tgz", + "integrity": "sha512-YY1Exxo2viZ/O2dMHuwQvimJ0SqvL+OAWQLLY6rvXavgQKjhQUzn7nc1Dd29gjB5Fqi00nrBWctJBOyfVMIVxw==", "dev": true, "optional": true }, + "@shikijs/core": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.2.1.tgz", + "integrity": "sha512-KaIS0H4EQ3KI2d++TjYqRNgwp8E3M/68e9veR4QtInzA7kKFgcjeiJqb80fuXW+blDy5fmd11PN9g9soz/3ANQ==", + "dev": true + }, + "@shikijs/transformers": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@shikijs/transformers/-/transformers-1.2.1.tgz", + "integrity": "sha512-H7cVtrdv6BW2kx83t2IQgP5ri1IA50mE3QnzgJ0AvOKCGtCEieXu0JIP3245cgjNLrL+LBwb8DtTXdky1iQL9Q==", + "dev": true, + "requires": { + "shiki": "1.2.1" + } + }, "@types/d3-scale": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.8.tgz", @@ -22247,199 +22483,225 @@ "dev": true }, "@vitejs/plugin-vue": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.0.3.tgz", - "integrity": "sha512-b8S5dVS40rgHdDrw+DQi/xOM9ed+kSRZzfm1T74bMmBDCd8XO87NKlFYInzCtwvtWwXZvo1QxE2OSspTATWrbA==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.0.4.tgz", + "integrity": "sha512-WS3hevEszI6CEVEx28F8RjTX97k3KsrcY6kvTg7+Whm5y3oYvcqzVeGCU3hxSAn4uY2CLCkeokkGKpoctccilQ==", "dev": true, "requires": {} }, "@vue/compiler-core": { - "version": "3.4.10", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.10.tgz", - "integrity": "sha512-53vxh7K9qbx+JILnGEhrFRyr7H7e4NdT8RuTNU3m6HhJKFvcAqFTNXpYMHnyuAzzRGdsbsYHBgQC3H6xEXTG6w==", + "version": "3.4.21", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.21.tgz", + "integrity": "sha512-MjXawxZf2SbZszLPYxaFCjxfibYrzr3eYbKxwpLR9EQN+oaziSu3qKVbwBERj1IFIB8OLUewxB5m/BFzi613og==", "dev": true, "requires": { - "@babel/parser": "^7.23.6", - "@vue/shared": "3.4.10", + "@babel/parser": "^7.23.9", + "@vue/shared": "3.4.21", "entities": "^4.5.0", "estree-walker": "^2.0.2", "source-map-js": "^1.0.2" } }, "@vue/compiler-dom": { - "version": "3.4.10", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.10.tgz", - "integrity": "sha512-QAALBJksIFpXGYuo74rtMgnwpVZDvd3kYbUa4gYX9s/5QiqEvZSgbKtOdUGydXcxKPt3ifC+0/bhPVHXN2694A==", + "version": "3.4.21", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.21.tgz", + "integrity": "sha512-IZC6FKowtT1sl0CR5DpXSiEB5ayw75oT2bma1BEhV7RRR1+cfwLrxc2Z8Zq/RGFzJ8w5r9QtCOvTjQgdn0IKmA==", "dev": true, "requires": { - "@vue/compiler-core": "3.4.10", - "@vue/shared": "3.4.10" + "@vue/compiler-core": "3.4.21", + "@vue/shared": "3.4.21" } }, "@vue/compiler-sfc": { - "version": "3.4.10", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.10.tgz", - "integrity": "sha512-sTOssaQySgrMjrhZxmAqdp6n+E51VteIVIDaOR537H2P63DyzMmig21U0XXFxiXmMIfrK91lAInnc+bIAYemGw==", + "version": "3.4.21", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.21.tgz", + "integrity": "sha512-me7epoTxYlY+2CUM7hy9PCDdpMPfIwrOvAXud2Upk10g4YLv9UBW7kL798TvMeDhPthkZ0CONNrK2GoeI1ODiQ==", "dev": true, "requires": { - "@babel/parser": "^7.23.6", - "@vue/compiler-core": "3.4.10", - "@vue/compiler-dom": "3.4.10", - "@vue/compiler-ssr": "3.4.10", - "@vue/shared": "3.4.10", + "@babel/parser": "^7.23.9", + "@vue/compiler-core": "3.4.21", + "@vue/compiler-dom": "3.4.21", + "@vue/compiler-ssr": "3.4.21", + "@vue/shared": "3.4.21", "estree-walker": "^2.0.2", - "magic-string": "^0.30.5", - "postcss": "^8.4.32", + "magic-string": "^0.30.7", + "postcss": "^8.4.35", "source-map-js": "^1.0.2" } }, "@vue/compiler-ssr": { - "version": "3.4.10", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.10.tgz", - "integrity": "sha512-Y90TL1abretWbUiK5rv+9smS1thCHE5sSuhZgiLh6cxgZ2Pcy3BEvDd3reID0iwNcTdMbTeE6NI3Aq4Mux6hqQ==", + "version": "3.4.21", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.21.tgz", + "integrity": "sha512-M5+9nI2lPpAsgXOGQobnIueVqc9sisBFexh5yMIMRAPYLa7+5wEJs8iqOZc1WAa9WQbx9GR2twgznU8LTIiZ4Q==", "dev": true, "requires": { - "@vue/compiler-dom": "3.4.10", - "@vue/shared": "3.4.10" + "@vue/compiler-dom": "3.4.21", + "@vue/shared": "3.4.21" } }, "@vue/devtools-api": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.5.1.tgz", - "integrity": "sha512-+KpckaAQyfbvshdDW5xQylLni1asvNSGme1JFs8I1+/H5pHEhqUKMEQD/qn3Nx5+/nycBq11qAEi8lk+LXI2dA==", - "dev": true + "version": "7.0.25", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-7.0.25.tgz", + "integrity": "sha512-fL6DlRp4MSXCLYcqYvKU7QhQZWE3Hfu7X8pC25BS74coJi7uJeSWs4tmrITcwFihNmC9S5GPiffkMdckkeWjzg==", + "dev": true, + "requires": { + "@vue/devtools-kit": "^7.0.25" + } + }, + "@vue/devtools-kit": { + "version": "7.0.25", + "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-7.0.25.tgz", + "integrity": "sha512-wbLkSnOTsKHPb1mB9koFHUoSAF8Dp6Ii/ocR2+DeXFY4oKqIjCeJb/4Lihk4rgqEhCy1WwxLfTgNDo83VvDYkQ==", + "dev": true, + "requires": { + "@vue/devtools-shared": "^7.0.25", + "hookable": "^5.5.3", + "mitt": "^3.0.1", + "perfect-debounce": "^1.0.0", + "speakingurl": "^14.0.1" + } + }, + "@vue/devtools-shared": { + "version": "7.0.25", + "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-7.0.25.tgz", + "integrity": "sha512-5+XYhcHSXuJSguYnNwL6/e6VTmXwCfryWQOkffh9ZU2zMByybqqqBrMWqvBkqTmMFCjPdzulo66xXbVbwLaElQ==", + "dev": true, + "requires": { + "rfdc": "^1.3.1" + } }, "@vue/reactivity": { - "version": "3.4.10", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.10.tgz", - "integrity": "sha512-SmGGpo37LzPcAFTopHNIJRNVOQfma9YgyPkAzx9/TJ01lbCCYigS28hEcY1hjiJ1PRK8iVX62Ov5yzmUgYH/pQ==", + "version": "3.4.21", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.21.tgz", + "integrity": "sha512-UhenImdc0L0/4ahGCyEzc/pZNwVgcglGy9HVzJ1Bq2Mm9qXOpP8RyNTjookw/gOCUlXSEtuZ2fUg5nrHcoqJcw==", "dev": true, "requires": { - "@vue/shared": "3.4.10" + "@vue/shared": "3.4.21" } }, "@vue/runtime-core": { - "version": "3.4.10", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.10.tgz", - "integrity": "sha512-Ri2Cz9sFr66AEUewGUK8IXhIUAhshTHVUGuJR8pqMbtjIds+zPa8QPO5UZImGMQ8HTY7eEpKwztCct9V3+Iqug==", + "version": "3.4.21", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.21.tgz", + "integrity": "sha512-pQthsuYzE1XcGZznTKn73G0s14eCJcjaLvp3/DKeYWoFacD9glJoqlNBxt3W2c5S40t6CCcpPf+jG01N3ULyrA==", "dev": true, "requires": { - "@vue/reactivity": "3.4.10", - "@vue/shared": "3.4.10" + "@vue/reactivity": "3.4.21", + "@vue/shared": "3.4.21" } }, "@vue/runtime-dom": { - "version": "3.4.10", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.10.tgz", - "integrity": "sha512-ROsdi5M2niRDmjXJNZ8KKiGwXyG1FO8l9n6sCN0kaJEHbjWkuigu96YAI3fK/AWUZPSXXEcMEBVPC6rL3mmUuA==", + "version": "3.4.21", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.21.tgz", + "integrity": "sha512-gvf+C9cFpevsQxbkRBS1NpU8CqxKw0ebqMvLwcGQrNpx6gqRDodqKqA+A2VZZpQ9RpK2f9yfg8VbW/EpdFUOJw==", "dev": true, "requires": { - "@vue/runtime-core": "3.4.10", - "@vue/shared": "3.4.10", + "@vue/runtime-core": "3.4.21", + "@vue/shared": "3.4.21", "csstype": "^3.1.3" } }, "@vue/server-renderer": { - "version": "3.4.10", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.10.tgz", - "integrity": "sha512-WpCBAhesLq44JKWfdFqb+Bi4ACUW0d8x1z90GnE0spccsAlEDMXV5nm+pwXLyW0OdP2iPrO/n/QMJh4B1v9Ciw==", + "version": "3.4.21", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.21.tgz", + "integrity": "sha512-aV1gXyKSN6Rz+6kZ6kr5+Ll14YzmIbeuWe7ryJl5muJ4uwSwY/aStXTixx76TwkZFJLm1aAlA/HSWEJ4EyiMkg==", "dev": true, "requires": { - "@vue/compiler-ssr": "3.4.10", - "@vue/shared": "3.4.10" + "@vue/compiler-ssr": "3.4.21", + "@vue/shared": "3.4.21" } }, "@vue/shared": { - "version": "3.4.10", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.10.tgz", - "integrity": "sha512-C0mIVhwW1xQLMFyqMJxnhq6fWyE02lCgcE+TDdtGpg6B3H6kh/0YcqS54qYc76UJNlWegf3VgsLqgk6D9hBmzQ==", + "version": "3.4.21", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.21.tgz", + "integrity": "sha512-PuJe7vDIi6VYSinuEbUIQgMIRZGgM8e4R+G+/dQTk0X1NEdvgvvgv7m+rfmDH1gZzyA1OjjoWskvHlfRNfQf3g==", "dev": true }, "@vueuse/core": { - "version": "10.7.1", - "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-10.7.1.tgz", - "integrity": "sha512-74mWHlaesJSWGp1ihg76vAnfVq9NTv1YT0SYhAQ6zwFNdBkkP+CKKJmVOEHcdSnLXCXYiL5e7MaewblfiYLP7g==", + "version": "10.9.0", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-10.9.0.tgz", + "integrity": "sha512-/1vjTol8SXnx6xewDEKfS0Ra//ncg4Hb0DaZiwKf7drgfMsKFExQ+FnnENcN6efPen+1kIzhLQoGSy0eDUVOMg==", "dev": true, "requires": { "@types/web-bluetooth": "^0.0.20", - "@vueuse/metadata": "10.7.1", - "@vueuse/shared": "10.7.1", - "vue-demi": ">=0.14.6" + "@vueuse/metadata": "10.9.0", + "@vueuse/shared": "10.9.0", + "vue-demi": ">=0.14.7" }, "dependencies": { "vue-demi": { - "version": "0.14.6", - "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.6.tgz", - "integrity": "sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==", + "version": "0.14.7", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.7.tgz", + "integrity": "sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==", "dev": true, "requires": {} } } }, "@vueuse/integrations": { - "version": "10.7.1", - "resolved": "https://registry.npmjs.org/@vueuse/integrations/-/integrations-10.7.1.tgz", - "integrity": "sha512-cKo5LEeKVHdBRBtMTOrDPdR0YNtrmN9IBfdcnY2P3m5LHVrsD0xiHUtAH1WKjHQRIErZG6rJUa6GA4tWZt89Og==", + "version": "10.9.0", + "resolved": "https://registry.npmjs.org/@vueuse/integrations/-/integrations-10.9.0.tgz", + "integrity": "sha512-acK+A01AYdWSvL4BZmCoJAcyHJ6EqhmkQEXbQLwev1MY7NBnS+hcEMx/BzVoR9zKI+UqEPMD9u6PsyAuiTRT4Q==", "dev": true, "requires": { - "@vueuse/core": "10.7.1", - "@vueuse/shared": "10.7.1", - "vue-demi": ">=0.14.6" + "@vueuse/core": "10.9.0", + "@vueuse/shared": "10.9.0", + "vue-demi": ">=0.14.7" }, "dependencies": { "vue-demi": { - "version": "0.14.6", - "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.6.tgz", - "integrity": "sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==", + "version": "0.14.7", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.7.tgz", + "integrity": "sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==", "dev": true, "requires": {} } } }, "@vueuse/metadata": { - "version": "10.7.1", - "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-10.7.1.tgz", - "integrity": "sha512-jX8MbX5UX067DYVsbtrmKn6eG6KMcXxLRLlurGkZku5ZYT3vxgBjui2zajvUZ18QLIjrgBkFRsu7CqTAg18QFw==", + "version": "10.9.0", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-10.9.0.tgz", + "integrity": "sha512-iddNbg3yZM0X7qFY2sAotomgdHK7YJ6sKUvQqbvwnf7TmaVPxS4EJydcNsVejNdS8iWCtDk+fYXr7E32nyTnGA==", "dev": true }, "@vueuse/shared": { - "version": "10.7.1", - "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-10.7.1.tgz", - "integrity": "sha512-v0jbRR31LSgRY/C5i5X279A/WQjD6/JsMzGa+eqt658oJ75IvQXAeONmwvEMrvJQKnRElq/frzBR7fhmWY5uLw==", + "version": "10.9.0", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-10.9.0.tgz", + "integrity": "sha512-Uud2IWncmAfJvRaFYzv5OHDli+FbOzxiVEQdLCKQKLyhz94PIyFC3CHcH7EDMwIn8NPtD06+PNbC/PiO0LGLtw==", "dev": true, "requires": { - "vue-demi": ">=0.14.6" + "vue-demi": ">=0.14.7" }, "dependencies": { "vue-demi": { - "version": "0.14.6", - "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.6.tgz", - "integrity": "sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==", + "version": "0.14.7", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.7.tgz", + "integrity": "sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==", "dev": true, "requires": {} } } }, "algoliasearch": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.22.1.tgz", - "integrity": "sha512-jwydKFQJKIx9kIZ8Jm44SdpigFwRGPESaxZBaHSV0XWN2yBJAOT4mT7ppvlrpA4UGzz92pqFnVKr/kaZXrcreg==", + "version": "4.23.2", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.23.2.tgz", + "integrity": "sha512-8aCl055IsokLuPU8BzLjwzXjb7ty9TPcUFFOk0pYOwsE5DMVhE3kwCMFtsCFKcnoPZK7oObm+H5mbnSO/9ioxQ==", "dev": true, "requires": { - "@algolia/cache-browser-local-storage": "4.22.1", - "@algolia/cache-common": "4.22.1", - "@algolia/cache-in-memory": "4.22.1", - "@algolia/client-account": "4.22.1", - "@algolia/client-analytics": "4.22.1", - "@algolia/client-common": "4.22.1", - "@algolia/client-personalization": "4.22.1", - "@algolia/client-search": "4.22.1", - "@algolia/logger-common": "4.22.1", - "@algolia/logger-console": "4.22.1", - "@algolia/requester-browser-xhr": "4.22.1", - "@algolia/requester-common": "4.22.1", - "@algolia/requester-node-http": "4.22.1", - "@algolia/transporter": "4.22.1" + "@algolia/cache-browser-local-storage": "4.23.2", + "@algolia/cache-common": "4.23.2", + "@algolia/cache-in-memory": "4.23.2", + "@algolia/client-account": "4.23.2", + "@algolia/client-analytics": "4.23.2", + "@algolia/client-common": "4.23.2", + "@algolia/client-personalization": "4.23.2", + "@algolia/client-search": "4.23.2", + "@algolia/logger-common": "4.23.2", + "@algolia/logger-console": "4.23.2", + "@algolia/recommend": "4.23.2", + "@algolia/requester-browser-xhr": "4.23.2", + "@algolia/requester-common": "4.23.2", + "@algolia/requester-node-http": "4.23.2", + "@algolia/transporter": "4.23.2" } }, "ansi-colors": { @@ -23223,34 +23485,34 @@ } }, "esbuild": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.11.tgz", - "integrity": "sha512-HJ96Hev2hX/6i5cDVwcqiJBBtuo9+FeIJOtZ9W1kA5M6AMJRHUZlpYZ1/SbEwtO0ioNAW8rUooVpC/WehY2SfA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz", + "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==", "dev": true, "requires": { - "@esbuild/aix-ppc64": "0.19.11", - "@esbuild/android-arm": "0.19.11", - "@esbuild/android-arm64": "0.19.11", - "@esbuild/android-x64": "0.19.11", - "@esbuild/darwin-arm64": "0.19.11", - "@esbuild/darwin-x64": "0.19.11", - "@esbuild/freebsd-arm64": "0.19.11", - "@esbuild/freebsd-x64": "0.19.11", - "@esbuild/linux-arm": "0.19.11", - "@esbuild/linux-arm64": "0.19.11", - "@esbuild/linux-ia32": "0.19.11", - "@esbuild/linux-loong64": "0.19.11", - "@esbuild/linux-mips64el": "0.19.11", - "@esbuild/linux-ppc64": "0.19.11", - "@esbuild/linux-riscv64": "0.19.11", - "@esbuild/linux-s390x": "0.19.11", - "@esbuild/linux-x64": "0.19.11", - "@esbuild/netbsd-x64": "0.19.11", - "@esbuild/openbsd-x64": "0.19.11", - "@esbuild/sunos-x64": "0.19.11", - "@esbuild/win32-arm64": "0.19.11", - "@esbuild/win32-ia32": "0.19.11", - "@esbuild/win32-x64": "0.19.11" + "@esbuild/aix-ppc64": "0.20.2", + "@esbuild/android-arm": "0.20.2", + "@esbuild/android-arm64": "0.20.2", + "@esbuild/android-x64": "0.20.2", + "@esbuild/darwin-arm64": "0.20.2", + "@esbuild/darwin-x64": "0.20.2", + "@esbuild/freebsd-arm64": "0.20.2", + "@esbuild/freebsd-x64": "0.20.2", + "@esbuild/linux-arm": "0.20.2", + "@esbuild/linux-arm64": "0.20.2", + "@esbuild/linux-ia32": "0.20.2", + "@esbuild/linux-loong64": "0.20.2", + "@esbuild/linux-mips64el": "0.20.2", + "@esbuild/linux-ppc64": "0.20.2", + "@esbuild/linux-riscv64": "0.20.2", + "@esbuild/linux-s390x": "0.20.2", + "@esbuild/linux-x64": "0.20.2", + "@esbuild/netbsd-x64": "0.20.2", + "@esbuild/openbsd-x64": "0.20.2", + "@esbuild/sunos-x64": "0.20.2", + "@esbuild/win32-arm64": "0.20.2", + "@esbuild/win32-ia32": "0.20.2", + "@esbuild/win32-x64": "0.20.2" } }, "escalade": { @@ -23308,7 +23570,7 @@ "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "dev": true }, "fsevents": { @@ -23358,17 +23620,36 @@ } }, "glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "dependencies": { + "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, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } } }, "glob-parent": { @@ -23434,6 +23715,12 @@ "integrity": "sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==", "dev": true }, + "hookable": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz", + "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==", + "dev": true + }, "hosted-git-info": { "version": "2.8.9", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", @@ -23452,7 +23739,7 @@ "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "dev": true, "requires": { "once": "^1.3.0", @@ -23729,9 +24016,9 @@ } }, "magic-string": { - "version": "0.30.5", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.5.tgz", - "integrity": "sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==", + "version": "0.30.8", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.8.tgz", + "integrity": "sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==", "dev": true, "requires": { "@jridgewell/sourcemap-codec": "^1.4.15" @@ -24053,10 +24340,16 @@ "integrity": "sha512-ihFnidEeU8iXzcVHy74dhkxh/dn8Dc08ERl0xwoMMGqp4+LvRSCgicb+zGqWthVokQKvCSxITlh3P08OzdTYCQ==", "dev": true }, + "mitt": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", + "dev": true + }, "mocha": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", - "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.4.0.tgz", + "integrity": "sha512-eqhGB8JKapEYcC4ytX/xrzKforgEc3j1pGlAXVy3eRwrtAy5/nIfT1SvgGzfN0XZZxeLq0aQWkOUAmqIJiv+bA==", "dev": true, "requires": { "ansi-colors": "4.1.1", @@ -24066,13 +24359,12 @@ "diff": "5.0.0", "escape-string-regexp": "4.0.0", "find-up": "5.0.0", - "glob": "7.2.0", + "glob": "8.1.0", "he": "1.2.0", "js-yaml": "4.1.0", "log-symbols": "4.1.0", "minimatch": "5.0.1", "ms": "2.1.3", - "nanoid": "3.3.3", "serialize-javascript": "6.0.0", "strip-json-comments": "3.1.1", "supports-color": "8.1.1", @@ -24115,28 +24407,29 @@ "dev": true }, "nanoid": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", - "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", "dev": true }, "netlify-cli": { - "version": "17.13.1", - "resolved": "https://registry.npmjs.org/netlify-cli/-/netlify-cli-17.13.1.tgz", - "integrity": "sha512-Ql+KQ/ag7fSwu7oj9oQpD7Lso2s3TplytOjXcZkLi2YIXJ11cGXv/WOmq2ZXyMp10J0gPg4iBTYKWsVjAzKISA==", + "version": "17.21.1", + "resolved": "https://registry.npmjs.org/netlify-cli/-/netlify-cli-17.21.1.tgz", + "integrity": "sha512-B8QveV55h2dFCTnk5LInVW1MiXPINTQ61IkEtih15CVYpvVSQy+he8M6hdpucq83VqaF/phaJkb3Si2ligOxxw==", "dev": true, "requires": { "@bugsnag/js": "7.20.2", "@fastify/static": "6.10.2", - "@netlify/blobs": "6.3.1", - "@netlify/build": "29.31.5", - "@netlify/build-info": "7.11.4", - "@netlify/config": "20.10.1", - "@netlify/edge-bundler": "11.0.0", + "@netlify/blobs": "7.0.1", + "@netlify/build": "29.36.6", + "@netlify/build-info": "7.13.2", + "@netlify/config": "20.12.1", + "@netlify/edge-bundler": "11.3.0", "@netlify/local-functions-proxy": "1.1.1", - "@netlify/zip-it-and-ship-it": "9.28.2", + "@netlify/zip-it-and-ship-it": "9.30.0", "@octokit/rest": "19.0.13", - "ansi-escapes": "6.2.0", + "@opentelemetry/api": "~1.8.0", + "ansi-escapes": "6.2.1", "ansi-styles": "6.2.1", "ansi-to-html": "0.7.2", "ascii-table": "0.0.9", @@ -24163,7 +24456,7 @@ "envinfo": "7.8.1", "etag": "1.8.1", "execa": "5.1.1", - "express": "4.18.2", + "express": "4.19.1", "express-logging": "1.1.1", "extract-zip": "2.0.1", "fastest-levenshtein": "1.0.16", @@ -24184,13 +24477,13 @@ "https-proxy-agent": "5.0.1", "inquirer": "6.5.2", "inquirer-autocomplete-prompt": "1.4.0", - "ipx": "2.0.1", + "ipx": "2.1.0", "is-docker": "3.0.0", "is-stream": "3.0.0", "is-wsl": "2.2.0", "isexe": "2.0.0", "js-yaml": "4.1.0", - "jsonwebtoken": "9.0.1", + "jsonwebtoken": "9.0.2", "jwt-decode": "3.1.2", "lambda-local": "2.1.2", "listr2": "7.0.2", @@ -24199,9 +24492,9 @@ "log-symbols": "5.1.0", "log-update": "5.0.1", "multiparty": "4.2.3", - "netlify": "13.1.12", - "netlify-headers-parser": "7.1.3", - "netlify-redirect-parser": "14.2.1", + "netlify": "13.1.14", + "netlify-headers-parser": "7.1.4", + "netlify-redirect-parser": "14.2.2", "netlify-redirector": "0.5.0", "node-fetch": "2.6.12", "node-version-alias": "3.4.1", @@ -24216,7 +24509,7 @@ "prettyjson": "1.2.5", "pump": "3.0.0", "raw-body": "2.5.2", - "read-pkg-up": "9.1.0", + "read-package-up": "11.0.0", "semver": "7.5.4", "source-map-support": "0.5.21", "strip-ansi-control-characters": "2.0.0", @@ -24358,15 +24651,15 @@ } }, "@babel/parser": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", - "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.6.tgz", + "integrity": "sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==", "dev": true }, "@babel/types": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.5.tgz", - "integrity": "sha512-ON5kSOJwVO6xXVRTvOI0eOnWe7VdUcIpsovGo9U/Br4Ie4UVFQTboO2cYnDhAGU6Fp+UxSiT+pMft0SMHfuq6w==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.6.tgz", + "integrity": "sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==", "dev": true, "requires": { "@babel/helper-string-parser": "^7.23.4", @@ -24468,6 +24761,167 @@ "node-source-walk": "^6.0.0" } }, + "@esbuild/aix-ppc64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.11.tgz", + "integrity": "sha512-FnzU0LyE3ySQk7UntJO4+qIiQgI7KoODnZg5xzXIrFJlKd2P2gwHsHY4927xj9y5PJmJSzULiUCWmv7iWnNa7g==", + "dev": true, + "optional": true + }, + "@esbuild/android-arm": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.11.tgz", + "integrity": "sha512-5OVapq0ClabvKvQ58Bws8+wkLCV+Rxg7tUVbo9xu034Nm536QTII4YzhaFriQ7rMrorfnFKUsArD2lqKbFY4vw==", + "dev": true, + "optional": true + }, + "@esbuild/android-arm64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.11.tgz", + "integrity": "sha512-aiu7K/5JnLj//KOnOfEZ0D90obUkRzDMyqd/wNAUQ34m4YUPVhRZpnqKV9uqDGxT7cToSDnIHsGooyIczu9T+Q==", + "dev": true, + "optional": true + }, + "@esbuild/android-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.11.tgz", + "integrity": "sha512-eccxjlfGw43WYoY9QgB82SgGgDbibcqyDTlk3l3C0jOVHKxrjdc9CTwDUQd0vkvYg5um0OH+GpxYvp39r+IPOg==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-arm64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.11.tgz", + "integrity": "sha512-ETp87DRWuSt9KdDVkqSoKoLFHYTrkyz2+65fj9nfXsaV3bMhTCjtQfw3y+um88vGRKRiF7erPrh/ZuIdLUIVxQ==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.11.tgz", + "integrity": "sha512-fkFUiS6IUK9WYUO/+22omwetaSNl5/A8giXvQlcinLIjVkxwTLSktbF5f/kJMftM2MJp9+fXqZ5ezS7+SALp4g==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-arm64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.11.tgz", + "integrity": "sha512-lhoSp5K6bxKRNdXUtHoNc5HhbXVCS8V0iZmDvyWvYq9S5WSfTIHU2UGjcGt7UeS6iEYp9eeymIl5mJBn0yiuxA==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.11.tgz", + "integrity": "sha512-JkUqn44AffGXitVI6/AbQdoYAq0TEullFdqcMY/PCUZ36xJ9ZJRtQabzMA+Vi7r78+25ZIBosLTOKnUXBSi1Kw==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.11.tgz", + "integrity": "sha512-3CRkr9+vCV2XJbjwgzjPtO8T0SZUmRZla+UL1jw+XqHZPkPgZiyWvbDvl9rqAN8Zl7qJF0O/9ycMtjU67HN9/Q==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.11.tgz", + "integrity": "sha512-LneLg3ypEeveBSMuoa0kwMpCGmpu8XQUh+mL8XXwoYZ6Be2qBnVtcDI5azSvh7vioMDhoJFZzp9GWp9IWpYoUg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ia32": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.11.tgz", + "integrity": "sha512-caHy++CsD8Bgq2V5CodbJjFPEiDPq8JJmBdeyZ8GWVQMjRD0sU548nNdwPNvKjVpamYYVL40AORekgfIubwHoA==", + "dev": true, + "optional": true + }, + "@esbuild/linux-loong64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.11.tgz", + "integrity": "sha512-ppZSSLVpPrwHccvC6nQVZaSHlFsvCQyjnvirnVjbKSHuE5N24Yl8F3UwYUUR1UEPaFObGD2tSvVKbvR+uT1Nrg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-mips64el": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.11.tgz", + "integrity": "sha512-B5x9j0OgjG+v1dF2DkH34lr+7Gmv0kzX6/V0afF41FkPMMqaQ77pH7CrhWeR22aEeHKaeZVtZ6yFwlxOKPVFyg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ppc64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.11.tgz", + "integrity": "sha512-MHrZYLeCG8vXblMetWyttkdVRjQlQUb/oMgBNurVEnhj4YWOr4G5lmBfZjHYQHHN0g6yDmCAQRR8MUHldvvRDA==", + "dev": true, + "optional": true + }, + "@esbuild/linux-riscv64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.11.tgz", + "integrity": "sha512-f3DY++t94uVg141dozDu4CCUkYW+09rWtaWfnb3bqe4w5NqmZd6nPVBm+qbz7WaHZCoqXqHz5p6CM6qv3qnSSQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-s390x": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.11.tgz", + "integrity": "sha512-A5xdUoyWJHMMlcSMcPGVLzYzpcY8QP1RtYzX5/bS4dvjBGVxdhuiYyFwp7z74ocV7WDc0n1harxmpq2ePOjI0Q==", + "dev": true, + "optional": true + }, + "@esbuild/linux-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.11.tgz", + "integrity": "sha512-grbyMlVCvJSfxFQUndw5mCtWs5LO1gUlwP4CDi4iJBbVpZcqLVT29FxgGuBJGSzyOxotFG4LoO5X+M1350zmPA==", + "dev": true, + "optional": true + }, + "@esbuild/netbsd-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.11.tgz", + "integrity": "sha512-13jvrQZJc3P230OhU8xgwUnDeuC/9egsjTkXN49b3GcS5BKvJqZn86aGM8W9pd14Kd+u7HuFBMVtrNGhh6fHEQ==", + "dev": true, + "optional": true + }, + "@esbuild/openbsd-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.11.tgz", + "integrity": "sha512-ysyOGZuTp6SNKPE11INDUeFVVQFrhcNDVUgSQVDzqsqX38DjhPEPATpid04LCoUr2WXhQTEZ8ct/EgJCUDpyNw==", + "dev": true, + "optional": true + }, + "@esbuild/sunos-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.11.tgz", + "integrity": "sha512-Hf+Sad9nVwvtxy4DXCZQqLpgmRTQqyFyhT3bZ4F2XlJCjxGmRFF0Shwn9rzhOYRB61w9VMXUkxlBy56dk9JJiQ==", + "dev": true, + "optional": true + }, + "@esbuild/win32-arm64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.11.tgz", + "integrity": "sha512-0P58Sbi0LctOMOQbpEOvOL44Ne0sqbS0XWHMvvrg6NE5jQ1xguCSSw9jQeUk2lfrXYsKDdOe6K+oZiwKPilYPQ==", + "dev": true, + "optional": true + }, + "@esbuild/win32-ia32": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.11.tgz", + "integrity": "sha512-6YOrWS+sDJDmshdBIQU+Uoyh7pQKrdykdefC1avn76ss5c+RN6gut3LZA4E2cH5xUEp5/cA0+YxRaVtRAb0xBg==", + "dev": true, + "optional": true + }, + "@esbuild/win32-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.11.tgz", + "integrity": "sha512-vfkhltrjCAb603XaFhqhAF4LGDi2M4OrCRrFusyQ+iTLQ/o60QQXxc9cZC/FFpihBI9N1Grn6SMKVJ4KP7Fuiw==", + "dev": true, + "optional": true + }, "@fastify/accept-negotiator": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@fastify/accept-negotiator/-/accept-negotiator-1.1.0.tgz", @@ -24658,6 +25112,12 @@ "integrity": "sha512-RE815I4arJFtt+FVeU1Tgp9/Xvecacji8w/V6XtXsWWH/wz/eNkNbhb+ny/+PlVZjV0rxQpRSQKNKE3lcktHEA==", "dev": true }, + "@iarna/toml": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/@iarna/toml/-/toml-2.2.5.tgz", + "integrity": "sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==", + "dev": true + }, "@import-maps/resolve": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@import-maps/resolve/-/resolve-1.0.1.tgz", @@ -24789,30 +25249,29 @@ "dev": true }, "@netlify/blobs": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/@netlify/blobs/-/blobs-6.3.1.tgz", - "integrity": "sha512-JjLz3WW7Wp6NVwQtDxPpWio4L3u9pnnDXnQ7Q16zgAFE9IA1rSjZVSsyOQrtkiBQIxaJ1Zr5eky8vrXJ5mdRWg==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@netlify/blobs/-/blobs-7.0.1.tgz", + "integrity": "sha512-TPx1QzdPcrtBLFXDsv+BOJg5ip/g4trKaot1MZIUV/uI6H0Islg3gU4AGuH5hAMZOr6VlRLWicFhGX7ihLz4eg==", "dev": true }, "@netlify/build": { - "version": "29.31.5", - "resolved": "https://registry.npmjs.org/@netlify/build/-/build-29.31.5.tgz", - "integrity": "sha512-NycFWMdCjCd0mPvWLpJucWzEedrxQSzeeMftA7lP00j3lGVRxqy+5WGfMGjEhAq6GNHTBoYUKTxdEeFJv3wesA==", + "version": "29.36.6", + "resolved": "https://registry.npmjs.org/@netlify/build/-/build-29.36.6.tgz", + "integrity": "sha512-crNoY5Vr7tAodBfYdz8weM+NTw5q6W6ArkowNw6QhKXa4iRXT5MY6H0c2ztsge9o5gAYs55bDhBpKiPcZlzDlA==", "dev": true, "requires": { "@bugsnag/js": "^7.0.0", - "@netlify/blobs": "^6.3.1", + "@netlify/blobs": "^6.5.0", "@netlify/cache-utils": "^5.1.5", - "@netlify/config": "^20.10.1", - "@netlify/edge-bundler": "10.1.3", - "@netlify/framework-info": "^9.8.10", - "@netlify/functions-utils": "^5.2.46", + "@netlify/config": "^20.12.1", + "@netlify/edge-bundler": "11.3.0", + "@netlify/framework-info": "^9.8.11", + "@netlify/functions-utils": "^5.2.51", "@netlify/git-utils": "^5.1.1", - "@netlify/opentelemetry-utils": "^1.0.1", - "@netlify/plugins-list": "^6.73.0", + "@netlify/opentelemetry-utils": "^1.0.3", + "@netlify/plugins-list": "^6.75.0", "@netlify/run-utils": "^5.1.1", - "@netlify/zip-it-and-ship-it": "9.28.2", - "@opentelemetry/api": "~1.6.0", + "@netlify/zip-it-and-ship-it": "9.29.2", "@sindresorhus/slugify": "^2.0.0", "ansi-escapes": "^6.0.0", "chalk": "^5.0.0", @@ -24860,198 +25319,64 @@ "yargs": "^17.6.0" }, "dependencies": { - "@esbuild/android-arm": { - "version": "0.19.6", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.6.tgz", - "integrity": "sha512-muPzBqXJKCbMYoNbb1JpZh/ynl0xS6/+pLjrofcR3Nad82SbsCogYzUE6Aq9QT3cLP0jR/IVK/NHC9b90mSHtg==", - "dev": true, - "optional": true - }, - "@esbuild/android-arm64": { - "version": "0.19.6", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.6.tgz", - "integrity": "sha512-KQ/hbe9SJvIJ4sR+2PcZ41IBV+LPJyYp6V1K1P1xcMRup9iYsBoQn4MzE3mhMLOld27Au2eDcLlIREeKGUXpHQ==", - "dev": true, - "optional": true - }, - "@esbuild/android-x64": { - "version": "0.19.6", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.6.tgz", - "integrity": "sha512-VVJVZQ7p5BBOKoNxd0Ly3xUM78Y4DyOoFKdkdAe2m11jbh0LEU4bPles4e/72EMl4tapko8o915UalN/5zhspg==", - "dev": true, - "optional": true - }, - "@esbuild/darwin-arm64": { - "version": "0.19.6", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.6.tgz", - "integrity": "sha512-91LoRp/uZAKx6ESNspL3I46ypwzdqyDLXZH7x2QYCLgtnaU08+AXEbabY2yExIz03/am0DivsTtbdxzGejfXpA==", - "dev": true, - "optional": true - }, - "@esbuild/darwin-x64": { - "version": "0.19.6", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.6.tgz", - "integrity": "sha512-QCGHw770ubjBU1J3ZkFJh671MFajGTYMZumPs9E/rqU52md6lIil97BR0CbPq6U+vTh3xnTNDHKRdR8ggHnmxQ==", - "dev": true, - "optional": true - }, - "@esbuild/freebsd-arm64": { - "version": "0.19.6", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.6.tgz", - "integrity": "sha512-J53d0jGsDcLzWk9d9SPmlyF+wzVxjXpOH7jVW5ae7PvrDst4kiAz6sX+E8btz0GB6oH12zC+aHRD945jdjF2Vg==", - "dev": true, - "optional": true - }, - "@esbuild/freebsd-x64": { - "version": "0.19.6", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.6.tgz", - "integrity": "sha512-hn9qvkjHSIB5Z9JgCCjED6YYVGCNpqB7dEGavBdG6EjBD8S/UcNUIlGcB35NCkMETkdYwfZSvD9VoDJX6VeUVA==", - "dev": true, - "optional": true - }, - "@esbuild/linux-arm": { - "version": "0.19.6", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.6.tgz", - "integrity": "sha512-G8IR5zFgpXad/Zp7gr7ZyTKyqZuThU6z1JjmRyN1vSF8j0bOlGzUwFSMTbctLAdd7QHpeyu0cRiuKrqK1ZTwvQ==", - "dev": true, - "optional": true - }, - "@esbuild/linux-arm64": { - "version": "0.19.6", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.6.tgz", - "integrity": "sha512-HQCOrk9XlH3KngASLaBfHpcoYEGUt829A9MyxaI8RMkfRA8SakG6YQEITAuwmtzFdEu5GU4eyhKcpv27dFaOBg==", - "dev": true, - "optional": true - }, - "@esbuild/linux-ia32": { - "version": "0.19.6", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.6.tgz", - "integrity": "sha512-22eOR08zL/OXkmEhxOfshfOGo8P69k8oKHkwkDrUlcB12S/sw/+COM4PhAPT0cAYW/gpqY2uXp3TpjQVJitz7w==", - "dev": true, - "optional": true - }, - "@esbuild/linux-loong64": { - "version": "0.19.6", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.6.tgz", - "integrity": "sha512-82RvaYAh/SUJyjWA8jDpyZCHQjmEggL//sC7F3VKYcBMumQjUL3C5WDl/tJpEiKtt7XrWmgjaLkrk205zfvwTA==", - "dev": true, - "optional": true - }, - "@esbuild/linux-mips64el": { - "version": "0.19.6", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.6.tgz", - "integrity": "sha512-8tvnwyYJpR618vboIv2l8tK2SuK/RqUIGMfMENkeDGo3hsEIrpGldMGYFcWxWeEILe5Fi72zoXLmhZ7PR23oQA==", - "dev": true, - "optional": true - }, - "@esbuild/linux-ppc64": { - "version": "0.19.6", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.6.tgz", - "integrity": "sha512-Qt+D7xiPajxVNk5tQiEJwhmarNnLPdjXAoA5uWMpbfStZB0+YU6a3CtbWYSy+sgAsnyx4IGZjWsTzBzrvg/fMA==", - "dev": true, - "optional": true - }, - "@esbuild/linux-riscv64": { - "version": "0.19.6", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.6.tgz", - "integrity": "sha512-lxRdk0iJ9CWYDH1Wpnnnc640ajF4RmQ+w6oHFZmAIYu577meE9Ka/DCtpOrwr9McMY11ocbp4jirgGgCi7Ls/g==", - "dev": true, - "optional": true - }, - "@esbuild/linux-s390x": { - "version": "0.19.6", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.6.tgz", - "integrity": "sha512-MopyYV39vnfuykHanRWHGRcRC3AwU7b0QY4TI8ISLfAGfK+tMkXyFuyT1epw/lM0pflQlS53JoD22yN83DHZgA==", - "dev": true, - "optional": true - }, - "@esbuild/linux-x64": { - "version": "0.19.6", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.6.tgz", - "integrity": "sha512-UWcieaBzsN8WYbzFF5Jq7QULETPcQvlX7KL4xWGIB54OknXJjBO37sPqk7N82WU13JGWvmDzFBi1weVBajPovg==", - "dev": true, - "optional": true - }, - "@esbuild/netbsd-x64": { - "version": "0.19.6", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.6.tgz", - "integrity": "sha512-EpWiLX0fzvZn1wxtLxZrEW+oQED9Pwpnh+w4Ffv8ZLuMhUoqR9q9rL4+qHW8F4Mg5oQEKxAoT0G+8JYNqCiR6g==", - "dev": true, - "optional": true - }, - "@esbuild/openbsd-x64": { - "version": "0.19.6", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.6.tgz", - "integrity": "sha512-fFqTVEktM1PGs2sLKH4M5mhAVEzGpeZJuasAMRnvDZNCV0Cjvm1Hu35moL2vC0DOrAQjNTvj4zWrol/lwQ8Deg==", - "dev": true, - "optional": true - }, - "@esbuild/sunos-x64": { - "version": "0.19.6", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.6.tgz", - "integrity": "sha512-M+XIAnBpaNvaVAhbe3uBXtgWyWynSdlww/JNZws0FlMPSBy+EpatPXNIlKAdtbFVII9OpX91ZfMb17TU3JKTBA==", - "dev": true, - "optional": true - }, - "@esbuild/win32-arm64": { - "version": "0.19.6", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.6.tgz", - "integrity": "sha512-2DchFXn7vp/B6Tc2eKdTsLzE0ygqKkNUhUBCNtMx2Llk4POIVMUq5rUYjdcedFlGLeRe1uLCpVvCmE+G8XYybA==", - "dev": true, - "optional": true - }, - "@esbuild/win32-ia32": { - "version": "0.19.6", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.6.tgz", - "integrity": "sha512-PBo/HPDQllyWdjwAVX+Gl2hH0dfBydL97BAH/grHKC8fubqp02aL4S63otZ25q3sBdINtOBbz1qTZQfXbP4VBg==", - "dev": true, - "optional": true - }, - "@esbuild/win32-x64": { - "version": "0.19.6", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.6.tgz", - "integrity": "sha512-OE7yIdbDif2kKfrGa+V0vx/B3FJv2L4KnIiLlvtibPyO9UkgO3rzYE0HhpREo2vmJ1Ixq1zwm9/0er+3VOSZJA==", - "dev": true, - "optional": true + "@netlify/blobs": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@netlify/blobs/-/blobs-6.5.0.tgz", + "integrity": "sha512-wRFlNnL/Qv3WNLZd3OT/YYqF1zb6iPSo8T31sl9ccL1ahBxW1fBqKgF4b1XL7Z+6mRIkatvcsVPkWBcO+oJMNA==", + "dev": true }, - "@netlify/edge-bundler": { - "version": "10.1.3", - "resolved": "https://registry.npmjs.org/@netlify/edge-bundler/-/edge-bundler-10.1.3.tgz", - "integrity": "sha512-+cFFUrdbkhbtmpvQlRam4CmNguKBjte7usNXO1IxDmExeYxdwkDWWBCjOO4zd/D12TIC3HSJGJjT76GkF+RwTg==", + "@netlify/zip-it-and-ship-it": { + "version": "9.29.2", + "resolved": "https://registry.npmjs.org/@netlify/zip-it-and-ship-it/-/zip-it-and-ship-it-9.29.2.tgz", + "integrity": "sha512-9o/4lsFWuyPpe38Rhk/00JyccKSBRGM9Av3DINnh/QrpTeIC6esfJsaJNQ4JQ+gU4XXAwxPY9Uk+16WMPs/zkg==", "dev": true, "requires": { - "@import-maps/resolve": "^1.0.1", - "@vercel/nft": "^0.24.3", - "ajv": "^8.11.2", - "ajv-errors": "^3.0.0", - "better-ajv-errors": "^1.2.0", + "@babel/parser": "^7.22.5", + "@babel/types": "7.23.6", + "@netlify/binary-info": "^1.0.0", + "@netlify/serverless-functions-api": "^1.14.0", + "@vercel/nft": "^0.23.0", + "archiver": "^6.0.0", "common-path-prefix": "^3.0.0", - "env-paths": "^3.0.0", - "esbuild": "0.19.6", + "cp-file": "^10.0.0", + "es-module-lexer": "^1.0.0", + "esbuild": "0.19.11", "execa": "^6.0.0", - "find-up": "^6.3.0", - "get-package-name": "^2.2.0", - "get-port": "^6.1.2", + "fast-glob": "^3.3.2", + "filter-obj": "^5.0.0", + "find-up": "^6.0.0", + "glob": "^8.0.3", + "is-builtin-module": "^3.1.0", "is-path-inside": "^4.0.0", - "jsonc-parser": "^3.2.0", - "node-fetch": "^3.1.1", - "node-stream-zip": "^1.15.0", - "p-retry": "^5.1.1", - "p-wait-for": "^4.1.0", - "path-key": "^4.0.0", - "regexp-tree": "^0.1.24", + "junk": "^4.0.0", + "locate-path": "^7.0.0", + "merge-options": "^3.0.4", + "minimatch": "^9.0.0", + "normalize-path": "^3.0.0", + "p-map": "^5.0.0", + "path-exists": "^5.0.0", + "precinct": "^11.0.0", + "require-package-name": "^2.0.1", + "resolve": "^2.0.0-next.1", "semver": "^7.3.8", - "tmp-promise": "^3.0.3", + "tmp-promise": "^3.0.2", + "toml": "^3.0.0", + "unixify": "^1.0.0", "urlpattern-polyfill": "8.0.2", - "uuid": "^9.0.0" + "yargs": "^17.0.0" + }, + "dependencies": { + "p-map": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-5.5.0.tgz", + "integrity": "sha512-VFqfGDHlx87K66yZrNdI4YGtD70IRyd+zSvgks6mzHPRNkoKy+9EKP4SFC77/vTTQYmRmti7dvqC+m5jBrBAcg==", + "dev": true, + "requires": { + "aggregate-error": "^4.0.0" + } + } } }, - "@opentelemetry/api": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.6.0.tgz", - "integrity": "sha512-OWlrQAnWn9577PhVgqjUvMr1pg57Bc4jv0iL4w0PRuOSRvq67rvHW9Ie/dZVMvCzhSCB+UxhcY/PmCmFj33Q+g==", - "dev": true - }, "@sindresorhus/is": { "version": "5.6.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.6.0.tgz", @@ -25067,44 +25392,15 @@ "defer-to-connect": "^2.0.1" } }, - "@vercel/nft": { - "version": "0.24.4", - "resolved": "https://registry.npmjs.org/@vercel/nft/-/nft-0.24.4.tgz", - "integrity": "sha512-KjYAZty7boH5fi5udp6p+lNu6nawgs++pHW+3koErMgbRkkHuToGX/FwjN5clV1FcaM3udfd4zW/sUapkMgpZw==", - "dev": true, - "requires": { - "@mapbox/node-pre-gyp": "^1.0.5", - "@rollup/pluginutils": "^4.0.0", - "acorn": "^8.6.0", - "async-sema": "^3.1.1", - "bindings": "^1.4.0", - "estree-walker": "2.0.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.2", - "node-gyp-build": "^4.2.2", - "resolve-from": "^5.0.0" - } - }, - "ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "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, "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "balanced-match": "^1.0.0" } }, - "ajv-errors": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-3.0.0.tgz", - "integrity": "sha512-V3wD15YHfHz6y0KdhYFjyy9vWtEVALT9UrxfN3zqlI6dMioHnJrqOYfyPKol3oqrnCM9uwkcdCwkJ0WUcbLMTQ==", - "dev": true, - "requires": {} - }, "cacheable-lookup": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", @@ -25132,36 +25428,6 @@ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", "dev": true }, - "esbuild": { - "version": "0.19.6", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.6.tgz", - "integrity": "sha512-Xl7dntjA2OEIvpr9j0DVxxnog2fyTGnyVoQXAMQI6eR3mf9zCQds7VIKUDCotDgE/p4ncTgeRqgX8t5d6oP4Gw==", - "dev": true, - "requires": { - "@esbuild/android-arm": "0.19.6", - "@esbuild/android-arm64": "0.19.6", - "@esbuild/android-x64": "0.19.6", - "@esbuild/darwin-arm64": "0.19.6", - "@esbuild/darwin-x64": "0.19.6", - "@esbuild/freebsd-arm64": "0.19.6", - "@esbuild/freebsd-x64": "0.19.6", - "@esbuild/linux-arm": "0.19.6", - "@esbuild/linux-arm64": "0.19.6", - "@esbuild/linux-ia32": "0.19.6", - "@esbuild/linux-loong64": "0.19.6", - "@esbuild/linux-mips64el": "0.19.6", - "@esbuild/linux-ppc64": "0.19.6", - "@esbuild/linux-riscv64": "0.19.6", - "@esbuild/linux-s390x": "0.19.6", - "@esbuild/linux-x64": "0.19.6", - "@esbuild/netbsd-x64": "0.19.6", - "@esbuild/openbsd-x64": "0.19.6", - "@esbuild/sunos-x64": "0.19.6", - "@esbuild/win32-arm64": "0.19.6", - "@esbuild/win32-ia32": "0.19.6", - "@esbuild/win32-x64": "0.19.6" - } - }, "escape-string-regexp": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", @@ -25195,11 +25461,29 @@ "is-unicode-supported": "^1.2.0" } }, - "get-port": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/get-port/-/get-port-6.1.2.tgz", - "integrity": "sha512-BrGGraKm2uPqurfGVj/z97/zv8dPleC6x9JBNRTrDNtCkkRF4rPwrQXFgL7+I+q8QSdU4ntLQX2D7KIxSy8nGw==", - "dev": true + "glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "dependencies": { + "minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } + } }, "got": { "version": "12.6.1", @@ -25248,12 +25532,6 @@ "integrity": "sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==", "dev": true }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, "lowercase-keys": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", @@ -25272,6 +25550,15 @@ "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", "dev": true }, + "minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + }, "node-fetch": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", @@ -25284,15 +25571,15 @@ } }, "normalize-url": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.0.tgz", - "integrity": "sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.1.tgz", + "integrity": "sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==", "dev": true }, "npm-run-path": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.2.0.tgz", - "integrity": "sha512-W4/tgAXFqFA0iL7fk0+uQ3g7wkL8xJmx3XdK0VGb4cHW//eZTtKGvFBBoRKVTpY7n6ze4NL9ly7rgXcHufqXKg==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", "dev": true, "requires": { "path-key": "^4.0.0" @@ -25337,21 +25624,6 @@ "integrity": "sha512-T8BatKGY+k5rU+Q/GTYgrEf2r4xRMevAN5mtXc2aPc4rS1j3s+vWTaO2Wag94neXuCAUAs8cxBL9EeB5EA6diw==", "dev": true }, - "p-timeout": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-5.1.0.tgz", - "integrity": "sha512-auFDyzzzGZZZdHz3BtET9VEz0SE/uMEAx7uWfGPucfzEwwe/xH0iVeZibQmANYE/hp9T2+UUZT5m+BKyrDp3Ew==", - "dev": true - }, - "p-wait-for": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-wait-for/-/p-wait-for-4.1.0.tgz", - "integrity": "sha512-i8nE5q++9h8oaQHWltS1Tnnv4IoMDOlqN7C0KFG2OdbK0iFJIt6CROZ8wfBM+K4Pxqfnq4C4lkkpXqTEpB5DZw==", - "dev": true, - "requires": { - "p-timeout": "^5.0.0" - } - }, "path-exists": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", @@ -25408,18 +25680,18 @@ } }, "@netlify/build-info": { - "version": "7.11.4", - "resolved": "https://registry.npmjs.org/@netlify/build-info/-/build-info-7.11.4.tgz", - "integrity": "sha512-4TvH/oIzow6wlpw+6wGsEyoApws1lzXNxwpArgSS5roCCWZ2NvoF1m7dsTEy+bN1bl1XkwOlK3L6YBJzs4khtg==", + "version": "7.13.2", + "resolved": "https://registry.npmjs.org/@netlify/build-info/-/build-info-7.13.2.tgz", + "integrity": "sha512-smzhIgcms6Z/v2cct90l8ncBbnA5kvknj5/quhwyM6UHUycgMKFlA22qkB0KLj9shwL1Lkh7iQW751JwhSaP9g==", "dev": true, "requires": { "@bugsnag/js": "^7.20.0", + "@iarna/toml": "^2.2.5", "dot-prop": "^7.2.0", "find-up": "^6.3.0", "minimatch": "^9.0.0", "read-pkg": "^7.1.0", "semver": "^7.3.8", - "toml": "^3.0.0", "yaml": "^2.1.3", "yargs": "^17.6.0" }, @@ -25461,9 +25733,9 @@ "dev": true }, "yaml": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz", - "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.1.tgz", + "integrity": "sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg==", "dev": true } } @@ -25512,11 +25784,12 @@ } }, "@netlify/config": { - "version": "20.10.1", - "resolved": "https://registry.npmjs.org/@netlify/config/-/config-20.10.1.tgz", - "integrity": "sha512-ZKNdJAeDs7c9Z5OERoW75ZLeU2NZOS4WjD87IEVjDDYg020A9RcvJBZtc4ZKeF8TaJlYhlRlet6xX2AwOL1gNA==", + "version": "20.12.1", + "resolved": "https://registry.npmjs.org/@netlify/config/-/config-20.12.1.tgz", + "integrity": "sha512-sziuaOA9XfeQjQf6Yru7S9k9xTMy9GAJSPJL02WFld0cFDA5dgDyAFLN34jedIbgl7jVV+g7Vb2nOJocfgibbg==", "dev": true, "requires": { + "@iarna/toml": "^2.2.5", "chalk": "^5.0.0", "cron-parser": "^4.1.0", "deepmerge": "^4.2.2", @@ -25530,14 +25803,13 @@ "is-plain-obj": "^4.0.0", "js-yaml": "^4.0.0", "map-obj": "^5.0.0", - "netlify": "^13.1.12", - "netlify-headers-parser": "^7.1.3", - "netlify-redirect-parser": "^14.2.1", + "netlify": "^13.1.14", + "netlify-headers-parser": "^7.1.4", + "netlify-redirect-parser": "^14.2.2", "node-fetch": "^3.3.1", "omit.js": "^2.0.2", "p-locate": "^6.0.0", "path-type": "^5.0.0", - "toml": "^3.0.0", "tomlify-j0.4": "^3.0.0", "validate-npm-package-name": "^4.0.0", "yargs": "^17.6.0" @@ -25662,19 +25934,19 @@ } }, "@netlify/edge-bundler": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/@netlify/edge-bundler/-/edge-bundler-11.0.0.tgz", - "integrity": "sha512-DPFkzQmdZR/1a3jUaZMbxk79N6PEtqhxEvx6x5wISegqkeM9DPNe+PQIBFXpsAwIeb9MB1RU7vliT1hIRt8DBg==", + "version": "11.3.0", + "resolved": "https://registry.npmjs.org/@netlify/edge-bundler/-/edge-bundler-11.3.0.tgz", + "integrity": "sha512-ROyjrrOCe4TYdBf9Eky8EFrSFENcKdsHHqGe0nSwbyLKDfbe9gPNwN9LoXt9QhxmPyJCOGwxz12kDX2rqFc+Mw==", "dev": true, "requires": { "@import-maps/resolve": "^1.0.1", - "@vercel/nft": "^0.24.3", + "@vercel/nft": "^0.26.0", "ajv": "^8.11.2", "ajv-errors": "^3.0.0", "better-ajv-errors": "^1.2.0", "common-path-prefix": "^3.0.0", "env-paths": "^3.0.0", - "esbuild": "0.19.9", + "esbuild": "0.20.0", "execa": "^6.0.0", "find-up": "^6.3.0", "get-package-name": "^2.2.0", @@ -25686,176 +25958,183 @@ "p-retry": "^5.1.1", "p-wait-for": "^4.1.0", "path-key": "^4.0.0", - "regexp-tree": "^0.1.24", "semver": "^7.3.8", "tmp-promise": "^3.0.3", "urlpattern-polyfill": "8.0.2", "uuid": "^9.0.0" }, "dependencies": { + "@esbuild/aix-ppc64": { + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.0.tgz", + "integrity": "sha512-fGFDEctNh0CcSwsiRPxiaqX0P5rq+AqE0SRhYGZ4PX46Lg1FNR6oCxJghf8YgY0WQEgQuh3lErUFE4KxLeRmmw==", + "dev": true, + "optional": true + }, "@esbuild/android-arm": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.9.tgz", - "integrity": "sha512-jkYjjq7SdsWuNI6b5quymW0oC83NN5FdRPuCbs9HZ02mfVdAP8B8eeqLSYU3gb6OJEaY5CQabtTFbqBf26H3GA==", + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.0.tgz", + "integrity": "sha512-3bMAfInvByLHfJwYPJRlpTeaQA75n8C/QKpEaiS4HrFWFiJlNI0vzq/zCjBrhAYcPyVPG7Eo9dMrcQXuqmNk5g==", "dev": true, "optional": true }, "@esbuild/android-arm64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.9.tgz", - "integrity": "sha512-q4cR+6ZD0938R19MyEW3jEsMzbb/1rulLXiNAJQADD/XYp7pT+rOS5JGxvpRW8dFDEfjW4wLgC/3FXIw4zYglQ==", + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.0.tgz", + "integrity": "sha512-aVpnM4lURNkp0D3qPoAzSG92VXStYmoVPOgXveAUoQBWRSuQzt51yvSju29J6AHPmwY1BjH49uR29oyfH1ra8Q==", "dev": true, "optional": true }, "@esbuild/android-x64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.9.tgz", - "integrity": "sha512-KOqoPntWAH6ZxDwx1D6mRntIgZh9KodzgNOy5Ebt9ghzffOk9X2c1sPwtM9P+0eXbefnDhqYfkh5PLP5ULtWFA==", + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.0.tgz", + "integrity": "sha512-uK7wAnlRvjkCPzh8jJ+QejFyrP8ObKuR5cBIsQZ+qbMunwR8sbd8krmMbxTLSrDhiPZaJYKQAU5Y3iMDcZPhyQ==", "dev": true, "optional": true }, "@esbuild/darwin-arm64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.9.tgz", - "integrity": "sha512-KBJ9S0AFyLVx2E5D8W0vExqRW01WqRtczUZ8NRu+Pi+87opZn5tL4Y0xT0mA4FtHctd0ZgwNoN639fUUGlNIWw==", + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.0.tgz", + "integrity": "sha512-AjEcivGAlPs3UAcJedMa9qYg9eSfU6FnGHJjT8s346HSKkrcWlYezGE8VaO2xKfvvlZkgAhyvl06OJOxiMgOYQ==", "dev": true, "optional": true }, "@esbuild/darwin-x64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.9.tgz", - "integrity": "sha512-vE0VotmNTQaTdX0Q9dOHmMTao6ObjyPm58CHZr1UK7qpNleQyxlFlNCaHsHx6Uqv86VgPmR4o2wdNq3dP1qyDQ==", + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.0.tgz", + "integrity": "sha512-bsgTPoyYDnPv8ER0HqnJggXK6RyFy4PH4rtsId0V7Efa90u2+EifxytE9pZnsDgExgkARy24WUQGv9irVbTvIw==", "dev": true, "optional": true }, "@esbuild/freebsd-arm64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.9.tgz", - "integrity": "sha512-uFQyd/o1IjiEk3rUHSwUKkqZwqdvuD8GevWF065eqgYfexcVkxh+IJgwTaGZVu59XczZGcN/YMh9uF1fWD8j1g==", + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.0.tgz", + "integrity": "sha512-kQ7jYdlKS335mpGbMW5tEe3IrQFIok9r84EM3PXB8qBFJPSc6dpWfrtsC/y1pyrz82xfUIn5ZrnSHQQsd6jebQ==", "dev": true, "optional": true }, "@esbuild/freebsd-x64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.9.tgz", - "integrity": "sha512-WMLgWAtkdTbTu1AWacY7uoj/YtHthgqrqhf1OaEWnZb7PQgpt8eaA/F3LkV0E6K/Lc0cUr/uaVP/49iE4M4asA==", + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.0.tgz", + "integrity": "sha512-uG8B0WSepMRsBNVXAQcHf9+Ko/Tr+XqmK7Ptel9HVmnykupXdS4J7ovSQUIi0tQGIndhbqWLaIL/qO/cWhXKyQ==", "dev": true, "optional": true }, "@esbuild/linux-arm": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.9.tgz", - "integrity": "sha512-C/ChPohUYoyUaqn1h17m/6yt6OB14hbXvT8EgM1ZWaiiTYz7nWZR0SYmMnB5BzQA4GXl3BgBO1l8MYqL/He3qw==", + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.0.tgz", + "integrity": "sha512-2ezuhdiZw8vuHf1HKSf4TIk80naTbP9At7sOqZmdVwvvMyuoDiZB49YZKLsLOfKIr77+I40dWpHVeY5JHpIEIg==", "dev": true, "optional": true }, "@esbuild/linux-arm64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.9.tgz", - "integrity": "sha512-PiPblfe1BjK7WDAKR1Cr9O7VVPqVNpwFcPWgfn4xu0eMemzRp442hXyzF/fSwgrufI66FpHOEJk0yYdPInsmyQ==", + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.0.tgz", + "integrity": "sha512-uTtyYAP5veqi2z9b6Gr0NUoNv9F/rOzI8tOD5jKcCvRUn7T60Bb+42NDBCWNhMjkQzI0qqwXkQGo1SY41G52nw==", "dev": true, "optional": true }, "@esbuild/linux-ia32": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.9.tgz", - "integrity": "sha512-f37i/0zE0MjDxijkPSQw1CO/7C27Eojqb+r3BbHVxMLkj8GCa78TrBZzvPyA/FNLUMzP3eyHCVkAopkKVja+6Q==", + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.0.tgz", + "integrity": "sha512-c88wwtfs8tTffPaoJ+SQn3y+lKtgTzyjkD8NgsyCtCmtoIC8RDL7PrJU05an/e9VuAke6eJqGkoMhJK1RY6z4w==", "dev": true, "optional": true }, "@esbuild/linux-loong64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.9.tgz", - "integrity": "sha512-t6mN147pUIf3t6wUt3FeumoOTPfmv9Cc6DQlsVBpB7eCpLOqQDyWBP1ymXn1lDw4fNUSb/gBcKAmvTP49oIkaA==", + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.0.tgz", + "integrity": "sha512-lR2rr/128/6svngnVta6JN4gxSXle/yZEZL3o4XZ6esOqhyR4wsKyfu6qXAL04S4S5CgGfG+GYZnjFd4YiG3Aw==", "dev": true, "optional": true }, "@esbuild/linux-mips64el": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.9.tgz", - "integrity": "sha512-jg9fujJTNTQBuDXdmAg1eeJUL4Jds7BklOTkkH80ZgQIoCTdQrDaHYgbFZyeTq8zbY+axgptncko3v9p5hLZtw==", + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.0.tgz", + "integrity": "sha512-9Sycc+1uUsDnJCelDf6ZNqgZQoK1mJvFtqf2MUz4ujTxGhvCWw+4chYfDLPepMEvVL9PDwn6HrXad5yOrNzIsQ==", "dev": true, "optional": true }, "@esbuild/linux-ppc64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.9.tgz", - "integrity": "sha512-tkV0xUX0pUUgY4ha7z5BbDS85uI7ABw3V1d0RNTii7E9lbmV8Z37Pup2tsLV46SQWzjOeyDi1Q7Wx2+QM8WaCQ==", + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.0.tgz", + "integrity": "sha512-CoWSaaAXOZd+CjbUTdXIJE/t7Oz+4g90A3VBCHLbfuc5yUQU/nFDLOzQsN0cdxgXd97lYW/psIIBdjzQIwTBGw==", "dev": true, "optional": true }, "@esbuild/linux-riscv64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.9.tgz", - "integrity": "sha512-DfLp8dj91cufgPZDXr9p3FoR++m3ZJ6uIXsXrIvJdOjXVREtXuQCjfMfvmc3LScAVmLjcfloyVtpn43D56JFHg==", + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.0.tgz", + "integrity": "sha512-mlb1hg/eYRJUpv8h/x+4ShgoNLL8wgZ64SUr26KwglTYnwAWjkhR2GpoKftDbPOCnodA9t4Y/b68H4J9XmmPzA==", "dev": true, "optional": true }, "@esbuild/linux-s390x": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.9.tgz", - "integrity": "sha512-zHbglfEdC88KMgCWpOl/zc6dDYJvWGLiUtmPRsr1OgCViu3z5GncvNVdf+6/56O2Ca8jUU+t1BW261V6kp8qdw==", + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.0.tgz", + "integrity": "sha512-fgf9ubb53xSnOBqyvWEY6ukBNRl1mVX1srPNu06B6mNsNK20JfH6xV6jECzrQ69/VMiTLvHMicQR/PgTOgqJUQ==", "dev": true, "optional": true }, "@esbuild/linux-x64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.9.tgz", - "integrity": "sha512-JUjpystGFFmNrEHQnIVG8hKwvA2DN5o7RqiO1CVX8EN/F/gkCjkUMgVn6hzScpwnJtl2mPR6I9XV1oW8k9O+0A==", + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.0.tgz", + "integrity": "sha512-H9Eu6MGse++204XZcYsse1yFHmRXEWgadk2N58O/xd50P9EvFMLJTQLg+lB4E1cF2xhLZU5luSWtGTb0l9UeSg==", "dev": true, "optional": true }, "@esbuild/netbsd-x64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.9.tgz", - "integrity": "sha512-GThgZPAwOBOsheA2RUlW5UeroRfESwMq/guy8uEe3wJlAOjpOXuSevLRd70NZ37ZrpO6RHGHgEHvPg1h3S1Jug==", + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.0.tgz", + "integrity": "sha512-lCT675rTN1v8Fo+RGrE5KjSnfY0x9Og4RN7t7lVrN3vMSjy34/+3na0q7RIfWDAj0e0rCh0OL+P88lu3Rt21MQ==", "dev": true, "optional": true }, "@esbuild/openbsd-x64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.9.tgz", - "integrity": "sha512-Ki6PlzppaFVbLnD8PtlVQfsYw4S9n3eQl87cqgeIw+O3sRr9IghpfSKY62mggdt1yCSZ8QWvTZ9jo9fjDSg9uw==", + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.0.tgz", + "integrity": "sha512-HKoUGXz/TOVXKQ+67NhxyHv+aDSZf44QpWLa3I1lLvAwGq8x1k0T+e2HHSRvxWhfJrFxaaqre1+YyzQ99KixoA==", "dev": true, "optional": true }, "@esbuild/sunos-x64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.9.tgz", - "integrity": "sha512-MLHj7k9hWh4y1ddkBpvRj2b9NCBhfgBt3VpWbHQnXRedVun/hC7sIyTGDGTfsGuXo4ebik2+3ShjcPbhtFwWDw==", + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.0.tgz", + "integrity": "sha512-GDwAqgHQm1mVoPppGsoq4WJwT3vhnz/2N62CzhvApFD1eJyTroob30FPpOZabN+FgCjhG+AgcZyOPIkR8dfD7g==", "dev": true, "optional": true }, "@esbuild/win32-arm64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.9.tgz", - "integrity": "sha512-GQoa6OrQ8G08guMFgeXPH7yE/8Dt0IfOGWJSfSH4uafwdC7rWwrfE6P9N8AtPGIjUzdo2+7bN8Xo3qC578olhg==", + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.0.tgz", + "integrity": "sha512-0vYsP8aC4TvMlOQYozoksiaxjlvUcQrac+muDqj1Fxy6jh9l9CZJzj7zmh8JGfiV49cYLTorFLxg7593pGldwQ==", "dev": true, "optional": true }, "@esbuild/win32-ia32": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.9.tgz", - "integrity": "sha512-UOozV7Ntykvr5tSOlGCrqU3NBr3d8JqPes0QWN2WOXfvkWVGRajC+Ym0/Wj88fUgecUCLDdJPDF0Nna2UK3Qtg==", + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.0.tgz", + "integrity": "sha512-p98u4rIgfh4gdpV00IqknBD5pC84LCub+4a3MO+zjqvU5MVXOc3hqR2UgT2jI2nh3h8s9EQxmOsVI3tyzv1iFg==", "dev": true, "optional": true }, "@esbuild/win32-x64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.9.tgz", - "integrity": "sha512-oxoQgglOP7RH6iasDrhY+R/3cHrfwIDvRlT4CGChflq6twk8iENeVvMJjmvBb94Ik1Z+93iGO27err7w6l54GQ==", + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.0.tgz", + "integrity": "sha512-NgJnesu1RtWihtTtXGFMU5YSE6JyyHPMxCwBZK7a6/8d31GuSo9l0Ss7w1Jw5QnKUawG6UEehs883kcXf5fYwg==", "dev": true, "optional": true }, "@vercel/nft": { - "version": "0.24.3", - "resolved": "https://registry.npmjs.org/@vercel/nft/-/nft-0.24.3.tgz", - "integrity": "sha512-IyBdIxmFAeGZnEfMgt4QrGK7XX4lWazlQj34HEi9dw04/WeDBJ7r1yaOIO5tTf9pbfvwUFodj9b0H+NDGGoOMg==", + "version": "0.26.4", + "resolved": "https://registry.npmjs.org/@vercel/nft/-/nft-0.26.4.tgz", + "integrity": "sha512-j4jCOOXke2t8cHZCIxu1dzKLHLcFmYzC3yqAK6MfZznOL1QIJKd0xcFsXK3zcqzU7ScsE2zWkiMMNHGMHgp+FA==", "dev": true, "requires": { "@mapbox/node-pre-gyp": "^1.0.5", "@rollup/pluginutils": "^4.0.0", "acorn": "^8.6.0", + "acorn-import-attributes": "^1.9.2", "async-sema": "^3.1.1", "bindings": "^1.4.0", "estree-walker": "2.0.2", @@ -25886,33 +26165,34 @@ "requires": {} }, "esbuild": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.9.tgz", - "integrity": "sha512-U9CHtKSy+EpPsEBa+/A2gMs/h3ylBC0H0KSqIg7tpztHerLi6nrrcoUJAkNCEPumx8yJ+Byic4BVwHgRbN0TBg==", - "dev": true, - "requires": { - "@esbuild/android-arm": "0.19.9", - "@esbuild/android-arm64": "0.19.9", - "@esbuild/android-x64": "0.19.9", - "@esbuild/darwin-arm64": "0.19.9", - "@esbuild/darwin-x64": "0.19.9", - "@esbuild/freebsd-arm64": "0.19.9", - "@esbuild/freebsd-x64": "0.19.9", - "@esbuild/linux-arm": "0.19.9", - "@esbuild/linux-arm64": "0.19.9", - "@esbuild/linux-ia32": "0.19.9", - "@esbuild/linux-loong64": "0.19.9", - "@esbuild/linux-mips64el": "0.19.9", - "@esbuild/linux-ppc64": "0.19.9", - "@esbuild/linux-riscv64": "0.19.9", - "@esbuild/linux-s390x": "0.19.9", - "@esbuild/linux-x64": "0.19.9", - "@esbuild/netbsd-x64": "0.19.9", - "@esbuild/openbsd-x64": "0.19.9", - "@esbuild/sunos-x64": "0.19.9", - "@esbuild/win32-arm64": "0.19.9", - "@esbuild/win32-ia32": "0.19.9", - "@esbuild/win32-x64": "0.19.9" + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.0.tgz", + "integrity": "sha512-6iwE3Y2RVYCME1jLpBqq7LQWK3MW6vjV2bZy6gt/WrqkY+WE74Spyc0ThAOYpMtITvnjX09CrC6ym7A/m9mebA==", + "dev": true, + "requires": { + "@esbuild/aix-ppc64": "0.20.0", + "@esbuild/android-arm": "0.20.0", + "@esbuild/android-arm64": "0.20.0", + "@esbuild/android-x64": "0.20.0", + "@esbuild/darwin-arm64": "0.20.0", + "@esbuild/darwin-x64": "0.20.0", + "@esbuild/freebsd-arm64": "0.20.0", + "@esbuild/freebsd-x64": "0.20.0", + "@esbuild/linux-arm": "0.20.0", + "@esbuild/linux-arm64": "0.20.0", + "@esbuild/linux-ia32": "0.20.0", + "@esbuild/linux-loong64": "0.20.0", + "@esbuild/linux-mips64el": "0.20.0", + "@esbuild/linux-ppc64": "0.20.0", + "@esbuild/linux-riscv64": "0.20.0", + "@esbuild/linux-s390x": "0.20.0", + "@esbuild/linux-x64": "0.20.0", + "@esbuild/netbsd-x64": "0.20.0", + "@esbuild/openbsd-x64": "0.20.0", + "@esbuild/sunos-x64": "0.20.0", + "@esbuild/win32-arm64": "0.20.0", + "@esbuild/win32-ia32": "0.20.0", + "@esbuild/win32-x64": "0.20.0" } }, "execa": { @@ -25968,9 +26248,9 @@ } }, "npm-run-path": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", - "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", "dev": true, "requires": { "path-key": "^4.0.0" @@ -26009,9 +26289,9 @@ } }, "@netlify/framework-info": { - "version": "9.8.10", - "resolved": "https://registry.npmjs.org/@netlify/framework-info/-/framework-info-9.8.10.tgz", - "integrity": "sha512-VT8ejAaB/XU2xRpdpQinHUO1YL3+BMx6LJ49wJk2u9Yq/VI1/gYCi5VqbqTHBQXJUlOi84YuiRlrDBsLpPr8eg==", + "version": "9.8.11", + "resolved": "https://registry.npmjs.org/@netlify/framework-info/-/framework-info-9.8.11.tgz", + "integrity": "sha512-8NuvzQQVeU36PRilWqijiIWmjy6JZcqbKooGQ4bNgH/26YNdS+tN5gOWGWVYnRHgdmBUCycyYrM5h1Srwnq3hQ==", "dev": true, "requires": { "ajv": "^8.12.0", @@ -26071,21 +26351,157 @@ } }, "@netlify/functions-utils": { - "version": "5.2.46", - "resolved": "https://registry.npmjs.org/@netlify/functions-utils/-/functions-utils-5.2.46.tgz", - "integrity": "sha512-fbruHy8nQRhqJ1jCsQN1kU6tZIYQvdSwYZkgkj5r6/rsyzZe5F0gaIE8FmlkUCSmw38GOPUuk78jR2MCmwNzGw==", + "version": "5.2.51", + "resolved": "https://registry.npmjs.org/@netlify/functions-utils/-/functions-utils-5.2.51.tgz", + "integrity": "sha512-A4XLQOE2pfcOHcCTs97G6FDVQg20zGoROCAZcpnNd8bMvBDDVgziC/xoFxm4xGC36u0YogSECsLoIbSKSxLloA==", "dev": true, "requires": { - "@netlify/zip-it-and-ship-it": "9.28.2", + "@netlify/zip-it-and-ship-it": "9.29.2", "cpy": "^9.0.0", "path-exists": "^5.0.0" }, "dependencies": { + "@netlify/zip-it-and-ship-it": { + "version": "9.29.2", + "resolved": "https://registry.npmjs.org/@netlify/zip-it-and-ship-it/-/zip-it-and-ship-it-9.29.2.tgz", + "integrity": "sha512-9o/4lsFWuyPpe38Rhk/00JyccKSBRGM9Av3DINnh/QrpTeIC6esfJsaJNQ4JQ+gU4XXAwxPY9Uk+16WMPs/zkg==", + "dev": true, + "requires": { + "@babel/parser": "^7.22.5", + "@babel/types": "7.23.6", + "@netlify/binary-info": "^1.0.0", + "@netlify/serverless-functions-api": "^1.14.0", + "@vercel/nft": "^0.23.0", + "archiver": "^6.0.0", + "common-path-prefix": "^3.0.0", + "cp-file": "^10.0.0", + "es-module-lexer": "^1.0.0", + "esbuild": "0.19.11", + "execa": "^6.0.0", + "fast-glob": "^3.3.2", + "filter-obj": "^5.0.0", + "find-up": "^6.0.0", + "glob": "^8.0.3", + "is-builtin-module": "^3.1.0", + "is-path-inside": "^4.0.0", + "junk": "^4.0.0", + "locate-path": "^7.0.0", + "merge-options": "^3.0.4", + "minimatch": "^9.0.0", + "normalize-path": "^3.0.0", + "p-map": "^5.0.0", + "path-exists": "^5.0.0", + "precinct": "^11.0.0", + "require-package-name": "^2.0.1", + "resolve": "^2.0.0-next.1", + "semver": "^7.3.8", + "tmp-promise": "^3.0.2", + "toml": "^3.0.0", + "unixify": "^1.0.0", + "urlpattern-polyfill": "8.0.2", + "yargs": "^17.0.0" + } + }, + "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, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "execa": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-6.1.0.tgz", + "integrity": "sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.1", + "human-signals": "^3.0.1", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^3.0.7", + "strip-final-newline": "^3.0.0" + } + }, + "glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "dependencies": { + "minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, + "human-signals": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-3.0.1.tgz", + "integrity": "sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ==", + "dev": true + }, + "is-path-inside": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-4.0.0.tgz", + "integrity": "sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==", + "dev": true + }, + "minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + }, + "npm-run-path": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", + "dev": true, + "requires": { + "path-key": "^4.0.0" + } + }, + "onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "requires": { + "mimic-fn": "^4.0.0" + } + }, "path-exists": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", "dev": true + }, + "strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true } } }, @@ -26274,32 +26690,22 @@ "dev": true }, "@netlify/open-api": { - "version": "2.26.0", - "resolved": "https://registry.npmjs.org/@netlify/open-api/-/open-api-2.26.0.tgz", - "integrity": "sha512-B7q+ySzQm6rJhaGbY0Pzqnb1p3FsBqwiPLnLtA17JgTsqmXgQ7j6OQImW9fRJy/Al1ob9M6Oxng/FA2c7aIW1g==", + "version": "2.28.0", + "resolved": "https://registry.npmjs.org/@netlify/open-api/-/open-api-2.28.0.tgz", + "integrity": "sha512-lSx9yVn5mzTS7u9aevQyDRoWaHJYNl15B7CU373g8We39wW8fGh4sdNY7ciPWshf42FblOVlBdoasn/LpzquXg==", "dev": true }, "@netlify/opentelemetry-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@netlify/opentelemetry-utils/-/opentelemetry-utils-1.0.1.tgz", - "integrity": "sha512-mL8vhn4tUpdkHg1+WuqEhguULNeN0kQWZtel6lFEEZ36G41Vxm1gv6n7RcOanNLHxQEnaLS4J8zRVUSuwj6iTQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@netlify/opentelemetry-utils/-/opentelemetry-utils-1.0.3.tgz", + "integrity": "sha512-1kpJ9lrCXkdhRy4DXf7H0MySOQ8K+8aAwl1aJGztMrq62luoN9qOAbZ5cnTpQHzBUfxveikWB32YuryNA42B8g==", "dev": true, - "requires": { - "@opentelemetry/api": "~1.6.0" - }, - "dependencies": { - "@opentelemetry/api": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.6.0.tgz", - "integrity": "sha512-OWlrQAnWn9577PhVgqjUvMr1pg57Bc4jv0iL4w0PRuOSRvq67rvHW9Ie/dZVMvCzhSCB+UxhcY/PmCmFj33Q+g==", - "dev": true - } - } + "requires": {} }, "@netlify/plugins-list": { - "version": "6.74.0", - "resolved": "https://registry.npmjs.org/@netlify/plugins-list/-/plugins-list-6.74.0.tgz", - "integrity": "sha512-cWZ9vQ0LgKowjlSG4vkLAQ+P41aB8KFrRRId2WCvYeK3g2pUJpseceZtYzTuQvvsOtBZh5qVkqRz1Ye/AfSP+A==", + "version": "6.75.0", + "resolved": "https://registry.npmjs.org/@netlify/plugins-list/-/plugins-list-6.75.0.tgz", + "integrity": "sha512-xH5UWc6v6oOu53kaNhJI6o0vESVECoGBjD5hW5nmjFaIkEJFDfbtHj/gSQ2hCcwIzTlGYRGIyGVBMY+e7ki6bw==", "dev": true }, "@netlify/run-utils": { @@ -26361,9 +26767,9 @@ } }, "@netlify/serverless-functions-api": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/@netlify/serverless-functions-api/-/serverless-functions-api-1.13.0.tgz", - "integrity": "sha512-H3SMpHw24jWjnEMqbXgILWdo3/Iv/2DRzOZZevqqEswRTOWcQJGlU35Dth72VAOxhPyWXjulogG1zJNRw8m2sQ==", + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/@netlify/serverless-functions-api/-/serverless-functions-api-1.14.0.tgz", + "integrity": "sha512-HUNETLNvNiC2J+SB/YuRwJA9+agPrc0azSoWVk8H85GC+YE114hcS5JW+dstpKwVerp2xILE3vNWN7IMXP5Q5Q==", "dev": true, "requires": { "@netlify/node-cookies": "^0.1.0", @@ -26371,21 +26777,21 @@ } }, "@netlify/zip-it-and-ship-it": { - "version": "9.28.2", - "resolved": "https://registry.npmjs.org/@netlify/zip-it-and-ship-it/-/zip-it-and-ship-it-9.28.2.tgz", - "integrity": "sha512-tNv/SXjoWWwrO22fYSxYsB7oIs/h0MDYNnoy8tt/X1AyFF0qIF+7ppNZCwNzh6QGVkGwDHPRz2c6HL2k+pZLIg==", + "version": "9.30.0", + "resolved": "https://registry.npmjs.org/@netlify/zip-it-and-ship-it/-/zip-it-and-ship-it-9.30.0.tgz", + "integrity": "sha512-R0v1/vDjjizB4em4YvigqIRj4ZAdcp18svajvcDp6OhB6pt76LZ/RlPEEPq4sGfpQRUpdmapNdnQDNHHReyXug==", "dev": true, "requires": { "@babel/parser": "^7.22.5", - "@babel/types": "7.23.5", + "@babel/types": "7.23.6", "@netlify/binary-info": "^1.0.0", - "@netlify/serverless-functions-api": "^1.13.0", + "@netlify/serverless-functions-api": "^1.14.0", "@vercel/nft": "^0.23.0", "archiver": "^6.0.0", "common-path-prefix": "^3.0.0", "cp-file": "^10.0.0", "es-module-lexer": "^1.0.0", - "esbuild": "0.19.9", + "esbuild": "0.19.11", "execa": "^6.0.0", "fast-glob": "^3.3.2", "filter-obj": "^5.0.0", @@ -26411,160 +26817,6 @@ "yargs": "^17.0.0" }, "dependencies": { - "@esbuild/android-arm": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.9.tgz", - "integrity": "sha512-jkYjjq7SdsWuNI6b5quymW0oC83NN5FdRPuCbs9HZ02mfVdAP8B8eeqLSYU3gb6OJEaY5CQabtTFbqBf26H3GA==", - "dev": true, - "optional": true - }, - "@esbuild/android-arm64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.9.tgz", - "integrity": "sha512-q4cR+6ZD0938R19MyEW3jEsMzbb/1rulLXiNAJQADD/XYp7pT+rOS5JGxvpRW8dFDEfjW4wLgC/3FXIw4zYglQ==", - "dev": true, - "optional": true - }, - "@esbuild/android-x64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.9.tgz", - "integrity": "sha512-KOqoPntWAH6ZxDwx1D6mRntIgZh9KodzgNOy5Ebt9ghzffOk9X2c1sPwtM9P+0eXbefnDhqYfkh5PLP5ULtWFA==", - "dev": true, - "optional": true - }, - "@esbuild/darwin-arm64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.9.tgz", - "integrity": "sha512-KBJ9S0AFyLVx2E5D8W0vExqRW01WqRtczUZ8NRu+Pi+87opZn5tL4Y0xT0mA4FtHctd0ZgwNoN639fUUGlNIWw==", - "dev": true, - "optional": true - }, - "@esbuild/darwin-x64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.9.tgz", - "integrity": "sha512-vE0VotmNTQaTdX0Q9dOHmMTao6ObjyPm58CHZr1UK7qpNleQyxlFlNCaHsHx6Uqv86VgPmR4o2wdNq3dP1qyDQ==", - "dev": true, - "optional": true - }, - "@esbuild/freebsd-arm64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.9.tgz", - "integrity": "sha512-uFQyd/o1IjiEk3rUHSwUKkqZwqdvuD8GevWF065eqgYfexcVkxh+IJgwTaGZVu59XczZGcN/YMh9uF1fWD8j1g==", - "dev": true, - "optional": true - }, - "@esbuild/freebsd-x64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.9.tgz", - "integrity": "sha512-WMLgWAtkdTbTu1AWacY7uoj/YtHthgqrqhf1OaEWnZb7PQgpt8eaA/F3LkV0E6K/Lc0cUr/uaVP/49iE4M4asA==", - "dev": true, - "optional": true - }, - "@esbuild/linux-arm": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.9.tgz", - "integrity": "sha512-C/ChPohUYoyUaqn1h17m/6yt6OB14hbXvT8EgM1ZWaiiTYz7nWZR0SYmMnB5BzQA4GXl3BgBO1l8MYqL/He3qw==", - "dev": true, - "optional": true - }, - "@esbuild/linux-arm64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.9.tgz", - "integrity": "sha512-PiPblfe1BjK7WDAKR1Cr9O7VVPqVNpwFcPWgfn4xu0eMemzRp442hXyzF/fSwgrufI66FpHOEJk0yYdPInsmyQ==", - "dev": true, - "optional": true - }, - "@esbuild/linux-ia32": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.9.tgz", - "integrity": "sha512-f37i/0zE0MjDxijkPSQw1CO/7C27Eojqb+r3BbHVxMLkj8GCa78TrBZzvPyA/FNLUMzP3eyHCVkAopkKVja+6Q==", - "dev": true, - "optional": true - }, - "@esbuild/linux-loong64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.9.tgz", - "integrity": "sha512-t6mN147pUIf3t6wUt3FeumoOTPfmv9Cc6DQlsVBpB7eCpLOqQDyWBP1ymXn1lDw4fNUSb/gBcKAmvTP49oIkaA==", - "dev": true, - "optional": true - }, - "@esbuild/linux-mips64el": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.9.tgz", - "integrity": "sha512-jg9fujJTNTQBuDXdmAg1eeJUL4Jds7BklOTkkH80ZgQIoCTdQrDaHYgbFZyeTq8zbY+axgptncko3v9p5hLZtw==", - "dev": true, - "optional": true - }, - "@esbuild/linux-ppc64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.9.tgz", - "integrity": "sha512-tkV0xUX0pUUgY4ha7z5BbDS85uI7ABw3V1d0RNTii7E9lbmV8Z37Pup2tsLV46SQWzjOeyDi1Q7Wx2+QM8WaCQ==", - "dev": true, - "optional": true - }, - "@esbuild/linux-riscv64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.9.tgz", - "integrity": "sha512-DfLp8dj91cufgPZDXr9p3FoR++m3ZJ6uIXsXrIvJdOjXVREtXuQCjfMfvmc3LScAVmLjcfloyVtpn43D56JFHg==", - "dev": true, - "optional": true - }, - "@esbuild/linux-s390x": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.9.tgz", - "integrity": "sha512-zHbglfEdC88KMgCWpOl/zc6dDYJvWGLiUtmPRsr1OgCViu3z5GncvNVdf+6/56O2Ca8jUU+t1BW261V6kp8qdw==", - "dev": true, - "optional": true - }, - "@esbuild/linux-x64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.9.tgz", - "integrity": "sha512-JUjpystGFFmNrEHQnIVG8hKwvA2DN5o7RqiO1CVX8EN/F/gkCjkUMgVn6hzScpwnJtl2mPR6I9XV1oW8k9O+0A==", - "dev": true, - "optional": true - }, - "@esbuild/netbsd-x64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.9.tgz", - "integrity": "sha512-GThgZPAwOBOsheA2RUlW5UeroRfESwMq/guy8uEe3wJlAOjpOXuSevLRd70NZ37ZrpO6RHGHgEHvPg1h3S1Jug==", - "dev": true, - "optional": true - }, - "@esbuild/openbsd-x64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.9.tgz", - "integrity": "sha512-Ki6PlzppaFVbLnD8PtlVQfsYw4S9n3eQl87cqgeIw+O3sRr9IghpfSKY62mggdt1yCSZ8QWvTZ9jo9fjDSg9uw==", - "dev": true, - "optional": true - }, - "@esbuild/sunos-x64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.9.tgz", - "integrity": "sha512-MLHj7k9hWh4y1ddkBpvRj2b9NCBhfgBt3VpWbHQnXRedVun/hC7sIyTGDGTfsGuXo4ebik2+3ShjcPbhtFwWDw==", - "dev": true, - "optional": true - }, - "@esbuild/win32-arm64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.9.tgz", - "integrity": "sha512-GQoa6OrQ8G08guMFgeXPH7yE/8Dt0IfOGWJSfSH4uafwdC7rWwrfE6P9N8AtPGIjUzdo2+7bN8Xo3qC578olhg==", - "dev": true, - "optional": true - }, - "@esbuild/win32-ia32": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.9.tgz", - "integrity": "sha512-UOozV7Ntykvr5tSOlGCrqU3NBr3d8JqPes0QWN2WOXfvkWVGRajC+Ym0/Wj88fUgecUCLDdJPDF0Nna2UK3Qtg==", - "dev": true, - "optional": true - }, - "@esbuild/win32-x64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.9.tgz", - "integrity": "sha512-oxoQgglOP7RH6iasDrhY+R/3cHrfwIDvRlT4CGChflq6twk8iENeVvMJjmvBb94Ik1Z+93iGO27err7w6l54GQ==", - "dev": true, - "optional": true - }, "brace-expansion": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", @@ -26574,36 +26826,6 @@ "balanced-match": "^1.0.0" } }, - "esbuild": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.9.tgz", - "integrity": "sha512-U9CHtKSy+EpPsEBa+/A2gMs/h3ylBC0H0KSqIg7tpztHerLi6nrrcoUJAkNCEPumx8yJ+Byic4BVwHgRbN0TBg==", - "dev": true, - "requires": { - "@esbuild/android-arm": "0.19.9", - "@esbuild/android-arm64": "0.19.9", - "@esbuild/android-x64": "0.19.9", - "@esbuild/darwin-arm64": "0.19.9", - "@esbuild/darwin-x64": "0.19.9", - "@esbuild/freebsd-arm64": "0.19.9", - "@esbuild/freebsd-x64": "0.19.9", - "@esbuild/linux-arm": "0.19.9", - "@esbuild/linux-arm64": "0.19.9", - "@esbuild/linux-ia32": "0.19.9", - "@esbuild/linux-loong64": "0.19.9", - "@esbuild/linux-mips64el": "0.19.9", - "@esbuild/linux-ppc64": "0.19.9", - "@esbuild/linux-riscv64": "0.19.9", - "@esbuild/linux-s390x": "0.19.9", - "@esbuild/linux-x64": "0.19.9", - "@esbuild/netbsd-x64": "0.19.9", - "@esbuild/openbsd-x64": "0.19.9", - "@esbuild/sunos-x64": "0.19.9", - "@esbuild/win32-arm64": "0.19.9", - "@esbuild/win32-ia32": "0.19.9", - "@esbuild/win32-x64": "0.19.9" - } - }, "execa": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/execa/-/execa-6.1.0.tgz", @@ -26621,19 +26843,6 @@ "strip-final-newline": "^3.0.0" } }, - "fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - } - }, "glob": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", @@ -26680,9 +26889,9 @@ } }, "npm-run-path": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.2.0.tgz", - "integrity": "sha512-W4/tgAXFqFA0iL7fk0+uQ3g7wkL8xJmx3XdK0VGb4cHW//eZTtKGvFBBoRKVTpY7n6ze4NL9ly7rgXcHufqXKg==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", "dev": true, "requires": { "path-key": "^4.0.0" @@ -26919,24 +27128,30 @@ "@octokit/openapi-types": "^13.11.0" } }, + "@opentelemetry/api": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.8.0.tgz", + "integrity": "sha512-I/s6F7yKUDdtMsoBWXJe8Qz40Tui5vsuKCWJEWVL+5q9sSWRzzx6v2KeNsOBEwd94j0eWkpWCH4yB6rZg9Mf0w==", + "dev": true + }, "@parcel/watcher": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.3.0.tgz", - "integrity": "sha512-pW7QaFiL11O0BphO+bq3MgqeX/INAk9jgBldVDYjlQPO4VddoZnF22TcF9onMhnLVHuNqBJeRf+Fj7eezi/+rQ==", - "dev": true, - "requires": { - "@parcel/watcher-android-arm64": "2.3.0", - "@parcel/watcher-darwin-arm64": "2.3.0", - "@parcel/watcher-darwin-x64": "2.3.0", - "@parcel/watcher-freebsd-x64": "2.3.0", - "@parcel/watcher-linux-arm-glibc": "2.3.0", - "@parcel/watcher-linux-arm64-glibc": "2.3.0", - "@parcel/watcher-linux-arm64-musl": "2.3.0", - "@parcel/watcher-linux-x64-glibc": "2.3.0", - "@parcel/watcher-linux-x64-musl": "2.3.0", - "@parcel/watcher-win32-arm64": "2.3.0", - "@parcel/watcher-win32-ia32": "2.3.0", - "@parcel/watcher-win32-x64": "2.3.0", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.4.0.tgz", + "integrity": "sha512-XJLGVL0DEclX5pcWa2N9SX1jCGTDd8l972biNooLFtjneuGqodupPQh6XseXIBBeVIMaaJ7bTcs3qGvXwsp4vg==", + "dev": true, + "requires": { + "@parcel/watcher-android-arm64": "2.4.0", + "@parcel/watcher-darwin-arm64": "2.4.0", + "@parcel/watcher-darwin-x64": "2.4.0", + "@parcel/watcher-freebsd-x64": "2.4.0", + "@parcel/watcher-linux-arm-glibc": "2.4.0", + "@parcel/watcher-linux-arm64-glibc": "2.4.0", + "@parcel/watcher-linux-arm64-musl": "2.4.0", + "@parcel/watcher-linux-x64-glibc": "2.4.0", + "@parcel/watcher-linux-x64-musl": "2.4.0", + "@parcel/watcher-win32-arm64": "2.4.0", + "@parcel/watcher-win32-ia32": "2.4.0", + "@parcel/watcher-win32-x64": "2.4.0", "detect-libc": "^1.0.3", "is-glob": "^4.0.3", "micromatch": "^4.0.5", @@ -26952,72 +27167,72 @@ } }, "@parcel/watcher-android-arm64": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.3.0.tgz", - "integrity": "sha512-f4o9eA3dgk0XRT3XhB0UWpWpLnKgrh1IwNJKJ7UJek7eTYccQ8LR7XUWFKqw6aEq5KUNlCcGvSzKqSX/vtWVVA==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.4.0.tgz", + "integrity": "sha512-+fPtO/GsbYX1LJnCYCaDVT3EOBjvSFdQN9Mrzh9zWAOOfvidPWyScTrHIZHHfJBvlHzNA0Gy0U3NXFA/M7PHUA==", "dev": true, "optional": true }, "@parcel/watcher-darwin-arm64": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.3.0.tgz", - "integrity": "sha512-mKY+oijI4ahBMc/GygVGvEdOq0L4DxhYgwQqYAz/7yPzuGi79oXrZG52WdpGA1wLBPrYb0T8uBaGFo7I6rvSKw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.4.0.tgz", + "integrity": "sha512-T/At5pansFuQ8VJLRx0C6C87cgfqIYhW2N/kBfLCUvDhCah0EnLLwaD/6MW3ux+rpgkpQAnMELOCTKlbwncwiA==", "dev": true, "optional": true }, "@parcel/watcher-darwin-x64": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.3.0.tgz", - "integrity": "sha512-20oBj8LcEOnLE3mgpy6zuOq8AplPu9NcSSSfyVKgfOhNAc4eF4ob3ldj0xWjGGbOF7Dcy1Tvm6ytvgdjlfUeow==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.4.0.tgz", + "integrity": "sha512-vZMv9jl+szz5YLsSqEGCMSllBl1gU1snfbRL5ysJU03MEa6gkVy9OMcvXV1j4g0++jHEcvzhs3Z3LpeEbVmY6Q==", "dev": true, "optional": true }, "@parcel/watcher-freebsd-x64": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.3.0.tgz", - "integrity": "sha512-7LftKlaHunueAEiojhCn+Ef2CTXWsLgTl4hq0pkhkTBFI3ssj2bJXmH2L67mKpiAD5dz66JYk4zS66qzdnIOgw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.4.0.tgz", + "integrity": "sha512-dHTRMIplPDT1M0+BkXjtMN+qLtqq24sLDUhmU+UxxLP2TEY2k8GIoqIJiVrGWGomdWsy5IO27aDV1vWyQ6gfHA==", "dev": true, "optional": true }, "@parcel/watcher-linux-arm-glibc": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.3.0.tgz", - "integrity": "sha512-1apPw5cD2xBv1XIHPUlq0cO6iAaEUQ3BcY0ysSyD9Kuyw4MoWm1DV+W9mneWI+1g6OeP6dhikiFE6BlU+AToTQ==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.4.0.tgz", + "integrity": "sha512-9NQXD+qk46RwATNC3/UB7HWurscY18CnAPMTFcI9Y8CTbtm63/eex1SNt+BHFinEQuLBjaZwR2Lp+n7pmEJPpQ==", "dev": true, "optional": true }, "@parcel/watcher-linux-arm64-glibc": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.3.0.tgz", - "integrity": "sha512-mQ0gBSQEiq1k/MMkgcSB0Ic47UORZBmWoAWlMrTW6nbAGoLZP+h7AtUM7H3oDu34TBFFvjy4JCGP43JlylkTQA==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.4.0.tgz", + "integrity": "sha512-QuJTAQdsd7PFW9jNGaV9Pw+ZMWV9wKThEzzlY3Lhnnwy7iW23qtQFPql8iEaSFMCVI5StNNmONUopk+MFKpiKg==", "dev": true, "optional": true }, "@parcel/watcher-linux-arm64-musl": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.3.0.tgz", - "integrity": "sha512-LXZAExpepJew0Gp8ZkJ+xDZaTQjLHv48h0p0Vw2VMFQ8A+RKrAvpFuPVCVwKJCr5SE+zvaG+Etg56qXvTDIedw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.4.0.tgz", + "integrity": "sha512-oyN+uA9xcTDo/45bwsd6TFHa7Lc7hKujyMlvwrCLvSckvWogndCEoVYFNfZ6JJ2KNL/6fFiGPcbjp8jJmEh5Ng==", "dev": true, "optional": true }, "@parcel/watcher-linux-x64-glibc": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.3.0.tgz", - "integrity": "sha512-P7Wo91lKSeSgMTtG7CnBS6WrA5otr1K7shhSjKHNePVmfBHDoAOHYRXgUmhiNfbcGk0uMCHVcdbfxtuiZCHVow==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.4.0.tgz", + "integrity": "sha512-KphV8awJmxU3q52JQvJot0QMu07CIyEjV+2Tb2ZtbucEgqyRcxOBDMsqp1JNq5nuDXtcCC0uHQICeiEz38dPBQ==", "dev": true, "optional": true }, "@parcel/watcher-linux-x64-musl": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.3.0.tgz", - "integrity": "sha512-+kiRE1JIq8QdxzwoYY+wzBs9YbJ34guBweTK8nlzLKimn5EQ2b2FSC+tAOpq302BuIMjyuUGvBiUhEcLIGMQ5g==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.4.0.tgz", + "integrity": "sha512-7jzcOonpXNWcSijPpKD5IbC6xC7yTibjJw9jviVzZostYLGxbz8LDJLUnLzLzhASPlPGgpeKLtFUMjAAzM+gSA==", "dev": true, "optional": true }, "@parcel/watcher-wasm": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-wasm/-/watcher-wasm-2.3.0.tgz", - "integrity": "sha512-ejBAX8H0ZGsD8lSICDNyMbSEtPMWgDL0WFCt/0z7hyf5v8Imz4rAM8xY379mBsECkq/Wdqa5WEDLqtjZ+6NxfA==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-wasm/-/watcher-wasm-2.4.0.tgz", + "integrity": "sha512-MNgQ4WCbBybqQ97KwR/hqJGYTg3+s8qHpgIyFWB2qJOBvoJWbXuJGmm4ZkPLq2bMaANqCZqrXwmKYagZTkMKZA==", "dev": true, "requires": { "is-glob": "^4.0.3", @@ -27033,23 +27248,23 @@ } }, "@parcel/watcher-win32-arm64": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.3.0.tgz", - "integrity": "sha512-35gXCnaz1AqIXpG42evcoP2+sNL62gZTMZne3IackM+6QlfMcJLy3DrjuL6Iks7Czpd3j4xRBzez3ADCj1l7Aw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.4.0.tgz", + "integrity": "sha512-NOej2lqlq8bQNYhUMnOD0nwvNql8ToQF+1Zhi9ULZoG+XTtJ9hNnCFfyICxoZLXor4bBPTOnzs/aVVoefYnjIg==", "dev": true, "optional": true }, "@parcel/watcher-win32-ia32": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.3.0.tgz", - "integrity": "sha512-FJS/IBQHhRpZ6PiCjFt1UAcPr0YmCLHRbTc00IBTrelEjlmmgIVLeOx4MSXzx2HFEy5Jo5YdhGpxCuqCyDJ5ow==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.4.0.tgz", + "integrity": "sha512-IO/nM+K2YD/iwjWAfHFMBPz4Zqn6qBDqZxY4j2n9s+4+OuTSRM/y/irksnuqcspom5DjkSeF9d0YbO+qpys+JA==", "dev": true, "optional": true }, "@parcel/watcher-win32-x64": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.3.0.tgz", - "integrity": "sha512-dLx+0XRdMnVI62kU3wbXvbIRhLck4aE28bIGKbRGS7BJNt54IIj9+c/Dkqb+7DJEbHUZAX1bwaoM8PqVlHJmCA==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.4.0.tgz", + "integrity": "sha512-pAUyUVjfFjWaf/pShmJpJmNxZhbMvJASUpdes9jL6bTEJ+gDxPRSpXTIemNyNsb9AtbiGXs9XduP1reThmd+dA==", "dev": true, "optional": true }, @@ -27268,9 +27483,9 @@ } }, "@types/normalize-package-data": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", - "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", + "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", "dev": true }, "@types/qs": { @@ -27617,15 +27832,22 @@ } }, "acorn": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", "dev": true }, + "acorn-import-attributes": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.2.tgz", + "integrity": "sha512-O+nfJwNolEA771IYJaiLWK1UAwjNsQmZbTRqqwBYxCgVQTmpFEMvBw6LOIQV0Me339L5UMVYFyRohGnGlQDdIQ==", + "dev": true, + "requires": {} + }, "acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", + "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", "dev": true }, "agent-base": { @@ -27741,13 +27963,10 @@ } }, "ansi-escapes": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.2.0.tgz", - "integrity": "sha512-kzRaCqXnpzWs+3z5ABPQiVke+iq0KXkHo8xiWV4RPTi5Yli0l97BEQuhXV1s7+aSU/fu1kUuxgS4MsQ0fRuygw==", - "dev": true, - "requires": { - "type-fest": "^3.0.0" - } + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.2.1.tgz", + "integrity": "sha512-4nJ3yixlEthEJ9Rk4vPcdBRkZvQZlYyu8j4/Mqz5sgIkddmEnH2Yj2ZrnP9S3tQOvSNRUIgVNF/1yPpRAGNRig==", + "dev": true }, "ansi-regex": { "version": "5.0.1", @@ -27794,12 +28013,6 @@ "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", "dev": true }, - "arch": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", - "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==", - "dev": true - }, "archiver": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/archiver/-/archiver-6.0.1.tgz", @@ -28149,74 +28362,6 @@ "integrity": "sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w==", "dev": true }, - "body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", - "dev": true, - "requires": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.1", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true - }, - "http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dev": true, - "requires": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", - "dev": true, - "requires": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - } - } - } - }, "boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", @@ -28441,9 +28586,9 @@ "dev": true }, "citty": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/citty/-/citty-0.1.4.tgz", - "integrity": "sha512-Q3bK1huLxzQrvj7hImJ7Z1vKYJRPQCDnd0EjXfHMidcjecGOMuLrmuQmtWmFkuKLcMThlGh1yCKG8IEc6VeNXQ==", + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/citty/-/citty-0.1.6.tgz", + "integrity": "sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==", "dev": true, "requires": { "consola": "^3.2.3" @@ -28576,14 +28721,84 @@ "dev": true }, "clipboardy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-3.0.0.tgz", - "integrity": "sha512-Su+uU5sr1jkUy1sGRpLKjKrvEOVXgSgiSInwa/qeID6aJ07yh+5NWc3h2QfjHjBnfX4LhtFcuAWKUsJ3r+fjbg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-4.0.0.tgz", + "integrity": "sha512-5mOlNS0mhX0707P2I0aZ2V/cmHUEO/fL7VFLqszkhUsxt7RwnmrInf/eEQKlf5GzvYeHIjT+Ov1HRfNmymlG0w==", "dev": true, "requires": { - "arch": "^2.2.0", - "execa": "^5.1.1", - "is-wsl": "^2.2.0" + "execa": "^8.0.1", + "is-wsl": "^3.1.0", + "is64bit": "^2.0.0" + }, + "dependencies": { + "execa": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + } + }, + "get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "dev": true + }, + "human-signals": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", + "dev": true + }, + "is-wsl": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", + "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", + "dev": true, + "requires": { + "is-inside-container": "^1.0.0" + } + }, + "npm-run-path": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.2.0.tgz", + "integrity": "sha512-W4/tgAXFqFA0iL7fk0+uQ3g7wkL8xJmx3XdK0VGb4cHW//eZTtKGvFBBoRKVTpY7n6ze4NL9ly7rgXcHufqXKg==", + "dev": true, + "requires": { + "path-key": "^4.0.0" + } + }, + "onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "requires": { + "mimic-fn": "^4.0.0" + } + }, + "signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true + }, + "strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true + } } }, "clone": { @@ -29175,6 +29390,12 @@ } } }, + "crossws": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/crossws/-/crossws-0.1.1.tgz", + "integrity": "sha512-c9c/o7bS3OjsdpSkvexpka0JNlesBF2JU9B2V1yNsYGwRbAafxhJQ7VI9b48D5bpONz/oxbPGMzBojy9sXoQIQ==", + "dev": true + }, "crypto-random-string": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", @@ -29413,9 +29634,9 @@ } }, "defu": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.3.tgz", - "integrity": "sha512-Vy2wmG3NTkmHNg/kzpuvHhkqeIx3ODWqasgCRbKtbXEN0G+HpEEv9BtJLp7ZG1CZloFaC41Ah3ZFbq7aqCqMeQ==", + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz", + "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==", "dev": true }, "delegates": { @@ -29707,6 +29928,37 @@ "integrity": "sha512-HBL8I3mIki5C1Cc9QjKUenHtnG0A5/xA8Q/AllRcfiwl2CZFXGK7ddBiCoRwAix4i2KxcQfjtIVcrVbB3vbmwg==", "dev": true }, + "esbuild": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.11.tgz", + "integrity": "sha512-HJ96Hev2hX/6i5cDVwcqiJBBtuo9+FeIJOtZ9W1kA5M6AMJRHUZlpYZ1/SbEwtO0ioNAW8rUooVpC/WehY2SfA==", + "dev": true, + "requires": { + "@esbuild/aix-ppc64": "0.19.11", + "@esbuild/android-arm": "0.19.11", + "@esbuild/android-arm64": "0.19.11", + "@esbuild/android-x64": "0.19.11", + "@esbuild/darwin-arm64": "0.19.11", + "@esbuild/darwin-x64": "0.19.11", + "@esbuild/freebsd-arm64": "0.19.11", + "@esbuild/freebsd-x64": "0.19.11", + "@esbuild/linux-arm": "0.19.11", + "@esbuild/linux-arm64": "0.19.11", + "@esbuild/linux-ia32": "0.19.11", + "@esbuild/linux-loong64": "0.19.11", + "@esbuild/linux-mips64el": "0.19.11", + "@esbuild/linux-ppc64": "0.19.11", + "@esbuild/linux-riscv64": "0.19.11", + "@esbuild/linux-s390x": "0.19.11", + "@esbuild/linux-x64": "0.19.11", + "@esbuild/netbsd-x64": "0.19.11", + "@esbuild/openbsd-x64": "0.19.11", + "@esbuild/sunos-x64": "0.19.11", + "@esbuild/win32-arm64": "0.19.11", + "@esbuild/win32-ia32": "0.19.11", + "@esbuild/win32-x64": "0.19.11" + } + }, "escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -29932,17 +30184,17 @@ "dev": true }, "express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.19.1.tgz", + "integrity": "sha512-K4w1/Bp7y8iSiVObmCrtq8Cs79XjJc/RU2YYkZQ7wpUu5ZyZ7MtPHkqoMz4pf+mgXfNvo2qft8D9OnrH2ABk9w==", "dev": true, "requires": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.1", + "body-parser": "1.20.2", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.5.0", + "cookie": "0.6.0", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", @@ -29970,6 +30222,32 @@ "vary": "~1.1.2" }, "dependencies": { + "body-parser": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "dev": true, + "requires": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + } + }, + "cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "dev": true + }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -30163,9 +30441,9 @@ "dev": true }, "fast-glob": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", - "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dev": true, "requires": { "@nodelib/fs.stat": "^2.0.2", @@ -30671,6 +30949,12 @@ } } }, + "find-up-simple": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/find-up-simple/-/find-up-simple-1.0.0.tgz", + "integrity": "sha512-q7Us7kcjj2VMePAa02hDAF6d+MzsdsAWEwYyOpwUtlerRBkOEPBCRZrAV4XfcSN8fHAgaD0hP7miwoay6DCprw==", + "dev": true + }, "flush-write-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-2.0.0.tgz", @@ -30813,9 +31097,9 @@ "dev": true }, "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, "optional": true }, @@ -30899,9 +31183,9 @@ "dev": true }, "get-port-please": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/get-port-please/-/get-port-please-3.1.1.tgz", - "integrity": "sha512-3UBAyM3u4ZBVYDsxOQfJDxEa6XTbpBDrOjp4mf7ExFRt5BKs/QywQQiJsh2B+hxcZLSapWqCRvElUe8DnKcFHA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/get-port-please/-/get-port-please-3.1.2.tgz", + "integrity": "sha512-Gxc29eLs1fbn6LQ4jSU4vXjlwyZhF5HsGuMAa7gqBP4Rw4yxxltyDUuF5MBclFzDTXO+ACchGQoeela4DSfzdQ==", "dev": true }, "get-stream": { @@ -31040,19 +31324,20 @@ "dev": true }, "h3": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/h3/-/h3-1.8.2.tgz", - "integrity": "sha512-1Ca0orJJlCaiFY68BvzQtP2lKLk46kcLAxVM8JgYbtm2cUg6IY7pjpYgWMwUvDO9QI30N5JAukOKoT8KD3Q0PQ==", + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/h3/-/h3-1.10.1.tgz", + "integrity": "sha512-UBAUp47hmm4BB5/njB4LrEa9gpuvZj4/Qf/ynSMzO6Ku2RXaouxEfiG2E2IFnv6fxbhAkzjasDxmo6DFdEeXRg==", "dev": true, "requires": { "cookie-es": "^1.0.0", - "defu": "^6.1.2", - "destr": "^2.0.1", - "iron-webcrypto": "^0.10.1", + "defu": "^6.1.4", + "destr": "^2.0.2", + "iron-webcrypto": "^1.0.0", + "ohash": "^1.1.3", "radix3": "^1.1.0", - "ufo": "^1.3.0", + "ufo": "^1.3.2", "uncrypto": "^0.1.3", - "unenv": "^1.7.4" + "unenv": "^1.9.0" } }, "has": { @@ -31334,6 +31619,12 @@ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", "dev": true }, + "index-to-position": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/index-to-position/-/index-to-position-0.1.2.tgz", + "integrity": "sha512-MWDKS3AS1bGCHLBA2VLImJz42f7bJh8wQsTGCzI3j519/CASStoDONUBVz2I/VID0MpiX3SGSnbOD2xUalbE5g==", + "dev": true + }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -31589,33 +31880,68 @@ "dev": true }, "ipx": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ipx/-/ipx-2.0.1.tgz", - "integrity": "sha512-+EyZiVNosYr3hu3F5+5GripTBLjKmSPTvcy3YdT4zxlhqHQJ2gUopLGxpfv9Wd11YgeiPh53ysbtG+ZNIOVF4A==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ipx/-/ipx-2.1.0.tgz", + "integrity": "sha512-AVnPGXJ8L41vjd11Z4akIF2yd14636Klxul3tBySxHA6PKfCOQPxBDkCFK5zcWh0z/keR6toh1eg8qzdBVUgdA==", "dev": true, "requires": { "@fastify/accept-negotiator": "^1.1.0", - "citty": "^0.1.4", + "citty": "^0.1.5", "consola": "^3.2.3", - "defu": "^6.1.3", + "defu": "^6.1.4", "destr": "^2.0.2", "etag": "^1.8.1", - "h3": "^1.8.2", + "h3": "^1.10.0", "image-meta": "^0.2.0", - "listhen": "^1.5.5", + "listhen": "^1.5.6", "ofetch": "^1.3.3", - "pathe": "^1.1.1", + "pathe": "^1.1.2", "sharp": "^0.32.6", - "svgo": "^3.0.2", - "ufo": "^1.3.1", - "unstorage": "^1.9.0", + "svgo": "^3.2.0", + "ufo": "^1.3.2", + "unstorage": "^1.10.1", "xss": "^1.0.14" + }, + "dependencies": { + "@netlify/blobs": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@netlify/blobs/-/blobs-6.5.0.tgz", + "integrity": "sha512-wRFlNnL/Qv3WNLZd3OT/YYqF1zb6iPSo8T31sl9ccL1ahBxW1fBqKgF4b1XL7Z+6mRIkatvcsVPkWBcO+oJMNA==", + "dev": true, + "optional": true, + "peer": true + }, + "lru-cache": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", + "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", + "dev": true + }, + "unstorage": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/unstorage/-/unstorage-1.10.1.tgz", + "integrity": "sha512-rWQvLRfZNBpF+x8D3/gda5nUCQL2PgXy2jNG4U7/Rc9BGEv9+CAJd0YyGCROUBKs9v49Hg8huw3aih5Bf5TAVw==", + "dev": true, + "requires": { + "anymatch": "^3.1.3", + "chokidar": "^3.5.3", + "destr": "^2.0.2", + "h3": "^1.8.2", + "ioredis": "^5.3.2", + "listhen": "^1.5.5", + "lru-cache": "^10.0.2", + "mri": "^1.2.0", + "node-fetch-native": "^1.4.1", + "ofetch": "^1.3.3", + "ufo": "^1.3.1" + } + } } }, "iron-webcrypto": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/iron-webcrypto/-/iron-webcrypto-0.10.1.tgz", - "integrity": "sha512-QGOS8MRMnj/UiOa+aMIgfyHcvkhqNUsUxb1XzskENvbo+rEfp6TOwqd1KPuDzXC4OnGHcMSVxDGRoilqB8ViqA==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/iron-webcrypto/-/iron-webcrypto-1.0.0.tgz", + "integrity": "sha512-anOK1Mktt8U1Xi7fCM3RELTuYbnFikQY5VtrDj7kPgpejV7d43tWKhzgioO0zpkazLEL/j/iayRqnJhrGfqUsg==", "dev": true }, "is-accessor-descriptor": { @@ -31741,6 +32067,15 @@ "is-extglob": "^2.1.1" } }, + "is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "dev": true, + "requires": { + "is-docker": "^3.0.0" + } + }, "is-installed-globally": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", @@ -31863,6 +32198,15 @@ "integrity": "sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ==", "dev": true }, + "is64bit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is64bit/-/is64bit-2.0.0.tgz", + "integrity": "sha512-jv+8jaWCl0g2lSBkNSVXdzfBA0npK1HGC2KtWM9FumFRoGS94g3NbCCLVnCYHLjp4GrW2KZeeSTMo5ddtznmGw==", + "dev": true, + "requires": { + "system-architecture": "^0.1.0" + } + }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -32011,15 +32355,21 @@ "dev": true }, "jsonwebtoken": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.1.tgz", - "integrity": "sha512-K8wx7eJ5TPvEjuiVSkv167EVboBDv9PZdDoF7BgeQnBLVvZWW9clr2PsQHVJDTKaEIH5JBIwHujGcHp7GgI2eg==", + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", + "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", "dev": true, "requires": { "jws": "^3.2.2", - "lodash": "^4.17.21", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", "ms": "^2.1.1", - "semver": "^7.3.8" + "semver": "^7.5.4" } }, "junk": { @@ -32202,27 +32552,28 @@ "dev": true }, "listhen": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/listhen/-/listhen-1.5.5.tgz", - "integrity": "sha512-LXe8Xlyh3gnxdv4tSjTjscD1vpr/2PRpzq8YIaMJgyKzRG8wdISlWVWnGThJfHnlJ6hmLt2wq1yeeix0TEbuoA==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/listhen/-/listhen-1.6.0.tgz", + "integrity": "sha512-z0RcEXVX5oTpY1bO02SKoTU/kmZSrFSngNNzHRM6KICR17PTq7ANush6AE6ztGJwJD4RLpBrVHd9GnV51J7s3w==", "dev": true, "requires": { - "@parcel/watcher": "^2.3.0", - "@parcel/watcher-wasm": "2.3.0", - "citty": "^0.1.4", - "clipboardy": "^3.0.0", + "@parcel/watcher": "^2.4.0", + "@parcel/watcher-wasm": "2.4.0", + "citty": "^0.1.5", + "clipboardy": "^4.0.0", "consola": "^3.2.3", - "defu": "^6.1.2", - "get-port-please": "^3.1.1", - "h3": "^1.8.1", + "crossws": "^0.1.0", + "defu": "^6.1.4", + "get-port-please": "^3.1.2", + "h3": "^1.10.1", "http-shutdown": "^1.2.2", - "jiti": "^1.20.0", - "mlly": "^1.4.2", + "jiti": "^1.21.0", + "mlly": "^1.5.0", "node-forge": "^1.3.1", - "pathe": "^1.1.1", - "std-env": "^3.4.3", - "ufo": "^1.3.0", - "untun": "^0.1.2", + "pathe": "^1.1.2", + "std-env": "^3.7.0", + "ufo": "^1.3.2", + "untun": "^0.1.3", "uqr": "^0.1.2" } }, @@ -32335,24 +32686,60 @@ "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==", "dev": true }, + "lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==", + "dev": true + }, "lodash.isarguments": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", "integrity": "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==", "dev": true }, + "lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==", + "dev": true + }, "lodash.isempty": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.isempty/-/lodash.isempty-4.4.0.tgz", "integrity": "sha1-b4bL7di+TsmHvpqvM8loTbGzHn4=", "dev": true }, + "lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==", + "dev": true + }, + "lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==", + "dev": true + }, "lodash.isplainobject": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=", "dev": true }, + "lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", + "dev": true + }, + "lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", + "dev": true + }, "lodash.transform": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.transform/-/lodash.transform-4.6.0.tgz", @@ -32812,15 +33199,15 @@ "dev": true }, "mlly": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.4.2.tgz", - "integrity": "sha512-i/Ykufi2t1EZ6NaPLdfnZk2AX8cs0d+mTzVKuPfqPKPatxLApaBoxJQ9x1/uckXtrS/U5oisPMDkNs0yQTaBRg==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.5.0.tgz", + "integrity": "sha512-NPVQvAY1xr1QoVeG0cy8yUYC7FQcOx6evl/RjT1wL5FvzPnzOysoqB/jmx/DhssT2dYa8nxECLAaFI/+gVLhDQ==", "dev": true, "requires": { - "acorn": "^8.10.0", - "pathe": "^1.1.1", + "acorn": "^8.11.3", + "pathe": "^1.1.2", "pkg-types": "^1.0.3", - "ufo": "^1.3.0" + "ufo": "^1.3.2" } }, "module-definition": { @@ -32905,9 +33292,9 @@ "optional": true }, "nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", "dev": true }, "nanomatch": { @@ -32948,12 +33335,12 @@ "dev": true }, "netlify": { - "version": "13.1.12", - "resolved": "https://registry.npmjs.org/netlify/-/netlify-13.1.12.tgz", - "integrity": "sha512-SNS/ANjR+DE71MTi4ke0ejYEvM6uY676NPluueUhvW9mZCR4tLwb2vahqzIKML5WQ1Dx+xRtOJYVAnUkJag/6w==", + "version": "13.1.14", + "resolved": "https://registry.npmjs.org/netlify/-/netlify-13.1.14.tgz", + "integrity": "sha512-7vSq6so7lPjr3HEpjbtLyde0F3IXOzD0ocJs3s2wnJR+nX+8pWOAVGe+KN6S98odsClJBJxCkWG2rLjTBzW9pw==", "dev": true, "requires": { - "@netlify/open-api": "^2.26.0", + "@netlify/open-api": "^2.28.0", "lodash-es": "^4.17.21", "micro-api-client": "^3.3.0", "node-fetch": "^3.0.0", @@ -32991,17 +33378,17 @@ } }, "netlify-headers-parser": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/netlify-headers-parser/-/netlify-headers-parser-7.1.3.tgz", - "integrity": "sha512-0iR1iWbknBLv6T7zzmMR2AtfO7G/0lMajRyAX3SXhc3U3MqpXsElXinWZteMWM7KeGb7PePQgEalEkk2T6kXSw==", + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/netlify-headers-parser/-/netlify-headers-parser-7.1.4.tgz", + "integrity": "sha512-fTVQf8u65vS4YTP2Qt1K6Np01q3yecRKXf6VMONMlWbfl5n3M/on7pZlZISNAXHNOtnVt+6Kpwfl+RIeALC8Kg==", "dev": true, "requires": { + "@iarna/toml": "^2.2.5", "escape-string-regexp": "^5.0.0", "fast-safe-stringify": "^2.0.7", "is-plain-obj": "^4.0.0", "map-obj": "^5.0.0", - "path-exists": "^5.0.0", - "toml": "^3.0.0" + "path-exists": "^5.0.0" }, "dependencies": { "escape-string-regexp": { @@ -33025,16 +33412,16 @@ } }, "netlify-redirect-parser": { - "version": "14.2.1", - "resolved": "https://registry.npmjs.org/netlify-redirect-parser/-/netlify-redirect-parser-14.2.1.tgz", - "integrity": "sha512-poQgLGh+YATMHatzf/1TaWcbKQIBhszebhJV7btc6Ysw4xmnUedaE8nCscfdDH2PygT6Y+IHZkyMU4gvTFffVA==", + "version": "14.2.2", + "resolved": "https://registry.npmjs.org/netlify-redirect-parser/-/netlify-redirect-parser-14.2.2.tgz", + "integrity": "sha512-LS3cbHZfATtfZFeJr8RLBREAjCE1rEG1CybKnA6dTLgXez0lGJE/QTPzjn6GqfNmiMowo15YQe4+UjRhbzQ04w==", "dev": true, "requires": { + "@iarna/toml": "^2.2.5", "fast-safe-stringify": "^2.1.1", "filter-obj": "^5.0.0", "is-plain-obj": "^4.0.0", - "path-exists": "^5.0.0", - "toml": "^3.0.0" + "path-exists": "^5.0.0" }, "dependencies": { "path-exists": { @@ -33061,9 +33448,9 @@ } }, "node-addon-api": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.0.0.tgz", - "integrity": "sha512-vgbBJTS4m5/KkE16t5Ly0WW9hz46swAstv0hYYwMtbG7AznRhNyfLRe8HZAiWIpcHzoO7HxhLuBQj9rJ/Ho0ZA==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.0.tgz", + "integrity": "sha512-mNcltoe1R8o7STTegSOHdnJNN7s5EUvhoS7ShnTHDyOSd+8H+UdWODq6qSv67PjC8Zc5JRT8+oLAMCr0SIXw7g==", "dev": true }, "node-domexception": { @@ -33082,9 +33469,9 @@ } }, "node-fetch-native": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.4.1.tgz", - "integrity": "sha512-NsXBU0UgBxo2rQLOeWNZqS3fvflWePMECr8CoSWoSTqCqGbVVsvl9vZu1HfQicYN0g5piV9Gh8RTEvo/uP752w==", + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.2.tgz", + "integrity": "sha512-69mtXOFZ6hSkYiXAVB5SqaRvrbITC/NPyqv7yuu/qw0nmgPyYbIMYYNIDhNtwPrzk0ptrimrLz/hhjvm4w5Z+w==", "dev": true }, "node-forge": { @@ -33300,6 +33687,12 @@ "ufo": "^1.3.0" } }, + "ohash": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/ohash/-/ohash-1.1.3.tgz", + "integrity": "sha512-zuHHiGTYTA1sYJ/wZN+t5HKZaH23i4yI1HMwbuXm24Nid7Dv0KcuRlKoNKS9UNfAVSBlnGLcuQrnOKWOZoEGaw==", + "dev": true + }, "omit.js": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/omit.js/-/omit.js-2.0.2.tgz", @@ -33748,9 +34141,9 @@ "dev": true }, "pathe": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.1.tgz", - "integrity": "sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", "dev": true }, "peek-readable": { @@ -33795,12 +34188,12 @@ "dev": true }, "postcss": { - "version": "8.4.31", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", - "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "version": "8.4.33", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.33.tgz", + "integrity": "sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg==", "dev": true, "requires": { - "nanoid": "^3.3.6", + "nanoid": "^3.3.7", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" } @@ -34122,6 +34515,76 @@ "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", "dev": true }, + "read-package-up": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/read-package-up/-/read-package-up-11.0.0.tgz", + "integrity": "sha512-MbgfoNPANMdb4oRBNg5eqLbB2t2r+o5Ua1pNt8BqGp4I0FJZhuVSOj3PaBPni4azWuSzEdNn2evevzVmEk1ohQ==", + "dev": true, + "requires": { + "find-up-simple": "^1.0.0", + "read-pkg": "^9.0.0", + "type-fest": "^4.6.0" + }, + "dependencies": { + "hosted-git-info": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.1.tgz", + "integrity": "sha512-+K84LB1DYwMHoHSgaOY/Jfhw3ucPmSET5v98Ke/HdNSw4a0UktWzyW1mjhjpuxxTqOOsfWT/7iVshHmVZ4IpOA==", + "dev": true, + "requires": { + "lru-cache": "^10.0.1" + } + }, + "lru-cache": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", + "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", + "dev": true + }, + "normalize-package-data": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.0.tgz", + "integrity": "sha512-UL7ELRVxYBHBgYEtZCXjxuD5vPxnmvMGq0jp/dGPKKrN7tfsBh2IY7TlJ15WWwdjRWD3RJbnsygUurTK3xkPkg==", + "dev": true, + "requires": { + "hosted-git-info": "^7.0.0", + "is-core-module": "^2.8.1", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" + } + }, + "parse-json": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-8.1.0.tgz", + "integrity": "sha512-rum1bPifK5SSar35Z6EKZuYPJx85pkNaFrxBK3mwdfSJ1/WKbYrjoW/zTPSjRRamfmVX1ACBIdFAO0VRErW/EA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.22.13", + "index-to-position": "^0.1.2", + "type-fest": "^4.7.1" + } + }, + "read-pkg": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-9.0.1.tgz", + "integrity": "sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA==", + "dev": true, + "requires": { + "@types/normalize-package-data": "^2.4.3", + "normalize-package-data": "^6.0.0", + "parse-json": "^8.0.0", + "type-fest": "^4.6.0", + "unicorn-magic": "^0.1.0" + } + }, + "type-fest": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.12.0.tgz", + "integrity": "sha512-5Y2/pp2wtJk8o08G0CMkuFPCO354FGwk/vbidxrdhRGZfd0tFnb4Qb8anp9XxXriwBgVPjdWbKpGl4J9lJY2jQ==", + "dev": true + } + } + }, "read-pkg-up": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-9.1.0.tgz", @@ -34253,12 +34716,6 @@ } } }, - "regexp-tree": { - "version": "0.1.24", - "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.24.tgz", - "integrity": "sha512-s2aEVuLhvnVJW6s/iPgEGK6R+/xngd2jNQ+xy4bXNDKxZKJH6jpPHY6kVeVv1IeLCHgswRj+Kl3ELaDjG6V1iw==", - "dev": true - }, "registry-auth-token": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.0.2.tgz", @@ -35062,9 +35519,9 @@ "dev": true }, "std-env": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.4.3.tgz", - "integrity": "sha512-f9aPhy8fYBuMN+sNfakZV18U39PbalgjXG3lLB9WkaYTxijru61wb57V9wxxNthXM5Sd88ETBWi29qLAsHO52Q==", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.7.0.tgz", + "integrity": "sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==", "dev": true }, "stdin-discarder": { @@ -35237,15 +35694,16 @@ "dev": true }, "svgo": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.0.2.tgz", - "integrity": "sha512-Z706C1U2pb1+JGP48fbazf3KxHrWOsLme6Rv7imFBn5EnuanDW1GPaA/P1/dvObE670JDePC3mnj0k0B7P0jjQ==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.2.0.tgz", + "integrity": "sha512-4PP6CMW/V7l/GmKRKzsLR8xxjdHTV4IMvhTnpuHwwBazSIlw5W/5SmPjN8Dwyt7lKbSJrRDgp4t9ph0HgChFBQ==", "dev": true, "requires": { "@trysound/sax": "0.2.0", "commander": "^7.2.0", "css-select": "^5.1.0", - "css-tree": "^2.2.1", + "css-tree": "^2.3.1", + "css-what": "^6.1.0", "csso": "^5.0.5", "picocolors": "^1.0.0" }, @@ -35258,6 +35716,12 @@ } } }, + "system-architecture": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/system-architecture/-/system-architecture-0.1.0.tgz", + "integrity": "sha512-ulAk51I9UVUyJgxlv9M6lFot2WP3e7t8Kz9+IS6D4rVba1tR9kON+Ey69f+1R4Q8cd45Lod6a4IcJIxnzGc/zA==", + "dev": true + }, "tabtab": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/tabtab/-/tabtab-3.0.2.tgz", @@ -35662,12 +36126,6 @@ "safe-buffer": "^5.0.1" } }, - "type-fest": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", - "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==", - "dev": true - }, "type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", @@ -35694,9 +36152,9 @@ "dev": true }, "ufo": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.3.1.tgz", - "integrity": "sha512-uY/99gMLIOlJPwATcMVYfqDSxUR9//AUcgZMzwfSTJPDKzA1S8mX4VLqa+fiAtveraQUBCz4FFcwVZBGbwBXIw==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.4.0.tgz", + "integrity": "sha512-Hhy+BhRBleFjpJ2vchUNN40qgkh0366FWJGqVLYBHev0vpHTrXSA0ryT+74UiW6KWsldNurQMKGqCm1M2zBciQ==", "dev": true }, "uid-safe": { @@ -35737,15 +36195,15 @@ "dev": true }, "unenv": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/unenv/-/unenv-1.7.4.tgz", - "integrity": "sha512-fjYsXYi30It0YCQYqLOcT6fHfMXsBr2hw9XC7ycf8rTG7Xxpe3ZssiqUnD0khrjiZEmkBXWLwm42yCSCH46fMw==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/unenv/-/unenv-1.9.0.tgz", + "integrity": "sha512-QKnFNznRxmbOF1hDgzpqrlIf6NC5sbZ2OJ+5Wl3OX8uM+LUJXbj4TXvLJCtwbPTmbMHCLIz6JLKNinNsMShK9g==", "dev": true, "requires": { "consola": "^3.2.3", - "defu": "^6.1.2", + "defu": "^6.1.3", "mime": "^3.0.0", - "node-fetch-native": "^1.4.0", + "node-fetch-native": "^1.6.1", "pathe": "^1.1.1" }, "dependencies": { @@ -35757,6 +36215,12 @@ } } }, + "unicorn-magic": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", + "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", + "dev": true + }, "union-value": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", @@ -35869,33 +36333,6 @@ } } }, - "unstorage": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/unstorage/-/unstorage-1.9.0.tgz", - "integrity": "sha512-VpD8ZEYc/le8DZCrny3bnqKE4ZjioQxBRnWE+j5sGNvziPjeDlaS1NaFFHzl/kkXaO3r7UaF8MGQrs14+1B4pQ==", - "dev": true, - "requires": { - "anymatch": "^3.1.3", - "chokidar": "^3.5.3", - "destr": "^2.0.1", - "h3": "^1.7.1", - "ioredis": "^5.3.2", - "listhen": "^1.2.2", - "lru-cache": "^10.0.0", - "mri": "^1.2.0", - "node-fetch-native": "^1.2.0", - "ofetch": "^1.1.1", - "ufo": "^1.2.0" - }, - "dependencies": { - "lru-cache": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.1.tgz", - "integrity": "sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==", - "dev": true - } - } - }, "untildify": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/untildify/-/untildify-3.0.3.tgz", @@ -35903,12 +36340,12 @@ "dev": true }, "untun": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/untun/-/untun-0.1.2.tgz", - "integrity": "sha512-wLAMWvxfqyTiBODA1lg3IXHQtjggYLeTK7RnSfqtOXixWJ3bAa2kK/HHmOOg19upteqO3muLvN6O/icbyQY33Q==", + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/untun/-/untun-0.1.3.tgz", + "integrity": "sha512-4luGP9LMYszMRZwsvyUd9MrxgEGZdZuZgpVQHEEX0lCYFESasVRvZd0EYpCkOIbJKHMuv0LskpXc/8Un+MJzEQ==", "dev": true, "requires": { - "citty": "^0.1.3", + "citty": "^0.1.5", "consola": "^3.2.3", "pathe": "^1.1.1" } @@ -36525,7 +36962,7 @@ "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dev": true, "requires": { "wrappy": "1" @@ -36565,12 +37002,6 @@ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, "path-key": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", @@ -36598,6 +37029,12 @@ "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", "dev": true }, + "perfect-debounce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz", + "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==", + "dev": true + }, "picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", @@ -36623,28 +37060,20 @@ "dev": true }, "postcss": { - "version": "8.4.33", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.33.tgz", - "integrity": "sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg==", + "version": "8.4.38", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", + "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", "dev": true, "requires": { "nanoid": "^3.3.7", "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "dependencies": { - "nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", - "dev": true - } + "source-map-js": "^1.2.0" } }, "preact": { - "version": "10.19.3", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.19.3.tgz", - "integrity": "sha512-nHHTeFVBTHRGxJXKkKu5hT8C/YWBkPso4/Gad6xuj5dbptt9iF9NZr9pHbPhBrnT2klheu7mHTxTZ/LjwJiEiQ==", + "version": "10.20.1", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.20.1.tgz", + "integrity": "sha512-JIFjgFg9B2qnOoGiYMVBtrcFxHqn+dNXbq76bVmcaHYJFYR4lW67AOcXgAYQQTDYXDOg/kTZrKPNCdRgJ2UJmw==", "dev": true }, "randombytes": { @@ -36693,6 +37122,12 @@ "supports-preserve-symlinks-flag": "^1.0.0" } }, + "rfdc": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.1.tgz", + "integrity": "sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==", + "dev": true + }, "robust-predicates": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.1.tgz", @@ -36700,24 +37135,25 @@ "dev": true }, "rollup": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.9.5.tgz", - "integrity": "sha512-E4vQW0H/mbNMw2yLSqJyjtkHY9dslf/p0zuT1xehNRqUTBOFMqEjguDvqhXr7N7r/4ttb2jr4T41d3dncmIgbQ==", + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.13.1.tgz", + "integrity": "sha512-hFi+fU132IvJ2ZuihN56dwgpltpmLZHZWsx27rMCTZ2sYwrqlgL5sECGy1eeV2lAihD8EzChBVVhsXci0wD4Tg==", "dev": true, "requires": { - "@rollup/rollup-android-arm-eabi": "4.9.5", - "@rollup/rollup-android-arm64": "4.9.5", - "@rollup/rollup-darwin-arm64": "4.9.5", - "@rollup/rollup-darwin-x64": "4.9.5", - "@rollup/rollup-linux-arm-gnueabihf": "4.9.5", - "@rollup/rollup-linux-arm64-gnu": "4.9.5", - "@rollup/rollup-linux-arm64-musl": "4.9.5", - "@rollup/rollup-linux-riscv64-gnu": "4.9.5", - "@rollup/rollup-linux-x64-gnu": "4.9.5", - "@rollup/rollup-linux-x64-musl": "4.9.5", - "@rollup/rollup-win32-arm64-msvc": "4.9.5", - "@rollup/rollup-win32-ia32-msvc": "4.9.5", - "@rollup/rollup-win32-x64-msvc": "4.9.5", + "@rollup/rollup-android-arm-eabi": "4.13.1", + "@rollup/rollup-android-arm64": "4.13.1", + "@rollup/rollup-darwin-arm64": "4.13.1", + "@rollup/rollup-darwin-x64": "4.13.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.13.1", + "@rollup/rollup-linux-arm64-gnu": "4.13.1", + "@rollup/rollup-linux-arm64-musl": "4.13.1", + "@rollup/rollup-linux-riscv64-gnu": "4.13.1", + "@rollup/rollup-linux-s390x-gnu": "4.13.1", + "@rollup/rollup-linux-x64-gnu": "4.13.1", + "@rollup/rollup-linux-x64-musl": "4.13.1", + "@rollup/rollup-win32-arm64-msvc": "4.13.1", + "@rollup/rollup-win32-ia32-msvc": "4.13.1", + "@rollup/rollup-win32-x64-msvc": "4.13.1", "@types/estree": "1.0.5", "fsevents": "~2.3.2" } @@ -36792,28 +37228,13 @@ "integrity": "sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==", "dev": true }, - "shikiji": { - "version": "0.9.18", - "resolved": "https://registry.npmjs.org/shikiji/-/shikiji-0.9.18.tgz", - "integrity": "sha512-/tFMIdV7UQklzN13VjF0/XFzmii6C606Jc878hNezvB8ZR8FG8FW9j0I4J9EJre0owlnPntgLVPpHqy27Gs+DQ==", - "dev": true, - "requires": { - "shikiji-core": "0.9.18" - } - }, - "shikiji-core": { - "version": "0.9.18", - "resolved": "https://registry.npmjs.org/shikiji-core/-/shikiji-core-0.9.18.tgz", - "integrity": "sha512-PKTXptbrp/WEDjNHV8OFG9KkfhmR0pSd161kzlDDlgQ0HXAnqJYNDSjqsy1CYZMx5bSvLMy42yJj9oFTqmkNTQ==", - "dev": true - }, - "shikiji-transformers": { - "version": "0.9.18", - "resolved": "https://registry.npmjs.org/shikiji-transformers/-/shikiji-transformers-0.9.18.tgz", - "integrity": "sha512-lvKVfgx1ETDqUNxqiUn+whlnjQiunsAg76DOpzjjxkHE/bLcwa+jrghcMxQhui86SLR1tzCdM4Imh+RxW0LI2Q==", + "shiki": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.2.1.tgz", + "integrity": "sha512-u+XW6o0vCkUNlneZb914dLO+AayEIwK5tI62WeS//R5HIXBFiYaj/Hc5xcq27Yh83Grr4JbNtUBV8W6zyK4hWg==", "dev": true, "requires": { - "shikiji": "0.9.18" + "@shikijs/core": "1.2.1" } }, "side-channel": { @@ -36828,9 +37249,9 @@ } }, "source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", "dev": true }, "spdx-correct": { @@ -36865,6 +37286,12 @@ "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==", "dev": true }, + "speakingurl": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/speakingurl/-/speakingurl-14.0.1.tgz", + "integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==", + "dev": true + }, "string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -37026,38 +37453,38 @@ } }, "vite": { - "version": "5.0.11", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.0.11.tgz", - "integrity": "sha512-XBMnDjZcNAw/G1gEiskiM1v6yzM4GE5aMGvhWTlHAYYhxb7S3/V1s3m2LDHa8Vh6yIWYYB0iJwsEaS523c4oYA==", + "version": "5.2.6", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.6.tgz", + "integrity": "sha512-FPtnxFlSIKYjZ2eosBQamz4CbyrTizbZ3hnGJlh/wMtCrlp1Hah6AzBLjGI5I2urTfNnpovpHdrL6YRuBOPnCA==", "dev": true, "requires": { - "esbuild": "^0.19.3", + "esbuild": "^0.20.1", "fsevents": "~2.3.3", - "postcss": "^8.4.32", - "rollup": "^4.2.0" + "postcss": "^8.4.36", + "rollup": "^4.13.0" } }, "vitepress": { - "version": "1.0.0-rc.36", - "resolved": "https://registry.npmjs.org/vitepress/-/vitepress-1.0.0-rc.36.tgz", - "integrity": "sha512-2z4dpM9PplN/yvTifhavOIAazlCR6OJ5PvLoRbc+7LdcFeIlCsuDGENLX4HjMW18jQZF5/j7++PNqdBfeazxUA==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/vitepress/-/vitepress-1.0.2.tgz", + "integrity": "sha512-bEj9yTEdWyewJFOhEREZF+mXuAgOq27etuJZT6DZSp+J3XpQstXMJc5piSVwhZBtuj8OfA0iXy+jdP1c71KMYQ==", "dev": true, "requires": { - "@docsearch/css": "^3.5.2", - "@docsearch/js": "^3.5.2", + "@docsearch/css": "^3.6.0", + "@docsearch/js": "^3.6.0", + "@shikijs/core": "^1.2.0", + "@shikijs/transformers": "^1.2.0", "@types/markdown-it": "^13.0.7", - "@vitejs/plugin-vue": "^5.0.2", - "@vue/devtools-api": "^6.5.1", - "@vueuse/core": "^10.7.1", - "@vueuse/integrations": "^10.7.1", + "@vitejs/plugin-vue": "^5.0.4", + "@vue/devtools-api": "^7.0.16", + "@vueuse/core": "^10.9.0", + "@vueuse/integrations": "^10.9.0", "focus-trap": "^7.5.4", "mark.js": "8.11.1", "minisearch": "^6.3.0", - "shikiji": "^0.9.17", - "shikiji-core": "^0.9.17", - "shikiji-transformers": "^0.9.17", - "vite": "^5.0.11", - "vue": "^3.4.5" + "shiki": "^1.2.0", + "vite": "^5.2.2", + "vue": "^3.4.21" } }, "vitepress-plugin-mermaid": { @@ -37070,16 +37497,16 @@ } }, "vue": { - "version": "3.4.10", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.10.tgz", - "integrity": "sha512-c+O8qGqdWPF9joTCzMGeDDedViooh6c8RY3+eW5+6GCAIY8YjChmU06LsUu0PnMZbIk1oKUoJTqKzmghYtFypw==", + "version": "3.4.21", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.21.tgz", + "integrity": "sha512-5hjyV/jLEIKD/jYl4cavMcnzKwjMKohureP8ejn3hhEjwhWIhWeuzL2kJAjzl/WyVsgPY56Sy4Z40C3lVshxXA==", "dev": true, "requires": { - "@vue/compiler-dom": "3.4.10", - "@vue/compiler-sfc": "3.4.10", - "@vue/runtime-dom": "3.4.10", - "@vue/server-renderer": "3.4.10", - "@vue/shared": "3.4.10" + "@vue/compiler-dom": "3.4.21", + "@vue/compiler-sfc": "3.4.21", + "@vue/runtime-dom": "3.4.21", + "@vue/server-renderer": "3.4.21", + "@vue/shared": "3.4.21" } }, "web-worker": { @@ -37121,7 +37548,7 @@ "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "dev": true }, "y18n": { diff --git a/package.json b/package.json index 39660377d4..d6008717a4 100644 --- a/package.json +++ b/package.json @@ -17,11 +17,11 @@ "chai": "^4", "lodash": "^4.17.21", "mermaid": "^10", - "mocha": "^10.2.0", - "netlify-cli": "^17.13.1", + "mocha": "^10.4.0", + "netlify-cli": "^17.21.1", "npm-run-all": "^4.1.5", - "vitepress": "1.0.0-rc.36", + "vitepress": "1.0.2", "vitepress-plugin-mermaid": "2.0.16", - "vue": "^3.4.10" + "vue": "^3.4.21" } } diff --git a/src/AspNetCoreWithMarten/Program.cs b/src/AspNetCoreWithMarten/Program.cs index 887dfb937a..c5c8f6d464 100644 --- a/src/AspNetCoreWithMarten/Program.cs +++ b/src/AspNetCoreWithMarten/Program.cs @@ -1,5 +1,6 @@ using AspNetCoreWithMarten; using Marten; +using Marten.Services.Json; using Microsoft.AspNetCore.Mvc; using Oakton; using Weasel.Core; @@ -19,6 +20,9 @@ // Establish the connection string to your Marten database options.Connection(builder.Configuration.GetConnectionString("Marten")!); + // Specify that we want to use STJ as our serializer + options.UseSystemTextJsonForSerialization(); + // If we're running in development mode, let Marten just take care // of all necessary schema building and patching behind the scenes if (builder.Environment.IsDevelopment()) diff --git a/src/CoreTests/Bugs/Bug_3083_concurrent_type_generation.cs b/src/CoreTests/Bugs/Bug_3083_concurrent_type_generation.cs new file mode 100644 index 0000000000..d3f07e7120 --- /dev/null +++ b/src/CoreTests/Bugs/Bug_3083_concurrent_type_generation.cs @@ -0,0 +1,97 @@ +using System.Collections.Generic; +using System.Threading.Tasks; +using Marten; +using Marten.Internal; +using Marten.Internal.Storage; +using Marten.Schema.BulkLoading; +using Marten.Testing.Harness; +using Shouldly; +using Xunit; + +namespace CoreTests.Bugs; + +public class Bug_3083_concurrent_type_generation: BugIntegrationContext +{ + [Fact] + public async Task concurrent_type_generation() + { + var graph = new ProviderGraph(new StoreOptions()); + + var tasks = new List>>(); + + for (var i = 0; i < 15; ++i) + { + var task = Task.Run(() => graph.StorageFor()); + + tasks.Add(task); + } + + var storages = new HashSet>(ReferenceEqualityComparer.Instance); + + foreach (var task in tasks) + { + var storage = await task; + storages.Add(storage); + } + + storages.ShouldHaveSingleItem(); + } + + [Fact] + public async Task concurrent_append_providers() + { + var graph = new ProviderGraph(new StoreOptions()); + + var tasks = new List(); + + var documentProvider1 = new MockDocumentProvider(); + var documentProvider2 = new MockDocumentProvider(); + var documentProvider3 = new MockDocumentProvider(); + var documentProvider4 = new MockDocumentProvider(); + + tasks.Add(Task.Run(() => graph.Append(documentProvider1))); + tasks.Add(Task.Run(() => graph.Append(documentProvider2))); + tasks.Add(Task.Run(() => graph.Append(documentProvider3))); + tasks.Add(Task.Run(() => graph.Append(documentProvider4))); + + await Task.WhenAll(tasks); + + graph.StorageFor().ShouldBeTheSameAs(documentProvider1); + graph.StorageFor().ShouldBeTheSameAs(documentProvider2); + graph.StorageFor().ShouldBeTheSameAs(documentProvider3); + graph.StorageFor().ShouldBeTheSameAs(documentProvider4); + } + + public class MockDocumentProvider: DocumentProvider where T : notnull + { + public MockDocumentProvider(): this(null, null, null, null, null) + { + } + + public MockDocumentProvider(IBulkLoader bulkLoader, IDocumentStorage queryOnly, + IDocumentStorage lightweight, IDocumentStorage identityMap, IDocumentStorage dirtyTracking): base( + bulkLoader, queryOnly, lightweight, identityMap, dirtyTracking) + { + } + } + + public class SomeDocument + { + public string Id { get; set; } = string.Empty; + } + + public class OtherDocument + { + public string Id { get; set; } = string.Empty; + } + + public class ThirdDocument + { + public string Id { get; set; } = string.Empty; + } + + public class ForthDocument + { + public string Id { get; set; } = string.Empty; + } +} diff --git a/src/CoreTests/CoreTests.csproj b/src/CoreTests/CoreTests.csproj index 6df66a292e..d744366ffb 100644 --- a/src/CoreTests/CoreTests.csproj +++ b/src/CoreTests/CoreTests.csproj @@ -20,6 +20,7 @@ + diff --git a/src/CoreTests/DocumentSchemaResolverTests.cs b/src/CoreTests/DocumentSchemaResolverTests.cs new file mode 100644 index 0000000000..e83dfb643c --- /dev/null +++ b/src/CoreTests/DocumentSchemaResolverTests.cs @@ -0,0 +1,201 @@ +using System; +using Marten; +using Marten.Events; +using Marten.Events.Projections; +using Marten.Schema; +using Marten.Testing.Documents; +using Marten.Testing.Harness; +using Shouldly; +using Xunit; + +namespace CoreTests; + +public class DocumentSchemaResolverTests : OneOffConfigurationsContext +{ + [Fact] + public void ValidateDefaultSchemaNames() + { + StoreOptions(options => + { + var newOptions = new StoreOptions(); + options.DatabaseSchemaName = newOptions.DatabaseSchemaName; + }, false); + + #region sample_document_schema_resolver_resolve_schemas + var schema = theSession.DocumentStore.Options.Schema; + + schema.DatabaseSchemaName.ShouldBe("public"); + schema.EventsSchemaName.ShouldBe("public"); + #endregion + } + + [Fact] + public void ValidateCustomSchemaNames() + { + StoreOptions(options => + { + options.DatabaseSchemaName = "custom_schema_name"; + }, false); + + #region sample_document_schema_resolver_options + var schema = theSession.DocumentStore.Options.Schema; + #endregion + + schema.DatabaseSchemaName.ShouldBe("custom_schema_name"); + schema.EventsSchemaName.ShouldBe("custom_schema_name"); + } + + [Fact] + public void ValidateCustomEventSchemaNames() + { + StoreOptions(options => + { + options.DatabaseSchemaName = "custom_schema_name"; + options.Events.DatabaseSchemaName = "custom_event_schema_name"; + }, false); + + var schema = theSession.DocumentStore.Options.Schema; + + schema.DatabaseSchemaName.ShouldBe("custom_schema_name"); + schema.EventsSchemaName.ShouldBe("custom_event_schema_name"); + } + + [Fact] + public void ValidateRegisteredDocumentNames() + { + StoreOptions(options => + { + options.RegisterDocumentType(); + options.RegisterDocumentType(); + options.RegisterDocumentType(); + }, false); + + var schema = theSession.DocumentStore.Options.Schema; + + schema.For(typeof(Account)).ShouldBe("documentschemaresolvertests.mt_doc_account"); + schema.For().ShouldBe("documentschemaresolvertests.mt_doc_company"); + schema.For().ShouldBe("documentschemaresolvertests.mt_doc_user"); + + schema.For(qualified: false).ShouldBe("mt_doc_account"); + schema.For(qualified: false).ShouldBe("mt_doc_company"); + schema.For(qualified: false).ShouldBe("mt_doc_user"); + } + + [Fact] + public void ValidateUnregisteredDocumentNames() + { + StoreOptions(options => + { + var newOptions = new StoreOptions(); + options.DatabaseSchemaName = newOptions.DatabaseSchemaName; + }, false); + + #region sample_document_schema_resolver_resolve_documents + var schema = theSession.DocumentStore.Options.Schema; + + schema.For().ShouldBe("public.mt_doc_account"); + schema.For().ShouldBe("public.mt_doc_company"); + schema.For().ShouldBe("public.mt_doc_user"); + + // `qualified: false` returns the table name without schema + schema.For(qualified: false).ShouldBe("mt_doc_account"); + schema.For(qualified: false).ShouldBe("mt_doc_company"); + schema.For(qualified: false).ShouldBe("mt_doc_user"); + #endregion + } + + [Fact] + public void ValidateDocumentWithCustomTableNames() + { + StoreOptions(options => + { + options.RegisterDocumentType(); + options.Schema.For().DatabaseSchemaName("custom_doc_schema"); + options.Schema.For().DocumentAlias("custom_account"); + }, false); + + var schema = theSession.DocumentStore.Options.Schema; + + schema.For().ShouldBe("custom_doc_schema.mt_doc_custom_account"); + + schema.For(qualified: false).ShouldBe("mt_doc_custom_account"); + } + + [Fact] + public void ValidateEventTableNames() + { + StoreOptions(options => { + var newOptions = new StoreOptions(); + options.DatabaseSchemaName = newOptions.DatabaseSchemaName; + }, false); + + var schema = theSession.DocumentStore.Options.Schema; + + #region sample_document_schema_resolver_resolve_event_tables + + schema.ForStreams().ShouldBe("public.mt_streams"); + schema.ForEvents().ShouldBe("public.mt_events"); + schema.ForEventProgression().ShouldBe("public.mt_event_progression"); + + schema.ForStreams(qualified: false).ShouldBe("mt_streams"); + schema.ForEvents(qualified: false).ShouldBe("mt_events"); + schema.ForEventProgression(qualified: false).ShouldBe("mt_event_progression"); + #endregion + } + + [Fact] + public void ValidateEventTableNamesWithCustomSchema() + { + StoreOptions(options => + { + options.Events.DatabaseSchemaName = "custom_event_schema_name"; + }, false); + + var schema = theSession.DocumentStore.Options.Schema; + + schema.ForStreams().ShouldBe("custom_event_schema_name.mt_streams"); + schema.ForEvents().ShouldBe("custom_event_schema_name.mt_events"); + schema.ForEventProgression().ShouldBe("custom_event_schema_name.mt_event_progression"); + + schema.ForStreams(qualified: false).ShouldBe("mt_streams"); + schema.ForEvents(qualified: false).ShouldBe("mt_events"); + schema.ForEventProgression(qualified: false).ShouldBe("mt_event_progression"); + } + + [Fact] + public void ValidateProjectionNames() + { + StoreOptions(options => + { + options.Projections.Snapshot(SnapshotLifecycle.Inline); + options.Projections.Snapshot(SnapshotLifecycle.Async); + }, false); + + var schema = theSession.DocumentStore.Options.Schema; + + schema.For().ShouldBe("documentschemaresolvertests.mt_doc_documentschemaresolvertests_projectiona"); + schema.For().ShouldBe("documentschemaresolvertests.mt_doc_custom_projection_alias"); + + schema.For(qualified: false).ShouldBe("mt_doc_documentschemaresolvertests_projectiona"); + schema.For(qualified: false).ShouldBe("mt_doc_custom_projection_alias"); + } + + public record FooEvent; + + public record ProjectionA(Guid Id) + { + public static ProjectionA Create(IEvent @event) + { + return new ProjectionA(@event.StreamId); + } + } + + [DocumentAlias("custom_projection_alias")] + public record ProjectionB(Guid Id) + { + public static ProjectionB Create(IEvent @event) + { + return new ProjectionB(@event.StreamId); + } + } +} diff --git a/src/CoreTests/Examples/CodeGenerationOptions.cs b/src/CoreTests/Examples/CodeGenerationOptions.cs index a09f7b94ef..2bad8109fb 100644 --- a/src/CoreTests/Examples/CodeGenerationOptions.cs +++ b/src/CoreTests/Examples/CodeGenerationOptions.cs @@ -25,10 +25,10 @@ public void build_store() // Marten will only use types that are compiled into // the application assembly ahead of time. This is the - // V4 "pre-built" model + // "pre-built" model opts.GeneratedCodeMode = TypeLoadMode.Static; - // New for V5. More explanation in the docs:) + // Explained Below :) opts.GeneratedCodeMode = TypeLoadMode.Auto; }); diff --git a/src/CoreTests/Internal/Sessions/EventTracingConnectionLifetimeTests.cs b/src/CoreTests/Internal/Sessions/EventTracingConnectionLifetimeTests.cs new file mode 100644 index 0000000000..1be8362fc3 --- /dev/null +++ b/src/CoreTests/Internal/Sessions/EventTracingConnectionLifetimeTests.cs @@ -0,0 +1,825 @@ +#nullable enable +using Marten.Internal.OpenTelemetry; +using Marten.Internal.Sessions; +using Marten.Testing.Harness; +using Npgsql; +using NSubstitute; +using NSubstitute.ExceptionExtensions; +using Shouldly; +using System; +using System.Collections.Generic; +using System.Data; +using System.Data.Common; +using System.Diagnostics; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using Marten.Services; +using Weasel.Postgresql; +using Xunit; + +namespace CoreTests.Internal.Sessions +{ + // EventTracingConnectionLifetime cannot be tested in parallel with other tests + [CollectionDefinition(nameof(EventTracingConnectionLifetimeCollection), DisableParallelization = true)] + public class EventTracingConnectionLifetimeCollection + { + } + + [Collection(nameof(EventTracingConnectionLifetimeCollection))] + public class EventTracingConnectionLifetimeTests : IAsyncLifetime + { + private NpgsqlCommand _npgsqlCommand = new("select 1"); + private IConnectionLifetime? _innerConnectionLifetime = Substitute.For(); + private bool _startCalled; + private bool _endCalled; + private List _batchPages =new(); + private List _exceptions =new(); + private BatchBuilder _batchBuilder =new(); + private NpgsqlBatch _batch; + private DataTable _dataTable =new(); + private DbDataReader _dataReader; + + private const string MartenCommandExecutionStarted = "marten.command.execution.started"; + private const string MartenBatchExecutionStarted = "marten.batch.execution.started"; + private const string MartenBatchPagesExecutionStarted = "marten.batch.pages.execution.started"; + + private const string DefaultTenant = "default"; + + //Taken from the OpenTelemetry package as they are internal. + private const string AttributeExceptionEventName = "exception"; + private const string AttributeExceptionType = "exception.type"; + private const string AttributeExceptionMessage = "exception.message"; + private const string AttributeExceptionStacktrace = "exception.stacktrace"; + + public Task InitializeAsync() + { + _batch = _batchBuilder.Compile(); + _dataReader = _dataTable.CreateDataReader(); + return Task.CompletedTask; + } + + public async Task DisposeAsync() + { + await _batch.DisposeAsync(); + await _dataReader.DisposeAsync(); + } + + [Fact] + public void Ctor_Should_Throw_Argument_Null_Exception_When_Inner_Connection_Lifetime_Is_Null() + { + _innerConnectionLifetime = null; + var act = () => new EventTracingConnectionLifetime(_innerConnectionLifetime, DefaultTenant); + Should.Throw(act); + } + + [Theory] + [InlineData("")] + [InlineData(" ")] + [InlineData(null)] + public void Ctor_Should_Throw_Argument_Exception_When_Tenant_Id_Is_Null(string tenantId) + { + var act = () => new EventTracingConnectionLifetime(_innerConnectionLifetime, tenantId); + Should.Throw(act); + } + + [Fact] + public void Execute_Ensure_The_Correct_Event_And_Tags_Are_Emited_When_Command_Execution_Succeeds() + { + _startCalled = false; + _endCalled = false; + + using var listener = new ActivityListener + { + ShouldListenTo = _ => _.Name == "Marten", + Sample = (ref ActivityCreationOptions _) => ActivitySamplingResult.AllData, + ActivityStarted = activity => + { + _startCalled = true; + activity.ShouldNotBeNull(); + activity.DisplayName.ShouldBe("connection"); + }, + ActivityStopped = activity => + { + _endCalled = true; + activity.ShouldNotBeNull(); + var expectedTag = activity.Tags.SingleOrDefault(); + expectedTag.ShouldNotBeNull(); + expectedTag.Key.ShouldBe(MartenTracing.MartenTenantId); + var expectedEvent = activity.Events.SingleOrDefault(); + expectedEvent.ShouldNotBeNull(); + expectedEvent.Name.ShouldBe(MartenCommandExecutionStarted); + expectedEvent.Tags.ShouldBeEmpty(); + } + }; + + ActivitySource.AddActivityListener(listener); + _innerConnectionLifetime.Execute(_npgsqlCommand).Returns(1); + using (var eventTracingConnectionLifetime = + new EventTracingConnectionLifetime(_innerConnectionLifetime, DefaultTenant)) + { + eventTracingConnectionLifetime.Execute(_npgsqlCommand); + } + + _startCalled.ShouldBeTrue(); + _endCalled.ShouldBeTrue(); + _innerConnectionLifetime.Received(1).Execute(_npgsqlCommand); + } + + [Fact] + public void Execute_Ensure_The_Correct_Events_And_Tags_Are_Emited_When_Command_Execution_Fails() + { + _startCalled = false; + _endCalled = false; + + using var listener = new ActivityListener + { + ShouldListenTo = _ => _.Name == "Marten", + Sample = (ref ActivityCreationOptions _) => ActivitySamplingResult.AllData, + ActivityStarted = activity => + { + _startCalled = true; + activity.ShouldNotBeNull(); + activity.DisplayName.ShouldBe("connection"); + }, + ActivityStopped = activity => + { + _endCalled = true; + var expectedTag = activity.Tags.SingleOrDefault(); + expectedTag.ShouldNotBeNull(); + expectedTag.Key.ShouldBe(MartenTracing.MartenTenantId); + activity.Events.Count().ShouldBe(2); + var firstEvent = activity.Events.First(); + firstEvent.Name.ShouldBe(MartenCommandExecutionStarted); + firstEvent.Tags.ShouldBeEmpty(); + var lastEvent = activity.Events.Last(); + lastEvent.Name.ShouldBe(AttributeExceptionEventName); + lastEvent.Tags.Select(x => x.Key) + .ShouldBe( + new[] { AttributeExceptionType, AttributeExceptionStacktrace, AttributeExceptionMessage }, + ignoreOrder: true); + } + }; + + ActivitySource.AddActivityListener(listener); + _innerConnectionLifetime.Execute(_npgsqlCommand).Throws(); + using (var eventTracingConnectionLifetime = + new EventTracingConnectionLifetime(_innerConnectionLifetime, DefaultTenant)) + { + Should.Throw(() => eventTracingConnectionLifetime.Execute(_npgsqlCommand)); + } + + _startCalled.ShouldBeTrue(); + _endCalled.ShouldBeTrue(); + _innerConnectionLifetime.Received(1).Execute(_npgsqlCommand); + } + + [Fact] + public async Task ExecuteAsync_Ensure_The_Correct_Event_And_Tags_Are_Emited_When_Command_Execution_Succeeds() + { + _startCalled = false; + _endCalled = false; + + using var listener = new ActivityListener + { + ShouldListenTo = _ => _.Name == "Marten", + Sample = (ref ActivityCreationOptions _) => ActivitySamplingResult.AllData, + ActivityStarted = activity => + { + _startCalled = true; + activity.ShouldNotBeNull(); + activity.DisplayName.ShouldBe("connection"); + }, + ActivityStopped = activity => + { + _endCalled = true; + activity.ShouldNotBeNull(); + var expectedTag = activity.Tags.SingleOrDefault(); + expectedTag.ShouldNotBeNull(); + expectedTag.Key.ShouldBe(MartenTracing.MartenTenantId); + var expectedEvent = activity.Events.SingleOrDefault(); + expectedEvent.ShouldNotBeNull(); + expectedEvent.Name.ShouldBe(MartenCommandExecutionStarted); + expectedEvent.Tags.ShouldBeEmpty(); + } + }; + + ActivitySource.AddActivityListener(listener); + _innerConnectionLifetime.ExecuteAsync(_npgsqlCommand, Arg.Any()) + .Returns(Task.FromResult(1)); + using (var eventTracingConnectionLifetime = + new EventTracingConnectionLifetime(_innerConnectionLifetime, DefaultTenant)) + { + await eventTracingConnectionLifetime.ExecuteAsync(_npgsqlCommand); + } + + _startCalled.ShouldBeTrue(); + _endCalled.ShouldBeTrue(); + _innerConnectionLifetime.Received(1).ExecuteAsync(_npgsqlCommand, Arg.Any()); + } + + [Fact] + public async Task ExecuteAsync_Ensure_The_Correct_Events_And_Tags_Are_Emited_When_Command_Execution_Fails() + { + _startCalled = false; + _endCalled = false; + + using var listener = new ActivityListener + { + ShouldListenTo = _ => _.Name == "Marten", + Sample = (ref ActivityCreationOptions _) => ActivitySamplingResult.AllData, + ActivityStarted = activity => + { + _startCalled = true; + activity.ShouldNotBeNull(); + activity.DisplayName.ShouldBe("connection"); + }, + ActivityStopped = activity => + { + _endCalled = true; + var expectedTag = activity.Tags.SingleOrDefault(); + expectedTag.ShouldNotBeNull(); + expectedTag.Key.ShouldBe(MartenTracing.MartenTenantId); + activity.Events.Count().ShouldBe(2); + var firstEvent = activity.Events.First(); + firstEvent.Name.ShouldBe(MartenCommandExecutionStarted); + firstEvent.Tags.ShouldBeEmpty(); + var lastEvent = activity.Events.Last(); + lastEvent.Name.ShouldBe(AttributeExceptionEventName); + lastEvent.Tags.Select(x => x.Key) + .ShouldBe( + new[] { AttributeExceptionType, AttributeExceptionStacktrace, AttributeExceptionMessage }, + ignoreOrder: true); + } + }; + + ActivitySource.AddActivityListener(listener); + _innerConnectionLifetime.ExecuteAsync(_npgsqlCommand, Arg.Any()) + .ThrowsAsync(); + using (var eventTracingConnectionLifetime =new EventTracingConnectionLifetime(_innerConnectionLifetime, DefaultTenant)) + { + await Should.ThrowAsync(() => eventTracingConnectionLifetime.ExecuteAsync(_npgsqlCommand)); + } + + _startCalled.ShouldBeTrue(); + _endCalled.ShouldBeTrue(); + _innerConnectionLifetime.Received(1).ExecuteAsync(_npgsqlCommand, Arg.Any()); + } + + [Fact] + public void ExecuteReader_Ensure_The_Correct_Event_And_Tags_Are_Emited_When_Command_Execution_Succeeds() + { + _startCalled = false; + _endCalled = false; + + using var listener = new ActivityListener + { + ShouldListenTo = _ => _.Name == "Marten", + Sample = (ref ActivityCreationOptions _) => ActivitySamplingResult.AllData, + ActivityStarted = activity => + { + _startCalled = true; + activity.ShouldNotBeNull(); + activity.DisplayName.ShouldBe("connection"); + }, + ActivityStopped = activity => + { + _endCalled = true; + activity.ShouldNotBeNull(); + var expectedTag = activity.Tags.SingleOrDefault(); + expectedTag.ShouldNotBeNull(); + expectedTag.Key.ShouldBe(MartenTracing.MartenTenantId); + var expectedEvent = activity.Events.SingleOrDefault(); + expectedEvent.ShouldNotBeNull(); + expectedEvent.Name.ShouldBe(MartenCommandExecutionStarted); + expectedEvent.Tags.ShouldBeEmpty(); + } + }; + + ActivitySource.AddActivityListener(listener); + using var dataTable = new DataTable(); + using var dataReader = dataTable.CreateDataReader(); + _innerConnectionLifetime.ExecuteReader(_npgsqlCommand).Returns(dataReader); + using (var eventTracingConnectionLifetime = + new EventTracingConnectionLifetime(_innerConnectionLifetime, DefaultTenant)) + { + eventTracingConnectionLifetime.ExecuteReader(_npgsqlCommand); + } + + _startCalled.ShouldBeTrue(); + _endCalled.ShouldBeTrue(); + _innerConnectionLifetime.Received(1).ExecuteReader(_npgsqlCommand); + } + + [Fact] + public void ExecuteReader_Ensure_The_Correct_Events_And_Tags_Are_Emited_When_Command_Execution_Fails() + { + _startCalled = false; + _endCalled = false; + + using var listener = new ActivityListener + { + ShouldListenTo = _ => _.Name == "Marten", + Sample = (ref ActivityCreationOptions _) => ActivitySamplingResult.AllData, + ActivityStarted = activity => + { + _startCalled = true; + activity.ShouldNotBeNull(); + activity.DisplayName.ShouldBe("connection"); + }, + ActivityStopped = activity => + { + _endCalled = true; + var expectedTag = activity.Tags.SingleOrDefault(); + expectedTag.ShouldNotBeNull(); + expectedTag.Key.ShouldBe(MartenTracing.MartenTenantId); + activity.Events.Count().ShouldBe(2); + var firstEvent = activity.Events.First(); + firstEvent.Name.ShouldBe(MartenCommandExecutionStarted); + firstEvent.Tags.ShouldBeEmpty(); + var lastEvent = activity.Events.Last(); + lastEvent.Name.ShouldBe(AttributeExceptionEventName); + lastEvent.Tags.Select(x => x.Key) + .ShouldBe( + new[] { AttributeExceptionType, AttributeExceptionStacktrace, AttributeExceptionMessage }, + ignoreOrder: true); + } + }; + + ActivitySource.AddActivityListener(listener); + _innerConnectionLifetime.ExecuteReader(_npgsqlCommand).Throws(); + using (var eventTracingConnectionLifetime = + new EventTracingConnectionLifetime(_innerConnectionLifetime, DefaultTenant)) + { + Should.Throw( + () => eventTracingConnectionLifetime.ExecuteReader(_npgsqlCommand)); + } + + _startCalled.ShouldBeTrue(); + _endCalled.ShouldBeTrue(); + _innerConnectionLifetime.Received(1).ExecuteReader(_npgsqlCommand); + } + + [Fact] + public async Task ExecuteReaderAsync_Ensure_The_Correct_Event_And_Tags_Are_Emited_When_Command_Execution_Succeeds() + { + _startCalled = false; + _endCalled = false; + + using var listener = new ActivityListener + { + ShouldListenTo = _ => _.Name == "Marten", + Sample = (ref ActivityCreationOptions _) => ActivitySamplingResult.AllData, + ActivityStarted = activity => + { + _startCalled = true; + activity.ShouldNotBeNull(); + activity.DisplayName.ShouldBe("connection"); + }, + ActivityStopped = activity => + { + _endCalled = true; + activity.ShouldNotBeNull(); + var expectedTag = activity.Tags.SingleOrDefault(); + expectedTag.ShouldNotBeNull(); + expectedTag.Key.ShouldBe(MartenTracing.MartenTenantId); + var expectedEvent = activity.Events.SingleOrDefault(); + expectedEvent.ShouldNotBeNull(); + expectedEvent.Name.ShouldBe(MartenCommandExecutionStarted); + expectedEvent.Tags.ShouldBeEmpty(); + } + }; + + ActivitySource.AddActivityListener(listener); + _dataReader =_dataTable.CreateDataReader(); + _innerConnectionLifetime.ExecuteReaderAsync(_npgsqlCommand, Arg.Any()) + .Returns(Task.FromResult(_dataReader)); + using (var eventTracingConnectionLifetime = + new EventTracingConnectionLifetime(_innerConnectionLifetime, DefaultTenant)) + { + await eventTracingConnectionLifetime.ExecuteReaderAsync(_npgsqlCommand); + } + + _startCalled.ShouldBeTrue(); + _endCalled.ShouldBeTrue(); + _innerConnectionLifetime.Received(1).ExecuteReaderAsync(_npgsqlCommand, Arg.Any()); + } + + [Fact] + public async Task ExecuteReaderAsync_Ensure_The_Correct_Events_And_Tags_Are_Emited_When_Command_Execution_Fails() + { + _startCalled = false; + _endCalled = false; + + using var listener = new ActivityListener + { + ShouldListenTo = _ => _.Name == "Marten", + Sample = (ref ActivityCreationOptions _) => ActivitySamplingResult.AllData, + ActivityStarted = activity => + { + _startCalled = true; + activity.ShouldNotBeNull(); + activity.DisplayName.ShouldBe("connection"); + }, + ActivityStopped = activity => + { + _endCalled = true; + var expectedTag = activity.Tags.SingleOrDefault(); + expectedTag.ShouldNotBeNull(); + expectedTag.Key.ShouldBe(MartenTracing.MartenTenantId); + activity.Events.Count().ShouldBe(2); + var firstEvent = activity.Events.First(); + firstEvent.Name.ShouldBe(MartenCommandExecutionStarted); + firstEvent.Tags.ShouldBeEmpty(); + var lastEvent = activity.Events.Last(); + lastEvent.Name.ShouldBe(AttributeExceptionEventName); + lastEvent.Tags.Select(x => x.Key) + .ShouldBe( + new[] { AttributeExceptionType, AttributeExceptionStacktrace, AttributeExceptionMessage }, + ignoreOrder: true); + } + }; + + ActivitySource.AddActivityListener(listener); + _innerConnectionLifetime.ExecuteAsync(_npgsqlCommand, Arg.Any()) + .ThrowsAsync(); + using (var eventTracingConnectionLifetime = new EventTracingConnectionLifetime(_innerConnectionLifetime, DefaultTenant)) + { + await Should.ThrowAsync(() => eventTracingConnectionLifetime.ExecuteAsync(_npgsqlCommand)); + } + + _startCalled.ShouldBeTrue(); + _endCalled.ShouldBeTrue(); + _innerConnectionLifetime.Received(1).ExecuteAsync(_npgsqlCommand, Arg.Any()); + } + + [Fact] + public void ExecuteReaderWithBatch_Ensure_The_Correct_Event_And_Tags_Are_Emited_When_Command_Execution_Succeeds() + { + _startCalled = false; + _endCalled = false; + + using var listener = new ActivityListener + { + ShouldListenTo = _ => _.Name == "Marten", + Sample = (ref ActivityCreationOptions _) => ActivitySamplingResult.AllData, + ActivityStarted = activity => + { + _startCalled = true; + activity.ShouldNotBeNull(); + activity.DisplayName.ShouldBe("connection"); + }, + ActivityStopped = activity => + { + _endCalled = true; + activity.ShouldNotBeNull(); + var expectedTag = activity.Tags.SingleOrDefault(); + expectedTag.ShouldNotBeNull(); + expectedTag.Key.ShouldBe(MartenTracing.MartenTenantId); + var expectedEvent = activity.Events.SingleOrDefault(); + expectedEvent.ShouldNotBeNull(); + expectedEvent.Name.ShouldBe(MartenBatchExecutionStarted); + expectedEvent.Tags.ShouldBeEmpty(); + } + }; + + ActivitySource.AddActivityListener(listener); + using var dataTable = new DataTable(); + using DbDataReader dataReader = dataTable.CreateDataReader(); + _innerConnectionLifetime.ExecuteReader(Arg.Any()).Returns(dataReader); + using (var eventTracingConnectionLifetime = + new EventTracingConnectionLifetime(_innerConnectionLifetime, DefaultTenant)) + { + eventTracingConnectionLifetime.ExecuteReader(_batch); + } + + _startCalled.ShouldBeTrue(); + _endCalled.ShouldBeTrue(); + _innerConnectionLifetime.Received(1).ExecuteReader(Arg.Any()); + } + + [Fact] + public void ExecuteReaderWithBatch_Ensure_The_Correct_Events_And_Tags_Are_Emited_When_Command_Execution_Fails() + { + _startCalled = false; + _endCalled = false; + + using var listener = new ActivityListener + { + ShouldListenTo = _ => _.Name == "Marten", + Sample = (ref ActivityCreationOptions _) => ActivitySamplingResult.AllData, + ActivityStarted = activity => + { + _startCalled = true; + activity.ShouldNotBeNull(); + activity.DisplayName.ShouldBe("connection"); + }, + ActivityStopped = activity => + { + _endCalled = true; + var expectedTag = activity.Tags.SingleOrDefault(); + expectedTag.ShouldNotBeNull(); + expectedTag.Key.ShouldBe(MartenTracing.MartenTenantId); + activity.Events.Count().ShouldBe(2); + var firstEvent = activity.Events.First(); + firstEvent.Name.ShouldBe(MartenBatchExecutionStarted); + firstEvent.Tags.ShouldBeEmpty(); + var lastEvent = activity.Events.Last(); + lastEvent.Name.ShouldBe(AttributeExceptionEventName); + lastEvent.Tags.Select(x => x.Key) + .ShouldBe( + new[] { AttributeExceptionType, AttributeExceptionStacktrace, AttributeExceptionMessage }, + ignoreOrder: true); + } + }; + + ActivitySource.AddActivityListener(listener); + _innerConnectionLifetime.ExecuteReader(Arg.Any()).Throws(); + using (var eventTracingConnectionLifetime = + new EventTracingConnectionLifetime(_innerConnectionLifetime, DefaultTenant)) + { + Should.Throw(() => eventTracingConnectionLifetime.ExecuteReader(_batch)); + } + + _startCalled.ShouldBeTrue(); + _endCalled.ShouldBeTrue(); + _innerConnectionLifetime.Received(1).ExecuteReader(Arg.Any()); + } + + [Fact] + public async Task ExecuteReaderWithBatchAsync_Ensure_The_Correct_Event_And_Tags_Are_Emited_When_Command_Execution_Succeeds() + { + _startCalled = false; + _endCalled = false; + + using var listener = new ActivityListener + { + ShouldListenTo = _ => _.Name == "Marten", + Sample = (ref ActivityCreationOptions _) => ActivitySamplingResult.AllData, + ActivityStarted = activity => + { + _startCalled = true; + activity.ShouldNotBeNull(); + activity.DisplayName.ShouldBe("connection"); + }, + ActivityStopped = activity => + { + _endCalled = true; + activity.ShouldNotBeNull(); + var expectedTag = activity.Tags.SingleOrDefault(); + expectedTag.ShouldNotBeNull(); + expectedTag.Key.ShouldBe(MartenTracing.MartenTenantId); + var expectedEvent = activity.Events.SingleOrDefault(); + expectedEvent.ShouldNotBeNull(); + expectedEvent.Name.ShouldBe(MartenBatchExecutionStarted); + expectedEvent.Tags.ShouldBeEmpty(); + } + }; + + ActivitySource.AddActivityListener(listener); + using var dataTable = new DataTable(); + using DbDataReader dataReader = dataTable.CreateDataReader(); + _innerConnectionLifetime.ExecuteReaderAsync(Arg.Any()).Returns(Task.FromResult(dataReader)); + using (var eventTracingConnectionLifetime = + new EventTracingConnectionLifetime(_innerConnectionLifetime, DefaultTenant)) + { + await eventTracingConnectionLifetime.ExecuteReaderAsync(_batch); + } + + _startCalled.ShouldBeTrue(); + _endCalled.ShouldBeTrue(); + _innerConnectionLifetime.Received(1).ExecuteReaderAsync(Arg.Any(), Arg.Any()); + } + + [Fact] + public async Task ExecuteReaderWithBatchAsync_Ensure_The_Correct_Events_And_Tags_Are_Emited_When_Command_Execution_Fails() + { + _startCalled = false; + _endCalled = false; + + using var listener = new ActivityListener + { + ShouldListenTo = _ => _.Name == "Marten", + Sample = (ref ActivityCreationOptions _) => ActivitySamplingResult.AllData, + ActivityStarted = activity => + { + _startCalled = true; + activity.ShouldNotBeNull(); + activity.DisplayName.ShouldBe("connection"); + }, + ActivityStopped = activity => + { + _endCalled = true; + var expectedTag = activity.Tags.SingleOrDefault(); + expectedTag.ShouldNotBeNull(); + expectedTag.Key.ShouldBe(MartenTracing.MartenTenantId); + activity.Events.Count().ShouldBe(2); + var firstEvent = activity.Events.First(); + firstEvent.Name.ShouldBe(MartenBatchExecutionStarted); + firstEvent.Tags.ShouldBeEmpty(); + var lastEvent = activity.Events.Last(); + lastEvent.Name.ShouldBe(AttributeExceptionEventName); + lastEvent.Tags.Select(x => x.Key) + .ShouldBe( + new[] { AttributeExceptionType, AttributeExceptionStacktrace, AttributeExceptionMessage }, + ignoreOrder: true); + } + }; + + ActivitySource.AddActivityListener(listener); + _innerConnectionLifetime.ExecuteReaderAsync(Arg.Any(), Arg.Any()) + .ThrowsAsync(); + using (var eventTracingConnectionLifetime = new EventTracingConnectionLifetime(_innerConnectionLifetime, DefaultTenant)) + { + await Should.ThrowAsync(() => eventTracingConnectionLifetime.ExecuteReaderAsync(_batch)); + } + + _startCalled.ShouldBeTrue(); + _endCalled.ShouldBeTrue(); + _innerConnectionLifetime.Received(1).ExecuteReaderAsync(Arg.Any(), Arg.Any()); + } + + [Fact] + public void ExecuteBatchPages_Ensure_The_Correct_Event_And_Tags_Are_Emited_When_Execution_Succeeds() + { + _startCalled = false; + _endCalled = false; + + using var listener = new ActivityListener + { + ShouldListenTo = _ => _.Name == "Marten", + Sample = (ref ActivityCreationOptions _) => ActivitySamplingResult.AllData, + ActivityStarted = activity => + { + _startCalled = true; + activity.ShouldNotBeNull(); + activity.DisplayName.ShouldBe("connection"); + }, + ActivityStopped = activity => + { + _endCalled = true; + activity.ShouldNotBeNull(); + var expectedTag = activity.Tags.SingleOrDefault(); + expectedTag.ShouldNotBeNull(); + expectedTag.Key.ShouldBe(MartenTracing.MartenTenantId); + var expectedEvent = activity.Events.SingleOrDefault(); + expectedEvent.ShouldNotBeNull(); + expectedEvent.Name.ShouldBe(MartenBatchPagesExecutionStarted); + expectedEvent.Tags.ShouldBeEmpty(); + } + }; + + ActivitySource.AddActivityListener(listener); + _innerConnectionLifetime.ExecuteBatchPages(Arg.Any>(), Arg.Any>()); + using (var eventTracingConnectionLifetime = + new EventTracingConnectionLifetime(_innerConnectionLifetime, DefaultTenant)) + { + eventTracingConnectionLifetime.ExecuteBatchPages(_batchPages, _exceptions); + } + + _startCalled.ShouldBeTrue(); + _endCalled.ShouldBeTrue(); + _innerConnectionLifetime.Received(1).ExecuteBatchPages(Arg.Any>(), Arg.Any>()); + } + + [Fact] + public void ExecuteBatchPages_Ensure_The_Correct_Events_And_Tags_Are_Emited_When_Execution_Fails() + { + _startCalled = false; + _endCalled = false; + + using var listener = new ActivityListener + { + ShouldListenTo = _ => _.Name == "Marten", + Sample = (ref ActivityCreationOptions _) => ActivitySamplingResult.AllData, + ActivityStarted = activity => + { + _startCalled = true; + activity.ShouldNotBeNull(); + activity.DisplayName.ShouldBe("connection"); + }, + ActivityStopped = activity => + { + _endCalled = true; + var expectedTag = activity.Tags.SingleOrDefault(); + expectedTag.ShouldNotBeNull(); + expectedTag.Key.ShouldBe(MartenTracing.MartenTenantId); + activity.Events.Count().ShouldBe(2); + var firstEvent = activity.Events.First(); + firstEvent.Name.ShouldBe(MartenBatchPagesExecutionStarted); + firstEvent.Tags.ShouldBeEmpty(); + var lastEvent = activity.Events.Last(); + lastEvent.Name.ShouldBe(AttributeExceptionEventName); + lastEvent.Tags.Select(x => x.Key) + .ShouldBe( + new[] { AttributeExceptionType, AttributeExceptionStacktrace, AttributeExceptionMessage }, + ignoreOrder: true); + } + }; + + ActivitySource.AddActivityListener(listener); + _innerConnectionLifetime.ExecuteBatchPages(Arg.Any>(), Arg.Any>()); + using (var eventTracingConnectionLifetime = + new EventTracingConnectionLifetime(_innerConnectionLifetime, DefaultTenant)) + { + Should.Throw(() => eventTracingConnectionLifetime.Execute(_npgsqlCommand)); + } + + _startCalled.ShouldBeTrue(); + _endCalled.ShouldBeTrue(); + _innerConnectionLifetime.Received(1).Execute(_npgsqlCommand); + } + + [Fact] + public async Task ExecuteBatchPagesAsync_Ensure_The_Correct_Event_And_Tags_Are_Emited_When_Command_Execution_Succeeds() + { + _startCalled = false; + _endCalled = false; + + using var listener = new ActivityListener + { + ShouldListenTo = _ => _.Name == "Marten", + Sample = (ref ActivityCreationOptions _) => ActivitySamplingResult.AllData, + ActivityStarted = activity => + { + _startCalled = true; + activity.ShouldNotBeNull(); + activity.DisplayName.ShouldBe("connection"); + }, + ActivityStopped = activity => + { + _endCalled = true; + activity.ShouldNotBeNull(); + var expectedTag = activity.Tags.SingleOrDefault(); + expectedTag.ShouldNotBeNull(); + expectedTag.Key.ShouldBe(MartenTracing.MartenTenantId); + var expectedEvent = activity.Events.SingleOrDefault(); + expectedEvent.ShouldNotBeNull(); + expectedEvent.Name.ShouldBe(MartenCommandExecutionStarted); + expectedEvent.Tags.ShouldBeEmpty(); + } + }; + + ActivitySource.AddActivityListener(listener); + _innerConnectionLifetime.ExecuteBatchPagesAsync(_batchPages, _exceptions, Arg.Any()) + .Returns(Task.FromResult(1)); + using (var eventTracingConnectionLifetime = + new EventTracingConnectionLifetime(_innerConnectionLifetime, DefaultTenant)) + { + await eventTracingConnectionLifetime.ExecuteBatchPagesAsync(_batchPages, _exceptions, CancellationToken.None); + } + + _startCalled.ShouldBeTrue(); + _endCalled.ShouldBeTrue(); + _innerConnectionLifetime.Received(1).ExecuteAsync(_npgsqlCommand, Arg.Any()); + } + + [Fact] + public async Task ExecuteBatchPagesAsync_Ensure_The_Correct_Events_And_Tags_Are_Emited_When_Command_Execution_Fails() + { + _startCalled = false; + _endCalled = false; + + using var listener = new ActivityListener + { + ShouldListenTo = _ => _.Name == "Marten", + Sample = (ref ActivityCreationOptions _) => ActivitySamplingResult.AllData, + ActivityStarted = activity => + { + _startCalled = true; + activity.ShouldNotBeNull(); + activity.DisplayName.ShouldBe("connection"); + }, + ActivityStopped = activity => + { + _endCalled = true; + var expectedTag = activity.Tags.SingleOrDefault(); + expectedTag.ShouldNotBeNull(); + expectedTag.Key.ShouldBe(MartenTracing.MartenTenantId); + activity.Events.Count().ShouldBe(2); + var firstEvent = activity.Events.First(); + firstEvent.Name.ShouldBe(MartenBatchPagesExecutionStarted); + firstEvent.Tags.ShouldBeEmpty(); + var lastEvent = activity.Events.Last(); + lastEvent.Name.ShouldBe(AttributeExceptionEventName); + lastEvent.Tags.Select(x => x.Key) + .ShouldBe( + new[] { AttributeExceptionType, AttributeExceptionStacktrace, AttributeExceptionMessage }, + ignoreOrder: true); + } + }; + + ActivitySource.AddActivityListener(listener); + _innerConnectionLifetime.ExecuteBatchPagesAsync(_batchPages, _exceptions, Arg.Any()) + .ThrowsAsync(); + using (var eventTracingConnectionLifetime = new EventTracingConnectionLifetime(_innerConnectionLifetime, DefaultTenant)) + { + await Should.ThrowAsync(() => eventTracingConnectionLifetime.ExecuteBatchPagesAsync(_batchPages, _exceptions, CancellationToken.None)); + } + + _startCalled.ShouldBeTrue(); + _endCalled.ShouldBeTrue(); + _innerConnectionLifetime.Received(1).ExecuteAsync(_npgsqlCommand, Arg.Any()); + } + } +} diff --git a/src/CoreTests/SessionOptionsTests.cs b/src/CoreTests/SessionOptionsTests.cs index 7ad20c5d64..3ccb75fea1 100644 --- a/src/CoreTests/SessionOptionsTests.cs +++ b/src/CoreTests/SessionOptionsTests.cs @@ -1,10 +1,12 @@ using System; using System.Data; +using System.Diagnostics; using System.Linq; using System.Threading.Tasks; using JasperFx.CodeGeneration; using JasperFx.Core; using Marten; +using Marten.Internal.OpenTelemetry; using Marten.Internal.Sessions; using Marten.Services; using Marten.Storage; @@ -290,6 +292,39 @@ public void build_connection_with_sticky_connections_enabled() ; } + [Fact] + public void Session_Should_Not_Track_Open_Telemetry_Events_By_Default() + { + var commandRunnerMode = CommandRunnerMode.ReadOnly; + var options = new SessionOptions(); + var connectionLifetime = options.Initialize(theStore, commandRunnerMode); + connectionLifetime.ShouldNotBeOfType(); + } + + [Fact] + public void Session_Should_Not_Track_Open_Telemetry_Events_When_Asked_To_Do_So_If_No_Listeners_Are_configured() + { + var commandRunnerMode = CommandRunnerMode.ReadOnly; + var options = new SessionOptions { OpenTelemetryOptions = { TrackConnectionEvents = true } }; + var connectionLifetime = options.Initialize(theStore, commandRunnerMode); + connectionLifetime.ShouldNotBeOfType(); + } + + [Fact] + public void Session_Should_Track_Open_Telemetry_Events_When_Asked_To_Do_So_If_Listeners_Are_configured() + { + using var listener = new ActivityListener + { + ShouldListenTo = _ => _.Name == "Marten", + Sample = (ref ActivityCreationOptions _) => ActivitySamplingResult.AllData, + }; + ActivitySource.AddActivityListener(listener); + var commandRunnerMode = CommandRunnerMode.ReadOnly; + var options = new SessionOptions { OpenTelemetryOptions = { TrackConnectionEvents = true } }; + var connectionLifetime = options.Initialize(theStore, commandRunnerMode); + connectionLifetime.ShouldBeOfType(); + } + public class FryGuy { public Guid Id; diff --git a/src/CoreTests/configuring_marten_with_async_extensions.cs b/src/CoreTests/configuring_marten_with_async_extensions.cs new file mode 100644 index 0000000000..1fd469c5bd --- /dev/null +++ b/src/CoreTests/configuring_marten_with_async_extensions.cs @@ -0,0 +1,103 @@ +using System; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using JasperFx.Core; +using Marten; +using Marten.Testing.Harness; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Microsoft.FeatureManagement; +using NSubstitute; +using Shouldly; +using Xunit; + +namespace CoreTests; + +public class configuring_marten_with_async_extensions +{ + [Fact] + public async Task feature_flag_positive() + { + var featureManager = Substitute.For(); + featureManager.IsEnabledAsync("Module1").Returns(true); + + using var host = await Host.CreateDefaultBuilder() + .ConfigureServices(services => + { + services.AddMarten(opts => + { + opts.Connection(ConnectionSource.ConnectionString); + opts.DatabaseSchemaName = "async_config"; + }).ApplyAllDatabaseChangesOnStartup(); + + #region sample_registering_async_config_marten + + services.ConfigureMartenWithServices(); + + #endregion + services.AddSingleton(featureManager); + }).StartAsync(); + + var store = (DocumentStore)host.Services.GetRequiredService(); + + store.Events.EventMappingFor() + .Alias.ShouldBe("module1:event"); + + } + + [Fact] + public async Task feature_flag_negative() + { + var featureManager = Substitute.For(); + + featureManager.IsEnabledAsync("Module1").Returns(false); + + using var host = await Host.CreateDefaultBuilder() + .ConfigureServices(services => + { + services.AddMarten(opts => + { + opts.Connection(ConnectionSource.ConnectionString); + opts.DatabaseSchemaName = "async_config"; + }); + + services.ConfigureMartenWithServices(); + services.AddSingleton(featureManager); + }).StartAsync(); + + var store = (DocumentStore)host.Services.GetRequiredService(); + + store.Events.EventMappingFor() + .Alias.ShouldBe("module_1_event"); + + } +} + +#region sample_FeatureManagementUsingExtension + +public class FeatureManagementUsingExtension: IAsyncConfigureMarten +{ + private readonly IFeatureManager _manager; + + public FeatureManagementUsingExtension(IFeatureManager manager) + { + _manager = manager; + } + + public async ValueTask Configure(StoreOptions options, CancellationToken cancellationToken) + { + if (await _manager.IsEnabledAsync("Module1")) + { + options.Events.MapEventType("module1:event"); + } + } +} + +#endregion + +public class Module1Event +{ + +} + diff --git a/src/DocumentDbTests/Bugs/Bug_2283_problems_with_duplicated_DateTime_fields.cs b/src/DocumentDbTests/Bugs/Bug_2283_problems_with_duplicated_DateTime_fields.cs index 74672c733f..fbffbfa55f 100644 --- a/src/DocumentDbTests/Bugs/Bug_2283_problems_with_duplicated_DateTime_fields.cs +++ b/src/DocumentDbTests/Bugs/Bug_2283_problems_with_duplicated_DateTime_fields.cs @@ -23,13 +23,10 @@ public async Task cannot_query_on_duplicated_datetime_field() theSession.Store(model1); await theSession.SaveChangesAsync(); - - await Should.ThrowAsync(() => - theSession - .Query() - .Where(t => t.UserId == model1.UserId) - .MinAsync(t => t.Date) - ); + var value = await theSession + .Query() + .Where(t => t.UserId == model1.UserId) + .MinAsync(t => t.Date); } [Fact] diff --git a/src/DocumentDbTests/Reading/advanced_sql_query.cs b/src/DocumentDbTests/Reading/advanced_sql_query.cs index 6c455a775c..79da5c9b33 100644 --- a/src/DocumentDbTests/Reading/advanced_sql_query.cs +++ b/src/DocumentDbTests/Reading/advanced_sql_query.cs @@ -19,12 +19,13 @@ public advanced_sql_query(DefaultStoreFixture fixture): base(fixture) [Fact] public async void can_query_scalar() { - using var session = theStore.LightweightSession(); + await using var session = theStore.LightweightSession(); session.Store(new DocWithMeta { Id = 1, Name = "Max" }); await session.SaveChangesAsync(); #region sample_advanced_sql_query_single_scalar + var schema = session.DocumentStore.Options.Schema; var name = (await session.AdvancedSqlQueryAsync( - "select data ->> 'Name' from mt_doc_advanced_sql_query_docwithmeta limit 1", + $"select data ->> 'Name' from {schema.For()} limit 1", CancellationToken.None)).First(); #endregion name.ShouldBe("Max"); @@ -33,7 +34,7 @@ public async void can_query_scalar() [Fact] public async void can_query_multiple_scalars() { - using var session = theStore.LightweightSession(); + await using var session = theStore.LightweightSession(); #region sample_advanced_sql_query_multiple_scalars var (number,text, boolean) = (await session.AdvancedSqlQueryAsync( "select row(5), row('foo'), row(true) from (values(1)) as dummy", @@ -47,7 +48,7 @@ public async void can_query_multiple_scalars() [Fact] public async void can_query_non_document_classes_from_json() { - using var session = theStore.LightweightSession(); + await using var session = theStore.LightweightSession(); #region sample_advanced_sql_query_json_object var result = (await session.AdvancedSqlQueryAsync( "select row(json_build_object('Name', 'foo')), row(json_build_object('Name', 'bar')) from (values(1)) as dummy", @@ -60,13 +61,14 @@ public async void can_query_non_document_classes_from_json() [Fact] public async void can_query_documents() { - using var session = theStore.LightweightSession(); + await using var session = theStore.LightweightSession(); session.Store(new DocWithoutMeta { Id = 1, Name = "Max" }); session.Store(new DocWithoutMeta { Id = 2, Name = "Anne" }); await session.SaveChangesAsync(); #region sample_advanced_sql_query_documents + var schema = session.DocumentStore.Options.Schema; var docs = await session.AdvancedSqlQueryAsync( - "select id, data from mt_doc_advanced_sql_query_docwithoutmeta order by data ->> 'Name'", + $"select id, data from {schema.For()} order by data ->> 'Name'", CancellationToken.None); #endregion docs.Count.ShouldBe(2); @@ -77,12 +79,13 @@ public async void can_query_documents() [Fact] public async void can_query_documents_and_will_set_metadata_on_result_documents() { - using var session = theStore.LightweightSession(); + await using var session = theStore.LightweightSession(); session.Store(new DocWithMeta { Id = 1, Name = "Max" }); await session.SaveChangesAsync(); #region sample_advanced_sql_query_documents_with_metadata + var schema = session.DocumentStore.Options.Schema; var doc = (await session.AdvancedSqlQueryAsync( - "select id, data, mt_version from mt_doc_advanced_sql_query_docwithmeta where data ->> 'Name' = 'Max'", + $"select id, data, mt_version from {schema.For()} where data ->> 'Name' = 'Max'", CancellationToken.None)).First(); #endregion doc.Id.ShouldBe(1); @@ -93,7 +96,7 @@ public async void can_query_documents_and_will_set_metadata_on_result_documents( [Fact] public async void can_query_multiple_documents_and_scalar() { - using var session = theStore.LightweightSession(); + await using var session = theStore.LightweightSession(); #region sample_advanced_sql_query_related_documents_and_scalar session.Store(new DocWithMeta { Id = 1, Name = "Max" }); session.Store(new DocDetailsWithMeta { Id = 1, Detail = "Likes bees" }); @@ -105,17 +108,18 @@ public async void can_query_multiple_documents_and_scalar() session.Store(new DocDetailsWithMeta { Id = 4, Detail = "Likes to cook" }); await session.SaveChangesAsync(); + var schema = session.DocumentStore.Options.Schema; IReadOnlyList<(DocWithMeta doc, DocDetailsWithMeta detail, long totalResults)> results = await session.AdvancedSqlQueryAsync( - """ + $""" select row(a.id, a.data, a.mt_version), row(b.id, b.data, b.mt_version), row(count(*) over()) from - mt_doc_advanced_sql_query_docwithmeta a + {schema.For()} a left join - mt_doc_advanced_sql_query_docdetailswithmeta b on a.id = b.id + {schema.For()} b on a.id = b.id where (a.data ->> 'Id')::int > 1 order by diff --git a/src/EventSourcingTests/Bugs/Bug_3113_do_not_reorder_sql_operations.cs b/src/EventSourcingTests/Bugs/Bug_3113_do_not_reorder_sql_operations.cs new file mode 100644 index 0000000000..a57f1d3725 --- /dev/null +++ b/src/EventSourcingTests/Bugs/Bug_3113_do_not_reorder_sql_operations.cs @@ -0,0 +1,181 @@ +using Marten.Schema; + +namespace EventSourcingTests.Bugs; + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Marten; +using Marten.Events; +using Marten.Events.Projections; +using Marten.Testing.Harness; +using Shouldly; +using Weasel.Postgresql.Tables; +using Xunit; + +public sealed class Bug_3113_do_not_reorder_sql_operations : BugIntegrationContext +{ + [Fact] + public Task does_not_reorder_sql_commands_randomly_single_document_projections() + { + StoreOptions(opts => + { + opts.Projections.LiveStreamAggregation(); + opts.Projections.Snapshot(SnapshotLifecycle.Inline); + opts.Projections.Add(ProjectionLifecycle.Inline); + }); + + return run_test(); + } + + [Fact] + public Task does_not_reorder_sql_commands_randomly_multiple_document_projections() + { + StoreOptions(opts => + { + opts.Projections.LiveStreamAggregation(); + opts.Projections.Snapshot(SnapshotLifecycle.Inline); + opts.Projections.Snapshot(SnapshotLifecycle.Inline); + opts.Projections.Add(ProjectionLifecycle.Inline); + }); + + return run_test(); + } + + private async Task run_test() + { + await using var session = theStore.LightweightSession(); + + var thingId1 = AddThing("First"); + var thingId2 = AddThing("Second"); + + await session.SaveChangesAsync(); + + var thingUsers1 = AssignUsers(thingId1, 2); + var thingUsers2 = AssignUsers(thingId2, 20); + + await session.SaveChangesAsync(); + + var actualThingUsers1 = await ReadUserIdsAsync(thingId1); + actualThingUsers1.ShouldBe(thingUsers1); + + var actualThingUsers2 = await ReadUserIdsAsync(thingId2); + actualThingUsers2.ShouldBe(thingUsers2); + + Guid AddThing(string name) + { + var id = Guid.NewGuid(); + var created = new ThingCreated(id, name); + session.Events.StartStream(created.Id, created); + + return id; + } + + IEnumerable AssignUsers(Guid thingId, int count) + { + var users = Enumerable.Range(1, count).Select(_ => Guid.NewGuid()).ToList(); + var assigned = new ThingUsersAssigned(thingId, users); + session.Events.Append(assigned.Id, assigned); + + return users; + } + + async Task> ReadUserIdsAsync(Guid thingId) + { + return await session.QueryAsync($"select user_id from {MyTableProjection.UsersTableName} where id = ?", thingId); + } + } + + public record ThingCreated(Guid Id, string Name); + public record ThingUsersAssigned(Guid Id, IEnumerable UserIds); + + public record Thing(Guid Id, string Name) + { + public static Thing Create(ThingCreated @event) + => new Thing(@event.Id, @event.Name); + } + + [DocumentAlias("projection1")] + public record MyProjection1(Guid Id, string Name, IEnumerable UserIds) + { + public static MyProjection1 Create(ThingCreated @event) + => new(@event.Id, @event.Name, []); + + public MyProjection1 Apply(ThingUsersAssigned @event) + => this with + { + UserIds = @event.UserIds + }; + } + + [DocumentAlias("projection2")] + public record MyProjection2(Guid Id, IEnumerable UserIds) + { + public static MyProjection2 Create(ThingCreated @event) + => new(@event.Id, []); + + public MyProjection2 Apply(ThingUsersAssigned @event) + => this with + { + UserIds = @event.UserIds + }; + } + + public class MyTableProjection : EventProjection + { + public const string MainTableName = "mt_tbl_bug_3113"; + public const string UsersTableName = $"{MainTableName}_users"; + + public MyTableProjection() + { + var mainTable = new Table(MainTableName); + + mainTable.AddColumn("id").AsPrimaryKey(); + mainTable.AddColumn("name").AsPrimaryKey(); + + SchemaObjects.Add(mainTable); + + var usersTable = new Table(UsersTableName); + + usersTable.AddColumn("id").AsPrimaryKey(); + usersTable.AddColumn("user_id").AsPrimaryKey(); + + SchemaObjects.Add(usersTable); + + foreach (var table in SchemaObjects.OfType()) + { + Options.DeleteDataInTableOnTeardown(table.Identifier); + } + } + + public void Project(IEvent @event, IDocumentOperations ops) + { + ops.QueueSqlCommand( + $""" + insert into {MainTableName} (id, name) values (?, ?) + """, + @event.Data.Id, + @event.Data.Name); + } + + public void Project(IEvent @event, IDocumentOperations ops) + { + ops.QueueSqlCommand( + $""" + delete from {UsersTableName} where id = ? + """, + @event.Data.Id); + + foreach (var userId in @event.Data.UserIds) + { + ops.QueueSqlCommand( + $""" + insert into {UsersTableName} (id, user_id) values (?, ?) + """, + @event.Data.Id, + userId); + } + } + } +} diff --git a/src/EventSourcingTests/cannot_register_duplicate_projections_by_name.cs b/src/EventSourcingTests/cannot_register_duplicate_projections_by_name.cs index 945bd65c6f..cff0f6210c 100644 --- a/src/EventSourcingTests/cannot_register_duplicate_projections_by_name.cs +++ b/src/EventSourcingTests/cannot_register_duplicate_projections_by_name.cs @@ -14,7 +14,7 @@ public class cannot_register_duplicate_projections_by_name [Fact] public void cannot_register_duplicate_projection_names() { - Should.Throw(() => + Should.Throw(() => { DocumentStore.For(opts => { diff --git a/src/EventSourcingTests/fetching_event_store_floor_by_time.cs b/src/EventSourcingTests/fetching_event_store_floor_by_time.cs new file mode 100644 index 0000000000..bcba97b1a9 --- /dev/null +++ b/src/EventSourcingTests/fetching_event_store_floor_by_time.cs @@ -0,0 +1,48 @@ +using System; +using System.Threading; +using System.Threading.Tasks; +using EventSourcingTests.Aggregation; +using JasperFx.Core; +using JasperFx.Core.Reflection; +using Marten.Storage; +using Marten.Testing.Harness; +using Microsoft.Extensions.Time.Testing; +using Shouldly; +using Xunit; + +namespace EventSourcingTests; + +public class fetching_event_store_floor_by_time : OneOffConfigurationsContext +{ + [Fact] + public async Task find_the_floor() + { + + var start = new DateTimeOffset(2024, 1, 1, 0, 0, 0, 0.Seconds()); + var provider = new FakeTimeProvider(start); + + StoreOptions(opts => + { + opts.Events.TimeProvider = provider; + }); + + theSession.Events.StartStream(Guid.NewGuid(), new AEvent(), new BEvent(), new CEvent(), new DEvent()); + theSession.Events.StartStream(Guid.NewGuid(), new AEvent(), new BEvent(), new CEvent(), new DEvent()); + theSession.Events.StartStream(Guid.NewGuid(), new AEvent(), new BEvent(), new CEvent(), new DEvent()); + theSession.Events.StartStream(Guid.NewGuid(), new AEvent(), new BEvent(), new CEvent(), new DEvent()); + + await theSession.SaveChangesAsync(); + + provider.Advance(5.Minutes()); + theSession.Events.StartStream(Guid.NewGuid(), new AEvent(), new BEvent(), new CEvent(), new DEvent()); + await theSession.SaveChangesAsync(); + + provider.Advance(30.Seconds()); + theSession.Events.StartStream(Guid.NewGuid(), new AEvent(), new BEvent(), new CEvent(), new DEvent()); + await theSession.SaveChangesAsync(); + + var position = await theStore.Storage.Database.As() + .FindEventStoreFloorAtTimeAsync(start.Add(3.Seconds()), CancellationToken.None); + position.ShouldBe(17L); + } +} diff --git a/src/LinqTests/Bugs/Bug_2223_list_contains_any_generates_invalid_sql.cs b/src/LinqTests/Bugs/Bug_2223_list_contains_any_generates_invalid_sql.cs index 987b2b1ad7..ff3e617435 100644 --- a/src/LinqTests/Bugs/Bug_2223_list_contains_any_generates_invalid_sql.cs +++ b/src/LinqTests/Bugs/Bug_2223_list_contains_any_generates_invalid_sql.cs @@ -64,12 +64,12 @@ public async Task should_be_able_to_query_with_multiple_list_items_and_have_incl var otherTestEntityLookup = new Dictionary(); var entities = await session.Query() .Include(x => x.OtherIds, otherTestEntityLookup) - .Where(x => Enumerable.Any(x.OtherIds, id => otherIdsQuery.Contains(id))) + .Where(x => x.OtherIds.Any(id => otherIdsQuery.Contains(id))) .ToListAsync(); entities.Count.ShouldBe(1); - ShouldBeTestExtensions.ShouldBe(entities[0].OtherIds.Count, 2); - ShouldBeEnumerableTestExtensions.ShouldContain(entities[0].OtherIds, otherEntityTestId); + entities[0].OtherIds.Count.ShouldBe(2); + entities[0].OtherIds.ShouldContain(otherEntityTestId); otherTestEntityLookup.Count.ShouldBe(2); otherTestEntityLookup.ShouldContainKey(otherEntityTestId); diff --git a/src/LinqTests/Bugs/Bug_3096_include_where_select.cs b/src/LinqTests/Bugs/Bug_3096_include_where_select.cs new file mode 100644 index 0000000000..47615cb98c --- /dev/null +++ b/src/LinqTests/Bugs/Bug_3096_include_where_select.cs @@ -0,0 +1,53 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Marten; +using Marten.Testing.Documents; +using Marten.Testing.Harness; +using Shouldly; +using Xunit.Abstractions; + +namespace LinqTests.Bugs; + +public class Bug_3096_include_where_select : IntegrationContext +{ + private readonly ITestOutputHelper _output; + + public Bug_3096_include_where_select(DefaultStoreFixture fixture, ITestOutputHelper output) : base(fixture) + { + _output = output; + } + + [Fact] + public void include_to_dictionary_with_where_and_projection() + { + var user1 = new User(); + var user2 = new User(); + + var issue1 = new Issue { AssigneeId = user1.Id, Title = "Garage Door is ok" }; + var issue2 = new Issue { AssigneeId = user2.Id, Title = "Garage Door is busted" }; + var issue3 = new Issue { AssigneeId = user2.Id, Title = "Garage Door is busted" }; + + using var session = theStore.IdentitySession(); + session.Store(user1, user2); + session.Store(issue1, issue2, issue3); + session.SaveChanges(); + + using var query = theStore.QuerySession(); + query.Logger = new TestOutputMartenLogger(_output); + + var dict = new Dictionary(); + + var issues = query + .Query() + .Where(i => i.Title.Contains("ok")) + .Include(x => x.AssigneeId, dict) + .Select(i => new { i.Id, i.Title, }) + .ToArray(); + + issues.Length.ShouldBe(1); + + dict.Count.ShouldBe(1); + dict.ContainsKey(user1.Id).ShouldBeTrue(); + } +} diff --git a/src/LinqTests/Bugs/Bug_3116_more_expression_to_constant_issues.cs b/src/LinqTests/Bugs/Bug_3116_more_expression_to_constant_issues.cs new file mode 100644 index 0000000000..349b87d6d9 --- /dev/null +++ b/src/LinqTests/Bugs/Bug_3116_more_expression_to_constant_issues.cs @@ -0,0 +1,27 @@ +using System.Linq; +using System.Threading.Tasks; +using Marten; +using Marten.Testing.Documents; +using Marten.Testing.Harness; + +namespace LinqTests.Bugs; + +public class Bug_3116_more_expression_to_constant_issues : BugIntegrationContext +{ + [Fact] + public async Task query_works() + { + int from = 0; + const int batchSize = 100; + + await theStore.BulkInsertDocumentsAsync(Target.GenerateRandomData(100)); + + await theSession.Query() + .Where( + e => e.String == "something" + && e.Number >= from + && e.Number < from + batchSize) + .OrderBy(r => r.Number) + .ToListAsync(); + } +} diff --git a/src/LinqTests/Bugs/Bug_3117_select_directly_to_DateTime.cs b/src/LinqTests/Bugs/Bug_3117_select_directly_to_DateTime.cs new file mode 100644 index 0000000000..f985722d08 --- /dev/null +++ b/src/LinqTests/Bugs/Bug_3117_select_directly_to_DateTime.cs @@ -0,0 +1,17 @@ +using System.Threading.Tasks; +using Marten; +using Marten.Testing.Documents; +using Marten.Testing.Harness; + +namespace LinqTests.Bugs; + +public class Bug_3117_select_directly_to_DateTime : BugIntegrationContext +{ + [Fact] + public async Task select_max_date_time() + { + await theStore.BulkInsertDocumentsAsync(Target.GenerateRandomData(100)); + + var time = await theSession.Query().MaxAsync(x => x.Date); + } +} diff --git a/src/LinqTests/Bugs/Bug_3126_dictionary_nested_queries.cs b/src/LinqTests/Bugs/Bug_3126_dictionary_nested_queries.cs new file mode 100644 index 0000000000..f17914b052 --- /dev/null +++ b/src/LinqTests/Bugs/Bug_3126_dictionary_nested_queries.cs @@ -0,0 +1,55 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Marten; +using Marten.Exceptions; +using Marten.Testing.Harness; +using Shouldly; +using Xunit.Abstractions; + +namespace LinqTests.Bugs; + +public class Bug_3126_dictionary_nested_queries : BugIntegrationContext +{ + private readonly ITestOutputHelper _output; + + public record DictObject(Guid Id, Dictionary> GuidDict, Dictionary NestedObject); + public record NestedObjectWithinDict(Guid Id); + + public Bug_3126_dictionary_nested_queries(ITestOutputHelper output) + { + _output = output; + } + + [Fact] + public async Task broken_linq_condition_3() + { + var id = Guid.Parse("49a5c1ff-cdef-40d4-9b53-26d1f5454810"); + + var o = new DictObject(Guid.NewGuid(), new Dictionary>(), + new Dictionary()); + + o.NestedObject.Add(Guid.NewGuid(), new NestedObjectWithinDict(Guid.NewGuid())); + o.NestedObject.Add(Guid.NewGuid(), new NestedObjectWithinDict(Guid.NewGuid())); + o.NestedObject.Add(Guid.NewGuid(), new NestedObjectWithinDict(Guid.NewGuid())); + + var main = new DictObject(Guid.NewGuid(), new Dictionary>(), + new Dictionary()); + + main.NestedObject.Add(Guid.NewGuid(), new NestedObjectWithinDict(id)); + main.GuidDict.Add(id, new HashSet{Guid.NewGuid(), Guid.NewGuid()}); + + await theStore.BulkInsertDocumentsAsync([o, main]); + + theSession.Logger = new TestOutputMartenLogger(_output); + + await Should.ThrowAsync(async () => + { + await theSession.Query() + .Where(x => x.NestedObject.Values.Any(s => s.Id == id)).ToListAsync(); + }); + + + } +} diff --git a/src/LinqTests/Bugs/Bug_490_hierarchy_and_include.cs b/src/LinqTests/Bugs/Bug_490_hierarchy_and_include.cs index 0df43d3dd8..d6c768844f 100644 --- a/src/LinqTests/Bugs/Bug_490_hierarchy_and_include.cs +++ b/src/LinqTests/Bugs/Bug_490_hierarchy_and_include.cs @@ -68,7 +68,7 @@ public void load_abstract_type_with_include() using (var session = theStore.QuerySession()) { - List accounts = new List(); + var accounts = new List(); session.Query() .Include(a => a.AccountId, accounts) .ToList() @@ -110,4 +110,4 @@ public async Task load_abstract_type_with_include_async() accounts.First().Id.ShouldBe(1); } } -} \ No newline at end of file +} diff --git a/src/LinqTests/Includes/end_to_end_query_with_include.cs b/src/LinqTests/Includes/end_to_end_query_with_include.cs index 5d151892c1..207220cadb 100644 --- a/src/LinqTests/Includes/end_to_end_query_with_include.cs +++ b/src/LinqTests/Includes/end_to_end_query_with_include.cs @@ -750,6 +750,8 @@ public void include_many_to_list() using (var query = theStore.QuerySession()) { + query.Logger = new TestOutputMartenLogger(_output); + var list = new List(); query.Query() diff --git a/src/Marten.AsyncDaemon.Testing/AsyncOptionsTests.cs b/src/Marten.AsyncDaemon.Testing/AsyncOptionsTests.cs index 4f843b7941..4336583b4a 100644 --- a/src/Marten.AsyncDaemon.Testing/AsyncOptionsTests.cs +++ b/src/Marten.AsyncDaemon.Testing/AsyncOptionsTests.cs @@ -1,13 +1,23 @@ +using System; +using System.Threading; +using System.Threading.Tasks; using Marten.Events.Daemon; using Marten.Internal.Operations; +using Marten.Storage; using Marten.Testing.Documents; +using Marten.Testing.Harness; using NSubstitute; +using Shouldly; using Xunit; namespace Marten.AsyncDaemon.Testing; public class AsyncOptionsTests { + private readonly IMartenDatabase theDatabase = Substitute.For(); + private readonly ShardName theName = new ShardName("Fake", "All"); + private readonly CancellationToken theToken = CancellationToken.None; + [Fact] public void teardown_by_view_type_1() { @@ -22,4 +32,213 @@ public void teardown_by_view_type_1() operations.Received().QueueOperation(new TruncateTable(typeof(Target))); operations.Received().QueueOperation(new TruncateTable(typeof(User))); } + + [Fact] + public async Task determine_starting_position_if_rebuild() + { + var options = new AsyncOptions(); + (await options.DetermineStartingPositionAsync(2000L, theName, ShardExecutionMode.Rebuild, theDatabase, theToken)) + .ShouldBe(new Position(0, true)); + + } + + [Fact] + public async Task determine_starting_position_if_continuous_and_no_other_constraints() + { + theDatabase.ProjectionProgressFor(theName, theToken).Returns(111L); + + var options = new AsyncOptions(); + (await options.DetermineStartingPositionAsync(2000L, theName, ShardExecutionMode.Continuous, theDatabase, theToken)) + .ShouldBe(new Position(111L, false)); + } + + [Fact] + public async Task subscribe_from_present() + { + var options = new AsyncOptions(); + options.SubscribeFromPresent(); + + (await options.DetermineStartingPositionAsync(2000L, theName, ShardExecutionMode.Continuous, theDatabase, theToken)) + .ShouldBe(new Position(2000L, true)); + } + + [Fact] + public async Task do_not_match_on_database_name() + { + theDatabase.ProjectionProgressFor(theName, theToken).Returns(111L); + theDatabase.Identifier.Returns("One"); + + var options = new AsyncOptions(); + options.SubscribeFromPresent("Two"); + + (await options.DetermineStartingPositionAsync(2000L, theName, ShardExecutionMode.Continuous, theDatabase, theToken)) + .ShouldBe(new Position(111L, false)); + } + + [Fact] + public async Task do_match_on_database_name() + { + theDatabase.ProjectionProgressFor(theName, theToken).Returns(111L); + theDatabase.Identifier.Returns("One"); + + var options = new AsyncOptions(); + options.SubscribeFromPresent("One"); + + (await options.DetermineStartingPositionAsync(2000L, theName, ShardExecutionMode.Continuous, theDatabase, theToken)) + .ShouldBe(new Position(2000L, true)); + } + + [Fact] + public async Task subscribe_from_time_hit_with_no_prior() + { + theDatabase.ProjectionProgressFor(theName, theToken).Returns(0); + theDatabase.Identifier.Returns("One"); + + var subscriptionTime = (DateTimeOffset)DateTime.Today; + + theDatabase.FindEventStoreFloorAtTimeAsync(subscriptionTime, theToken).Returns(222L); + + var options = new AsyncOptions(); + options.SubscribeFromTime(subscriptionTime); + + (await options.DetermineStartingPositionAsync(2000L, theName, ShardExecutionMode.Continuous, theDatabase, theToken)) + .ShouldBe(new Position(222L, true)); + } + + [Fact] + public async Task subscribe_from_time_miss_with_no_prior() + { + theDatabase.ProjectionProgressFor(theName, theToken).Returns(0); + theDatabase.Identifier.Returns("One"); + + var subscriptionTime = (DateTimeOffset)DateTime.Today; + + theDatabase.FindEventStoreFloorAtTimeAsync(subscriptionTime, theToken).Returns((long?)null); + + var options = new AsyncOptions(); + options.SubscribeFromTime(subscriptionTime); + + (await options.DetermineStartingPositionAsync(2000L, theName, ShardExecutionMode.Continuous, theDatabase, theToken)) + .ShouldBe(new Position(0, false)); + } + + [Fact] + public async Task subscribe_from_time_hit_with_prior_lower_than_threshold() + { + theDatabase.ProjectionProgressFor(theName, theToken).Returns(200L); + theDatabase.Identifier.Returns("One"); + + var subscriptionTime = (DateTimeOffset)DateTime.Today; + + theDatabase.FindEventStoreFloorAtTimeAsync(subscriptionTime, theToken).Returns(222L); + + var options = new AsyncOptions(); + options.SubscribeFromTime(subscriptionTime); + + (await options.DetermineStartingPositionAsync(2000L, theName, ShardExecutionMode.Continuous, theDatabase, theToken)) + .ShouldBe(new Position(222L, true)); + } + + [Fact] + public async Task subscribe_from_time_hit_with_prior_higher_than_threshold() + { + theDatabase.ProjectionProgressFor(theName, theToken).Returns(500L); + theDatabase.Identifier.Returns("One"); + + var subscriptionTime = (DateTimeOffset)DateTime.Today; + + theDatabase.FindEventStoreFloorAtTimeAsync(subscriptionTime, theToken).Returns(222L); + + var options = new AsyncOptions(); + options.SubscribeFromTime(subscriptionTime); + + (await options.DetermineStartingPositionAsync(2000L, theName, ShardExecutionMode.Continuous, theDatabase, theToken)) + .ShouldBe(new Position(500L, false)); + } + + [Fact] + public async Task subscribe_from_time_hit_with_prior_higher_than_threshold_and_rebuild() + { + theDatabase.ProjectionProgressFor(theName, theToken).Returns(500L); + theDatabase.Identifier.Returns("One"); + + var subscriptionTime = (DateTimeOffset)DateTime.Today; + + theDatabase.FindEventStoreFloorAtTimeAsync(subscriptionTime, theToken).Returns(222L); + + var options = new AsyncOptions(); + options.SubscribeFromTime(subscriptionTime); + + (await options.DetermineStartingPositionAsync(2000L, theName, ShardExecutionMode.Rebuild, theDatabase, theToken)) + .ShouldBe(new Position(222L, true)); + } + + [Fact] + public async Task subscribe_from_sequence_hit_with_no_prior() + { + theDatabase.ProjectionProgressFor(theName, theToken).Returns(100); + theDatabase.Identifier.Returns("One"); + + var options = new AsyncOptions(); + options.SubscribeFromSequence(222L); + + (await options.DetermineStartingPositionAsync(2000L, theName, ShardExecutionMode.Continuous, theDatabase, theToken)) + .ShouldBe(new Position(222L, true)); + } + + [Fact] + public async Task subscribe_from_sequence_miss_with_no_prior() + { + theDatabase.ProjectionProgressFor(theName, theToken).Returns(0); + theDatabase.Identifier.Returns("One"); + + var options = new AsyncOptions(); + options.SubscribeFromSequence(222L); + + (await options.DetermineStartingPositionAsync(2000L, theName, ShardExecutionMode.Continuous, theDatabase, theToken)) + .ShouldBe(new Position(222L, true)); + } + + [Fact] + public async Task subscribe_from_sequence_hit_with_prior_lower_than_threshold() + { + theDatabase.ProjectionProgressFor(theName, theToken).Returns(200L); + theDatabase.Identifier.Returns("One"); + + var options = new AsyncOptions(); + options.SubscribeFromSequence(222L); + + (await options.DetermineStartingPositionAsync(2000L, theName, ShardExecutionMode.Continuous, theDatabase, theToken)) + .ShouldBe(new Position(222L, true)); + } + + [Fact] + public async Task subscribe_from_sequence_hit_with_prior_higher_than_threshold() + { + theDatabase.ProjectionProgressFor(theName, theToken).Returns(500L); + theDatabase.Identifier.Returns("One"); + + var options = new AsyncOptions(); + options.SubscribeFromSequence(222L); + + (await options.DetermineStartingPositionAsync(2000L, theName, ShardExecutionMode.Continuous, theDatabase, theToken)) + .ShouldBe(new Position(500L, false)); + } + + [Fact] + public async Task subscribe_from_sequence_hit_with_prior_higher_than_threshold_and_rebuild() + { + theDatabase.ProjectionProgressFor(theName, theToken).Returns(500L); + theDatabase.Identifier.Returns("One"); + + var options = new AsyncOptions(); + options.SubscribeFromSequence(222L); + + (await options.DetermineStartingPositionAsync(2000L, theName, ShardExecutionMode.Rebuild, theDatabase, theToken)) + .ShouldBe(new Position(222L, true)); + } + + + + } diff --git a/src/Marten.AsyncDaemon.Testing/Subscriptions/subscription_configuration.cs b/src/Marten.AsyncDaemon.Testing/Subscriptions/subscription_configuration.cs new file mode 100644 index 0000000000..5a54b9ddf8 --- /dev/null +++ b/src/Marten.AsyncDaemon.Testing/Subscriptions/subscription_configuration.cs @@ -0,0 +1,107 @@ +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using Marten.Events; +using Marten.Events.Daemon; +using Marten.Events.Daemon.Internals; +using Marten.Events.Projections; +using Marten.Services; +using Marten.Subscriptions; +using Marten.Testing.Harness; +using Shouldly; +using Xunit; + +namespace Marten.AsyncDaemon.Testing.Subscriptions; + +public class subscription_configuration : OneOffConfigurationsContext +{ + [Fact] + public void register_subscription_and_part_of_shards() + { + StoreOptions(opts => + { + opts.Projections.Subscribe(new FakeSubscription()); + }); + + theStore.Options.Projections.AllShards().Select(x => x.Name.Identity) + .ShouldContain("Fake:All"); + + } + + [Fact] + public async Task start_up_the_subscription() + { + StoreOptions(opts => + { + opts.Projections.Subscribe(new FakeSubscription()); + }); + + using var daemon = await theStore.BuildProjectionDaemonAsync(); + await daemon.StartAgentAsync("Fake:All", CancellationToken.None); + } + + [Fact] + public void validate_on_uniqueness_of_shard_names_with_subscriptions_and_projections() + { + Should.Throw(() => + { + StoreOptions(opts => + { + opts.Projections.Subscribe(new FakeSubscription()); + opts.Projections.Add(new FakeProjection(), ProjectionLifecycle.Async, projectionName: "Fake"); + }); + }); + } +} + +public class FakeProjection: IProjection +{ + public void Apply(IDocumentOperations operations, IReadOnlyList streams) + { + throw new System.NotImplementedException(); + } + + public async Task ApplyAsync(IDocumentOperations operations, IReadOnlyList streams, CancellationToken cancellation) + { + throw new System.NotImplementedException(); + } +} + +public class FakeSubscription: SubscriptionBase +{ + public FakeSubscription() + { + SubscriptionName = "Fake"; + } + + public List EventsEncountered { get; } = new List(); + + public override Task ProcessEventsAsync(EventRange page, ISubscriptionController controller, + IDocumentOperations operations, CancellationToken cancellationToken) + { + EventsEncountered.AddRange(page.Events); + return Task.FromResult((IChangeListener)Listener); + } + + public FakeChangeListener Listener { get; } = new(); +} + +public class FakeChangeListener: IChangeListener +{ + public Task AfterCommitAsync(IDocumentSession session, IChangeSet commit, CancellationToken token) + { + AfterCommitWasCalled = true; + return Task.CompletedTask; + } + + public bool AfterCommitWasCalled { get; set; } + + public Task BeforeCommitAsync(IDocumentSession session, IChangeSet commit, CancellationToken token) + { + BeforeCommitWasCalled = true; + return Task.CompletedTask; + } + + public bool BeforeCommitWasCalled { get; set; } +} diff --git a/src/Marten.AsyncDaemon.Testing/Subscriptions/subscriptions_end_to_end.cs b/src/Marten.AsyncDaemon.Testing/Subscriptions/subscriptions_end_to_end.cs new file mode 100644 index 0000000000..020236136b --- /dev/null +++ b/src/Marten.AsyncDaemon.Testing/Subscriptions/subscriptions_end_to_end.cs @@ -0,0 +1,386 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using JasperFx.Core; +using Lamar.IoC.Instances; +using Marten.Events; +using Marten.Events.Daemon; +using Marten.Events.Daemon.Internals; +using Marten.Events.Daemon.Resiliency; +using Marten.Subscriptions; +using Marten.Testing.Harness; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Npgsql; +using Shouldly; +using Weasel.Postgresql; +using Xunit; + +namespace Marten.AsyncDaemon.Testing.Subscriptions; + +public class subscriptions_end_to_end: OneOffConfigurationsContext +{ + private readonly FakeSubscription theSubscription = new(); + + public subscriptions_end_to_end() + { + StoreOptions(opts => + { + opts.Projections.Subscribe(theSubscription); + }); + } + + [Fact] + public async Task run_events_through() + { + using var daemon = await theStore.BuildProjectionDaemonAsync(); + await daemon.StartAllAsync(); + + var events1 = new object[] { new EventSourcingTests.Aggregation.AEvent(), new EventSourcingTests.Aggregation.AEvent(), new EventSourcingTests.Aggregation.BEvent(), new EventSourcingTests.Aggregation.CEvent() }; + var events2 = new object[] { new EventSourcingTests.Aggregation.BEvent(), new EventSourcingTests.Aggregation.AEvent(), new EventSourcingTests.Aggregation.BEvent(), new EventSourcingTests.Aggregation.CEvent() }; + var events3 = new object[] { new EventSourcingTests.Aggregation.DEvent(), new EventSourcingTests.Aggregation.AEvent(), new EventSourcingTests.Aggregation.DEvent(), new EventSourcingTests.Aggregation.CEvent() }; + var events4 = new object[] { new EventSourcingTests.Aggregation.EEvent(), new EventSourcingTests.Aggregation.BEvent(), new EventSourcingTests.Aggregation.DEvent(), new EventSourcingTests.Aggregation.CEvent() }; + + theSession.Events.StartStream(Guid.NewGuid(), events1); + theSession.Events.StartStream(Guid.NewGuid(), events2); + theSession.Events.StartStream(Guid.NewGuid(), events3); + theSession.Events.StartStream(Guid.NewGuid(), events4); + + await theSession.SaveChangesAsync(); + + await theStore.WaitForNonStaleProjectionDataAsync(20.Seconds()); + + theSubscription.EventsEncountered.Count.ShouldBe(16); + + var progress = await theStore.Advanced.ProjectionProgressFor(new ShardName("Fake", "All")); + progress.ShouldBe(16); + } + + [Fact] + public async Task start_subscription_at_sequence_floor() + { + using var daemon = await theStore.BuildProjectionDaemonAsync(); + await daemon.StartAllAsync(); + + var events1 = new object[] { new EventSourcingTests.Aggregation.AEvent(), new EventSourcingTests.Aggregation.AEvent(), new EventSourcingTests.Aggregation.BEvent(), new EventSourcingTests.Aggregation.CEvent() }; + var events2 = new object[] { new EventSourcingTests.Aggregation.BEvent(), new EventSourcingTests.Aggregation.AEvent(), new EventSourcingTests.Aggregation.BEvent(), new EventSourcingTests.Aggregation.CEvent() }; + var events3 = new object[] { new EventSourcingTests.Aggregation.DEvent(), new EventSourcingTests.Aggregation.AEvent(), new EventSourcingTests.Aggregation.DEvent(), new EventSourcingTests.Aggregation.CEvent() }; + var events4 = new object[] { new EventSourcingTests.Aggregation.EEvent(), new EventSourcingTests.Aggregation.BEvent(), new EventSourcingTests.Aggregation.DEvent(), new EventSourcingTests.Aggregation.CEvent() }; + + theSession.Events.StartStream(Guid.NewGuid(), events1); + theSession.Events.StartStream(Guid.NewGuid(), events2); + theSession.Events.StartStream(Guid.NewGuid(), events3); + theSession.Events.StartStream(Guid.NewGuid(), events4); + + await theSession.SaveChangesAsync(); + + await theStore.WaitForNonStaleProjectionDataAsync(20.Seconds()); + + var secondSubscription = new FakeSubscription(); + var secondStore = SeparateStore(opts => + { + opts.Projections.Subscribe(secondSubscription, o => o.Options.SubscribeFromSequence(8)); + }); + + await daemon.StopAllAsync(); + + using var daemon2 = await secondStore.BuildProjectionDaemonAsync(); + await daemon2.StartAllAsync(); + await Task.Delay(2000); // yeah, I know + await secondStore.WaitForNonStaleProjectionDataAsync(20.Seconds()); + + secondSubscription.EventsEncountered.Count.ShouldBe(8); + } + + [Fact] + public async Task run_events_through_and_rewind_from_scratch() + { + using var daemon = await theStore.BuildProjectionDaemonAsync(); + await daemon.StartAllAsync(); + + var events1 = new object[] { new EventSourcingTests.Aggregation.AEvent(), new EventSourcingTests.Aggregation.AEvent(), new EventSourcingTests.Aggregation.BEvent(), new EventSourcingTests.Aggregation.CEvent() }; + var events2 = new object[] { new EventSourcingTests.Aggregation.BEvent(), new EventSourcingTests.Aggregation.AEvent(), new EventSourcingTests.Aggregation.BEvent(), new EventSourcingTests.Aggregation.CEvent() }; + var events3 = new object[] { new EventSourcingTests.Aggregation.DEvent(), new EventSourcingTests.Aggregation.AEvent(), new EventSourcingTests.Aggregation.DEvent(), new EventSourcingTests.Aggregation.CEvent() }; + var events4 = new object[] { new EventSourcingTests.Aggregation.EEvent(), new EventSourcingTests.Aggregation.BEvent(), new EventSourcingTests.Aggregation.DEvent(), new EventSourcingTests.Aggregation.CEvent() }; + + theSession.Events.StartStream(Guid.NewGuid(), events1); + theSession.Events.StartStream(Guid.NewGuid(), events2); + theSession.Events.StartStream(Guid.NewGuid(), events3); + theSession.Events.StartStream(Guid.NewGuid(), events4); + + await theSession.SaveChangesAsync(); + + await theStore.WaitForNonStaleProjectionDataAsync(20.Seconds()); + + theSubscription.EventsEncountered.Clear(); + + await daemon.RewindSubscriptionAsync("Fake", CancellationToken.None); + + await theStore.WaitForNonStaleProjectionDataAsync(30.Seconds()); + + theSubscription.EventsEncountered.Count.ShouldBe(16); + + var progress = await theStore.Advanced.ProjectionProgressFor(new ShardName("Fake", "All")); + progress.ShouldBe(16); + } + + [Fact] + public async Task run_events_through_and_rewind_from_middle() + { + using var daemon = await theStore.BuildProjectionDaemonAsync(); + await daemon.StartAllAsync(); + + var events1 = new object[] { new EventSourcingTests.Aggregation.AEvent(), new EventSourcingTests.Aggregation.AEvent(), new EventSourcingTests.Aggregation.BEvent(), new EventSourcingTests.Aggregation.CEvent() }; + var events2 = new object[] { new EventSourcingTests.Aggregation.BEvent(), new EventSourcingTests.Aggregation.AEvent(), new EventSourcingTests.Aggregation.BEvent(), new EventSourcingTests.Aggregation.CEvent() }; + var events3 = new object[] { new EventSourcingTests.Aggregation.DEvent(), new EventSourcingTests.Aggregation.AEvent(), new EventSourcingTests.Aggregation.DEvent(), new EventSourcingTests.Aggregation.CEvent() }; + var events4 = new object[] { new EventSourcingTests.Aggregation.EEvent(), new EventSourcingTests.Aggregation.BEvent(), new EventSourcingTests.Aggregation.DEvent(), new EventSourcingTests.Aggregation.CEvent() }; + + theSession.Events.StartStream(Guid.NewGuid(), events1); + theSession.Events.StartStream(Guid.NewGuid(), events2); + theSession.Events.StartStream(Guid.NewGuid(), events3); + theSession.Events.StartStream(Guid.NewGuid(), events4); + + await theSession.SaveChangesAsync(); + + await theStore.WaitForNonStaleProjectionDataAsync(20.Seconds()); + + theSubscription.EventsEncountered.Clear(); + + await daemon.RewindSubscriptionAsync("Fake", CancellationToken.None, 8); + + await theStore.WaitForNonStaleProjectionDataAsync(20.Seconds()); + + theSubscription.EventsEncountered.Count.ShouldBe(8); + + var progress = await theStore.Advanced.ProjectionProgressFor(new ShardName("Fake", "All")); + progress.ShouldBe(16); + } + + [Fact] + public async Task listener_registered_by_a_subscription_is_called() + { + using var daemon = await theStore.BuildProjectionDaemonAsync(); + await daemon.StartAllAsync(); + + var events1 = new object[] { new EventSourcingTests.Aggregation.AEvent(), new EventSourcingTests.Aggregation.AEvent(), new EventSourcingTests.Aggregation.BEvent(), new EventSourcingTests.Aggregation.CEvent() }; + var events2 = new object[] { new EventSourcingTests.Aggregation.BEvent(), new EventSourcingTests.Aggregation.AEvent(), new EventSourcingTests.Aggregation.BEvent(), new EventSourcingTests.Aggregation.CEvent() }; + var events3 = new object[] { new EventSourcingTests.Aggregation.DEvent(), new EventSourcingTests.Aggregation.AEvent(), new EventSourcingTests.Aggregation.DEvent(), new EventSourcingTests.Aggregation.CEvent() }; + var events4 = new object[] { new EventSourcingTests.Aggregation.EEvent(), new EventSourcingTests.Aggregation.BEvent(), new EventSourcingTests.Aggregation.DEvent(), new EventSourcingTests.Aggregation.CEvent() }; + + theSession.Events.StartStream(Guid.NewGuid(), events1); + theSession.Events.StartStream(Guid.NewGuid(), events2); + theSession.Events.StartStream(Guid.NewGuid(), events3); + theSession.Events.StartStream(Guid.NewGuid(), events4); + + await theSession.SaveChangesAsync(); + + await theStore.WaitForNonStaleProjectionDataAsync(20.Seconds()); + + theSubscription.Listener.AfterCommitWasCalled.ShouldBeTrue(); + } + + [Fact] + public async Task run_events_through_with_event_filters() + { + theSubscription.IncludeType(); + theSubscription.IncludeType(); + + using var daemon = await theStore.BuildProjectionDaemonAsync(); + await daemon.StartAllAsync(); + + var events1 = new object[] { new EventSourcingTests.Aggregation.AEvent(), new EventSourcingTests.Aggregation.AEvent(), new EventSourcingTests.Aggregation.BEvent(), new EventSourcingTests.Aggregation.CEvent() }; + var events2 = new object[] { new EventSourcingTests.Aggregation.BEvent(), new EventSourcingTests.Aggregation.AEvent(), new EventSourcingTests.Aggregation.BEvent(), new EventSourcingTests.Aggregation.CEvent() }; + var events3 = new object[] { new EventSourcingTests.Aggregation.DEvent(), new EventSourcingTests.Aggregation.AEvent(), new EventSourcingTests.Aggregation.DEvent(), new EventSourcingTests.Aggregation.CEvent() }; + var events4 = new object[] { new EventSourcingTests.Aggregation.EEvent(), new EventSourcingTests.Aggregation.BEvent(), new EventSourcingTests.Aggregation.DEvent(), new EventSourcingTests.Aggregation.CEvent() }; + + theSession.Events.StartStream(Guid.NewGuid(), events1); + theSession.Events.StartStream(Guid.NewGuid(), events2); + theSession.Events.StartStream(Guid.NewGuid(), events3); + theSession.Events.StartStream(Guid.NewGuid(), events4); + + await theSession.SaveChangesAsync(); + + await theStore.WaitForNonStaleProjectionDataAsync(20.Seconds()); + + theSubscription.EventsEncountered.Count.ShouldBe(5); + theSubscription.EventsEncountered.All(x => x.Data is EventSourcingTests.Aggregation.BEvent or EventSourcingTests.Aggregation.EEvent).ShouldBeTrue(); + + var progress = await theStore.Advanced.ProjectionProgressFor(new ShardName("Fake", "All")); + progress.ShouldBe(16); + } +} + +public class using_simple_subscription_registrations: OneOffConfigurationsContext +{ + [Fact] + public async Task use_end_to_end() + { + SimpleSubscription.Clear(); + + StoreOptions(opts => + { + opts.Projections.Subscribe(new SimpleSubscription(), x => x.SubscriptionName = "Simple"); + }); + + theStore.Options.Projections.AllShards().Select(x => x.Name.Identity) + .ShouldContain("Simple:All"); + + using var daemon = await theStore.BuildProjectionDaemonAsync(); + await daemon.StartAllAsync(); + + var events1 = new object[] { new EventSourcingTests.Aggregation.AEvent(), new EventSourcingTests.Aggregation.AEvent(), new EventSourcingTests.Aggregation.BEvent(), new EventSourcingTests.Aggregation.CEvent() }; + var events2 = new object[] { new EventSourcingTests.Aggregation.BEvent(), new EventSourcingTests.Aggregation.AEvent(), new EventSourcingTests.Aggregation.BEvent(), new EventSourcingTests.Aggregation.CEvent() }; + var events3 = new object[] { new EventSourcingTests.Aggregation.DEvent(), new EventSourcingTests.Aggregation.AEvent(), new EventSourcingTests.Aggregation.DEvent(), new EventSourcingTests.Aggregation.CEvent() }; + var events4 = new object[] { new EventSourcingTests.Aggregation.EEvent(), new EventSourcingTests.Aggregation.BEvent(), new EventSourcingTests.Aggregation.DEvent(), new EventSourcingTests.Aggregation.CEvent() }; + + theSession.Events.StartStream(Guid.NewGuid(), events1); + theSession.Events.StartStream(Guid.NewGuid(), events2); + theSession.Events.StartStream(Guid.NewGuid(), events3); + theSession.Events.StartStream(Guid.NewGuid(), events4); + + await theSession.SaveChangesAsync(); + + await theStore.WaitForNonStaleProjectionDataAsync(20.Seconds()); + + SimpleSubscription.EventsEncountered[1].Count.ShouldBe(16); + + var progress = await theStore.Advanced.ProjectionProgressFor(new ShardName("Simple", "All")); + progress.ShouldBe(16); + } + + [Fact] + public async Task use_from_service_provider_as_singleton() + { + await rewindState(); + + using var host = await Host.CreateDefaultBuilder() + .ConfigureServices(services => + { + services.AddMarten(opts => + { + opts.Connection(ConnectionSource.ConnectionString); + opts.DatabaseSchemaName = "ioc"; + }).AddAsyncDaemon(DaemonMode.Solo).AddSubscriptionWithServices(ServiceLifetime.Singleton, + o => o.SubscriptionName = "Simple2"); + }).StartAsync(); + + var store = (DocumentStore)host.Services.GetRequiredService(); + + + store.Options.Projections.AllShards().Select(x => x.Name.Identity) + .ShouldContain("Simple2:All"); + + var events1 = new object[] { new EventSourcingTests.Aggregation.AEvent(), new EventSourcingTests.Aggregation.AEvent(), new EventSourcingTests.Aggregation.BEvent(), new EventSourcingTests.Aggregation.CEvent() }; + var events2 = new object[] { new EventSourcingTests.Aggregation.BEvent(), new EventSourcingTests.Aggregation.AEvent(), new EventSourcingTests.Aggregation.BEvent(), new EventSourcingTests.Aggregation.CEvent() }; + var events3 = new object[] { new EventSourcingTests.Aggregation.DEvent(), new EventSourcingTests.Aggregation.AEvent(), new EventSourcingTests.Aggregation.DEvent(), new EventSourcingTests.Aggregation.CEvent() }; + var events4 = new object[] { new EventSourcingTests.Aggregation.EEvent(), new EventSourcingTests.Aggregation.BEvent(), new EventSourcingTests.Aggregation.DEvent(), new EventSourcingTests.Aggregation.CEvent() }; + + await using var session = store.LightweightSession(); + + session.Events.StartStream(Guid.NewGuid(), events1); + session.Events.StartStream(Guid.NewGuid(), events2); + session.Events.StartStream(Guid.NewGuid(), events3); + session.Events.StartStream(Guid.NewGuid(), events4); + + await session.SaveChangesAsync(); + + await store.WaitForNonStaleProjectionDataAsync(60.Seconds()); + + SimpleSubscription.EventsEncountered[1].Count.ShouldBeGreaterThanOrEqualTo(16); + + var progress = await store.Advanced.ProjectionProgressFor(new ShardName("Simple2", "All")); + progress.ShouldBeGreaterThanOrEqualTo(16); + + await store.Advanced.Clean.DeleteAllEventDataAsync(); + } + + private async Task rewindState() + { + SimpleSubscription.Clear(); + await using var conn = new NpgsqlConnection(ConnectionSource.ConnectionString); + await conn.OpenAsync(); + await conn.DropSchemaAsync("ioc"); + await conn.CloseAsync(); + } + + [Fact] + public async Task use_from_service_provider_as_scoped() + { + await rewindState(); + + using var host = await Host.CreateDefaultBuilder() + .ConfigureServices(services => + { + services.AddMarten(opts => + { + opts.Connection(ConnectionSource.ConnectionString); + opts.DatabaseSchemaName = "ioc"; + }).AddAsyncDaemon(DaemonMode.Solo).AddSubscriptionWithServices(ServiceLifetime.Scoped, + o => o.SubscriptionName = "Simple2"); + }).StartAsync(); + + var store = (DocumentStore)host.Services.GetRequiredService(); + + + store.Options.Projections.AllShards().Select(x => x.Name.Identity) + .ShouldContain("Simple2:All"); + + var events1 = new object[] { new EventSourcingTests.Aggregation.AEvent(), new EventSourcingTests.Aggregation.AEvent(), new EventSourcingTests.Aggregation.BEvent(), new EventSourcingTests.Aggregation.CEvent() }; + var events2 = new object[] { new EventSourcingTests.Aggregation.BEvent(), new EventSourcingTests.Aggregation.AEvent(), new EventSourcingTests.Aggregation.BEvent(), new EventSourcingTests.Aggregation.CEvent() }; + var events3 = new object[] { new EventSourcingTests.Aggregation.DEvent(), new EventSourcingTests.Aggregation.AEvent(), new EventSourcingTests.Aggregation.DEvent(), new EventSourcingTests.Aggregation.CEvent() }; + var events4 = new object[] { new EventSourcingTests.Aggregation.EEvent(), new EventSourcingTests.Aggregation.BEvent(), new EventSourcingTests.Aggregation.DEvent(), new EventSourcingTests.Aggregation.CEvent() }; + + await using var session = store.LightweightSession(); + + session.Events.StartStream(Guid.NewGuid(), events1); + session.Events.StartStream(Guid.NewGuid(), events2); + session.Events.StartStream(Guid.NewGuid(), events3); + session.Events.StartStream(Guid.NewGuid(), events4); + + await session.SaveChangesAsync(); + + await store.WaitForNonStaleProjectionDataAsync(60.Seconds()); + + SimpleSubscription.EventsEncountered.Sum(x => x.Count).ShouldBeGreaterThanOrEqualTo(16); + + var progress = await store.Advanced.ProjectionProgressFor(new ShardName("Simple2", "All")); + progress.ShouldBeGreaterThanOrEqualTo(16); + + await store.Advanced.Clean.DeleteAllEventDataAsync(); + } +} + +public class SimpleSubscription: ISubscription +{ + public static int InstanceCounter = 0; + + public static LightweightCache> EventsEncountered = new(i => new()); + + public static void Clear() + { + InstanceCounter = 0; + EventsEncountered.Clear(); + } + + public SimpleSubscription() + { + Instance = ++InstanceCounter; + } + + public int Instance { get; set; } + + public ValueTask DisposeAsync() + { + return new ValueTask(); + } + + public Task ProcessEventsAsync(EventRange page, ISubscriptionController controller, + IDocumentOperations operations, + CancellationToken cancellationToken) + { + EventsEncountered[Instance].AddRange(page.Events); + return Task.FromResult((IChangeListener)NullChangeListener.Instance); + } +} diff --git a/src/Marten.AsyncDaemon.Testing/configuration_logic.cs b/src/Marten.AsyncDaemon.Testing/configuration_logic.cs new file mode 100644 index 0000000000..c5774f44f6 --- /dev/null +++ b/src/Marten.AsyncDaemon.Testing/configuration_logic.cs @@ -0,0 +1,26 @@ +using Marten.Events.Daemon; +using Marten.Events.Projections; +using Marten.Subscriptions; +using NSubstitute; +using Shouldly; +using Xunit; + +namespace Marten.AsyncDaemon.Testing; + +public class configuration_logic +{ + [Fact] + public void AsyncProjectionShard_Role_is_Projection() + { + var shard = new AsyncProjectionShard(Substitute.For()); + shard.Role.ShouldBe(ShardRole.Projection); + } + + [Fact] + public void AsyncProjectionShard_Role_is_Subscription() + { + var source = Substitute.For(); + var shard = new AsyncProjectionShard("Foo:All", source); + shard.Role.ShouldBe(ShardRole.Subscription); + } +} diff --git a/src/Marten/Events/Aggregation/GeneratedAggregateProjectionBase.CodeGen.cs b/src/Marten/Events/Aggregation/GeneratedAggregateProjectionBase.CodeGen.cs index c7bd6a29c3..d641a288dd 100644 --- a/src/Marten/Events/Aggregation/GeneratedAggregateProjectionBase.CodeGen.cs +++ b/src/Marten/Events/Aggregation/GeneratedAggregateProjectionBase.CodeGen.cs @@ -3,6 +3,7 @@ using System.IO; using System.Linq; using System.Reflection; +using System.Threading; using JasperFx.CodeGeneration; using JasperFx.CodeGeneration.Model; using JasperFx.Core; @@ -18,15 +19,13 @@ namespace Marten.Events.Aggregation; public abstract partial class GeneratedAggregateProjectionBase { - private readonly object _compilationLock = new(); - public ILiveAggregator Build(StoreOptions options) { - if (_liveType == null) + if (!_hasGenerated) { - lock (_compilationLock) + lock (_assembleLocker) { - if (_liveType == null) + if (!_hasGenerated) { Compile(options); } @@ -62,11 +61,11 @@ internal void Compile(StoreOptions options, GenerationRules rules) this.As().InitializeSynchronously(rules, options.EventGraph, null); // You have to do this for the sake of the Setters - if (_liveGeneratedType == null || _liveType == null) + if (!_hasGenerated) { lock (_assembleLocker) { - if (_liveGeneratedType == null) + if (!_hasGenerated) { assembleTypes(new GeneratedAssembly(rules), options); } @@ -149,11 +148,25 @@ protected override IProjection buildProjectionObject(DocumentStore store) internal ILiveAggregator BuildLiveAggregator() { + if (_liveType == null) + { + throw new ArgumentNullException(nameof(_liveType), $"Expected {nameof(_liveType)} to have value"); + } + + if (_liveGeneratedType == null) + { + throw new ArgumentNullException(nameof(_liveGeneratedType), $"Expected {nameof(_liveGeneratedType)} to have value"); + } + var aggregator = (ILiveAggregator)Activator.CreateInstance(_liveType, this); foreach (var setter in _liveGeneratedType.Setters) { var prop = _liveType.GetProperty(setter.PropName); + if (prop == null) + { + throw new ArgumentNullException(nameof(prop), $"Expected {nameof(prop)} to have value"); + } prop.SetValue(aggregator, setter.InitialValue); } @@ -182,12 +195,21 @@ internal IAggregationRuntime BuildRuntime(DocumentStore store) var storage = store.Options.Providers.StorageFor().Lightweight; var slicer = buildEventSlicer(store.Options); + if (_inlineType == null) + { + throw new ArgumentNullException(nameof(_inlineType), $"Expected {nameof(_inlineType)} to have value"); + } + var inline = (IAggregationRuntime)Activator.CreateInstance(_inlineType, store, this, slicer, storage, this); foreach (var setter in _inlineGeneratedType.Setters) { var prop = _inlineType.GetProperty(setter.PropName); + if (prop == null) + { + throw new ArgumentNullException(nameof(prop), $"Expected {nameof(prop)} to have value"); + } prop.SetValue(inline, setter.InitialValue); } diff --git a/src/Marten/Events/AsyncProjectionTestingExtensions.cs b/src/Marten/Events/AsyncProjectionTestingExtensions.cs index 07a5ab1f1a..e2fcc28d9f 100644 --- a/src/Marten/Events/AsyncProjectionTestingExtensions.cs +++ b/src/Marten/Events/AsyncProjectionTestingExtensions.cs @@ -6,7 +6,6 @@ using JasperFx.Core; using JasperFx.Core.Reflection; using Marten.Events.Daemon; -using Marten.Events.Projections; using Marten.Storage; namespace Marten.Events; @@ -89,13 +88,13 @@ public static async Task WaitForNonStaleProjectionDataAsync(this IMartenDatabase break; } - await Task.Delay(100.Milliseconds(), cancellationSource.Token).ConfigureAwait(false); + await Task.Delay(250.Milliseconds(), cancellationSource.Token).ConfigureAwait(false); } while (true); if (projections.Count < projectionsCount) { throw new TimeoutException( - $"The projection shards (in total of {projectionsCount}) haven't been started within the timeout span"); + $"The projection shards (in total of {projectionsCount}) haven't been completely started within the timeout span"); } if (cancellationSource.IsCancellationRequested) diff --git a/src/Marten/Events/Daemon/AsyncOptions.cs b/src/Marten/Events/Daemon/AsyncOptions.cs index 4216202cb3..983ca0412f 100644 --- a/src/Marten/Events/Daemon/AsyncOptions.cs +++ b/src/Marten/Events/Daemon/AsyncOptions.cs @@ -1,8 +1,15 @@ using System; using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using JasperFx.Core; using Marten.Internal.Operations; +using Marten.Storage; using Weasel.Core; +#nullable enable + namespace Marten.Events.Daemon; /// @@ -83,4 +90,148 @@ internal void Teardown(IDocumentOperations operations) { foreach (var action in _actions) action(operations); } + + internal Task DetermineStartingPositionAsync(long highWaterMark, ShardName name, ShardExecutionMode mode, + IMartenDatabase database, + CancellationToken token) + { + var strategy = matchStrategy(database); + return strategy.DetermineStartingPositionAsync(highWaterMark, name, mode, database, token); + } + + private IPositionStrategy matchStrategy(IMartenDatabase database) + { + return _strategies.Where(x => x.DatabaseName.IsNotEmpty()).FirstOrDefault(x => x.DatabaseName!.EqualsIgnoreCase(database.Identifier)) + ?? _strategies.FirstOrDefault(x => x.DatabaseName.IsEmpty()) ?? CatchUp.Instance; + } + + private readonly List _strategies = new(); + + /// + /// Direct that this subscription or projection should only start from events that are appended + /// after the subscription is started + /// + /// Optionally applies this rule to *only* the named database in the case of + /// using a multi-tenancy per multiple databases strategy + /// + public AsyncOptions SubscribeFromPresent(string? databaseIdentifier = null) + { + _strategies.Add(new FromPresent(databaseIdentifier)); + return this; + } + + /// + /// Direct that this subscription or projection should only start from events that have a timestamp + /// greater than the supplied eventTimestampFloor + /// + /// The floor time of the events where this subscription should be started + /// Optionally applies this rule to *only* the named database in the case of + /// using a multi-tenancy per multiple databases strategy + /// + public AsyncOptions SubscribeFromTime(DateTimeOffset eventTimestampFloor, string? databaseIdentifier = null) + { + _strategies.Add(new FromTime(databaseIdentifier, eventTimestampFloor)); + return this; + } + + /// + /// Direct that this subscription or projection should only start from events that have a sequence + /// greater than the supplied sequenceFloor + /// + /// + /// Optionally applies this rule to *only* the named database in the case of + /// using a multi-tenancy per multiple databases strategy + /// + public AsyncOptions SubscribeFromSequence(long sequenceFloor, string? databaseIdentifier = null) + { + _strategies.Add(new FromSequence(databaseIdentifier, sequenceFloor)); + return this; + } +} + +internal record Position(long Floor, bool ShouldUpdateProgressFirst); + +internal interface IPositionStrategy +{ + string? DatabaseName { get;} + + Task DetermineStartingPositionAsync(long highWaterMark, ShardName name, ShardExecutionMode mode, + IMartenDatabase database, + CancellationToken token); +} + +internal class FromSequence(string? databaseName, long sequence): IPositionStrategy +{ + public string? DatabaseName { get; } = databaseName; + public long Sequence { get; } = sequence; + + public async Task DetermineStartingPositionAsync(long highWaterMark, ShardName name, + ShardExecutionMode mode, + IMartenDatabase database, CancellationToken token) + { + if (mode == ShardExecutionMode.Rebuild) + { + return new Position(Sequence, true); + } + + var current = await database.ProjectionProgressFor(name, token).ConfigureAwait(false); + + return current >= Sequence + ? new Position(current, false) + : new Position(Sequence, true); + } +} + +internal class FromTime(string? databaseName, DateTimeOffset time): IPositionStrategy +{ + public string? DatabaseName { get; } = databaseName; + public DateTimeOffset EventFloorTime { get; } = time; + + public async Task DetermineStartingPositionAsync(long highWaterMark, ShardName name, + ShardExecutionMode mode, + IMartenDatabase database, CancellationToken token) + { + var floor = await database.FindEventStoreFloorAtTimeAsync(EventFloorTime, token).ConfigureAwait(false) ?? 0; + + if (mode == ShardExecutionMode.Rebuild) + { + return new Position(floor, true); + } + + var current = await database.ProjectionProgressFor(name, token).ConfigureAwait(false); + + return current >= floor ? new Position(current, false) : new Position(floor, true); + } +} + +internal class FromPresent(string? databaseName): IPositionStrategy +{ + public string? DatabaseName { get; } = databaseName; + + public Task DetermineStartingPositionAsync(long highWaterMark, ShardName name, ShardExecutionMode mode, + IMartenDatabase database, CancellationToken token) + { + return Task.FromResult(new Position(highWaterMark, true)); + } +} + +internal class CatchUp: IPositionStrategy +{ + internal static CatchUp Instance = new(); + + private CatchUp(){} + + public string? DatabaseName { get; set; } = null; + + public async Task DetermineStartingPositionAsync(long highWaterMark, ShardName name, + ShardExecutionMode mode, + IMartenDatabase database, + CancellationToken token) + { + return mode == ShardExecutionMode.Continuous + ? new Position(await database.ProjectionProgressFor(name, token).ConfigureAwait(false), false) + + // No point in doing the extra database hop + : new Position(0, true); + } } diff --git a/src/Marten/Events/Daemon/AsyncProjectionShard.cs b/src/Marten/Events/Daemon/AsyncProjectionShard.cs index 9708bfde1b..441c646a90 100644 --- a/src/Marten/Events/Daemon/AsyncProjectionShard.cs +++ b/src/Marten/Events/Daemon/AsyncProjectionShard.cs @@ -4,10 +4,17 @@ using Marten.Events.Archiving; using Marten.Events.Daemon.Internals; using Marten.Events.Projections; +using Marten.Subscriptions; using Weasel.Postgresql.SqlGeneration; namespace Marten.Events.Daemon; +public enum ShardRole +{ + Subscription, + Projection +} + /// /// Definition of a single projection shard to be executed asynchronously /// @@ -19,6 +26,16 @@ public AsyncProjectionShard(string shardName, IProjectionSource source) Source = source; } + public AsyncProjectionShard(string shardName, ISubscriptionSource source) + { + Name = new ShardName(source.SubscriptionName, shardName, source.SubscriptionVersion); + SubscriptionSource = source; + } + + public ShardRole Role => Source != null ? ShardRole.Projection : ShardRole.Subscription; + + public ISubscriptionSource SubscriptionSource { get; } + public AsyncProjectionShard(IProjectionSource source): this(ShardName.All, source) { @@ -38,6 +55,7 @@ internal void OverrideProjectionName(string projectionName) public bool IncludeArchivedEvents { get; set; } + // TODO -- reuse this somewhere public IEnumerable BuildFilters(DocumentStore store) { if (EventTypes.Any() && !EventTypes.Any(x => x.IsAbstract || x.IsInterface)) diff --git a/src/Marten/Events/Daemon/IProjectionDaemon.cs b/src/Marten/Events/Daemon/IProjectionDaemon.cs index 2ad5be0d9f..dc157a3f37 100644 --- a/src/Marten/Events/Daemon/IProjectionDaemon.cs +++ b/src/Marten/Events/Daemon/IProjectionDaemon.cs @@ -263,4 +263,17 @@ public interface IProjectionDaemon: IDisposable /// /// Task WaitForShardToBeRunning(string shardName, TimeSpan timeout); + + + /// + /// Rewinds a subscription (or projection, so be careful with this usage) to a certain point + /// and allows it to restart at that point + /// + /// Name of the subscription + /// + /// The point at which to rewind the subscription. The default is zero + /// Optional parameter to rewind the subscription to rerun any events that were posted on or after this time. If Marten cannot determine the sequence, it will do nothing + /// + Task RewindSubscriptionAsync(string subscriptionName, CancellationToken token, long? sequenceFloor = 0, + DateTimeOffset? timestamp = null); } diff --git a/src/Marten/Events/Daemon/ISubscriptionAgent.cs b/src/Marten/Events/Daemon/ISubscriptionAgent.cs index 7a738c4a76..78796d1ac9 100644 --- a/src/Marten/Events/Daemon/ISubscriptionAgent.cs +++ b/src/Marten/Events/Daemon/ISubscriptionAgent.cs @@ -12,19 +12,52 @@ public record SubscriptionExecutionRequest( ErrorHandlingOptions ErrorHandling, IDaemonRuntime Runtime); +public interface ISubscriptionController +{ + ShardExecutionMode Mode { get; } + + /// + /// The current error handling configuration for this projection or subscription + /// + ErrorHandlingOptions ErrorOptions { get; } + + void MarkSuccess(long processedCeiling); + + /// + /// Tell the governing subscription agent that there was a critical error that + /// should pause the subscription or projection + /// + /// + /// + Task ReportCriticalFailureAsync(Exception ex); + + /// + /// Tell the governing subscription agent that there was a critical error that + /// should pause the subscription or projection + /// + /// + /// This allows a subscription to stop at a point within a batch of events + /// + Task ReportCriticalFailureAsync(Exception ex, long lastProcessed); + + /// + /// Record a dead letter event for the failure to process the current event + /// + /// + /// + /// + Task RecordDeadLetterEventAsync(IEvent @event, Exception ex); +} + /// /// Used internally by asynchronous projections. /// // This is public because it's used by the generated code -public interface ISubscriptionAgent +public interface ISubscriptionAgent: ISubscriptionController { ShardName Name { get; } - ShardExecutionMode Mode { get; } - void MarkSuccess(long processedCeiling); void MarkHighWater(long sequence); - Task ReportCriticalFailureAsync(Exception ex); - long Position { get; } AgentStatus Status { get; } @@ -33,8 +66,15 @@ public interface ISubscriptionAgent Task StartAsync(SubscriptionExecutionRequest request); + /// + /// Record a dead letter event for the failure to process the current + /// event + /// + /// + /// Task RecordDeadLetterEventAsync(DeadLetterEvent @event); DateTimeOffset? PausedTime { get; } + AsyncOptions Options { get; } Task ReplayAsync(SubscriptionExecutionRequest request, long highWaterMark, TimeSpan timeout); } diff --git a/src/Marten/Events/Daemon/Internals/EventRange.cs b/src/Marten/Events/Daemon/Internals/EventRange.cs index 8f48a16cdc..ed8b0ffb9c 100644 --- a/src/Marten/Events/Daemon/Internals/EventRange.cs +++ b/src/Marten/Events/Daemon/Internals/EventRange.cs @@ -1,3 +1,4 @@ +using System; using System.Collections.Generic; using System.Linq; using Marten.Events.Daemon.Progress; @@ -52,6 +53,7 @@ public EventRange(ShardName shardName, long ceiling) public int Size => Events?.Count ?? (int)(SequenceCeiling - SequenceFloor); // TODO -- make this come through the constructor later + [Obsolete("This property will be removed in Marten 8 in favor of passing in the ISubscriptionController")] public ISubscriptionAgent Agent { get; set; } protected bool Equals(EventRange other) diff --git a/src/Marten/Events/Daemon/Internals/IAgentFactory.cs b/src/Marten/Events/Daemon/Internals/IAgentFactory.cs index a7837de7af..13f0a2a378 100644 --- a/src/Marten/Events/Daemon/Internals/IAgentFactory.cs +++ b/src/Marten/Events/Daemon/Internals/IAgentFactory.cs @@ -3,6 +3,7 @@ using System.Linq; using JasperFx.Core; using Marten.Storage; +using Marten.Subscriptions; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; @@ -10,9 +11,9 @@ namespace Marten.Events.Daemon.Internals; public interface IAgentFactory { - IReadOnlyList BuildAgentsForProjection(string projectionName, MartenDatabase database); - IReadOnlyList BuildAllAgents(MartenDatabase database); - ISubscriptionAgent BuildAgentForShard(string shardName, MartenDatabase database); + IReadOnlyList BuildAgents(string projectionOrSubscriptionName, MartenDatabase database); + IReadOnlyList BuildAllProjectionAgents(MartenDatabase database); + ISubscriptionAgent BuildProjectionAgentForShard(string shardName, MartenDatabase database); } @@ -25,16 +26,23 @@ public AgentFactory(DocumentStore store) _store = store; } - public IReadOnlyList BuildAgentsForProjection(string projectionName, MartenDatabase database) + public IReadOnlyList BuildAgents(string projectionOrSubscriptionName, MartenDatabase database) { - if (!_store.Options.Projections.TryFindProjection(projectionName, out var projection)) + if (_store.Options.Projections.TryFindProjection(projectionOrSubscriptionName, out var source1)) { - throw new ArgumentOutOfRangeException(nameof(projectionName), - $"No registered projection matches the name '{projectionName}'. Available names are {_store.Options.Projections.AllProjectionNames().Join(", ")}"); + var shards = source1.AsyncProjectionShards(_store); + return shards.Select(shard => buildAgentForShard(database, shard)).ToList(); + + } + + if (_store.Options.Projections.TryFindSubscription(projectionOrSubscriptionName, out var source2)) + { + var shards = source2.AsyncProjectionShards(_store); + return shards.Select(shard => buildAgentForShard(database, shard)).ToList(); } - var shards = projection.AsyncProjectionShards(_store); - return shards.Select(shard => buildAgentForShard(database, shard)).ToList(); + throw new ArgumentOutOfRangeException(nameof(projectionOrSubscriptionName), + $"No registered projection matches the name '{projectionOrSubscriptionName}'. Available names are {_store.Options.Projections.AllProjectionNames().Join(", ")}"); } private SubscriptionAgent buildAgentForShard(MartenDatabase database, AsyncProjectionShard shard) @@ -42,20 +50,37 @@ private SubscriptionAgent buildAgentForShard(MartenDatabase database, AsyncProje var logger = _store.Options.LogFactory?.CreateLogger() ?? _store.Options.DotNetLogger ?? NullLogger.Instance; - var execution = new GroupedProjectionExecution(shard, _store, database, logger); - var loader = new EventLoader(_store, database, shard, shard.Source.Options); - var wrapped = new ResilientEventLoader(_store.Options.ResiliencePipeline, loader); + if (shard.Source != null) + { + var execution = new GroupedProjectionExecution(shard, _store, database, logger); + var options = shard.Source.Options; + var loader = new EventLoader(_store, database, shard, options); + var wrapped = new ResilientEventLoader(_store.Options.ResiliencePipeline, loader); + + return new SubscriptionAgent(shard.Name, options, wrapped, execution, database.Tracker, logger); + } + + if (shard.SubscriptionSource != null) + { + var subscription = shard.SubscriptionSource.Build(_store); + var execution = new SubscriptionExecution(shard.Name, subscription, _store, database, logger); + var options = shard.SubscriptionSource.Options; + var loader = new EventLoader(_store, database, shard, options); + var wrapped = new ResilientEventLoader(_store.Options.ResiliencePipeline, loader); + + return new SubscriptionAgent(shard.Name, options, wrapped, execution, database.Tracker, logger); + } - return new SubscriptionAgent(shard.Name, shard.Source.Options, wrapped, execution, database.Tracker, logger); + throw new ArgumentOutOfRangeException(nameof(shard), "This shard has neither a subscription nor projection"); } - public IReadOnlyList BuildAllAgents(MartenDatabase database) + public IReadOnlyList BuildAllProjectionAgents(MartenDatabase database) { var shards = _store.Options.Projections.AllShards(); return shards.Select(x => buildAgentForShard(database, x)).ToList(); } - public ISubscriptionAgent BuildAgentForShard(string shardName, MartenDatabase database) + public ISubscriptionAgent BuildProjectionAgentForShard(string shardName, MartenDatabase database) { var shard = _store.Options.Projections.AllShards().FirstOrDefault(x => x.Name.Identity == shardName); if (shard == null) diff --git a/src/Marten/Events/Daemon/Internals/ProjectionUpdateBatch.cs b/src/Marten/Events/Daemon/Internals/ProjectionUpdateBatch.cs index a0fea8defb..8032811a82 100644 --- a/src/Marten/Events/Daemon/Internals/ProjectionUpdateBatch.cs +++ b/src/Marten/Events/Daemon/Internals/ProjectionUpdateBatch.cs @@ -31,6 +31,8 @@ private IMartenSession Session get => _session ?? throw new InvalidOperationException("Session already released"); } + public List Listeners { get; } = new(); + public bool IsDisposed() { return _session == null; @@ -210,27 +212,42 @@ public IReadOnlyList DocumentTypes() public async Task PostUpdateAsync(IMartenSession session) { - if (_mode == ShardExecutionMode.Continuous && _settings.AsyncListeners.Any()) + if (shouldApplyListeners()) { - var unitOfWorkData = new UnitOfWork(_pages.SelectMany(x => x.Operations)); - foreach (var listener in _settings.AsyncListeners) - { - await listener.AfterCommitAsync((IDocumentSession)session, unitOfWorkData, _token) - .ConfigureAwait(false); - } + return; + } + + var listeners = _settings.AsyncListeners.Concat(Listeners).ToArray(); + if (!listeners.Any()) return; + + var unitOfWorkData = new UnitOfWork(_pages.SelectMany(x => x.Operations)); + foreach (var listener in listeners) + { + await listener.AfterCommitAsync((IDocumentSession)session, unitOfWorkData, _token) + .ConfigureAwait(false); } } + private bool shouldApplyListeners() + { + return _mode == ShardExecutionMode.Rebuild || !Range.Events.Any(); + } + public async Task PreUpdateAsync(IMartenSession session) { - if (_mode == ShardExecutionMode.Continuous && _settings.AsyncListeners.Any()) + if (shouldApplyListeners()) { - var unitOfWorkData = new UnitOfWork(_pages.SelectMany(x => x.Operations)); - foreach (var listener in _settings.AsyncListeners) - { - await listener.BeforeCommitAsync((IDocumentSession)session, unitOfWorkData, _token) - .ConfigureAwait(false); - } + return; + } + + var listeners = _settings.AsyncListeners.Concat(Listeners).ToArray(); + if (!listeners.Any()) return; + + var unitOfWorkData = new UnitOfWork(_pages.SelectMany(x => x.Operations)); + foreach (var listener in _settings.AsyncListeners) + { + await listener.BeforeCommitAsync((IDocumentSession)session, unitOfWorkData, _token) + .ConfigureAwait(false); } } diff --git a/src/Marten/Events/Daemon/Internals/SubscriptionAgent.cs b/src/Marten/Events/Daemon/Internals/SubscriptionAgent.cs index 1d74ac2154..41291ebc82 100644 --- a/src/Marten/Events/Daemon/Internals/SubscriptionAgent.cs +++ b/src/Marten/Events/Daemon/Internals/SubscriptionAgent.cs @@ -4,13 +4,13 @@ using System.Threading.Tasks.Dataflow; using JasperFx.Core; using Marten.Events.Projections; +using Marten.Exceptions; using Microsoft.Extensions.Logging; namespace Marten.Events.Daemon.Internals; public class SubscriptionAgent: ISubscriptionAgent, IAsyncDisposable { - private readonly AsyncOptions _options; private readonly IEventLoader _loader; private readonly ISubscriptionExecution _execution; private readonly ShardStateTracker _tracker; @@ -18,13 +18,12 @@ public class SubscriptionAgent: ISubscriptionAgent, IAsyncDisposable public ShardName Name { get; } private readonly CancellationTokenSource _cancellation = new(); private readonly ActionBlock _commandBlock; - private ErrorHandlingOptions _errorOptions = new(); private IDaemonRuntime _runtime = new NulloDaemonRuntime(); public SubscriptionAgent(ShardName name, AsyncOptions options, IEventLoader loader, ISubscriptionExecution execution, ShardStateTracker tracker, ILogger logger) { - _options = options; + Options = options; _loader = loader; _execution = execution; _tracker = tracker; @@ -40,10 +39,14 @@ public SubscriptionAgent(ShardName name, AsyncOptions options, IEventLoader load } } + public AsyncOptions Options { get; } + public string ProjectionShardIdentity { get; private set; } public CancellationToken CancellationToken => _cancellation.Token; + public ErrorHandlingOptions ErrorOptions { get; private set; } = new(); + // Making the setter internal so the test harness can override it // It's naughty, will make some people get very upset, and // makes unit testing much simpler. I'm not ashamed @@ -53,6 +56,12 @@ public SubscriptionAgent(ShardName name, AsyncOptions options, IEventLoader load public long HighWaterMark { get; internal set; } + public async Task ReportCriticalFailureAsync(Exception ex, long lastProcessed) + { + await ReportCriticalFailureAsync(ex).ConfigureAwait(false); + MarkSuccess(lastProcessed); + } + public async Task ReportCriticalFailureAsync(Exception ex) { try @@ -131,7 +140,7 @@ public async Task StartAsync(SubscriptionExecutionRequest request) { Mode = request.Mode; _execution.Mode = request.Mode; - _errorOptions = request.ErrorHandling; + ErrorOptions = request.ErrorHandling; _runtime = request.Runtime; await _execution.EnsureStorageExists().ConfigureAwait(false); _commandBlock.Post(Command.Started(_tracker.HighWaterMark, request.Floor)); @@ -147,8 +156,9 @@ public async Task ReplayAsync(SubscriptionExecutionRequest request, long highWat Mode = ShardExecutionMode.Rebuild; _rebuild = new TaskCompletionSource(); _execution.Mode = ShardExecutionMode.Rebuild; - _errorOptions = request.ErrorHandling; + ErrorOptions = request.ErrorHandling; _runtime = request.Runtime; + LastCommitted = request.Floor; // Force it to start here! try { @@ -174,6 +184,12 @@ public Task RecordDeadLetterEventAsync(DeadLetterEvent @event) return _runtime.RecordDeadLetterEventAsync(@event); } + public Task RecordDeadLetterEventAsync(IEvent @event, Exception ex) + { + var dlEvent = new DeadLetterEvent(@event, Name, new ApplyEventException(@event, ex)); + return _runtime.RecordDeadLetterEventAsync(dlEvent); + } + public DateTimeOffset? PausedTime { get; private set; } public async ValueTask DisposeAsync() @@ -233,7 +249,7 @@ internal async Task Apply(Command command) var inflight = LastEnqueued - LastCommitted; // Back pressure, slow down - if (inflight >= _options.MaximumHopperSize) return; + if (inflight >= Options.MaximumHopperSize) return; // If all caught up, do nothing! // Not sure how either of these numbers could actually be higher than @@ -242,7 +258,7 @@ internal async Task Apply(Command command) if (LastEnqueued >= HighWaterMark) return; // You could maybe get a full size batch, so go get the next - if (HighWaterMark - LastEnqueued > _options.BatchSize) + if (HighWaterMark - LastEnqueued > Options.BatchSize) { await loadNextAsync().ConfigureAwait(false); } @@ -250,7 +266,7 @@ internal async Task Apply(Command command) { // If the execution is busy, let's let events accumulate a little // more - var twoBatchSize = 2 * _options.BatchSize; + var twoBatchSize = 2 * Options.BatchSize; if (inflight < twoBatchSize) { await loadNextAsync().ConfigureAwait(false); @@ -263,9 +279,9 @@ private async Task loadNextAsync() var request = new EventRequest { HighWater = HighWaterMark, - BatchSize = _options.BatchSize, + BatchSize = Options.BatchSize, Floor = LastEnqueued, - ErrorOptions = _errorOptions, + ErrorOptions = ErrorOptions, Runtime = _runtime, Name = Name }; diff --git a/src/Marten/Events/Daemon/ProjectionDaemon.Rebuilding.cs b/src/Marten/Events/Daemon/ProjectionDaemon.Rebuilding.cs index a53f980c25..90b9aa86af 100644 --- a/src/Marten/Events/Daemon/ProjectionDaemon.Rebuilding.cs +++ b/src/Marten/Events/Daemon/ProjectionDaemon.Rebuilding.cs @@ -86,24 +86,11 @@ private async Task rebuildProjection(IProjectionSource source, TimeSpan shardTim { await Database.EnsureStorageExistsAsync(typeof(IEvent), token).ConfigureAwait(false); + var subscriptionName = source.ProjectionName; Logger.LogInformation("Starting to rebuild Projection {ProjectionName}@{DatabaseIdentifier}", - source.ProjectionName, Database.Identifier); + subscriptionName, Database.Identifier); - var running = CurrentAgents().Where(x => x.Name.ProjectionName == source.ProjectionName).ToArray(); - - await _semaphore.WaitAsync(_cancellation.Token).ConfigureAwait(false); - - try - { - foreach (var agent in running) - { - await agent.HardStopAsync().ConfigureAwait(false); - } - } - finally - { - _semaphore.Release(); - } + await stopRunningAgents(subscriptionName).ConfigureAwait(false); if (token.IsCancellationRequested) return; @@ -121,7 +108,7 @@ private async Task rebuildProjection(IProjectionSource source, TimeSpan shardTim if (token.IsCancellationRequested) return; - var agents = _factory.BuildAgentsForProjection(source.ProjectionName, Database); + var agents = _factory.BuildAgents(subscriptionName, Database); foreach (var agent in agents) { @@ -164,6 +151,25 @@ await Parallel.ForEachAsync(agents, } } + private async Task stopRunningAgents(string subscriptionName) + { + var running = CurrentAgents().Where(x => x.Name.ProjectionName == subscriptionName).ToArray(); + + await _semaphore.WaitAsync(_cancellation.Token).ConfigureAwait(false); + + try + { + foreach (var agent in running) + { + await agent.HardStopAsync().ConfigureAwait(false); + } + } + finally + { + _semaphore.Release(); + } + } + private async Task teardownExistingProjectionProgress(IProjectionSource source, CancellationToken token, IReadOnlyList agents) @@ -193,4 +199,73 @@ public async Task PrepareForRebuildsAsync() await _highWater.CheckNowAsync().ConfigureAwait(false); } + + public async Task RewindSubscriptionAsync(string subscriptionName, CancellationToken token, long? sequenceFloor = 0, + DateTimeOffset? timestamp = null) + { + if (timestamp.HasValue) + { + sequenceFloor = await Database.FindEventStoreFloorAtTimeAsync(timestamp.Value, token).ConfigureAwait(false); + if (sequenceFloor == null) return; + } + + if (_cancellation.IsCancellationRequested) return; + + await stopRunningAgents(subscriptionName).ConfigureAwait(false); + + if (_cancellation.IsCancellationRequested) return; + + var agents = _factory.BuildAgents(subscriptionName, Database); + + await rewindSubscriptionProgress(subscriptionName, token, sequenceFloor, agents).ConfigureAwait(false); + + foreach (var agent in agents) + { + Tracker.MarkAsRestarted(agent.Name); + var errorOptions = _store.Options.Projections.RebuildErrors; + await agent.StartAsync(new SubscriptionExecutionRequest(sequenceFloor.Value, ShardExecutionMode.Continuous, + errorOptions, this)).ConfigureAwait(false); + agent.MarkHighWater(HighWaterMark()); + } + } + + private async Task rewindAgentProgress(string shardName, CancellationToken token, long sequenceFloor) + { + var sessionOptions = SessionOptions.ForDatabase(Database); + sessionOptions.AllowAnyTenant = true; + await using var session = _store.LightweightSession(sessionOptions); + + session.QueueSqlCommand($"delete from {_store.Options.EventGraph.ProgressionTable} where name = ?", shardName); + if (sequenceFloor > 0) + { + session.QueueSqlCommand($"update {_store.Options.EventGraph.ProgressionTable} set last_seq_id = ? where name = ?", sequenceFloor, shardName); + } + + await session.SaveChangesAsync(token).ConfigureAwait(false); + } + + private async Task rewindSubscriptionProgress(string subscriptionName, CancellationToken token, long? sequenceFloor, + IReadOnlyList agents) + { + var sessionOptions = SessionOptions.ForDatabase(Database); + sessionOptions.AllowAnyTenant = true; + await using var session = _store.LightweightSession(sessionOptions); + + foreach (var agent in agents) + { + if (sequenceFloor.Value == 0) + { + session.QueueSqlCommand($"delete from {_store.Options.EventGraph.ProgressionTable} where name = ?", agent.Name.Identity); + } + else + { + session.QueueSqlCommand($"update {_store.Options.EventGraph.ProgressionTable} set last_seq_id = ? where name = ?", sequenceFloor, agent.Name.Identity); + } + } + + // Rewind previous DeadLetterEvents because you're going to replay them all anyway + session.DeleteWhere(x => x.ProjectionName == subscriptionName && x.EventSequence >= sequenceFloor); + + await session.SaveChangesAsync(token).ConfigureAwait(false); + } } diff --git a/src/Marten/Events/Daemon/ProjectionDaemon.cs b/src/Marten/Events/Daemon/ProjectionDaemon.cs index 0ee7781165..86d4cb532a 100644 --- a/src/Marten/Events/Daemon/ProjectionDaemon.cs +++ b/src/Marten/Events/Daemon/ProjectionDaemon.cs @@ -94,18 +94,22 @@ private async Task tryStartAgentAsync(ISubscriptionAgent agent, ShardExecu return false; } - var position = mode == ShardExecutionMode.Continuous - ? await Database.ProjectionProgressFor(agent.Name, _cancellation.Token).ConfigureAwait(false) + var highWaterMark = HighWaterMark(); + var position = await agent + .Options + .DetermineStartingPositionAsync(highWaterMark, agent.Name, mode, Database, _cancellation.Token).ConfigureAwait(false); - // No point in doing the extra database hop - : 0; + if (position.ShouldUpdateProgressFirst) + { + await rewindAgentProgress(agent.Name.Identity, _cancellation.Token, position.Floor).ConfigureAwait(false); + } var errorOptions = mode == ShardExecutionMode.Continuous ? _store.Options.Projections.Errors : _store.Options.Projections.RebuildErrors; - await agent.StartAsync(new SubscriptionExecutionRequest(position, mode, errorOptions, this)).ConfigureAwait(false); - agent.MarkHighWater(HighWaterMark()); + await agent.StartAsync(new SubscriptionExecutionRequest(position.Floor, mode, errorOptions, this)).ConfigureAwait(false); + agent.MarkHighWater(highWaterMark); _agents = _agents.AddOrUpdate(agent.Name.Identity, agent); } @@ -146,7 +150,7 @@ public async Task StartAgentAsync(string shardName, CancellationToken token) await StartHighWaterDetectionAsync().ConfigureAwait(false); } - var agent = _factory.BuildAgentForShard(shardName, Database); + var agent = _factory.BuildProjectionAgentForShard(shardName, Database); var didStart = await tryStartAgentAsync(agent, ShardExecutionMode.Continuous).ConfigureAwait(false); if (!didStart && agent is IAsyncDisposable d) @@ -225,7 +229,7 @@ public async Task StartAllAsync() await StartHighWaterDetectionAsync().ConfigureAwait(false); } - var agents = _factory.BuildAllAgents(Database); + var agents = _factory.BuildAllProjectionAgents(Database); foreach (var agent in agents) { await tryStartAgentAsync(agent, ShardExecutionMode.Continuous).ConfigureAwait(false); diff --git a/src/Marten/Events/EventGraph.cs b/src/Marten/Events/EventGraph.cs index a00eb48956..e8735836ef 100644 --- a/src/Marten/Events/EventGraph.cs +++ b/src/Marten/Events/EventGraph.cs @@ -413,7 +413,10 @@ public async ValueTask DisposeAsync() { try { - await _tombstones.DrainAsync().ConfigureAwait(false); + if (_tombstones != null) + { + await _tombstones.DrainAsync().ConfigureAwait(false); + } } catch (TaskCanceledException) { diff --git a/src/Marten/Events/Projections/GeneratedProjection.cs b/src/Marten/Events/Projections/GeneratedProjection.cs index 2293fa5184..3356f3b2b3 100644 --- a/src/Marten/Events/Projections/GeneratedProjection.cs +++ b/src/Marten/Events/Projections/GeneratedProjection.cs @@ -18,7 +18,7 @@ namespace Marten.Events.Projections; /// public abstract class GeneratedProjection: ProjectionBase, IProjectionSource, ICodeFile { - private bool _hasGenerated; + protected bool _hasGenerated; protected GeneratedProjection(string projectionName) { @@ -37,17 +37,15 @@ bool ICodeFile.AttachTypesSynchronously(GenerationRules rules, Assembly assembly void ICodeFile.AssembleTypes(GeneratedAssembly assembly) { + if (_hasGenerated) + return; + lock (_assembleLocker) { if (_hasGenerated) return; - lock (_assembleLocker) - { - if (_hasGenerated) - return; - assembleTypes(assembly, StoreOptions); - _hasGenerated = true; - } + assembleTypes(assembly, StoreOptions); + _hasGenerated = true; } } diff --git a/src/Marten/Events/Projections/IProjectionSource.cs b/src/Marten/Events/Projections/IProjectionSource.cs index 14568f2e9a..905d448a72 100644 --- a/src/Marten/Events/Projections/IProjectionSource.cs +++ b/src/Marten/Events/Projections/IProjectionSource.cs @@ -9,6 +9,7 @@ namespace Marten.Events.Projections; + public interface IProjectionSource: IReadOnlyProjectionData { AsyncOptions Options { get; } diff --git a/src/Marten/Events/Projections/ProjectionBase.cs b/src/Marten/Events/Projections/ProjectionBase.cs index 5a86bf40c8..cdee245fcf 100644 --- a/src/Marten/Events/Projections/ProjectionBase.cs +++ b/src/Marten/Events/Projections/ProjectionBase.cs @@ -5,27 +5,39 @@ namespace Marten.Events.Projections; -public abstract class ProjectionBase +public interface IEventFilterable { - private readonly List _publishedTypes = new(); + /// + /// Short hand syntax to tell Marten that this projection takes in the event type T + /// This is not mandatory, but can be used to optimize the asynchronous projections + /// to create an "allow list" in the IncludedEventTypes collection + /// + /// + void IncludeType(); /// - /// Descriptive name for this projection in the async daemon. The default is the type name of the projection + /// Short hand syntax to tell Marten that this projection takes in the event type T + /// This is not mandatory, but can be used to optimize the asynchronous projections + /// to create an "allow list" in the IncludedEventTypes collection /// - [DisallowNull] - public string? ProjectionName { get; set; } + void IncludeType(Type type); /// - /// Specify that this projection is a non 1 version of the original projection definition to opt - /// into Marten's parallel blue/green deployment of this projection. + /// Limit the events processed by this projection to only streams + /// marked with the given streamType. + /// ONLY APPLIED TO ASYNCHRONOUS PROJECTIONS OR SUBSCRIPTIONS /// - public uint ProjectionVersion { get; set; } = 1; + /// + public void FilterIncomingEventsOnStreamType(Type streamType); /// - /// The projection lifecycle that governs when this projection is executed + /// Should archived events be considered for this filtered set? Default is false. /// - public ProjectionLifecycle Lifecycle { get; internal set; } = ProjectionLifecycle.Async; + public bool IncludeArchivedEvents { get; set; } +} +public abstract class EventFilterable: IEventFilterable +{ /// /// Optimize this projection within the Async Daemon by /// limiting the event types processed through this projection @@ -43,13 +55,6 @@ public abstract class ProjectionBase [DisallowNull] internal Type? StreamType { get; set; } - - /// - /// Direct Marten to delete data published by this projection as the first - /// step to rebuilding the projection data. The default is false. - /// - public bool TeardownDataOnRebuild { get; set; } = false; - /// /// Short hand syntax to tell Marten that this projection takes in the event type T /// This is not mandatory, but can be used to optimize the asynchronous projections @@ -61,10 +66,20 @@ public void IncludeType() IncludedEventTypes.Add(typeof(T)); } + /// + /// Short hand syntax to tell Marten that this projection takes in the event type T + /// This is not mandatory, but can be used to optimize the asynchronous projections + /// to create an "allow list" in the IncludedEventTypes collection + /// + public void IncludeType(Type type) + { + IncludedEventTypes.Add(type); + } + /// /// Limit the events processed by this projection to only streams /// marked with the given streamType. - /// ONLY APPLIED TO ASYNCHRONOUS PROJECTIONS + /// ONLY APPLIED TO ASYNCHRONOUS PROJECTIONS OR SUBSCRIPTIONS /// /// public void FilterIncomingEventsOnStreamType(Type streamType) @@ -72,6 +87,43 @@ public void FilterIncomingEventsOnStreamType(Type streamType) StreamType = streamType; } + /// + /// Should archived events be considered for this filtered set? Default is false. + /// + public bool IncludeArchivedEvents { get; set; } + + +} + +public abstract class ProjectionBase : EventFilterable +{ + private readonly List _publishedTypes = new(); + + /// + /// Descriptive name for this projection in the async daemon. The default is the type name of the projection + /// + [DisallowNull] + public string? ProjectionName { get; set; } + + /// + /// Specify that this projection is a non 1 version of the original projection definition to opt + /// into Marten's parallel blue/green deployment of this projection. + /// + public uint ProjectionVersion { get; set; } = 1; + + /// + /// The projection lifecycle that governs when this projection is executed + /// + public ProjectionLifecycle Lifecycle { get; internal set; } = ProjectionLifecycle.Async; + + + /// + /// Direct Marten to delete data published by this projection as the first + /// step to rebuilding the projection data. The default is false. + /// + public bool TeardownDataOnRebuild { get; set; } = false; + + internal virtual void AssembleAndAssertValidity() { // Nothing diff --git a/src/Marten/Events/Projections/ProjectionOptions.cs b/src/Marten/Events/Projections/ProjectionOptions.cs index fcaf17eee1..f39b9ae2e0 100644 --- a/src/Marten/Events/Projections/ProjectionOptions.cs +++ b/src/Marten/Events/Projections/ProjectionOptions.cs @@ -8,6 +8,7 @@ using Marten.Events.Daemon; using Marten.Events.Fetching; using Marten.Exceptions; +using Marten.Subscriptions; namespace Marten.Events.Projections; @@ -43,6 +44,8 @@ public class ProjectionOptions: DaemonSettings internal readonly IFetchPlanner[] _builtInPlanners = [new InlineFetchPlanner(), new AsyncFetchPlanner(), new LiveFetchPlanner()]; + private readonly List _subscriptions = new(); + internal ProjectionOptions(StoreOptions options) { _options = options; @@ -85,15 +88,9 @@ internal IEnumerable allPlanners() internal IList All { get; } = new List(); - internal bool DoesPersistAggregate(Type aggregateType) - { - return All.OfType().Any(x => - x.AggregateType == aggregateType && x.Lifecycle != ProjectionLifecycle.Live); - } - internal bool HasAnyAsyncProjections() { - return All.Any(x => x.Lifecycle == ProjectionLifecycle.Async); + return All.Any(x => x.Lifecycle == ProjectionLifecycle.Async) || _subscriptions.Any(); } internal IEnumerable AllAggregateTypes() @@ -320,9 +317,26 @@ public void Add( All.Add(projection); } + /// + /// Add a new event subscription to this store + /// + /// + public void Subscribe(ISubscriptionSource subscription) + { + _subscriptions.Add(subscription); + } + + public void Subscribe(ISubscription subscription, Action? configure = null) + { + var wrapper = new SubscriptionWrapper(subscription); + configure?.Invoke(wrapper); + + _subscriptions.Add(wrapper); + } + internal bool Any() { - return All.Any(); + return All.Any() || _subscriptions.Any(); } internal ILiveAggregator AggregatorFor() where T : class @@ -359,15 +373,15 @@ private SingleStreamProjection tryFindProjectionSourceForAggregateType() w internal void AssertValidity(DocumentStore store) { - var duplicateNames = All - .GroupBy(x => x.ProjectionName) + var duplicateNames = All.Select(x => x.ProjectionName).Concat(_subscriptions.Select(x => x.SubscriptionName)) + .GroupBy(x => x) .Where(x => x.Count() > 1) - .Select(group => $"Duplicate projection name '{group.Key}': {group.Select(x => x.ToString()).Join(", ")}") + .Select(group => $"Duplicate projection or subscription name '{group.Key}': {group.Select(x => x.ToString()).Join(", ")}") .ToArray(); if (duplicateNames.Any()) { - throw new InvalidOperationException(duplicateNames.Join("; ")); + throw new DuplicateSubscriptionNamesException(duplicateNames.Join("; ")); } var messages = All.Concat(_liveAggregateSources.Values) @@ -381,6 +395,7 @@ internal void AssertValidity(DocumentStore store) return All .Where(x => x.Lifecycle == ProjectionLifecycle.Async) .SelectMany(x => x.AsyncProjectionShards(store)) + .Concat(_subscriptions.SelectMany(x => x.AsyncProjectionShards(store))) .ToDictionary(x => x.Name.Identity); }); @@ -395,7 +410,6 @@ public IReadOnlyList AllShards() { return _asyncShards.Value.Values.ToList(); } - internal bool TryFindAsyncShard(string projectionOrShardName, out AsyncProjectionShard shard) { return _asyncShards.Value.TryGetValue(projectionOrShardName, out shard); @@ -407,10 +421,16 @@ internal bool TryFindProjection(string projectionName, out IProjectionSource sou return source != null; } + internal bool TryFindSubscription(string projectionName, out ISubscriptionSource source) + { + source = _subscriptions.FirstOrDefault(x => x.SubscriptionName.EqualsIgnoreCase(projectionName)); + return source != null; + } + internal string[] AllProjectionNames() { - return All.Select(x => $"'{x.ProjectionName}'").ToArray(); + return All.Select(x => $"'{x.ProjectionName}'").Concat(_subscriptions.Select(x => $"'{x.SubscriptionName}'")).ToArray(); } internal IEnumerable AllPublishedTypes() @@ -418,3 +438,10 @@ internal IEnumerable AllPublishedTypes() return All.Where(x => x.Lifecycle != ProjectionLifecycle.Live).SelectMany(x => x.PublishedTypes()).Distinct(); } } + +public class DuplicateSubscriptionNamesException: MartenException +{ + public DuplicateSubscriptionNamesException(string message) : base(message) + { + } +} diff --git a/src/Marten/IDocumentSchemaResolver.cs b/src/Marten/IDocumentSchemaResolver.cs new file mode 100644 index 0000000000..cd0883288a --- /dev/null +++ b/src/Marten/IDocumentSchemaResolver.cs @@ -0,0 +1,70 @@ +#nullable enable +using System; + +namespace Marten; + +public interface IDocumentSchemaResolver +{ + /// + /// The schema name used to store the documents. + /// + string DatabaseSchemaName { get; } + + /// + /// The database schema name for event related tables. By default this + /// is the same schema as the document storage + /// + string EventsSchemaName { get; } + + /// + /// Find the database name of the table backing . Supports documents and projections. + /// + /// The document or projection to look up. + /// + /// When true (default) the qualified name is returned (schema and table name). + /// Otherwise only the table name is returned. + /// + /// The name of in the database. + string For(bool qualified = true); + + /// + /// Find the database name of the table backing . Supports documents and projections. + /// + /// The document type + /// + /// When true (default) the qualified name is returned (schema and table name). + /// Otherwise only the table name is returned. + /// + /// The name of in the database. + string For(Type documentType, bool qualified = true); + + /// + /// Find the database name of the table backing the events table. Supports documents and projections. + /// + /// + /// When true (default) the qualified name is returned (schema and table name). + /// Otherwise only the table name is returned. + /// + /// The name of events table in the database. + string ForEvents(bool qualified = true); + + /// + /// Find the database name of the table backing the event streams table. Supports documents and projections. + /// + /// + /// When true (default) the qualified name is returned (schema and table name). + /// Otherwise only the table name is returned. + /// + /// The name of event streams table in the database. + string ForStreams(bool qualified = true); + + /// + /// Find the database name of the table backing the event progression table. Supports documents and projections. + /// + /// + /// When true (default) the qualified name is returned (schema and table name). + /// Otherwise only the table name is returned. + /// + /// The name of event progression table in the database. + string ForEventProgression(bool qualified = true); +} diff --git a/src/Marten/IDocumentSessionListener.cs b/src/Marten/IDocumentSessionListener.cs index 685a175253..37cfde9a68 100644 --- a/src/Marten/IDocumentSessionListener.cs +++ b/src/Marten/IDocumentSessionListener.cs @@ -5,6 +5,25 @@ namespace Marten; +public class NullChangeListener: IChangeListener +{ + public static IChangeListener Instance { get; } = new NullChangeListener(); + + private NullChangeListener() + { + } + + public Task AfterCommitAsync(IDocumentSession session, IChangeSet commit, CancellationToken token) + { + return Task.CompletedTask; + } + + public Task BeforeCommitAsync(IDocumentSession session, IChangeSet commit, CancellationToken token) + { + return Task.CompletedTask; + } +} + #region sample_IDocumentSessionListener public interface IChangeListener diff --git a/src/Marten/IQuerySession.cs b/src/Marten/IQuerySession.cs index 4860778b47..f32dc66ab2 100644 --- a/src/Marten/IQuerySession.cs +++ b/src/Marten/IQuerySession.cs @@ -66,6 +66,11 @@ public interface IQuerySession: IDisposable, IAsyncDisposable /// string? CorrelationId { get; set; } + /// + /// The tenant id for this session. If not opened with a tenant id, this value will be "*DEFAULT*" + /// + string TenantId { get; } + /// /// Find or load a single document of type T by a string id /// @@ -216,7 +221,7 @@ public interface IQuerySession: IDisposable, IAsyncDisposable /// Asynchronously queries the document storage with the supplied SQL. /// The type parameters can be any document class, scalar or JSON-serializable class. /// For each result type parameter, the SQL SELECT statement must contain a ROW. - /// For document types, the row must contain the required fields in the correct order, + /// For document types, the row must contain the required fields in the correct order, /// depending on the session type and the metadata the document might use, at least id and data must be /// provided. /// @@ -231,7 +236,7 @@ public interface IQuerySession: IDisposable, IAsyncDisposable /// Asynchronously queries the document storage with the supplied SQL. /// The type parameters can be any document class, scalar or JSON-serializable class. /// For each result type parameter, the SQL SELECT statement must contain a ROW. - /// For document types, the row must contain the required fields in the correct order, + /// For document types, the row must contain the required fields in the correct order, /// depending on the session type and the metadata the document might use, at least id and data must be /// provided. /// @@ -260,7 +265,7 @@ public interface IQuerySession: IDisposable, IAsyncDisposable /// Asynchronously queries the document storage with the supplied SQL. /// The type parameters can be any document class, scalar or JSON-serializable class. /// For each result type parameter, the SQL SELECT statement must contain a ROW. - /// For document types, the row must contain the required fields in the correct order, + /// For document types, the row must contain the required fields in the correct order, /// depending on the session type and the metadata the document might use, at least id and data must be /// provided. /// @@ -275,7 +280,7 @@ public interface IQuerySession: IDisposable, IAsyncDisposable /// Asynchronously queries the document storage with the supplied SQL. /// The type parameters can be any document class, scalar or JSON-serializable class. /// For each result type parameter, the SQL SELECT statement must contain a ROW. - /// For document types, the row must contain the required fields in the correct order, + /// For document types, the row must contain the required fields in the correct order, /// depending on the session type and the metadata the document might use, at least id and data must be /// provided. /// diff --git a/src/Marten/IReadOnlyStoreOptions.cs b/src/Marten/IReadOnlyStoreOptions.cs index 7d30a924cf..3e28daeebb 100644 --- a/src/Marten/IReadOnlyStoreOptions.cs +++ b/src/Marten/IReadOnlyStoreOptions.cs @@ -83,4 +83,9 @@ public interface IReadOnlyStoreOptions IDocumentType FindOrResolveDocumentType(Type documentType); void AssertDocumentTypeIsSoftDeleted(Type documentType); + + /// + /// Get database schema names for configured tables + /// + IDocumentSchemaResolver Schema { get; } } diff --git a/src/Marten/Internal/IMartenSession.cs b/src/Marten/Internal/IMartenSession.cs index 4558a67b6e..921dd5862f 100644 --- a/src/Marten/Internal/IMartenSession.cs +++ b/src/Marten/Internal/IMartenSession.cs @@ -17,7 +17,7 @@ public interface IMartenSession: IDisposable, IAsyncDisposable { ISerializer Serializer { get; } Dictionary ItemMap { get; } - string TenantId { get; } + public string TenantId { get; } IMartenDatabase Database { get; } VersionTracker Versions { get; } diff --git a/src/Marten/Internal/OpenTelemetry/MartenTracing.cs b/src/Marten/Internal/OpenTelemetry/MartenTracing.cs new file mode 100644 index 0000000000..e78cb97a02 --- /dev/null +++ b/src/Marten/Internal/OpenTelemetry/MartenTracing.cs @@ -0,0 +1,24 @@ +#nullable enable +using System.Diagnostics; + +namespace Marten.Internal.OpenTelemetry; + +internal static class MartenTracing +{ + // See https://opentelemetry.io/docs/reference/specification/trace/semantic_conventions/messaging/ for more information + public const string MartenTenantId = "marten.tenant.id"; + + internal static ActivitySource ActivitySource { get; } = new( + "Marten", + typeof(MartenTracing).Assembly.GetName().Version!.ToString()); + + public static Activity? StartConnectionActivity(Activity? parentActivity = null, ActivityTagsCollection? tags = null) + { + return StartActivity("connection", parentActivity, tags); + } + + public static Activity? StartActivity(string spanName, Activity? parentActivity = null, ActivityTagsCollection? tags = null, ActivityKind activityKind = ActivityKind.Internal) + { + return ActivitySource.StartActivity(spanName, activityKind, parentActivity?.ParentId, tags); + } +} diff --git a/src/Marten/Internal/ProviderGraph.cs b/src/Marten/Internal/ProviderGraph.cs index 234639d208..e76fba3981 100644 --- a/src/Marten/Internal/ProviderGraph.cs +++ b/src/Marten/Internal/ProviderGraph.cs @@ -14,6 +14,7 @@ namespace Marten.Internal; public class ProviderGraph: IProviderGraph { private readonly StoreOptions _options; + private readonly object _storageLock = new(); private ImHashMap _storage = ImHashMap.Empty; public ProviderGraph(StoreOptions options) @@ -23,7 +24,10 @@ public ProviderGraph(StoreOptions options) public void Append(DocumentProvider provider) where T : notnull { - _storage = _storage.AddOrUpdate(typeof(T), provider); + lock (_storageLock) + { + _storage = _storage.AddOrUpdate(typeof(T), provider); + } } public DocumentProvider StorageFor() where T : notnull @@ -35,6 +39,21 @@ public DocumentProvider StorageFor() where T : notnull return stored.As>(); } + lock (_storageLock) + { + if (_storage.TryFind(documentType, out stored)) + { + return stored.As>(); + } + + return CreateDocumentProvider(); + } + } + + internal DocumentProvider CreateDocumentProvider() where T : notnull + { + var documentType = typeof(T); + if (documentType == typeof(IEvent)) { var rules = _options.CreateGenerationRules(); diff --git a/src/Marten/Internal/Sessions/EventTracingConnectionLifetime.cs b/src/Marten/Internal/Sessions/EventTracingConnectionLifetime.cs new file mode 100644 index 0000000000..648092e0c5 --- /dev/null +++ b/src/Marten/Internal/Sessions/EventTracingConnectionLifetime.cs @@ -0,0 +1,198 @@ +#nullable enable +using System; +using System.Collections.Generic; +using System.Data.Common; +using System.Diagnostics; +using System.Threading; +using System.Threading.Tasks; +using Marten.Internal.OpenTelemetry; +using Npgsql; +using OpenTelemetry.Trace; + +namespace Marten.Internal.Sessions; + +internal class EventTracingConnectionLifetime: + IConnectionLifetime +{ + private const string MartenCommandExecutionStarted = "marten.command.execution.started"; + private const string MartenBatchExecutionStarted = "marten.batch.execution.started"; + private const string MartenBatchPagesExecutionStarted = "marten.batch.pages.execution.started"; + private readonly IConnectionLifetime _innerConnectionLifetime; + private readonly Activity? _databaseActivity; + + public EventTracingConnectionLifetime(IConnectionLifetime innerConnectionLifetime, string tenantId) + { + if (innerConnectionLifetime == null) + { + throw new ArgumentNullException(nameof(innerConnectionLifetime)); + } + + if (string.IsNullOrWhiteSpace(tenantId)) + { + throw new ArgumentException("The tenant id cannot be null, an empty string or whitespace.", nameof(tenantId)); + } + + Logger = innerConnectionLifetime.Logger; + CommandTimeout = innerConnectionLifetime.CommandTimeout; + _innerConnectionLifetime = innerConnectionLifetime; + + var currentActivity = Activity.Current ?? null; + var tags = new ActivityTagsCollection(new[] { new KeyValuePair(MartenTracing.MartenTenantId, tenantId) }); + _databaseActivity = MartenTracing.StartConnectionActivity(currentActivity, tags); + } + + public ValueTask DisposeAsync() + { + _databaseActivity.Stop(); + return _innerConnectionLifetime.DisposeAsync(); + } + + public void Dispose() + { + _databaseActivity.Stop(); + _innerConnectionLifetime.Dispose(); + } + + public IMartenSessionLogger Logger { get; set; } + public int CommandTimeout { get; } + public int Execute(NpgsqlCommand cmd) + { + _databaseActivity?.AddEvent(new ActivityEvent(MartenCommandExecutionStarted)); + + try + { + return _innerConnectionLifetime.Execute(cmd); + } + catch (Exception e) + { + _databaseActivity?.RecordException(e); + + throw; + } + } + + public async Task ExecuteAsync(NpgsqlCommand command, CancellationToken token = new CancellationToken()) + { + _databaseActivity?.AddEvent(new ActivityEvent(MartenCommandExecutionStarted)); + + try + { + return await _innerConnectionLifetime.ExecuteAsync(command, token).ConfigureAwait(false); + } + catch (Exception e) + { + _databaseActivity?.RecordException(e); + + throw; + } + } + + public DbDataReader ExecuteReader(NpgsqlCommand command) + { + _databaseActivity?.AddEvent(new ActivityEvent(MartenCommandExecutionStarted)); + + try + { + return _innerConnectionLifetime.ExecuteReader(command); + } + catch (Exception e) + { + _databaseActivity?.RecordException(e); + + throw; + } + } + + public async Task ExecuteReaderAsync(NpgsqlCommand command, CancellationToken token = default) + { + _databaseActivity?.AddEvent(new ActivityEvent(MartenCommandExecutionStarted)); + + try + { + return await _innerConnectionLifetime.ExecuteReaderAsync(command, token).ConfigureAwait(false); + } + catch (Exception e) + { + _databaseActivity?.RecordException(e); + + throw; + } + } + + public DbDataReader ExecuteReader(NpgsqlBatch batch) + { + _databaseActivity?.AddEvent(new ActivityEvent(MartenBatchExecutionStarted)); + + try + { + return _innerConnectionLifetime.ExecuteReader(batch); + } + catch (Exception e) + { + _databaseActivity?.RecordException(e); + + throw; + } + } + + public async Task ExecuteReaderAsync(NpgsqlBatch batch, CancellationToken token = default) + { + _databaseActivity?.AddEvent(new ActivityEvent(MartenBatchExecutionStarted)); + + try + { + return await _innerConnectionLifetime.ExecuteReaderAsync(batch, token).ConfigureAwait(false); + } + catch (Exception e) + { + _databaseActivity?.RecordException(e); + + throw; + } + } + + public void ExecuteBatchPages(IReadOnlyList pages, List exceptions) + { + _databaseActivity?.AddEvent(new ActivityEvent(MartenBatchPagesExecutionStarted)); + + try + { + _innerConnectionLifetime.ExecuteBatchPages(pages, exceptions); + } + catch (AggregateException e) + { + _databaseActivity?.RecordException(e); + + throw; + } + catch (Exception e) + { + _databaseActivity?.RecordException(e); + + throw; + } + } + + public Task ExecuteBatchPagesAsync(IReadOnlyList pages, List exceptions, CancellationToken token) + { + _databaseActivity?.AddEvent(new ActivityEvent(MartenBatchPagesExecutionStarted)); + + try + { + return _innerConnectionLifetime.ExecuteBatchPagesAsync(pages, exceptions, token); + } + catch (AggregateException e) + { + _databaseActivity?.RecordException(e); + + throw; + } + catch (Exception e) + { + _databaseActivity?.RecordException(e); + + + throw; + } + } +} diff --git a/src/Marten/Internal/Storage/DataAndIdSelectClause.cs b/src/Marten/Internal/Storage/DataAndIdSelectClause.cs new file mode 100644 index 0000000000..bb42091c40 --- /dev/null +++ b/src/Marten/Internal/Storage/DataAndIdSelectClause.cs @@ -0,0 +1,48 @@ +using System; +using System.Linq; +using JasperFx.Core; +using Marten.Linq; +using Marten.Linq.QueryHandlers; +using Marten.Linq.Selectors; +using Marten.Linq.SqlGeneration; +using Weasel.Postgresql; +using Weasel.Postgresql.SqlGeneration; + +namespace Marten.Internal.Storage; + +internal class DataAndIdSelectClause: ISelectClause, IModifyableFromObject +{ + private readonly IDocumentStorage _inner; + + public DataAndIdSelectClause(IDocumentStorage inner) + { + _inner = inner; + FromObject = inner.FromObject; + } + + public void Apply(ICommandBuilder builder) + { + builder.Append($"select {_inner.SelectFields().Concat(["d.id"]).Join(", ")} from "); + builder.Append(FromObject); + builder.Append(" as d"); + } + + public string FromObject { get; set; } + public Type SelectedType => typeof(T); + public string[] SelectFields() => ["d.data", "d.id"]; + + public ISelector BuildSelector(IMartenSession session) + { + return _inner.BuildSelector(session); + } + + public IQueryHandler BuildHandler(IMartenSession session, ISqlFragment topStatement, ISqlFragment currentStatement) + { + return _inner.BuildHandler(session, topStatement, currentStatement); + } + + public ISelectClause UseStatistics(QueryStatistics statistics) + { + return _inner.UseStatistics(statistics); + } +} diff --git a/src/Marten/Internal/Storage/QueryOnlyDocumentStorage.cs b/src/Marten/Internal/Storage/QueryOnlyDocumentStorage.cs index 067a900d05..5702e70941 100644 --- a/src/Marten/Internal/Storage/QueryOnlyDocumentStorage.cs +++ b/src/Marten/Internal/Storage/QueryOnlyDocumentStorage.cs @@ -4,16 +4,27 @@ using System.Threading.Tasks; using Marten.Internal.CodeGeneration; using Marten.Linq.Selectors; +using Marten.Linq.SqlGeneration; using Marten.Schema; namespace Marten.Internal.Storage; -public abstract class QueryOnlyDocumentStorage: DocumentStorage +internal interface IQueryOnlyDocumentStorage: IDocumentStorage +{ + ISelectClause SelectClauseForIncludes(); +} + +public abstract class QueryOnlyDocumentStorage: DocumentStorage, IQueryOnlyDocumentStorage { public QueryOnlyDocumentStorage(DocumentMapping document): base(StorageStyle.QueryOnly, document) { } + public ISelectClause SelectClauseForIncludes() + { + return new DataAndIdSelectClause(this); + } + public sealed override void Store(IMartenSession session, T document) { } diff --git a/src/Marten/Internal/UnitOfWork.cs b/src/Marten/Internal/UnitOfWork.cs index 882453efc4..25b94d3596 100644 --- a/src/Marten/Internal/UnitOfWork.cs +++ b/src/Marten/Internal/UnitOfWork.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Text; using JasperFx.Core; using JasperFx.Core.Reflection; using Marten.Events; @@ -243,15 +244,20 @@ private bool shouldSort(StoreOptions options, out IComparer c return false; } - if (_operations.Where(x => x.Role() != OperationRole.Other).Select(x => x.DocumentType).Distinct().Count(x => x != typeof(StorageFeatures)) == 1) - { - return false; - } - - var types = _operations + var rawTypes = _operations + .Where(x => x.Role() != OperationRole.Other) .Select(x => x.DocumentType) .Where(x => x != null) - .Distinct() + .Where(x => x != typeof(StorageFeatures)) + .Distinct().ToArray(); + + if (rawTypes.Length <= 1) return false; + + var hasRelationship = rawTypes.Any(x => options.Storage.GetTypeDependencies(x).Intersect(rawTypes).Any()); + + if (!hasRelationship) return false; + + var types = rawTypes .TopologicalSort(type => options.Storage.GetTypeDependencies(type)).ToArray(); if (_operations.OfType().Any()) diff --git a/src/Marten/Linq/Includes/TemporaryTableStatement.cs b/src/Marten/Linq/Includes/TemporaryTableStatement.cs index 7a6c33fa06..07fad95654 100644 --- a/src/Marten/Linq/Includes/TemporaryTableStatement.cs +++ b/src/Marten/Linq/Includes/TemporaryTableStatement.cs @@ -1,4 +1,6 @@ +using System.Linq; using Marten.Internal; +using Marten.Internal.Storage; using Marten.Linq.SqlGeneration; using Weasel.Postgresql; @@ -9,8 +11,15 @@ public class TemporaryTableStatement: Statement public TemporaryTableStatement(Statement inner, IMartenSession session) { Inner = inner; + var selectorStatement = Inner.SelectorStatement(); + selectorStatement.Mode = StatementMode.Inner; - Inner.SelectorStatement().Mode = StatementMode.Inner; + // This is ugly, but you need to pick up the id column *just* in case there's a Select() + // clause that needs it. + if (selectorStatement.SelectClause is IQueryOnlyDocumentStorage s) + { + selectorStatement.SelectClause = s.SelectClauseForIncludes(); + } ExportName = session.NextTempTableName(); } diff --git a/src/Marten/Linq/Parsing/SelectorVisitor.cs b/src/Marten/Linq/Parsing/SelectorVisitor.cs index f991533dc1..1ba2d8d8a4 100644 --- a/src/Marten/Linq/Parsing/SelectorVisitor.cs +++ b/src/Marten/Linq/Parsing/SelectorVisitor.cs @@ -93,7 +93,7 @@ public void ToScalar(Expression selectClauseSelector) } else if (member.MemberType.IsSimple() || member.MemberType == typeof(Guid) || member.MemberType == typeof(decimal) || - member.MemberType == typeof(DateTimeOffset)) + member.MemberType == typeof(DateTimeOffset) || member.MemberType == typeof(DateTime)) { _statement.SelectClause = typeof(NewScalarSelectClause<>).CloseAndBuildAs(member, diff --git a/src/Marten/Linq/Parsing/SimpleExpression.cs b/src/Marten/Linq/Parsing/SimpleExpression.cs index 7f61c11ec0..a440556770 100644 --- a/src/Marten/Linq/Parsing/SimpleExpression.cs +++ b/src/Marten/Linq/Parsing/SimpleExpression.cs @@ -181,6 +181,8 @@ public ISqlFragment CompareTo(SimpleExpression right, string op) protected override Expression VisitBinary(BinaryExpression node) { + + switch (node.NodeType) { case ExpressionType.Modulo: @@ -206,6 +208,13 @@ protected override Expression VisitBinary(BinaryExpression node) return null; + // GH-3116 + case ExpressionType.Add: + Constant = node.ReduceToConstant(); + HasConstant = true; + + return null; + default: throw new BadLinqExpressionException( $"Unsupported nested operator '{node.NodeType}' as an operand in a binary expression"); diff --git a/src/Marten/Linq/SqlGeneration/Filters/ContainmentWhereFilter.cs b/src/Marten/Linq/SqlGeneration/Filters/ContainmentWhereFilter.cs index 9eec615667..d292d184fb 100644 --- a/src/Marten/Linq/SqlGeneration/Filters/ContainmentWhereFilter.cs +++ b/src/Marten/Linq/SqlGeneration/Filters/ContainmentWhereFilter.cs @@ -4,8 +4,10 @@ using System.Linq.Expressions; using System.Reflection; using JasperFx.CodeGeneration; +using Marten.Exceptions; using Marten.Internal.CompiledQueries; using Marten.Linq.Members; +using Marten.Linq.Members.Dictionaries; using NpgsqlTypes; using Weasel.Postgresql; using Weasel.Postgresql.SqlGeneration; @@ -42,6 +44,10 @@ public ContainmentWhereFilter(IQueryableMember member, ConstantExpression consta public ContainmentWhereFilter(ICollectionMember collection, ISerializer serializer) { + if (collection is DictionaryValuesMember) + throw new BadLinqExpressionException( + "Marten cannot (yet) support sub query filters against Dictionary<,>.Values. You will have to revert to using MatchesSql()"); + _locator = collection.JSONBLocator; _serializer = serializer; CollectionMember = collection; diff --git a/src/Marten/Linq/SqlGeneration/SelectDataSelectClause.cs b/src/Marten/Linq/SqlGeneration/SelectDataSelectClause.cs index 3470164873..3141b30fb3 100644 --- a/src/Marten/Linq/SqlGeneration/SelectDataSelectClause.cs +++ b/src/Marten/Linq/SqlGeneration/SelectDataSelectClause.cs @@ -9,7 +9,7 @@ namespace Marten.Linq.SqlGeneration; -internal class SelectDataSelectClause: ISelectClause, IScalarSelectClause +internal class SelectDataSelectClause: ISelectClause, IScalarSelectClause, IModifyableFromObject { public SelectDataSelectClause(string from, ISqlFragment selector) { @@ -21,7 +21,7 @@ public SelectDataSelectClause(string from, ISqlFragment selector) public Type SelectedType => typeof(T); - public string FromObject { get; } + public string FromObject { get; set; } public void Apply(ICommandBuilder sql) { diff --git a/src/Marten/Marten.csproj b/src/Marten/Marten.csproj index 5dab2a5db3..1a0911d7ab 100644 --- a/src/Marten/Marten.csproj +++ b/src/Marten/Marten.csproj @@ -44,6 +44,7 @@ + @@ -65,5 +66,8 @@ + + + diff --git a/src/Marten/MartenServiceCollectionExtensions.cs b/src/Marten/MartenServiceCollectionExtensions.cs index 1f789b6553..666a8a32c2 100644 --- a/src/Marten/MartenServiceCollectionExtensions.cs +++ b/src/Marten/MartenServiceCollectionExtensions.cs @@ -5,6 +5,8 @@ using System.IO; using System.Linq; using System.Reflection; +using System.Threading; +using System.Threading.Tasks; using JasperFx.CodeGeneration; using JasperFx.Core; using JasperFx.Core.Reflection; @@ -15,6 +17,7 @@ using Marten.Schema; using Marten.Services; using Marten.Sessions; +using Marten.Subscriptions; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; @@ -27,6 +30,20 @@ namespace Marten; public static class MartenServiceCollectionExtensions { + /// + /// Apply additional configuration to a Marten DocumentStore. This is applied *after* + /// AddMarten(), but before the DocumentStore is initialized + /// + /// + /// + /// + public static IServiceCollection ConfigureMartenWithServices(this IServiceCollection services) where T : class, IAsyncConfigureMarten + { + services.EnsureAsyncConfigureMartenApplicationIsRegistered(); + services.AddSingleton(); + return services; + } + /// /// Apply additional configuration to a Marten DocumentStore. This is applied *after* /// AddMarten(), but before the DocumentStore is initialized @@ -300,13 +317,36 @@ public static IReadOnlyList AllDocumentStores(this IServiceProvi return list; } + internal static void EnsureAsyncConfigureMartenApplicationIsRegistered(this IServiceCollection services) + { + if (!services.Any( + x => x.ServiceType == typeof(IHostedService) && x.ImplementationType == typeof(AsyncConfigureMartenApplication))) + { + services.Insert(0, + new ServiceDescriptor(typeof(IHostedService), typeof(AsyncConfigureMartenApplication), ServiceLifetime.Singleton)); + } + } + internal static void EnsureMartenActivatorIsRegistered(this IServiceCollection services) { if (!services.Any( x => x.ServiceType == typeof(IHostedService) && x.ImplementationType == typeof(MartenActivator))) { - services.Insert(0, - new ServiceDescriptor(typeof(IHostedService), typeof(MartenActivator), ServiceLifetime.Singleton)); + var descriptor = services.FirstOrDefault(x => + x.ServiceType == typeof(IHostedService) && + x.ImplementationType == typeof(AsyncConfigureMartenApplication)); + + if (descriptor != null) + { + var index = services.IndexOf(descriptor); + services.Insert(index + 1, + new ServiceDescriptor(typeof(IHostedService), typeof(MartenActivator), ServiceLifetime.Singleton)); + } + else + { + services.Insert(0, + new ServiceDescriptor(typeof(IHostedService), typeof(MartenActivator), ServiceLifetime.Singleton)); + } } } @@ -795,6 +835,44 @@ public MartenConfigurationExpression AddProjectionWithServices(ProjectionLife return this; } + + + /// + /// Add a subscription to this Marten store that will require resolution + /// from the application's IoC container in order to function correctly + /// + /// IoC service lifetime + /// Optional configuration of the subscription within Marten + /// + /// + public MartenConfigurationExpression AddSubscriptionWithServices( + ServiceLifetime lifetime, Action? configure = null) where T : class, ISubscription + { + switch (lifetime) + { + case ServiceLifetime.Singleton: + Services.AddSingleton(); + Services.ConfigureMarten((s, opts) => + { + var subscription = s.GetRequiredService(); + opts.Projections.Subscribe(subscription, configure); + }); + break; + + case ServiceLifetime.Transient: + case ServiceLifetime.Scoped: + Services.AddScoped(); + Services.ConfigureMarten((s, opts) => + { + var subscription = new ScopedSubscriptionServiceWrapper(s); + opts.Projections.Subscribe(subscription, configure); + }); + break; + } + + return this; + } + } internal class AddInitialData: IConfigureMarten where T : IDocumentStore where TData : IInitialData @@ -826,6 +904,45 @@ public interface IConfigureMarten #endregion +#region sample_IAsyncConfigureMarten + +/// +/// Mechanism to register additional Marten configuration that is applied after AddMarten() +/// configuration, but before DocumentStore is initialized when you need to utilize some +/// kind of asynchronous services like Microsoft's FeatureManagement feature to configure Marten +/// +public interface IAsyncConfigureMarten +{ + ValueTask Configure(StoreOptions options, CancellationToken cancellationToken); +} + +#endregion + +internal class AsyncConfigureMartenApplication: IHostedService +{ + private readonly IList _configures; + private readonly StoreOptions _options; + + public AsyncConfigureMartenApplication(IEnumerable configures, StoreOptions options) + { + _configures = configures.ToList(); + _options = options; + } + + public async Task StartAsync(CancellationToken cancellationToken) + { + foreach (var configure in _configures) + { + await configure.Configure(_options, cancellationToken).ConfigureAwait(false); + } + } + + public Task StopAsync(CancellationToken cancellationToken) + { + return Task.CompletedTask; + } +} + internal class LambdaConfigureMarten: IConfigureMarten { private readonly Action _configure; diff --git a/src/Marten/Patching/PatchExpression.cs b/src/Marten/Patching/PatchExpression.cs index 27441bfe15..49d91298ed 100644 --- a/src/Marten/Patching/PatchExpression.cs +++ b/src/Marten/Patching/PatchExpression.cs @@ -27,7 +27,7 @@ public PatchExpression(ISqlFragment filter, DocumentSessionBase session) { _session = session; var storage = _session.StorageFor(typeof(T)); - var operation = new PatchOperation(PatchFunction, storage, _patchSet, _session.Serializer); + var operation = new PatchOperation(session, PatchFunction, storage, _patchSet, _session.Serializer); if (filter != null) { operation.Wheres.Add(storage.FilterDocuments(filter, _session)); @@ -43,7 +43,7 @@ public PatchExpression(Expression> filterExpression, DocumentSessi { _session = session; var storage = _session.StorageFor(typeof(T)); - var operation = new PatchOperation(PatchFunction, storage, _patchSet, _session.Serializer); + var operation = new PatchOperation(session, PatchFunction, storage, _patchSet, _session.Serializer); if (filterExpression != null) { operation.ApplyFiltering(_session, filterExpression); diff --git a/src/Marten/Patching/PatchOperation.cs b/src/Marten/Patching/PatchOperation.cs index 6047734e60..b242be674f 100644 --- a/src/Marten/Patching/PatchOperation.cs +++ b/src/Marten/Patching/PatchOperation.cs @@ -1,6 +1,7 @@ using System.Collections.Generic; using System.Linq; using Marten.Internal.Operations; +using Marten.Internal.Sessions; using Marten.Internal.Storage; using Marten.Linq.SqlGeneration; using Marten.Schema; @@ -19,11 +20,14 @@ internal class PatchFragment: IOperationFragment private readonly ISerializer _serializer; private readonly IDocumentStorage _storage; private readonly DbObjectName _function; + private readonly DocumentSessionBase _session; private readonly List _patchSet; - public PatchFragment(List patchSet, ISerializer serializer, DbObjectName function, + public PatchFragment(DocumentSessionBase session, List patchSet, ISerializer serializer, + DbObjectName function, IDocumentStorage storage) { + _session = session; _patchSet = patchSet; _patchSet = patchSet; _serializer = serializer; @@ -59,12 +63,16 @@ public void Apply(ICommandBuilder builder) builder.Append(_function.QualifiedName); builder.Append("(data, "); builder.AppendParameter("[" + string.Join(",", patchSetStr.ToArray()) + "]", NpgsqlDbType.Jsonb); - builder.Append("), "); - builder.Append(SchemaConstants.LastModifiedColumn); - builder.Append(" = (now() at time zone 'utc'), "); - builder.Append(SchemaConstants.VersionColumn); - builder.Append(" = "); - builder.AppendParameter(CombGuidIdGeneration.NewGuid()); + builder.Append(")"); + + if (_storage is IHaveMetadataColumns metadata) + { + foreach (var column in metadata.MetadataColumns().Where(x => x.Enabled && x.ShouldUpdatePartials)) + { + builder.Append(", "); + column.WriteMetadataInUpdateStatement(builder, _session); + } + } } public OperationRole Role() @@ -79,8 +87,9 @@ internal class PatchOperation: StatementOperation, NoDataReturnedCall private readonly IDocumentStorage _storage; private readonly List _patchSet; - public PatchOperation(DbObjectName function, IDocumentStorage storage, List patchSet , ISerializer serializer): - base(storage, new PatchFragment(patchSet, serializer, function, storage)) + public PatchOperation(DocumentSessionBase session, DbObjectName function, IDocumentStorage storage, + List patchSet, ISerializer serializer): + base(storage, new PatchFragment(session, patchSet, serializer, function, storage)) { _storage = storage; _patchSet = patchSet; diff --git a/src/Marten/Services/OpenTelemetryOptions.cs b/src/Marten/Services/OpenTelemetryOptions.cs new file mode 100644 index 0000000000..1169544576 --- /dev/null +++ b/src/Marten/Services/OpenTelemetryOptions.cs @@ -0,0 +1,10 @@ +#nullable enable +namespace Marten.Services; + +public sealed class OpenTelemetryOptions +{ + /// + /// Used to track OpenTelemetry events for a connection, for example when a command or data reader has been executed. This defaults to false. + /// + public bool TrackConnectionEvents { get; set; } +} diff --git a/src/Marten/Services/SessionOptions.cs b/src/Marten/Services/SessionOptions.cs index 27552792ee..0b1c43b280 100644 --- a/src/Marten/Services/SessionOptions.cs +++ b/src/Marten/Services/SessionOptions.cs @@ -6,6 +6,7 @@ using System.Threading.Tasks; using System.Transactions; using Marten.Exceptions; +using Marten.Internal.OpenTelemetry; using Marten.Internal.Sessions; using Marten.Storage; using Npgsql; @@ -82,6 +83,11 @@ public sealed class SessionOptions /// public bool AllowAnyTenant { get; set; } + /// + /// Used to enable or disable Marten's OpenTelemetry features for just this session. + /// + public OpenTelemetryOptions OpenTelemetryOptions { get; set; } = new OpenTelemetryOptions(); + internal IConnectionLifetime Initialize(DocumentStore store, CommandRunnerMode mode) { Mode = mode; @@ -93,6 +99,15 @@ internal IConnectionLifetime Initialize(DocumentStore store, CommandRunnerMode m throw new DefaultTenantUsageDisabledException(); } + var innerConnectionLifetime = GetInnerConnectionLifetime(store, mode); + + return !OpenTelemetryOptions.TrackConnectionEvents || !MartenTracing.ActivitySource.HasListeners() + ? innerConnectionLifetime + : new EventTracingConnectionLifetime(innerConnectionLifetime, Tenant.TenantId); + } + + private IConnectionLifetime GetInnerConnectionLifetime(DocumentStore store, CommandRunnerMode mode) + { if (!OwnsTransactionLifecycle && mode != CommandRunnerMode.ReadOnly) { Mode = CommandRunnerMode.External; @@ -103,16 +118,17 @@ internal IConnectionLifetime Initialize(DocumentStore store, CommandRunnerMode m if (IsolationLevel == IsolationLevel.Serializable) { var transaction = mode == CommandRunnerMode.ReadOnly - ? new ReadOnlyTransactionalConnection(this){CommandTimeout = Timeout ?? store.Options.CommandTimeout} - : new TransactionalConnection(this){CommandTimeout = Timeout ?? store.Options.CommandTimeout}; + ? new ReadOnlyTransactionalConnection(this) { CommandTimeout = Timeout ?? store.Options.CommandTimeout } + : new TransactionalConnection(this) { CommandTimeout = Timeout ?? store.Options.CommandTimeout }; transaction.BeginTransaction(); return transaction; } else if (store.Options.UseStickyConnectionLifetimes) { - return new TransactionalConnection(this){CommandTimeout = Timeout ?? store.Options.CommandTimeout}; + return new TransactionalConnection(this) { CommandTimeout = Timeout ?? store.Options.CommandTimeout }; } + { return new AutoClosingLifetime(this, store.Options); } @@ -121,18 +137,18 @@ internal IConnectionLifetime Initialize(DocumentStore store, CommandRunnerMode m if (Transaction != null) { - return new ExternalTransaction(this){CommandTimeout = Timeout ?? store.Options.CommandTimeout}; + return new ExternalTransaction(this) { CommandTimeout = Timeout ?? store.Options.CommandTimeout }; } if (DotNetTransaction != null) { - return new AmbientTransactionLifetime(this){CommandTimeout = Timeout ?? store.Options.CommandTimeout}; + return new AmbientTransactionLifetime(this) { CommandTimeout = Timeout ?? store.Options.CommandTimeout }; } if (Connection != null) { - return new TransactionalConnection(this){CommandTimeout = Timeout ?? store.Options.CommandTimeout}; + return new TransactionalConnection(this) { CommandTimeout = Timeout ?? store.Options.CommandTimeout }; } diff --git a/src/Marten/Storage/IMartenDatabase.cs b/src/Marten/Storage/IMartenDatabase.cs index 14b8e3297c..377c229e2e 100644 --- a/src/Marten/Storage/IMartenDatabase.cs +++ b/src/Marten/Storage/IMartenDatabase.cs @@ -110,4 +110,12 @@ Task ProjectionProgressFor(ShardName name, CancellationToken token = default); + /// + /// Find the position of the event store sequence just below the supplied timestamp. Will + /// return null if there are no events below that time threshold + /// + /// + /// + /// + Task FindEventStoreFloorAtTimeAsync(DateTimeOffset timestamp, CancellationToken token); } diff --git a/src/Marten/Storage/MartenDatabase.EventStorage.cs b/src/Marten/Storage/MartenDatabase.EventStorage.cs index 20ee9d251a..07833442c8 100644 --- a/src/Marten/Storage/MartenDatabase.EventStorage.cs +++ b/src/Marten/Storage/MartenDatabase.EventStorage.cs @@ -1,4 +1,5 @@ #nullable enable +using System; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; @@ -10,12 +11,33 @@ using Marten.Linq.QueryHandlers; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; +using NpgsqlTypes; using Weasel.Postgresql; namespace Marten.Storage; public partial class MartenDatabase { + public async Task FindEventStoreFloorAtTimeAsync(DateTimeOffset timestamp, CancellationToken token) + { + var sql = + $"select seq_id from {Options.Events.DatabaseSchemaName}.mt_events where timestamp >= :timestamp order by seq_id limit 1"; + await EnsureStorageExistsAsync(typeof(IEvent), token).ConfigureAwait(false); + + await using var conn = CreateConnection(); + + try + { + await conn.OpenAsync(token).ConfigureAwait(false); + var raw = await conn.CreateCommand(sql).With("timestamp", timestamp.ToUniversalTime(), NpgsqlDbType.TimestampTz).ExecuteScalarAsync(token).ConfigureAwait(false); + return raw is DBNull ? null : (long?)raw; + } + finally + { + await conn.CloseAsync().ConfigureAwait(false); + } + } + /// /// Fetch the current size of the event store tables, including the current value /// of the event sequence number diff --git a/src/Marten/Storage/Metadata/CausationIdColumn.cs b/src/Marten/Storage/Metadata/CausationIdColumn.cs index a4acc36d27..922139c7b2 100644 --- a/src/Marten/Storage/Metadata/CausationIdColumn.cs +++ b/src/Marten/Storage/Metadata/CausationIdColumn.cs @@ -6,9 +6,11 @@ using Marten.Events.Schema; using Marten.Internal; using Marten.Internal.CodeGeneration; +using Marten.Internal.Sessions; using Marten.Schema; using Marten.Schema.Arguments; using NpgsqlTypes; +using Weasel.Postgresql; namespace Marten.Storage.Metadata; @@ -19,6 +21,7 @@ internal class CausationIdColumn: MetadataColumn, ISelectableColumn, IEv public CausationIdColumn(): base(ColumnName, x => x.CausationId) { Enabled = false; + ShouldUpdatePartials = true; } public void GenerateSelectorCodeSync(GeneratedMethod method, EventGraph graph, int index) @@ -58,6 +61,13 @@ internal override UpsertArgument ToArgument() { return new CausationIdArgument(); } + + public override void WriteMetadataInUpdateStatement(ICommandBuilder builder, DocumentSessionBase session) + { + builder.Append(ColumnName); + builder.Append(" = "); + builder.AppendParameter(session.CausationId); + } } internal class CausationIdArgument: UpsertArgument diff --git a/src/Marten/Storage/Metadata/CorrelationIdColumn.cs b/src/Marten/Storage/Metadata/CorrelationIdColumn.cs index 925b21d0d3..87f3e8aeb5 100644 --- a/src/Marten/Storage/Metadata/CorrelationIdColumn.cs +++ b/src/Marten/Storage/Metadata/CorrelationIdColumn.cs @@ -6,9 +6,11 @@ using Marten.Events.Schema; using Marten.Internal; using Marten.Internal.CodeGeneration; +using Marten.Internal.Sessions; using Marten.Schema; using Marten.Schema.Arguments; using NpgsqlTypes; +using Weasel.Postgresql; namespace Marten.Storage.Metadata; @@ -19,6 +21,7 @@ internal class CorrelationIdColumn: MetadataColumn, ISelectableColumn, I public CorrelationIdColumn(): base(ColumnName, x => x.CorrelationId) { Enabled = false; + ShouldUpdatePartials = true; } public void GenerateSelectorCodeSync(GeneratedMethod method, EventGraph graph, int index) @@ -58,6 +61,13 @@ internal override UpsertArgument ToArgument() { return new CorrelationIdArgument(); } + + public override void WriteMetadataInUpdateStatement(ICommandBuilder builder, DocumentSessionBase session) + { + builder.Append(ColumnName); + builder.Append(" = "); + builder.AppendParameter(session.CorrelationId); + } } internal class CorrelationIdArgument: UpsertArgument diff --git a/src/Marten/Storage/Metadata/LastModifiedByColumn.cs b/src/Marten/Storage/Metadata/LastModifiedByColumn.cs index 2f1ccd8128..7e80420332 100644 --- a/src/Marten/Storage/Metadata/LastModifiedByColumn.cs +++ b/src/Marten/Storage/Metadata/LastModifiedByColumn.cs @@ -4,9 +4,11 @@ using JasperFx.CodeGeneration.Model; using Marten.Internal; using Marten.Internal.CodeGeneration; +using Marten.Internal.Sessions; using Marten.Schema; using Marten.Schema.Arguments; using NpgsqlTypes; +using Weasel.Postgresql; namespace Marten.Storage.Metadata; @@ -17,6 +19,7 @@ internal class LastModifiedByColumn: MetadataColumn, ISelectableColumn public LastModifiedByColumn(): base(ColumnName, x => x.LastModifiedBy) { Enabled = false; + ShouldUpdatePartials = true; } public void GenerateCode(StorageStyle storageStyle, GeneratedType generatedType, GeneratedMethod async, @@ -35,6 +38,13 @@ internal override UpsertArgument ToArgument() { return new LastModifiedByArgument(); } + + public override void WriteMetadataInUpdateStatement(ICommandBuilder builder, DocumentSessionBase session) + { + builder.Append(ColumnName); + builder.Append(" = "); + builder.AppendParameter(session.LastModifiedBy); + } } internal class LastModifiedByArgument: UpsertArgument diff --git a/src/Marten/Storage/Metadata/LastModifiedColumn.cs b/src/Marten/Storage/Metadata/LastModifiedColumn.cs index 1ab2114492..f6abde6de1 100644 --- a/src/Marten/Storage/Metadata/LastModifiedColumn.cs +++ b/src/Marten/Storage/Metadata/LastModifiedColumn.cs @@ -2,7 +2,9 @@ using JasperFx.CodeGeneration; using JasperFx.Core.Reflection; using Marten.Internal.CodeGeneration; +using Marten.Internal.Sessions; using Marten.Schema; +using Weasel.Postgresql; namespace Marten.Storage.Metadata; @@ -12,6 +14,8 @@ public LastModifiedColumn(): base(SchemaConstants.LastModifiedColumn, x => x.Las { DefaultExpression = "(transaction_timestamp())"; Type = "timestamp with time zone"; + + ShouldUpdatePartials = true; } public void GenerateCode(StorageStyle storageStyle, GeneratedType generatedType, GeneratedMethod async, @@ -38,4 +42,10 @@ public bool ShouldSelect(DocumentMapping mapping, StorageStyle storageStyle) { return Member != null; } + + public override void WriteMetadataInUpdateStatement(ICommandBuilder builder, DocumentSessionBase session) + { + builder.Append(SchemaConstants.LastModifiedColumn); + builder.Append(" = (now() at time zone 'utc')"); + } } diff --git a/src/Marten/Storage/Metadata/MetadataColumn.cs b/src/Marten/Storage/Metadata/MetadataColumn.cs index 6e7aefbb62..a41352e2fc 100644 --- a/src/Marten/Storage/Metadata/MetadataColumn.cs +++ b/src/Marten/Storage/Metadata/MetadataColumn.cs @@ -9,6 +9,7 @@ using JasperFx.Core.Reflection; using Marten.Internal; using Marten.Internal.CodeGeneration; +using Marten.Internal.Sessions; using Marten.Linq.Parsing; using Marten.Schema; using Marten.Schema.Arguments; @@ -35,6 +36,8 @@ protected MetadataColumn(string name, string type, Type dotNetType): base(name, /// public bool Enabled { get; set; } = true; + public bool ShouldUpdatePartials { get; protected set; } + internal abstract Task ApplyAsync(IMartenSession martenSession, DocumentMetadata metadata, int index, DbDataReader reader, CancellationToken token); @@ -88,6 +91,11 @@ protected void setMemberFromReader(GeneratedType generatedType, GeneratedMethod async.AssignMemberFromReaderAsync(generatedType, index, mapping.DocumentType, Member.Name); }); } + + public virtual void WriteMetadataInUpdateStatement(ICommandBuilder builder, DocumentSessionBase session) + { + throw new NotSupportedException(); + } } internal abstract class MetadataColumn: MetadataColumn diff --git a/src/Marten/Storage/Metadata/VersionColumn.cs b/src/Marten/Storage/Metadata/VersionColumn.cs index 59948667bc..89e48d40f0 100644 --- a/src/Marten/Storage/Metadata/VersionColumn.cs +++ b/src/Marten/Storage/Metadata/VersionColumn.cs @@ -1,7 +1,10 @@ using System; using JasperFx.CodeGeneration; +using JasperFx.Core; using Marten.Internal.CodeGeneration; +using Marten.Internal.Sessions; using Marten.Schema; +using Weasel.Postgresql; namespace Marten.Storage.Metadata; @@ -11,6 +14,7 @@ public VersionColumn(): base(SchemaConstants.VersionColumn, x => x.CurrentVersio { AllowNulls = false; DefaultExpression = "(md5(random()::text || clock_timestamp()::text)::uuid)"; + ShouldUpdatePartials = true; } public void GenerateCode(StorageStyle storageStyle, GeneratedType generatedType, GeneratedMethod async, @@ -48,4 +52,11 @@ public bool ShouldSelect(DocumentMapping mapping, StorageStyle storageStyle) return storageStyle != StorageStyle.QueryOnly && mapping.UseOptimisticConcurrency; } + + public override void WriteMetadataInUpdateStatement(ICommandBuilder builder, DocumentSessionBase session) + { + builder.Append(SchemaConstants.VersionColumn); + builder.Append(" = "); + builder.AppendParameter(Guid.NewGuid()); + } } diff --git a/src/Marten/Storage/StandinDatabase.cs b/src/Marten/Storage/StandinDatabase.cs index 123d28d05f..5c8b2924f7 100644 --- a/src/Marten/Storage/StandinDatabase.cs +++ b/src/Marten/Storage/StandinDatabase.cs @@ -223,6 +223,11 @@ public Task ProjectionProgressFor(ShardName name, CancellationToken token throw new NotImplementedException(); } + public async Task FindEventStoreFloorAtTimeAsync(DateTimeOffset timestamp, CancellationToken token) + { + throw new NotImplementedException(); + } + public void Dispose() { ((IDisposable)Tracker)?.Dispose(); diff --git a/src/Marten/StoreOptions.cs b/src/Marten/StoreOptions.cs index 4561e59281..70cb02ee2a 100644 --- a/src/Marten/StoreOptions.cs +++ b/src/Marten/StoreOptions.cs @@ -12,6 +12,7 @@ using Marten.Events; using Marten.Events.Daemon; using Marten.Events.Projections; +using Marten.Events.Schema; using Marten.Exceptions; using Marten.Internal; using Marten.Linq; @@ -38,7 +39,7 @@ namespace Marten; /// necessary to customize and bootstrap a working /// DocumentStore /// -public partial class StoreOptions: IReadOnlyStoreOptions, IMigrationLogger +public partial class StoreOptions: IReadOnlyStoreOptions, IMigrationLogger, IDocumentSchemaResolver { public const int DefaultTimeout = 5; @@ -112,7 +113,7 @@ public StoreOptions() NpgsqlDataSourceFactory = new DefaultNpgsqlDataSourceFactory(connectionString => { var builder = new NpgsqlDataSourceBuilder(connectionString); - if (LogFactory != null) + if (LogFactory != null && !DisableNpgsqlLogging) { builder.UseLoggerFactory(LogFactory); } @@ -121,6 +122,11 @@ public StoreOptions() }); } + /// + /// Npgsql logging is absurdly noisy, you may want to disable the logging. Default is false + /// + public bool DisableNpgsqlLogging { get; set; } + /// /// Configure and override the Polly error handling policies for this DocumentStore /// @@ -495,8 +501,7 @@ public void Serializer(ISerializer serializer) } /// - /// Use the default serialization (ilmerged Newtonsoft.Json) with Enum values - /// stored as either integers or strings + /// Configure the default serializer settings /// /// /// Casing style to be used in serialization @@ -880,6 +885,37 @@ public void MultiTenantedDatabasesWithMasterDatabaseTable(Action this; + + string IDocumentSchemaResolver.EventsSchemaName => Events.DatabaseSchemaName; + + string IDocumentSchemaResolver.For(bool qualified) + { + var docType = ((IReadOnlyStoreOptions)this).FindOrResolveDocumentType(typeof(TDocument)); + return qualified ? docType.TableName.QualifiedName : docType.TableName.Name; + } + + public string For(Type documentType, bool qualified = true) + { + var docType = ((IReadOnlyStoreOptions)this).FindOrResolveDocumentType(documentType); + return qualified ? docType.TableName.QualifiedName : docType.TableName.Name; + } + + string IDocumentSchemaResolver.ForEvents(bool qualified) + { + return qualified ? _eventGraph.Table.QualifiedName : _eventGraph.Table.Name; + } + + string IDocumentSchemaResolver.ForStreams(bool qualified) + { + return qualified ? _eventGraph.StreamsTable.QualifiedName : _eventGraph.StreamsTable.Name; + } + + string IDocumentSchemaResolver.ForEventProgression(bool qualified) + { + return qualified ? _eventGraph.ProgressionTable.QualifiedName : _eventGraph.ProgressionTable.Name; + } } internal class LambdaDocumentPolicy: IDocumentPolicy diff --git a/src/Marten/Subscriptions/ISubscription.cs b/src/Marten/Subscriptions/ISubscription.cs new file mode 100644 index 0000000000..0facbacff7 --- /dev/null +++ b/src/Marten/Subscriptions/ISubscription.cs @@ -0,0 +1,30 @@ +using System; +using System.Threading; +using System.Threading.Tasks; +using Marten.Events.Daemon; +using Marten.Events.Daemon.Internals; + +namespace Marten.Subscriptions; + +#region sample_ISubscription + +/// +/// Basic abstraction for custom subscriptions to Marten events through the async daemon. Use this in +/// order to do custom processing against an ordered stream of the events +/// +public interface ISubscription : IAsyncDisposable +{ + /// + /// Processes a page of events at a time + /// + /// + /// Use to log dead letter events that are skipped or to stop the subscription from processing based on an exception + /// Access to Marten queries and writes that will be committed with the progress update for this subscription + /// + /// + Task ProcessEventsAsync(EventRange page, ISubscriptionController controller, + IDocumentOperations operations, + CancellationToken cancellationToken); +} + +#endregion diff --git a/src/Marten/Subscriptions/ISubscriptionSource.cs b/src/Marten/Subscriptions/ISubscriptionSource.cs new file mode 100644 index 0000000000..57a23ba57c --- /dev/null +++ b/src/Marten/Subscriptions/ISubscriptionSource.cs @@ -0,0 +1,14 @@ +using System.Collections.Generic; +using Marten.Events.Daemon; + +namespace Marten.Subscriptions; + +public interface ISubscriptionSource +{ + public AsyncOptions Options { get; } + IReadOnlyList AsyncProjectionShards(DocumentStore store); + ISubscription Build(DocumentStore store); + + public string SubscriptionName { get; } + public uint SubscriptionVersion { get; } +} diff --git a/src/Marten/Subscriptions/SubscriptionBase.cs b/src/Marten/Subscriptions/SubscriptionBase.cs new file mode 100644 index 0000000000..38608d1b25 --- /dev/null +++ b/src/Marten/Subscriptions/SubscriptionBase.cs @@ -0,0 +1,83 @@ +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; +using JasperFx.Core.Reflection; +using Marten.Events.Daemon; +using Marten.Events.Daemon.Internals; +using Marten.Events.Projections; + +namespace Marten.Subscriptions; + +public interface ISubscriptionOptions : IEventFilterable +{ + string SubscriptionName { get; set; } + uint SubscriptionVersion { get; set; } + AsyncOptions Options { get; } + + +} + +/// +/// Base class for custom subscriptions for Marten event data +/// +public abstract class SubscriptionBase: EventFilterable, ISubscription, ISubscriptionSource, ISubscriptionOptions +{ + protected SubscriptionBase() + { + SubscriptionName = GetType().NameInCode(); + } + + public virtual ValueTask DisposeAsync() + { + return new ValueTask(); + } + + /// + /// How to process events + /// + /// + /// + /// + /// + /// + public abstract Task ProcessEventsAsync(EventRange page, ISubscriptionController controller, + IDocumentOperations operations, CancellationToken cancellationToken); + + ISubscription ISubscriptionSource.Build(DocumentStore store) + { + return buildSubscription(store); + } + + /// + /// Build the actual subscription object. By default, this just returns itself + /// + /// + /// + protected virtual ISubscription buildSubscription(DocumentStore store) => this; + + IReadOnlyList ISubscriptionSource.AsyncProjectionShards(DocumentStore store) + { + return new List { new ("All",this) + { + EventTypes = IncludedEventTypes, + StreamType = StreamType, + IncludeArchivedEvents = false + } }; + } + + /// + /// Descriptive name for Marten progress tracking and rebuild/replays + /// + public string SubscriptionName { get; set; } + + /// + /// If this value is greater than 1, it will be treated as an all new subscription and will played from zero + /// when deployed + /// + public uint SubscriptionVersion { get; set; } = 1; + + /// + /// Fine tune the behavior of this subscription at runtime + /// + public AsyncOptions Options { get; protected set; } = new(); +} diff --git a/src/Marten/Subscriptions/SubscriptionExecution.cs b/src/Marten/Subscriptions/SubscriptionExecution.cs new file mode 100644 index 0000000000..b4a83e10f5 --- /dev/null +++ b/src/Marten/Subscriptions/SubscriptionExecution.cs @@ -0,0 +1,135 @@ +using System; +using System.Threading; +using System.Threading.Tasks; +using System.Threading.Tasks.Dataflow; +using Marten.Events.Daemon; +using Marten.Events.Daemon.Internals; +using Marten.Internal.Sessions; +using Marten.Services; +using Marten.Storage; +using Microsoft.Extensions.Logging; + +namespace Marten.Subscriptions; + +internal class SubscriptionExecution: ISubscriptionExecution +{ + private readonly ISubscription _subscription; + private readonly DocumentStore _store; + private readonly IMartenDatabase _database; + private readonly ILogger _logger; + private readonly CancellationTokenSource _cancellation = new(); + private readonly ActionBlock _executionBlock; + + public SubscriptionExecution(ShardName shard, ISubscription subscription, DocumentStore store, IMartenDatabase database, + ILogger logger) + { + _subscription = subscription; + _store = store; + _database = database; + _logger = logger; + + ShardIdentity = shard.Identity; + if (database.Identifier != "Marten") + { + ShardIdentity += $"@{database.Identifier}"; + } + + _executionBlock = new ActionBlock(executeRange, _cancellation.Token.SequentialOptions()); + } + + private async Task executeRange(EventRange range) + { + if (_cancellation.IsCancellationRequested) return; + + try + { + await using var parent = (DocumentSessionBase)_store.OpenSession(SessionOptions.ForDatabase(_database)); + + var batch = new ProjectionUpdateBatch(_store.Events, _store.Options.Projections, parent, + range, _cancellation.Token, Mode); + + await using var session = new ProjectionDocumentSession(_store, batch, + new SessionOptions + { + Tracking = DocumentTracking.IdentityOnly, + Tenant = new Tenant(Tenancy.DefaultTenantId, _database) + }); + + + var listener = await _subscription.ProcessEventsAsync(range, range.Agent, session, _cancellation.Token).ConfigureAwait(false); + + batch.Listeners.Add(listener); + await batch.WaitForCompletion().ConfigureAwait(false); + + // Polly is already around the basic retry here, so anything that gets past this + // probably deserves a full circuit break + await session.ExecuteBatchAsync(batch, _cancellation.Token).ConfigureAwait(false); + + range.Agent.MarkSuccess(range.SequenceCeiling); + + if (Mode == ShardExecutionMode.Continuous) + { + _logger.LogInformation("Subscription '{ShardIdentity}': Executed for {Range}", + ShardIdentity, batch.Range); + } + } + catch (OperationCanceledException) + { + return; + } + catch (Exception e) + { + _logger.LogError(e, "Error trying to process subscription {Name}", ShardIdentity); + await range.Agent.ReportCriticalFailureAsync(e).ConfigureAwait(false); + } + } + + public string ShardIdentity { get; } + + public async ValueTask DisposeAsync() + { + await _subscription.DisposeAsync().ConfigureAwait(false); + } + + public void Enqueue(EventPage page, ISubscriptionAgent subscriptionAgent) + { + if (_cancellation.IsCancellationRequested) return; + + var range = new EventRange(subscriptionAgent.Name, page.Floor, page.Ceiling) + { + Agent = subscriptionAgent, + Events = page + }; + + _executionBlock.Post(range); + } + + public async Task StopAndDrainAsync(CancellationToken token) + { + _executionBlock.Complete(); + await _executionBlock.Completion.ConfigureAwait(false); +#if NET8_0_OR_GREATER + await _cancellation.CancelAsync().ConfigureAwait(false); +#else + _cancellation.Cancel(); +#endif + } + + public async Task HardStopAsync() + { + _executionBlock.Complete(); +#if NET8_0_OR_GREATER + await _cancellation.CancelAsync().ConfigureAwait(false); +#else + _cancellation.Cancel(); +#endif + } + + public Task EnsureStorageExists() + { + return Task.CompletedTask; + } + + public string DatabaseName => _database.Identifier; + public ShardExecutionMode Mode { get; set; } = ShardExecutionMode.Continuous; +} diff --git a/src/Marten/Subscriptions/SubscriptionWrapper.cs b/src/Marten/Subscriptions/SubscriptionWrapper.cs new file mode 100644 index 0000000000..eff08a070d --- /dev/null +++ b/src/Marten/Subscriptions/SubscriptionWrapper.cs @@ -0,0 +1,64 @@ +using System; +using System.Threading; +using System.Threading.Tasks; +using JasperFx.Core; +using Marten.Events.Daemon; +using Marten.Events.Daemon.Internals; +using Microsoft.Extensions.DependencyInjection; + +namespace Marten.Subscriptions; + +internal class SubscriptionWrapper: SubscriptionBase +{ + private readonly ISubscription _subscription; + + public SubscriptionWrapper(ISubscription subscription) + { + _subscription = subscription; + SubscriptionName = _subscription.GetType().Name; + } + + public override Task ProcessEventsAsync(EventRange page, ISubscriptionController controller, + IDocumentOperations operations, CancellationToken cancellationToken) + { + return _subscription.ProcessEventsAsync(page, controller, operations, cancellationToken); + } +} + +internal class ScopedSubscriptionServiceWrapper: SubscriptionBase where T : ISubscription +{ + private readonly IServiceProvider _provider; + + public ScopedSubscriptionServiceWrapper(IServiceProvider provider) + { + _provider = provider; + SubscriptionName = typeof(T).Name; + } + + public override async Task ProcessEventsAsync(EventRange page, ISubscriptionController controller, + IDocumentOperations operations, CancellationToken cancellationToken) + { + var scope = _provider.CreateScope(); + var sp = scope.ServiceProvider; + + try + { + var subscription = sp.GetRequiredService(); + + return await subscription.ProcessEventsAsync(page, controller, operations, cancellationToken).ConfigureAwait(false); + } + finally + { + if (scope is IAsyncDisposable ad) + { + await ad.DisposeAsync().ConfigureAwait(false); + } + else + { + scope.SafeDispose(); + } + } + + + } +} diff --git a/src/PatchingTests/Patching/patching_with_altered_metadata_columns.cs b/src/PatchingTests/Patching/patching_with_altered_metadata_columns.cs new file mode 100644 index 0000000000..2e79e609d7 --- /dev/null +++ b/src/PatchingTests/Patching/patching_with_altered_metadata_columns.cs @@ -0,0 +1,63 @@ +using System; +using System.Threading.Tasks; +using Marten.Patching; +using Marten.Testing.Documents; +using Marten.Testing.Harness; +using Shouldly; +using Xunit; +using Xunit.Abstractions; + +namespace PatchingTests.Patching; + +public class patching_with_altered_metadata_columns : OneOffConfigurationsContext +{ + private readonly ITestOutputHelper _output; + + public patching_with_altered_metadata_columns(ITestOutputHelper output) + { + _output = output; + } + + [Fact] + public async Task write_and_read_metadata_from_patch() + { + StoreOptions(opts => + { + opts.Schema.For().Metadata(m => + { + m.Version.Enabled = false; + m.LastModified.Enabled = false; + m.CausationId.Enabled = true; + m.CorrelationId.Enabled = true; + m.LastModifiedBy.Enabled = true; + + }); + }); + + var target1 = new Target { Color = Colors.Blue, Number = 1 }; + var target2 = new Target { Color = Colors.Blue, Number = 1 }; + var target3 = new Target { Color = Colors.Blue, Number = 1 }; + var target4 = new Target { Color = Colors.Green, Number = 1 }; + var target5 = new Target { Color = Colors.Green, Number = 1 }; + var target6 = new Target { Color = Colors.Red, Number = 1 }; + + theSession.Store(target1, target2, target3, target4, target5, target6); + await theSession.SaveChangesAsync(); + + + theSession.CorrelationId = "correlation1"; + theSession.CausationId = "causation1"; + theSession.LastModifiedBy = "some guy"; + + theSession.Logger = new TestOutputMartenLogger(_output); + theSession.Patch(target1.Id).Set(x => x.Number, 2); + + await theSession.SaveChangesAsync(); + + var metadata = await theSession.MetadataForAsync(target1); + + metadata.CorrelationId.ShouldBe(theSession.CorrelationId); + metadata.CausationId.ShouldBe(theSession.CausationId); + metadata.LastModifiedBy.ShouldBe(theSession.LastModifiedBy); + } +}