diff --git a/.editorconfig b/.editorconfig old mode 100644 new mode 100755 diff --git a/.gitignore b/.gitignore old mode 100644 new mode 100755 diff --git a/.vscode/settings.json b/.vscode/settings.json old mode 100644 new mode 100755 diff --git a/CLAUDE.md b/CLAUDE.md old mode 100644 new mode 100755 index a50fd46..eb52472 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -24,10 +24,17 @@ MicCheck: open source. asp.net, c#, typescript, VueJS. Manages feature flags, pr # Coding - Descriptive names for all classes/methods. No generic names: Provider, Manager, Helper - Match formatting/style from `.editorconfig` +- Wrap lines at 220 characters, leave single line if fewer +- Place interfaces that are implemented by a single class at the bottom of the class file. An interface with multiple implementations of an interface should be in a seperate file. +- Do not use tuples for return types. Prefer records or classes for multiple values +- Do not use `sealed` on classes- +- Use `record` for data objects, `class` for objects with behavior. Avoid mutable state where possible. ## Testing - BDD-style unit tests, end-to-end as possible, no external resources (DB, filesystem). e.g. `WhenAUserDoesSomething_ThenAThingAppears` - Mock external deps with Moq +- New features need unit tests covering as much logic as possible +- Any modified file: evaluate for missing test coverage- - No "Mock" in mocked object names - No Arrange/Act/Assert comments diff --git a/CLAUDE.original.md b/CLAUDE.original.md old mode 100644 new mode 100755 diff --git a/MicCheck.slnx b/MicCheck.slnx old mode 100644 new mode 100755 index a0e117e..f24785e --- a/MicCheck.slnx +++ b/MicCheck.slnx @@ -1,22 +1,22 @@ - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + diff --git a/dev-build.sh b/dev-build.sh old mode 100644 new mode 100755 diff --git a/docker-compose.yml b/docker-compose.yml old mode 100644 new mode 100755 diff --git a/docs/admin/00-New-Website-output.md b/docs/admin/00-New-Website-output.md old mode 100644 new mode 100755 diff --git a/docs/admin/00-New-Website.md b/docs/admin/00-New-Website.md old mode 100644 new mode 100755 diff --git a/docs/admin/01-admin-site_plan.md b/docs/admin/01-admin-site_plan.md old mode 100644 new mode 100755 diff --git a/docs/api/00 - new-aspnet-project.md b/docs/api/00 - new-aspnet-project.md old mode 100644 new mode 100755 diff --git a/docs/api/00-output.md b/docs/api/00-output.md old mode 100644 new mode 100755 diff --git a/docs/api/01_project_setup.md b/docs/api/01_project_setup.md old mode 100644 new mode 100755 diff --git a/docs/api/01_project_setup_output.md b/docs/api/01_project_setup_output.md old mode 100644 new mode 100755 diff --git a/docs/api/02_core_domain_models.md b/docs/api/02_core_domain_models.md old mode 100644 new mode 100755 diff --git a/docs/api/02_core_domain_models_output.md b/docs/api/02_core_domain_models_output.md old mode 100644 new mode 100755 diff --git a/docs/api/03_database_and_repositories.md b/docs/api/03_database_and_repositories.md old mode 100644 new mode 100755 diff --git a/docs/api/03_database_and_repositories_output.md b/docs/api/03_database_and_repositories_output.md old mode 100644 new mode 100755 diff --git a/docs/api/04_authentication_and_authorization.md b/docs/api/04_authentication_and_authorization.md old mode 100644 new mode 100755 diff --git a/docs/api/04_authentication_and_authorization_output.md b/docs/api/04_authentication_and_authorization_output.md old mode 100644 new mode 100755 diff --git a/docs/api/05_flags_api.md b/docs/api/05_flags_api.md old mode 100644 new mode 100755 diff --git a/docs/api/05_flags_api_output.md b/docs/api/05_flags_api_output.md old mode 100644 new mode 100755 diff --git a/docs/api/06_admin_api.md b/docs/api/06_admin_api.md old mode 100644 new mode 100755 diff --git a/docs/api/06_admin_api_output.md b/docs/api/06_admin_api_output.md old mode 100644 new mode 100755 diff --git a/docs/api/07_audit_and_webhooks.md b/docs/api/07_audit_and_webhooks.md old mode 100644 new mode 100755 diff --git a/docs/api/07_audit_and_webhooks_output.md b/docs/api/07_audit_and_webhooks_output.md old mode 100644 new mode 100755 diff --git a/docs/api/08_testing_strategy.md b/docs/api/08_testing_strategy.md old mode 100644 new mode 100755 diff --git a/dotnet-install.sh b/dotnet-install.sh old mode 100644 new mode 100755 diff --git a/dotnet-tools.json b/dotnet-tools.json old mode 100644 new mode 100755 diff --git a/readme.md b/readme.md old mode 100644 new mode 100755 diff --git a/src/MicCheck.AppHost/AppHost.cs b/src/MicCheck.AppHost/AppHost.cs old mode 100644 new mode 100755 index 24d837a..e1f7bc2 --- a/src/MicCheck.AppHost/AppHost.cs +++ b/src/MicCheck.AppHost/AppHost.cs @@ -1,13 +1,9 @@ var builder = DistributedApplication.CreateBuilder(args); -var postgres = builder.AddPostgres("postgres") - .WithDataVolume("miccheck-pgdata") - .WithPgAdmin(); +var postgres = builder.AddPostgres("postgres").WithDataVolume("miccheck-pgdata").WithPgAdmin(); var miccheckDb = postgres.AddDatabase("miccheck"); -builder.AddProject("api") - .WithReference(miccheckDb) - .WaitFor(miccheckDb); +builder.AddProject("api").WithReference(miccheckDb).WaitFor(miccheckDb); builder.Build().Run(); diff --git a/src/MicCheck.AppHost/MicCheck.AppHost.csproj b/src/MicCheck.AppHost/MicCheck.AppHost.csproj old mode 100644 new mode 100755 index f8d22cb..6262cb9 --- a/src/MicCheck.AppHost/MicCheck.AppHost.csproj +++ b/src/MicCheck.AppHost/MicCheck.AppHost.csproj @@ -1,19 +1,20 @@ - - - - - - - - - - - - Exe - net10.0 - enable - enable - d10a4485-2ac0-4ba7-bda5-8eb63e417567 - - - + + + + + + + + + + + + + Exe + net10.0 + enable + enable + d10a4485-2ac0-4ba7-bda5-8eb63e417567 + + + diff --git a/src/MicCheck.AppHost/Properties/launchSettings.json b/src/MicCheck.AppHost/Properties/launchSettings.json old mode 100644 new mode 100755 index b6c5fd5..3494766 --- a/src/MicCheck.AppHost/Properties/launchSettings.json +++ b/src/MicCheck.AppHost/Properties/launchSettings.json @@ -1,29 +1,29 @@ -{ - "$schema": "https://json.schemastore.org/launchsettings.json", - "profiles": { - "https": { - "commandName": "Project", - "dotnetRunMessages": true, - "launchBrowser": true, - "applicationUrl": "https://localhost:17244;http://localhost:15050", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development", - "DOTNET_ENVIRONMENT": "Development", - "ASPIRE_DASHBOARD_OTLP_ENDPOINT_URL": "https://localhost:21229", - "ASPIRE_RESOURCE_SERVICE_ENDPOINT_URL": "https://localhost:22051" - } - }, - "http": { - "commandName": "Project", - "dotnetRunMessages": true, - "launchBrowser": true, - "applicationUrl": "http://localhost:15050", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development", - "DOTNET_ENVIRONMENT": "Development", - "ASPIRE_DASHBOARD_OTLP_ENDPOINT_URL": "http://localhost:19033", - "ASPIRE_RESOURCE_SERVICE_ENDPOINT_URL": "http://localhost:20209" - } - } - } -} +{ + "$schema": "https://json.schemastore.org/launchsettings.json", + "profiles": { + "https": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "applicationUrl": "https://localhost:17244;http://localhost:15050", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development", + "DOTNET_ENVIRONMENT": "Development", + "ASPIRE_DASHBOARD_OTLP_ENDPOINT_URL": "https://localhost:21229", + "ASPIRE_RESOURCE_SERVICE_ENDPOINT_URL": "https://localhost:22051" + } + }, + "http": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "applicationUrl": "http://localhost:15050", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development", + "DOTNET_ENVIRONMENT": "Development", + "ASPIRE_DASHBOARD_OTLP_ENDPOINT_URL": "http://localhost:19033", + "ASPIRE_RESOURCE_SERVICE_ENDPOINT_URL": "http://localhost:20209" + } + } + } +} diff --git a/src/MicCheck.AppHost/appsettings.Development.json b/src/MicCheck.AppHost/appsettings.Development.json old mode 100644 new mode 100755 index 0c208ae..ff66ba6 --- a/src/MicCheck.AppHost/appsettings.Development.json +++ b/src/MicCheck.AppHost/appsettings.Development.json @@ -1,8 +1,8 @@ -{ - "Logging": { - "LogLevel": { - "Default": "Information", - "Microsoft.AspNetCore": "Warning" - } - } -} +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + } +} diff --git a/src/MicCheck.AppHost/appsettings.json b/src/MicCheck.AppHost/appsettings.json old mode 100644 new mode 100755 index 31c092a..2185f95 --- a/src/MicCheck.AppHost/appsettings.json +++ b/src/MicCheck.AppHost/appsettings.json @@ -1,9 +1,9 @@ -{ - "Logging": { - "LogLevel": { - "Default": "Information", - "Microsoft.AspNetCore": "Warning", - "Aspire.Hosting.Dcp": "Warning" - } - } -} +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning", + "Aspire.Hosting.Dcp": "Warning" + } + } +} diff --git a/src/MicCheck.AppHost/aspire.config.json b/src/MicCheck.AppHost/aspire.config.json old mode 100644 new mode 100755 index eb7b7dc..c083953 --- a/src/MicCheck.AppHost/aspire.config.json +++ b/src/MicCheck.AppHost/aspire.config.json @@ -1,5 +1,5 @@ -{ - "appHost": { - "path": "MicCheck.AppHost.csproj" - } -} +{ + "appHost": { + "path": "MicCheck.AppHost.csproj" + } +} diff --git a/src/MicCheck.ServiceDefaults/Extensions.cs b/src/MicCheck.ServiceDefaults/Extensions.cs old mode 100644 new mode 100755 index 4fdcccf..97642a1 --- a/src/MicCheck.ServiceDefaults/Extensions.cs +++ b/src/MicCheck.ServiceDefaults/Extensions.cs @@ -1,127 +1,127 @@ -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Diagnostics.HealthChecks; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Diagnostics.HealthChecks; -using Microsoft.Extensions.Logging; -using Microsoft.Extensions.ServiceDiscovery; -using OpenTelemetry; -using OpenTelemetry.Metrics; -using OpenTelemetry.Trace; - -namespace Microsoft.Extensions.Hosting; - -// Adds common Aspire services: service discovery, resilience, health checks, and OpenTelemetry. -// This project should be referenced by each service project in your solution. -// To learn more about using this project, see https://aka.ms/aspire/service-defaults -public static class Extensions -{ - private const string HealthEndpointPath = "/health"; - private const string AlivenessEndpointPath = "/alive"; - - public static TBuilder AddServiceDefaults(this TBuilder builder) where TBuilder : IHostApplicationBuilder - { - builder.ConfigureOpenTelemetry(); - - builder.AddDefaultHealthChecks(); - - builder.Services.AddServiceDiscovery(); - - builder.Services.ConfigureHttpClientDefaults(http => - { - // Turn on resilience by default - http.AddStandardResilienceHandler(); - - // Turn on service discovery by default - http.AddServiceDiscovery(); - }); - - // Uncomment the following to restrict the allowed schemes for service discovery. - // builder.Services.Configure(options => - // { - // options.AllowedSchemes = ["https"]; - // }); - - return builder; - } - - public static TBuilder ConfigureOpenTelemetry(this TBuilder builder) where TBuilder : IHostApplicationBuilder - { - builder.Logging.AddOpenTelemetry(logging => - { - logging.IncludeFormattedMessage = true; - logging.IncludeScopes = true; - }); - - builder.Services.AddOpenTelemetry() - .WithMetrics(metrics => - { - metrics.AddAspNetCoreInstrumentation() - .AddHttpClientInstrumentation() - .AddRuntimeInstrumentation(); - }) - .WithTracing(tracing => - { - tracing.AddSource(builder.Environment.ApplicationName) - .AddAspNetCoreInstrumentation(tracing => - // Exclude health check requests from tracing - tracing.Filter = context => - !context.Request.Path.StartsWithSegments(HealthEndpointPath) - && !context.Request.Path.StartsWithSegments(AlivenessEndpointPath) - ) - // Uncomment the following line to enable gRPC instrumentation (requires the OpenTelemetry.Instrumentation.GrpcNetClient package) - //.AddGrpcClientInstrumentation() - .AddHttpClientInstrumentation(); - }); - - builder.AddOpenTelemetryExporters(); - - return builder; - } - - private static TBuilder AddOpenTelemetryExporters(this TBuilder builder) where TBuilder : IHostApplicationBuilder - { - var useOtlpExporter = !string.IsNullOrWhiteSpace(builder.Configuration["OTEL_EXPORTER_OTLP_ENDPOINT"]); - - if (useOtlpExporter) - { - builder.Services.AddOpenTelemetry().UseOtlpExporter(); - } - - // Uncomment the following lines to enable the Azure Monitor exporter (requires the Azure.Monitor.OpenTelemetry.AspNetCore package) - //if (!string.IsNullOrEmpty(builder.Configuration["APPLICATIONINSIGHTS_CONNECTION_STRING"])) - //{ - // builder.Services.AddOpenTelemetry() - // .UseAzureMonitor(); - //} - - return builder; - } - - public static TBuilder AddDefaultHealthChecks(this TBuilder builder) where TBuilder : IHostApplicationBuilder - { - builder.Services.AddHealthChecks() - // Add a default liveness check to ensure app is responsive - .AddCheck("self", () => HealthCheckResult.Healthy(), ["live"]); - - return builder; - } - - public static WebApplication MapDefaultEndpoints(this WebApplication app) - { - // Adding health checks endpoints to applications in non-development environments has security implications. - // See https://aka.ms/aspire/healthchecks for details before enabling these endpoints in non-development environments. - if (app.Environment.IsDevelopment()) - { - // All health checks must pass for app to be considered ready to accept traffic after starting - app.MapHealthChecks(HealthEndpointPath); - - // Only health checks tagged with the "live" tag must pass for app to be considered alive - app.MapHealthChecks(AlivenessEndpointPath, new HealthCheckOptions - { - Predicate = r => r.Tags.Contains("live") - }); - } - - return app; - } -} +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Diagnostics.HealthChecks; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Diagnostics.HealthChecks; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.ServiceDiscovery; +using OpenTelemetry; +using OpenTelemetry.Metrics; +using OpenTelemetry.Trace; + +namespace Microsoft.Extensions.Hosting; + +// Adds common Aspire services: service discovery, resilience, health checks, and OpenTelemetry. +// This project should be referenced by each service project in your solution. +// To learn more about using this project, see https://aka.ms/aspire/service-defaults +public static class Extensions +{ + private const string HealthEndpointPath = "/health"; + private const string AlivenessEndpointPath = "/alive"; + + public static TBuilder AddServiceDefaults(this TBuilder builder) where TBuilder : IHostApplicationBuilder + { + builder.ConfigureOpenTelemetry(); + + builder.AddDefaultHealthChecks(); + + builder.Services.AddServiceDiscovery(); + + builder.Services.ConfigureHttpClientDefaults(http => + { + // Turn on resilience by default + http.AddStandardResilienceHandler(); + + // Turn on service discovery by default + http.AddServiceDiscovery(); + }); + + // Uncomment the following to restrict the allowed schemes for service discovery. + // builder.Services.Configure(options => + // { + // options.AllowedSchemes = ["https"]; + // }); + + return builder; + } + + public static TBuilder ConfigureOpenTelemetry(this TBuilder builder) where TBuilder : IHostApplicationBuilder + { + builder.Logging.AddOpenTelemetry(logging => + { + logging.IncludeFormattedMessage = true; + logging.IncludeScopes = true; + }); + + builder.Services.AddOpenTelemetry() + .WithMetrics(metrics => + { + metrics.AddAspNetCoreInstrumentation() + .AddHttpClientInstrumentation() + .AddRuntimeInstrumentation(); + }) + .WithTracing(tracing => + { + tracing.AddSource(builder.Environment.ApplicationName) + .AddAspNetCoreInstrumentation(tracing => + // Exclude health check requests from tracing + tracing.Filter = context => + !context.Request.Path.StartsWithSegments(HealthEndpointPath) + && !context.Request.Path.StartsWithSegments(AlivenessEndpointPath) + ) + // Uncomment the following line to enable gRPC instrumentation (requires the OpenTelemetry.Instrumentation.GrpcNetClient package) + //.AddGrpcClientInstrumentation() + .AddHttpClientInstrumentation(); + }); + + builder.AddOpenTelemetryExporters(); + + return builder; + } + + private static TBuilder AddOpenTelemetryExporters(this TBuilder builder) where TBuilder : IHostApplicationBuilder + { + var useOtlpExporter = !string.IsNullOrWhiteSpace(builder.Configuration["OTEL_EXPORTER_OTLP_ENDPOINT"]); + + if (useOtlpExporter) + { + builder.Services.AddOpenTelemetry().UseOtlpExporter(); + } + + // Uncomment the following lines to enable the Azure Monitor exporter (requires the Azure.Monitor.OpenTelemetry.AspNetCore package) + //if (!string.IsNullOrEmpty(builder.Configuration["APPLICATIONINSIGHTS_CONNECTION_STRING"])) + //{ + // builder.Services.AddOpenTelemetry() + // .UseAzureMonitor(); + //} + + return builder; + } + + public static TBuilder AddDefaultHealthChecks(this TBuilder builder) where TBuilder : IHostApplicationBuilder + { + builder.Services.AddHealthChecks() + // Add a default liveness check to ensure app is responsive + .AddCheck("self", () => HealthCheckResult.Healthy(), ["live"]); + + return builder; + } + + public static WebApplication MapDefaultEndpoints(this WebApplication app) + { + // Adding health checks endpoints to applications in non-development environments has security implications. + // See https://aka.ms/aspire/healthchecks for details before enabling these endpoints in non-development environments. + if (app.Environment.IsDevelopment()) + { + // All health checks must pass for app to be considered ready to accept traffic after starting + app.MapHealthChecks(HealthEndpointPath); + + // Only health checks tagged with the "live" tag must pass for app to be considered alive + app.MapHealthChecks(AlivenessEndpointPath, new HealthCheckOptions + { + Predicate = r => r.Tags.Contains("live") + }); + } + + return app; + } +} diff --git a/src/MicCheck.ServiceDefaults/MicCheck.ServiceDefaults.csproj b/src/MicCheck.ServiceDefaults/MicCheck.ServiceDefaults.csproj old mode 100644 new mode 100755 index 791c654..1efc067 --- a/src/MicCheck.ServiceDefaults/MicCheck.ServiceDefaults.csproj +++ b/src/MicCheck.ServiceDefaults/MicCheck.ServiceDefaults.csproj @@ -1,22 +1,22 @@ - - - - net10.0 - enable - enable - true - - - - - - - - - - - - - - - + + + + net10.0 + enable + enable + true + + + + + + + + + + + + + + + diff --git a/src/admin/.dockerignore b/src/admin/.dockerignore old mode 100644 new mode 100755 diff --git a/src/admin/Admin.esproj b/src/admin/Admin.esproj old mode 100644 new mode 100755 diff --git a/src/admin/Dockerfile b/src/admin/Dockerfile old mode 100644 new mode 100755 diff --git a/src/admin/babel.config.js b/src/admin/babel.config.js old mode 100644 new mode 100755 diff --git a/src/admin/index.html b/src/admin/index.html old mode 100644 new mode 100755 diff --git a/src/admin/jest.config.js b/src/admin/jest.config.js old mode 100644 new mode 100755 diff --git a/src/admin/nginx.conf b/src/admin/nginx.conf old mode 100644 new mode 100755 diff --git a/src/admin/package-lock.json b/src/admin/package-lock.json old mode 100644 new mode 100755 index ea146eb..1b6d4fe --- a/src/admin/package-lock.json +++ b/src/admin/package-lock.json @@ -1,11504 +1,11504 @@ -{ - "name": "mic-check-admin", - "version": "1.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "mic-check-admin", - "version": "1.0.0", - "dependencies": { - "@iconify-json/bxl": "^1.2.0", - "@iconify-json/ri": "^1.2.0", - "@iconify/vue": "^4.1.0", - "@vueuse/core": "^11.0.0", - "axios": "^1.15.0", - "pinia": "^3.0.4", - "vue": "^3.4.0", - "vue-router": "^4.3.0", - "vue3-perfect-scrollbar": "^2.0.0", - "vuetify": "^3.7.5" - }, - "devDependencies": { - "@babel/core": "^7.24.0", - "@babel/preset-env": "^7.24.0", - "@babel/preset-typescript": "^7.24.0", - "@types/jest": "^29.5.12", - "@types/node": "^20.12.0", - "@vitejs/plugin-vue": "^6.0.6", - "@vue/test-utils": "^2.4.6", - "@vue/vue3-jest": "^29.2.6", - "babel-jest": "^29.7.0", - "eslint": "^10.4.1", - "jest": "^29.7.0", - "jest-environment-jsdom": "^29.7.0", - "sass": "^1.77.2", - "sass-embedded": "^1.77.0", - "ts-jest": "^29.1.4", - "typescript": "^5.4.5", - "vite": "^8.0.8", - "vite-plugin-vuetify": "^2.1.3", - "vite-svg-loader": "^5.1.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", - "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.29.7", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", - "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", - "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.29.7", - "@babel/generator": "^7.29.7", - "@babel/helper-compilation-targets": "^7.29.7", - "@babel/helper-module-transforms": "^7.29.7", - "@babel/helpers": "^7.29.7", - "@babel/parser": "^7.29.7", - "@babel/template": "^7.29.7", - "@babel/traverse": "^7.29.7", - "@babel/types": "^7.29.7", - "@jridgewell/remapping": "^2.3.5", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/generator": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz", - "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.29.7", - "@babel/types": "^7.29.7", - "@jridgewell/gen-mapping": "^0.3.12", - "@jridgewell/trace-mapping": "^0.3.28", - "jsesc": "^3.0.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.29.7.tgz", - "integrity": "sha512-OoK6239jHPuSQOoS0kfTVKn0b/rVTk0seKq4Gd2UMLtmOVLjDC0ki3e+c90Trqv2gMfvJFqkiljrr568+qddiw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", - "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.29.7", - "@babel/helper-validator-option": "^7.29.7", - "browserslist": "^4.24.0", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.29.7.tgz", - "integrity": "sha512-IY3ZD9Tmooqr3TUhc3DUWxiuo8xx1DWLhd5M7hQ+ZWJamqM2BbalrBJb2MisSLoYorOj75U03qULCxQTY9r3hg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.29.7", - "@babel/helper-member-expression-to-functions": "^7.29.7", - "@babel/helper-optimise-call-expression": "^7.29.7", - "@babel/helper-replace-supers": "^7.29.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7", - "@babel/traverse": "^7.29.7", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.29.7.tgz", - "integrity": "sha512-907Uymvqgg1dwUA+7IGwFAOSYzQOuzPXKNJ1yxzwPffzkYFg2q2eHi1fIOs6sXkG9NbIUMunnUlkYsfRFNvomg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.29.7", - "regexpu-core": "^6.3.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.6.8", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.8.tgz", - "integrity": "sha512-47UwBLPpQi1NoWzLuHNjRoHlYXMwIJoBf7MFou6viC/sIHWYygpvr0B6IAyh5sBdA2nr2LPIRww8lfaUVQINBA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-compilation-targets": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6", - "debug": "^4.4.3", - "lodash.debounce": "^4.0.8", - "resolve": "^1.22.11" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/@babel/helper-globals": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", - "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.29.7.tgz", - "integrity": "sha512-j+7JYmk1JYDtACIGj0QJqqWZjoUpMoEikQGADMaHgCMCSDqd2+P32rfcibUNrGOMWrlzK1WJBdxrB3JJQZwWtg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.29.7", - "@babel/types": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", - "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.29.7", - "@babel/types": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", - "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.29.7", - "@babel/helper-validator-identifier": "^7.29.7", - "@babel/traverse": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.29.7.tgz", - "integrity": "sha512-+kmGVjcT9RGYzoDwdwEqEvGgKe3BYq+O1iGzjFubaNgZHwYHP6lsF2Yghf4kEuv9BV7tYDZ913aBW9am6YKong==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.29.7.tgz", - "integrity": "sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.29.7.tgz", - "integrity": "sha512-16AMiW26DbXWBbr3B8wNozKM0ydMLB892vaOaJW/fPJdnT8vJk5sdkQcU/isqUxyCE0cEoa8wZOcbgDuC4b6Og==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.29.7", - "@babel/helper-wrap-function": "^7.29.7", - "@babel/traverse": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.29.7.tgz", - "integrity": "sha512-atfGXWSeCiF4DnKZIfmJfQRkSw9b9gNNXR1kqKjbhG4pGYCOnkp8OcTB8E3NXjBu8NpheSnOeNKz8KT7UNFTmQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.29.7", - "@babel/helper-optimise-call-expression": "^7.29.7", - "@babel/traverse": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.29.7.tgz", - "integrity": "sha512-brcMGQaVzIeUb+6/bs1Av0f8YuNNjKY2JyvfRCsFuFsdKccEQ5Ges2y74D74NZ1Rz8lKJ9ksJkfqwQFJ/iNEyQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.29.7", - "@babel/types": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", - "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", - "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", - "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-wrap-function": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.29.7.tgz", - "integrity": "sha512-iES0Skag9ERIF68aXadpO6dbXa03mNWK3sEqJaMnLNs/eC3l0lkImdfoy6Y09/SfkpawdAB4RjQ7PVA7TcVGdw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/template": "^7.29.7", - "@babel/traverse": "^7.29.7", - "@babel/types": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz", - "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/template": "^7.29.7", - "@babel/types": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", - "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.29.7" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.29.7.tgz", - "integrity": "sha512-j8SrR0zLZrRsC09DlszEx8FpMiwukKffYXMK0d5LmOglO7vGG6sz/BR/20yHqWH+Lnn31JTt2PE3hIWNgM2J6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7", - "@babel/traverse": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.29.7.tgz", - "integrity": "sha512-r8j8escF+U2FUHo0KOhPUdMzUO+jp9fInva6+ACVAF3Y97Ev+5iNZwiqTghmzNeWwDkOPlYuTcfb1vDaoZKmAQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.29.7.tgz", - "integrity": "sha512-GE1TFSiuFeGsCxmYXZl8HwoPrVlwe4rHPFE8weieGKZqnDORK+Ar3vgWMgW+AOxQ6/2TgLSKx9p6W7O4rC6qgQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-safari-rest-destructuring-rhs-array": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-rest-destructuring-rhs-array/-/plugin-bugfix-safari-rest-destructuring-rhs-array-7.29.7.tgz", - "integrity": "sha512-oBNVCvnO5tND+xSopWvV8WNGfpTfgP4Zr/YXXSj8zfmcPktp5Ku/aZlsIowgSD4fjmgHn6sGmB9APVsU5zOdhA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.29.7.tgz", - "integrity": "sha512-QQt9qKHZ2sg/kivaLr7lnQr8HVrQDdBNSfCsTjiDxRuX/K5ORyKq+Bu8Xr0cDE3Dfkv0cw28Ve0EKyKMvulkOw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7", - "@babel/plugin-transform-optional-chaining": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.13.0" - } - }, - "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.29.7.tgz", - "integrity": "sha512-pn6QacGLgvCcwc+syUhKE/qSjV2D1IHDB84RNxWYSt1mW3K/SCtjinZ2p0cETJxAWBjPy3K/1lHwG5BjjPxNlw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7", - "@babel/traverse": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.21.0-placeholder-for-preset-env.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", - "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.29.7.tgz", - "integrity": "sha512-/An1OCBN93thpBAGyfsK2pcf0jvju1SAtKkL2Ny++B5Sy6sqgzXDQH1cZxWbF96Wuk+bn41MDA9bLd4VVAw6rw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.29.7.tgz", - "integrity": "sha512-zGYcYfq/WmZ4V+kBIXQon9dSSc8ircGZqw9ZaNhhGj9nZkeBu1jHLBDQqYYi5WA9uawvA2sIMbry2nCFhf5Djg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.29.7.tgz", - "integrity": "sha512-TSu8+mHCoEaaCDEZ0I3+6mvTBYR4PCxQwf2z9/r5Tbztv6NaLR3B9thGTTxX2WGuGHJqRiAbKPeGTJ5XWXVg6A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.29.7.tgz", - "integrity": "sha512-ngr+82Sh0xMz25TPCZi+nC2iTzjfCdWS2ONXTp/PtSCHCgaCNBpdMqgvJ2ccdLlClVZ7sisIgB914j/JFe+RZA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-unicode-sets-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", - "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.29.7.tgz", - "integrity": "sha512-N7zArUXWzAMzm+/N0uPBeVB3Fam5lMxtUwMmDK5f/IBBS7a7p1qeUoxd/6CckXoxUdgsntq1Dh8xNW06maZbDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.29.7.tgz", - "integrity": "sha512-d98gXZkgswvkyohMBABkhm3GeXhYj8psWfwQ2C7gtfrKGTykQa/iOIi+JJhwMjPlZ6Vm2XN+DCf3Es1EoG4ZLA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7", - "@babel/helper-remap-async-to-generator": "^7.29.7", - "@babel/traverse": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.29.7.tgz", - "integrity": "sha512-pcUb2SS+RMo9TWVBwKGI5ShtoG7R+zBsFmCKDa6fe8c+hPr3XJlZgoE5j6i8W7gDjhyvy+85vmYexanvXh3d1w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.29.7", - "@babel/helper-plugin-utils": "^7.29.7", - "@babel/helper-remap-async-to-generator": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.29.7.tgz", - "integrity": "sha512-cUSmjh72N+rN4PrkFlN1dJwNCwjVp5d38/CQrEsFggkD10UiFlBFgdH3tv5dNsLuHY+3S8db2xCHjhZcv5WgvA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.29.7.tgz", - "integrity": "sha512-ONyr4+AZhKh8yKWInVxU9AXA9EbsyeLcL6V0dJy6M2/62vuvpGm29zzuymbTpdc451GEpDIdAyPLP3r+P61yKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.29.7.tgz", - "integrity": "sha512-GtcpjFvanPfzNQi3eTitsCqtRRmmqzpy/A+yhTR1HaZo1Ly3EA8ZXxlPyHdR8/IuRMYc3E4wdGBewB2QKQjAaA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.29.7", - "@babel/helper-plugin-utils": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.29.7.tgz", - "integrity": "sha512-kibJgmEdX2iMwsHY2tSZNDgj8PwIlCQz7FK9KuGKO8zsuoUwSEhoNnNVp/emKWrbY4HeO6kkXfdMqRKKKXBm2A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.29.7", - "@babel/helper-plugin-utils": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0" - } - }, - "node_modules/@babel/plugin-transform-classes": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.29.7.tgz", - "integrity": "sha512-qV0OGGBVacduzQHE649JyCneOFI/maT+YKsO+K4Yi3xv2wTPNjM/W2o2gdzMwEAZz7fXNTHAe0NcSg30bIN69g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.29.7", - "@babel/helper-compilation-targets": "^7.29.7", - "@babel/helper-globals": "^7.29.7", - "@babel/helper-plugin-utils": "^7.29.7", - "@babel/helper-replace-supers": "^7.29.7", - "@babel/traverse": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.29.7.tgz", - "integrity": "sha512-RK7/IyU5phpuCdBAuig5VkzG/EnbDaui5SQGdU9BFrHdV+mV4cUjLMQ9lJDjLNtWHsqtiefpGZUXQP2BiTYMsA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7", - "@babel/template": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.29.7.tgz", - "integrity": "sha512-iPX8aD6H9zV5s7ZsqTdNocPN/MGQ5sSMnElKrktxjJRMnB2jN/1p2+R7GkfD6CAYoVFqy5A4XnSIUeGgJzIWpg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7", - "@babel/traverse": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.29.7.tgz", - "integrity": "sha512-3qc18hsD2RdZiyJNDNc7HQpv6xbncwh8FYtxNFFzclSyh/trPD9KkVR9BDECUjDLvb7yJVF15GfYUuC+LMkkiQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.29.7", - "@babel/helper-plugin-utils": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.29.7.tgz", - "integrity": "sha512-6IvRRriEMqnBwD6chtxdLpMYCHWEzN+oL5cyQtjykya19UgzbmKhxmhZgKC/LHxS2nYr9Q/qYPZ5Lr6jOL9+yQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.29.7.tgz", - "integrity": "sha512-2wiIyo2BjtgU7HufSeDnL9L2O7zr8jmhFKuSr65VpRkUiRKRNpb0mdlk56+XPPKoIrfHqzbMuglDvZun0RISsA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.29.7", - "@babel/helper-plugin-utils": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.29.7.tgz", - "integrity": "sha512-giOlEm/EFjfjr+te9NsdjkUo2v4f8rS/SXPumRVHAtbNcyNlvtREkU1dZzaIDclNpnaVhlCqRdFKhJBjBikzLg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-explicit-resource-management": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.29.7.tgz", - "integrity": "sha512-Rstj7coNz8sE+7Ju7ihpHLI564lsK5pUpNNlvptCIC/16E/S5hbl6n3kESPKdNRmqEWlpn5xpS5Q2dvXBsySLw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7", - "@babel/plugin-transform-destructuring": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.29.7.tgz", - "integrity": "sha512-zFpMOTLZBdW5LfObqcSbL6kefg4R4eLdmvS0wbN9M6D5Mym/sKm9toOoWyVOa+xDjvCnuWcHls2YonXwHvH3CQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.29.7.tgz", - "integrity": "sha512-24B2nOy2TeJSMheqwPD4DDQOV/elLSIlKxjZt4i05H5AgdPdWR3n18HnNrcJ+j76WJd9gbwb9jPjNYUy6RautA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-for-of": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.29.7.tgz", - "integrity": "sha512-zeSIHh0+E1Um1WJRXCFlHQYu2ieJNdivLLjlBEp+dIBu3S51n+SZZmIXjxnItw6pz56Cn+KvK68BIBVsxq2JiQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-function-name": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.29.7.tgz", - "integrity": "sha512-otRWaHXE6fbAGkePvaj/kvs3HsqXfPhlnzwSOlnFgbqCPMd975dW+4wZ00WFBt+/YlBGcJwNrARQTOJOb4ZrIg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-compilation-targets": "^7.29.7", - "@babel/helper-plugin-utils": "^7.29.7", - "@babel/traverse": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.29.7.tgz", - "integrity": "sha512-RRnE2+eon1rJAq8MnoF1b5kTpY1vU88twHcvcKMrsqP/jxIRqDVs9iJB5fqPuqyeFAW0wJo4MlUIPpQCq/aRsg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-literals": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.29.7.tgz", - "integrity": "sha512-DZ/oLP21ZuWx1vKqnoNv6/tvEK48AQOBRai40CX9dTjGluvT/YZCyY3rryDtyUqCEoyNroy5KKPwX2iQCiRvyw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.29.7.tgz", - "integrity": "sha512-A0H91hh6W8MFRkp5TqJmMr39jzGD1A1E1Ysiv2O06Sfbhkapm+XyIzxWCEh5kqwOZ1/8QZ0dY3SeQ7XBqfJd5Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.29.7.tgz", - "integrity": "sha512-hl1kwFZCCiDyfH25Xmco9jTrkPgnS9pmOzSG7W5I4SaGbLeqKv417hcU2RKmaxoPEgsoJh7ZPOrnPGq99bHoUg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.29.7.tgz", - "integrity": "sha512-fxtQoH3m5ywUSIfaH0FGCzWu4McsYon5bD3K4XnskC7f+OyQMj7rsOMi4NvvmJ83WwBAg4UCe+ov4VZlqEvyew==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-transforms": "^7.29.7", - "@babel/helper-plugin-utils": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.29.7.tgz", - "integrity": "sha512-j0vCldybPC5b5dwCQOJ21uKtHzt7hxLygJTg9eF1ScfaikEDNfzn94XoW5Fi+seBR0nCyL23xaBFFkq7dTM8XQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-transforms": "^7.29.7", - "@babel/helper-plugin-utils": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.29.7.tgz", - "integrity": "sha512-TM2ZcQLoG2/y4HODiStCo10DibYhWhGWAwVv+EQKmG/7GFl0N+AAmUiXOMKM+aiJ9XBJ9AHVZBvTzMnJ2sM3cQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-transforms": "^7.29.7", - "@babel/helper-plugin-utils": "^7.29.7", - "@babel/helper-validator-identifier": "^7.29.7", - "@babel/traverse": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.29.7.tgz", - "integrity": "sha512-B4UkaTK3QpgCwJnrxKfMPKdo92CN7OKXAlpAAnM3UPu0Q0lCCk57ylA9AJbRy2v8dDKOPAAWcoR6CMyeoHwRCA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-transforms": "^7.29.7", - "@babel/helper-plugin-utils": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.29.7.tgz", - "integrity": "sha512-vuFoLwr4qnv2xbZ16SQd6uPcH5FNrLHhk/Jzo++0XJFcaDsr4gjJVg6j398oMHiC+83k/GiBzviwF5KBJkPUtQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.29.7", - "@babel/helper-plugin-utils": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-new-target": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.29.7.tgz", - "integrity": "sha512-fEo41GmsOUhOBlw8ioo6zvjX5Xc2Lqkzlyfqbpsk3eB6TReV18uhxZ0esfEokVbY2+PVJAQHNKxER6lGrzNd3A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.29.7.tgz", - "integrity": "sha512-idmp1dFaekP9GbcMvG24Kvw2BfhFZjHnNJCkV4WuIY4PskJzwI3f1N5OdgYke38T7rftO6ERulFRn2cFeZwRkg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.29.7.tgz", - "integrity": "sha512-zR7fv/z14OjgHl4AgRtkDBvBMhIzCxqV/qN/2BCRC7LjFwvuzjYe7gDWxC4Wl/SNsLM6SE1IWvRPYMgSJaUvNw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.29.7.tgz", - "integrity": "sha512-Ld98jn4c0smUywL57m7SgsHq3OpThOa6LqZJif3G6jYOovPleoFhVrBJ1WegRApSFB2wu4+RelAj9AC9G08Z4A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-compilation-targets": "^7.29.7", - "@babel/helper-plugin-utils": "^7.29.7", - "@babel/plugin-transform-destructuring": "^7.29.7", - "@babel/plugin-transform-parameters": "^7.29.7", - "@babel/traverse": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-object-super": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.29.7.tgz", - "integrity": "sha512-Ea/diGcw0twB5IlZPO5sgET6fJsLJqPABqTuFWIR+iMPGPZJkATEIWx0wa+aEQ5UY1CBQyP/gkAiLEqn1vBiQA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7", - "@babel/helper-replace-supers": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.29.7.tgz", - "integrity": "sha512-sLsyndxK2VwX6yNUOakMb7Sh553ZTe/vVM1XJ+9Z5aW1ytsc8xOIwmyk05NNjN60vkc5/KqoTH6hB4V41LJhng==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.29.7.tgz", - "integrity": "sha512-6GM1dhvK3gNODkXcEcMCOLEDCLSoZ/sBbro2Ax8HURyasQ4NshagQixkRFdh5niI6E4gmA/jYI/4aT7rRos3ZQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-parameters": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.29.7.tgz", - "integrity": "sha512-ZDOBqV/qLYJI0YElr8DcENEyARsFQeESqWXH6gZlghYXuPPjvweuDhP4VyEi4BlUBlLRFZVjxoZDMjxhLW766g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.29.7.tgz", - "integrity": "sha512-/6Rz4DK1ETDEM/bWHsPHcaEe7ZaT1EqSXjtSP/L0DijOYuaUhiRiOKcwpZ8P7zR4xXEHc2ITdiCgBm9Tpyv9ug==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.29.7", - "@babel/helper-plugin-utils": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.29.7.tgz", - "integrity": "sha512-+BNo06dnrzdNNqCm1X6YUaVv0DKk8Q+JYcoZfOkLhYWNCXzlwTSRq8zGWayT1csjcpNXV9CQTBRRbmTLZac5cA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.29.7", - "@babel/helper-create-class-features-plugin": "^7.29.7", - "@babel/helper-plugin-utils": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.29.7.tgz", - "integrity": "sha512-bOMRLQuI0A5ZqHq3OWJ89/rXpJ/NJrbVhXiP4zwPGMs6kpcVsuTUNjwoE30K0Qm3mf48a/TnRYYD6vPNqcg6jA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.29.7.tgz", - "integrity": "sha512-rNNFV0DBAJp988xW2DOntfDoYn1eR8GGF5AT5vYc+rjyfaQkM242c9tZUHHPe7KYaiJizXPWhQTzzdbXySyhBw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-regexp-modifiers": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.29.7.tgz", - "integrity": "sha512-mB5Fs0VWrJ42ZCmc8114v60qetdaUVNkj9PmSZRmanCZM3S9hm0CFRLjRmYIsuXav14l2jvZ+4T8iiCGnhj3nQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.29.7", - "@babel/helper-plugin-utils": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.29.7.tgz", - "integrity": "sha512-5+YhdpVgmfSmwZyLMftfaiffLRMHjzIRHFHHLdibcSyJm2pasMrKHrO3Ptrt2DRshjvpgjEJJ1zVW14WPq/6QA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.29.7.tgz", - "integrity": "sha512-I+WYbGBAiCn7nA6xBrlgPH+MB7HWb4u8pv5S0Pv7OtwNvIFvCCb24YlttKEeUFVurfBCEaOTnuhlqsb7f0Z5Dg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-spread": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.29.7.tgz", - "integrity": "sha512-/u5K1QWada7tbYNqTjMh96718g9NTwh9tfPJMsSmVsQwGT447FskV+KcfeXkXq2GWki4EM/MuTdmBec+hOuVTQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.29.7.tgz", - "integrity": "sha512-BCHzNYJGe9l7EpwwDBN/ztlL2NYFFq8hp9ddjtUEM9f2O7S7kKV/lL6Fwo7IF7NSkYhPK2vO+86nIGltA90MsA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.29.7.tgz", - "integrity": "sha512-NCSEJ4sLFU2gqAub45HYh4fus2yQ36rr6ei6vpU7NdoJqCpxvEG8E6eJpscGyXP3VHD2Ny+fSXr04k1hoUrFqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.29.7.tgz", - "integrity": "sha512-223mNGoTkBiTEWFoK+Q6Go3tueMRclO8vxxxxquNCYuNI4jWOofFKJRRDu6SDrB8Sgo1UEGW9T4GAQ8ZyRso1A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-typescript": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.29.7.tgz", - "integrity": "sha512-jK52h8LaLc7JarhQV2ofeFMts4H7vnOXnqZNA6fYglBTZewRBE51KWt3BUltW1P+KoPsYkHoJeXePuz4zo2LMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.29.7", - "@babel/helper-create-class-features-plugin": "^7.29.7", - "@babel/helper-plugin-utils": "^7.29.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7", - "@babel/plugin-syntax-typescript": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.29.7.tgz", - "integrity": "sha512-jCfXxSjf94lf4E0hKE0AByxF6F3/pVFqRdUUNkDJhsY0m1ZKjnN6ZYyMeHNpzflxb/0q5b7t3p+BE+SLF1WOtA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.29.7.tgz", - "integrity": "sha512-OgZ+zoAJgZLUCunsTRQ5LAjOywDv5zzZ2/hQ5aMw1pGXyY2rtE8/chXYUmu3AlVHKpm10KEdG9aMwbI/K76ZGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.29.7", - "@babel/helper-plugin-utils": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.29.7.tgz", - "integrity": "sha512-7D/x/23/d/3VqZ0QA+LGbZMlGwZjztBygSWWWsfTPoQ1oQ6Q1P6Mr3d0kk42XabyUVw+fha3LqdRsFqeKqvCyA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.29.7", - "@babel/helper-plugin-utils": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.29.7.tgz", - "integrity": "sha512-BLOhLht9DOJwIxlmp91wHvkXv1lguuHS3/FwUO8HL1H0u8s4hR1gASVFyilu9iGtcTRYqjTZmlsFFeQletntEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.29.7", - "@babel/helper-plugin-utils": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/preset-env": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.29.7.tgz", - "integrity": "sha512-GYzX36n1nsciIb0uyH0GHwxwtNwPQIcpxSeiVLDtG/B7jB5xXgchnmL1f/jCX5o+pwnaDBtO60ONSJhEBJfxYA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.29.7", - "@babel/helper-compilation-targets": "^7.29.7", - "@babel/helper-plugin-utils": "^7.29.7", - "@babel/helper-validator-option": "^7.29.7", - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.29.7", - "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.29.7", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.29.7", - "@babel/plugin-bugfix-safari-rest-destructuring-rhs-array": "^7.29.7", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.29.7", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.29.7", - "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-import-assertions": "^7.29.7", - "@babel/plugin-syntax-import-attributes": "^7.29.7", - "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.29.7", - "@babel/plugin-transform-async-generator-functions": "^7.29.7", - "@babel/plugin-transform-async-to-generator": "^7.29.7", - "@babel/plugin-transform-block-scoped-functions": "^7.29.7", - "@babel/plugin-transform-block-scoping": "^7.29.7", - "@babel/plugin-transform-class-properties": "^7.29.7", - "@babel/plugin-transform-class-static-block": "^7.29.7", - "@babel/plugin-transform-classes": "^7.29.7", - "@babel/plugin-transform-computed-properties": "^7.29.7", - "@babel/plugin-transform-destructuring": "^7.29.7", - "@babel/plugin-transform-dotall-regex": "^7.29.7", - "@babel/plugin-transform-duplicate-keys": "^7.29.7", - "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.29.7", - "@babel/plugin-transform-dynamic-import": "^7.29.7", - "@babel/plugin-transform-explicit-resource-management": "^7.29.7", - "@babel/plugin-transform-exponentiation-operator": "^7.29.7", - "@babel/plugin-transform-export-namespace-from": "^7.29.7", - "@babel/plugin-transform-for-of": "^7.29.7", - "@babel/plugin-transform-function-name": "^7.29.7", - "@babel/plugin-transform-json-strings": "^7.29.7", - "@babel/plugin-transform-literals": "^7.29.7", - "@babel/plugin-transform-logical-assignment-operators": "^7.29.7", - "@babel/plugin-transform-member-expression-literals": "^7.29.7", - "@babel/plugin-transform-modules-amd": "^7.29.7", - "@babel/plugin-transform-modules-commonjs": "^7.29.7", - "@babel/plugin-transform-modules-systemjs": "^7.29.7", - "@babel/plugin-transform-modules-umd": "^7.29.7", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.29.7", - "@babel/plugin-transform-new-target": "^7.29.7", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.29.7", - "@babel/plugin-transform-numeric-separator": "^7.29.7", - "@babel/plugin-transform-object-rest-spread": "^7.29.7", - "@babel/plugin-transform-object-super": "^7.29.7", - "@babel/plugin-transform-optional-catch-binding": "^7.29.7", - "@babel/plugin-transform-optional-chaining": "^7.29.7", - "@babel/plugin-transform-parameters": "^7.29.7", - "@babel/plugin-transform-private-methods": "^7.29.7", - "@babel/plugin-transform-private-property-in-object": "^7.29.7", - "@babel/plugin-transform-property-literals": "^7.29.7", - "@babel/plugin-transform-regenerator": "^7.29.7", - "@babel/plugin-transform-regexp-modifiers": "^7.29.7", - "@babel/plugin-transform-reserved-words": "^7.29.7", - "@babel/plugin-transform-shorthand-properties": "^7.29.7", - "@babel/plugin-transform-spread": "^7.29.7", - "@babel/plugin-transform-sticky-regex": "^7.29.7", - "@babel/plugin-transform-template-literals": "^7.29.7", - "@babel/plugin-transform-typeof-symbol": "^7.29.7", - "@babel/plugin-transform-unicode-escapes": "^7.29.7", - "@babel/plugin-transform-unicode-property-regex": "^7.29.7", - "@babel/plugin-transform-unicode-regex": "^7.29.7", - "@babel/plugin-transform-unicode-sets-regex": "^7.29.7", - "@babel/preset-modules": "0.1.6-no-external-plugins", - "babel-plugin-polyfill-corejs2": "^0.4.15", - "babel-plugin-polyfill-corejs3": "^0.14.0", - "babel-plugin-polyfill-regenerator": "^0.6.6", - "core-js-compat": "^3.48.0", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-modules": { - "version": "0.1.6-no-external-plugins", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", - "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/@babel/preset-typescript": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.29.7.tgz", - "integrity": "sha512-/Foi8vKY2EVbed/1eZx0gJEEwHAIxogrySI7rULcRIvhZzbvoE/b5qG5Ghc0WKAFKOHA9SD1x7RsFlOYdutIiQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7", - "@babel/helper-validator-option": "^7.29.7", - "@babel/plugin-syntax-jsx": "^7.29.7", - "@babel/plugin-transform-modules-commonjs": "^7.29.7", - "@babel/plugin-transform-typescript": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/template": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", - "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.29.7", - "@babel/parser": "^7.29.7", - "@babel/types": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz", - "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.29.7", - "@babel/generator": "^7.29.7", - "@babel/helper-globals": "^7.29.7", - "@babel/parser": "^7.29.7", - "@babel/template": "^7.29.7", - "@babel/types": "^7.29.7", - "debug": "^4.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", - "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.29.7", - "@babel/helper-validator-identifier": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@bufbuild/protobuf": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/@bufbuild/protobuf/-/protobuf-2.12.0.tgz", - "integrity": "sha512-B/XlCaFIP8LOwzo+bz5uFzATYokcwCKQcghqnlfwSmM5eX/qTkvDBnDPs+gXtX/RyjxJ4DRikECcPJbyALA8FA==", - "devOptional": true, - "license": "(Apache-2.0 AND BSD-3-Clause)" - }, - "node_modules/@emnapi/core": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.10.0.tgz", - "integrity": "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==", - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/wasi-threads": "1.2.1", - "tslib": "^2.4.0" - } - }, - "node_modules/@emnapi/runtime": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz", - "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==", - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@emnapi/wasi-threads": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz", - "integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==", - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", - "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", - "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/config-array": { - "version": "0.23.5", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.23.5.tgz", - "integrity": "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/object-schema": "^3.0.5", - "debug": "^4.3.1", - "minimatch": "^10.2.4" - }, - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - } - }, - "node_modules/@eslint/config-array/node_modules/minimatch": { - "version": "10.2.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", - "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "brace-expansion": "^5.0.5" - }, - "engines": { - "node": "18 || 20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@eslint/config-helpers": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.6.0.tgz", - "integrity": "sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/core": "^1.2.1" - }, - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - } - }, - "node_modules/@eslint/core": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.2.1.tgz", - "integrity": "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@types/json-schema": "^7.0.15" - }, - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - } - }, - "node_modules/@eslint/object-schema": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-3.0.5.tgz", - "integrity": "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - } - }, - "node_modules/@eslint/plugin-kit": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.7.2.tgz", - "integrity": "sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/core": "^1.2.1", - "levn": "^0.4.1" - }, - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - } - }, - "node_modules/@humanfs/core": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz", - "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@humanfs/types": "^0.15.0" - }, - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanfs/node": { - "version": "0.16.8", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz", - "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@humanfs/core": "^0.19.2", - "@humanfs/types": "^0.15.0", - "@humanwhocodes/retry": "^0.4.0" - }, - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanfs/types": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz", - "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/retry": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", - "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@iconify-json/bxl": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@iconify-json/bxl/-/bxl-1.2.4.tgz", - "integrity": "sha512-R6gVQSxB1+XeVClK7KdACnk1SfP8xiAu6LHuKZmp6Ro5zwMQbpe9vFBv30F6eHMDL8lZ7eXuac5SRJ9C8DKehQ==", - "license": "MIT", - "dependencies": { - "@iconify/types": "*" - } - }, - "node_modules/@iconify-json/ri": { - "version": "1.2.10", - "resolved": "https://registry.npmjs.org/@iconify-json/ri/-/ri-1.2.10.tgz", - "integrity": "sha512-WWMhoncVVM+Xmu9T5fgu2lhYRrKTEWhKk3Com0KiM111EeEsRLiASjpsFKnC/SrB6covhUp95r2mH8tGxhgd5Q==", - "license": "Apache-2.0", - "dependencies": { - "@iconify/types": "*" - } - }, - "node_modules/@iconify/types": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz", - "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==", - "license": "MIT" - }, - "node_modules/@iconify/vue": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@iconify/vue/-/vue-4.3.0.tgz", - "integrity": "sha512-Xq0h6zMrHBbrW8jXJ9fISi+x8oDQllg5hTDkDuxnWiskJ63rpJu9CvJshj8VniHVTbsxCg9fVoPAaNp3RQI5OQ==", - "license": "MIT", - "dependencies": { - "@iconify/types": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/cyberalien" - }, - "peerDependencies": { - "vue": ">=3" - } - }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@isaacs/cliui/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", - "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.2.2" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.6.tgz", - "integrity": "sha512-+Sg6GCR/wy1oSmQDFq4LQDAhm3ETKnorxN+y5nbLULOR3P0c14f2Wurzj3/xqPXtasLFfHd5iRFQ7AJt4KH2cw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/console": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", - "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/console/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@jest/console/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@jest/console/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@jest/console/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@jest/console/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/console/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/core": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", - "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/console": "^29.7.0", - "@jest/reporters": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.7.0", - "jest-config": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-resolve-dependencies": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "jest-watcher": "^29.7.0", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/core/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@jest/core/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@jest/core/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@jest/core/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@jest/core/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/core/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/environment": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", - "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "expect": "^29.7.0", - "jest-snapshot": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/expect-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", - "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", - "dev": true, - "license": "MIT", - "dependencies": { - "jest-get-type": "^29.6.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/fake-timers": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", - "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "@sinonjs/fake-timers": "^10.0.2", - "@types/node": "*", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/globals": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", - "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/types": "^29.6.3", - "jest-mock": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/reporters": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", - "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "@types/node": "*", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^6.0.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "slash": "^3.0.0", - "string-length": "^4.0.1", - "strip-ansi": "^6.0.0", - "v8-to-istanbul": "^9.0.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/reporters/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@jest/reporters/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@jest/reporters/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@jest/reporters/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@jest/reporters/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/reporters/node_modules/istanbul-lib-instrument": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", - "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@babel/core": "^7.23.9", - "@babel/parser": "^7.23.9", - "@istanbuljs/schema": "^0.1.3", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^7.5.4" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@jest/reporters/node_modules/semver": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.1.tgz", - "integrity": "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@jest/reporters/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@sinclair/typebox": "^0.27.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/source-map": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", - "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.18", - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/test-result": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", - "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/console": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/test-sequencer": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", - "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/test-result": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/transform": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", - "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^2.0.0", - "fast-json-stable-stringify": "^2.1.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.2" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/transform/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@jest/transform/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@jest/transform/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@jest/transform/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@jest/transform/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/transform/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/types/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@jest/types/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@jest/types/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@jest/types/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@jest/types/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/types/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/remapping": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", - "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@napi-rs/wasm-runtime": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.4.tgz", - "integrity": "sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==", - "license": "MIT", - "optional": true, - "dependencies": { - "@tybys/wasm-util": "^0.10.1" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Brooooooklyn" - }, - "peerDependencies": { - "@emnapi/core": "^1.7.1", - "@emnapi/runtime": "^1.7.1" - } - }, - "node_modules/@one-ini/wasm": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@one-ini/wasm/-/wasm-0.1.1.tgz", - "integrity": "sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@oxc-project/types": { - "version": "0.133.0", - "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.133.0.tgz", - "integrity": "sha512-KzkdCd6Uxqnf6l3HOw1xfatAlUURA0g14cvBYFyJ5SaNOQbOUvBr9PKArcPcrNIeRsBdgcUzOGrhKveVpvOIGA==", - "devOptional": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/Boshen" - } - }, - "node_modules/@parcel/watcher": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.6.tgz", - "integrity": "sha512-tmmZ3lQxAe/k/+rNnXQRawJ4NjxO2hqiOLTHvWchtGZULp4RyFeh6aU4XdOYBFe2KE1oShQTv4AblOs2iOrNnQ==", - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "dependencies": { - "detect-libc": "^2.0.3", - "is-glob": "^4.0.3", - "node-addon-api": "^7.0.0", - "picomatch": "^4.0.3" - }, - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "optionalDependencies": { - "@parcel/watcher-android-arm64": "2.5.6", - "@parcel/watcher-darwin-arm64": "2.5.6", - "@parcel/watcher-darwin-x64": "2.5.6", - "@parcel/watcher-freebsd-x64": "2.5.6", - "@parcel/watcher-linux-arm-glibc": "2.5.6", - "@parcel/watcher-linux-arm-musl": "2.5.6", - "@parcel/watcher-linux-arm64-glibc": "2.5.6", - "@parcel/watcher-linux-arm64-musl": "2.5.6", - "@parcel/watcher-linux-x64-glibc": "2.5.6", - "@parcel/watcher-linux-x64-musl": "2.5.6", - "@parcel/watcher-win32-arm64": "2.5.6", - "@parcel/watcher-win32-ia32": "2.5.6", - "@parcel/watcher-win32-x64": "2.5.6" - } - }, - "node_modules/@parcel/watcher-android-arm64": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.6.tgz", - "integrity": "sha512-YQxSS34tPF/6ZG7r/Ih9xy+kP/WwediEUsqmtf0cuCV5TPPKw/PQHRhueUo6JdeFJaqV3pyjm0GdYjZotbRt/A==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-darwin-arm64": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.6.tgz", - "integrity": "sha512-Z2ZdrnwyXvvvdtRHLmM4knydIdU9adO3D4n/0cVipF3rRiwP+3/sfzpAwA/qKFL6i1ModaabkU7IbpeMBgiVEA==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-darwin-x64": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.6.tgz", - "integrity": "sha512-HgvOf3W9dhithcwOWX9uDZyn1lW9R+7tPZ4sug+NGrGIo4Rk1hAXLEbcH1TQSqxts0NYXXlOWqVpvS1SFS4fRg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-freebsd-x64": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.6.tgz", - "integrity": "sha512-vJVi8yd/qzJxEKHkeemh7w3YAn6RJCtYlE4HPMoVnCpIXEzSrxErBW5SJBgKLbXU3WdIpkjBTeUNtyBVn8TRng==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm-glibc": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.6.tgz", - "integrity": "sha512-9JiYfB6h6BgV50CCfasfLf/uvOcJskMSwcdH1PHH9rvS1IrNy8zad6IUVPVUfmXr+u+Km9IxcfMLzgdOudz9EQ==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm-musl": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.6.tgz", - "integrity": "sha512-Ve3gUCG57nuUUSyjBq/MAM0CzArtuIOxsBdQ+ftz6ho8n7s1i9E1Nmk/xmP323r2YL0SONs1EuwqBp2u1k5fxg==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm64-glibc": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.6.tgz", - "integrity": "sha512-f2g/DT3NhGPdBmMWYoxixqYr3v/UXcmLOYy16Bx0TM20Tchduwr4EaCbmxh1321TABqPGDpS8D/ggOTaljijOA==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm64-musl": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.6.tgz", - "integrity": "sha512-qb6naMDGlbCwdhLj6hgoVKJl2odL34z2sqkC7Z6kzir8b5W65WYDpLB6R06KabvZdgoHI/zxke4b3zR0wAbDTA==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-x64-glibc": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.6.tgz", - "integrity": "sha512-kbT5wvNQlx7NaGjzPFu8nVIW1rWqV780O7ZtkjuWaPUgpv2NMFpjYERVi0UYj1msZNyCzGlaCWEtzc+exjMGbQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-x64-musl": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.6.tgz", - "integrity": "sha512-1JRFeC+h7RdXwldHzTsmdtYR/Ku8SylLgTU/reMuqdVD7CtLwf0VR1FqeprZ0eHQkO0vqsbvFLXUmYm/uNKJBg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-win32-arm64": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.6.tgz", - "integrity": "sha512-3ukyebjc6eGlw9yRt678DxVF7rjXatWiHvTXqphZLvo7aC5NdEgFufVwjFfY51ijYEWpXbqF5jtrK275z52D4Q==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-win32-ia32": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.6.tgz", - "integrity": "sha512-k35yLp1ZMwwee3Ez/pxBi5cf4AoBKYXj00CZ80jUz5h8prpiaQsiRPKQMxoLstNuqe2vR4RNPEAEcjEFzhEz/g==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-win32-x64": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.6.tgz", - "integrity": "sha512-hbQlYcCq5dlAX9Qx+kFb0FHue6vbjlf0FrNzSKdYK2APUf7tGfGxQCk2ihEREmbR6ZMc0MVAD5RIX/41gpUzTw==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher/node_modules/picomatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@rolldown/binding-android-arm64": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.3.tgz", - "integrity": "sha512-454rs7jHngixp/NMxd5srYD57OnzSlZ/eFTETjORQHLwJG1lRtmNOJcBerZlfu4GjKqeq8aCCIQrMdHyhI51Hw==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-darwin-arm64": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.3.tgz", - "integrity": "sha512-PcAhP+ynjURNyy8SKGl5DQP94aGuB/7JrXJb/t7P+hanXvQVMWzUvRRhBAcg/lNRadBhoUPqSoP4xw5tR/KBEA==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-darwin-x64": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.3.tgz", - "integrity": "sha512-9YpfeUvSE2RS7wysJ81uOZkXJz7f7Q55H2Gvp3VEw/EsahqDtrphrZ0EwDLK5vvKOzaCrBsjF8JmnMLcUt78Gg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-freebsd-x64": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.3.tgz", - "integrity": "sha512-yB1IlAsSNHncV6SCTL27/MVGR5htvQsoGxIv5KMGXALp+Ll1wYsn+x98M9MW7qa+NdSbvrrY7ANI4wLJ0n1e6g==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-arm-gnueabihf": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.3.tgz", - "integrity": "sha512-Yi30IVAAfLUCy2MseFjbB1jAMDl1VMCAas5StnYp8da9+CKvMd2H2cbEjWcw5NPaPqzvYkVIaF1nNUG+b7u/sw==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-arm64-gnu": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.3.tgz", - "integrity": "sha512-jsO7R8To+AdlYgUmN5sHSCZbfhtMBkO0WUx8iORQnPcMMdgr7qM2DQmMwgabs3GhNztdmoKkMKQFHD6DTMCIQw==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-arm64-musl": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.3.tgz", - "integrity": "sha512-VWkUHwWriDciit80wleYwKILoR/KMvxh/IdwS/paX+ZgpuRpCrKLUdadJbc0NpBEiyhpYawsJ73j9aCvOH+f7Q==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-ppc64-gnu": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.3.tgz", - "integrity": "sha512-5f1laC0SlIR0yDbFCd8acUhvJIag6N3zC5P7oUPN6wX0aOma+uKJ0wBDH5aq7I1PVI2ttTlhJwzwRIBnLiSGEg==", - "cpu": [ - "ppc64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-s390x-gnu": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.3.tgz", - "integrity": "sha512-Iq4ko0r4XsgbrF/LunNgHtAGLRRVE2kXonAXQ/MV0mC6jQpMOhW1SvtZja2EhC/kd05++bP78dsqBeIQyYJ6Yg==", - "cpu": [ - "s390x" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-x64-gnu": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.3.tgz", - "integrity": "sha512-B8m6tD5+/N5FeNQFbKlLA/2yVq9ycQP1SeedyEYYKWBNR3ZQbkvIUcNnDNM03lO1l5F2roiiFJGgvoLLyZXtSg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-x64-musl": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.3.tgz", - "integrity": "sha512-pSdpdUJHkuCxun9LE7jvgUB9qsRgaiyNNCX7m/AvHTcq67AiT/Yhoxvw5zPfhrM8k/BfP8ce/hMOpthKDpEUow==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-openharmony-arm64": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.3.tgz", - "integrity": "sha512-OXXS3RKJgX2uLwM+gYyuH5omcH8fL1LJs96pZGgtetVCahON57+d4SJHzTgZiOjxgGkSnpXpOsWuPDGAKAigEg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-wasm32-wasi": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.3.tgz", - "integrity": "sha512-JTtb8BWFynicNSoPrehsCzBtOKjZ6jhMiPFEmOiuXg1Fl8dn2KHQob+GuPSGR0dryQa1PQJbzjF3dqO/whhjLg==", - "cpu": [ - "wasm32" - ], - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/core": "1.10.0", - "@emnapi/runtime": "1.10.0", - "@napi-rs/wasm-runtime": "^1.1.4" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-win32-arm64-msvc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.3.tgz", - "integrity": "sha512-gEdFFEN70A/jxb2svrWsN3aDL7OUtmvlOy+6fa2jxG8K0wQ1ZbdeLGnidov6Yu5/733dI5ySfzFlQ/cb0bSz1g==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-win32-x64-msvc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.3.tgz", - "integrity": "sha512-eXB7CHuaQdqmJcc3koCNtNPmT/bj2gc999kUFgBxG8Ac0NdgXc4rkCHhqrgrhN3zddvvvrgzj1e90SuSfmyIXA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/pluginutils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", - "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/@sinclair/typebox": { - "version": "0.27.10", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.10.tgz", - "integrity": "sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@sinonjs/commons": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", - "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/@sinonjs/fake-timers": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", - "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@sinonjs/commons": "^3.0.0" - } - }, - "node_modules/@tootallnate/once": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.1.tgz", - "integrity": "sha512-HqmEUIGRJ5fSXchkVgR5F7qn48bDBzv0kWj/Kfu5e6uci4UlEeng4331LnBkWffb++Ei3FOVLxo8JJWMFBDMeQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tybys/wasm-util": { - "version": "0.10.2", - "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.2.tgz", - "integrity": "sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==", - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@types/babel__core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", - "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", - "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.28.2" - } - }, - "node_modules/@types/esrecurse": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@types/esrecurse/-/esrecurse-4.3.1.tgz", - "integrity": "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/estree": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", - "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/graceful-fs": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", - "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", - "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", - "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-coverage": "*" - } - }, - "node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/@types/jest": { - "version": "29.5.14", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.14.tgz", - "integrity": "sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "expect": "^29.0.0", - "pretty-format": "^29.0.0" - } - }, - "node_modules/@types/jsdom": { - "version": "20.0.1", - "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-20.0.1.tgz", - "integrity": "sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "@types/tough-cookie": "*", - "parse5": "^7.0.0" - } - }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "20.19.41", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.41.tgz", - "integrity": "sha512-ECymXOukMnOoVkC2bb1Vc/w/836DXncOg5m8Xj1RH7xSHZJWNYY6Zh7EH477vcnD5egKNNfy2RpNOmuChhFPgQ==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "undici-types": "~6.21.0" - } - }, - "node_modules/@types/stack-utils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", - "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-xevGOReSYGM7g/kUBZzPqCrR/KYAo+F0yiPc85WFTJa0MSLtyFTVTU6cJu/aV4mid7IffDIWqo69THF2o4JiEQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/strip-json-comments": { - "version": "0.0.30", - "resolved": "https://registry.npmjs.org/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz", - "integrity": "sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/tough-cookie": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", - "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/web-bluetooth": { - "version": "0.0.20", - "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.20.tgz", - "integrity": "sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==", - "license": "MIT" - }, - "node_modules/@types/yargs": { - "version": "17.0.35", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz", - "integrity": "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@types/yargs-parser": { - "version": "21.0.3", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", - "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@vitejs/plugin-vue": { - "version": "6.0.7", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-6.0.7.tgz", - "integrity": "sha512-km+p+XdSz9Sxm5rqUbqcSfZYaAniKxWBj1KURl+Jr7UaPvvX7BmaWMdP69I5rrFDeQGyxAG7NXdc57vz+snhWg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@rolldown/pluginutils": "^1.0.1" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "peerDependencies": { - "vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0", - "vue": "^3.2.25" - } - }, - "node_modules/@vue/compiler-core": { - "version": "3.5.35", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.35.tgz", - "integrity": "sha512-BUmHaR1J+O+CKZ9uJucdVTEr1LHsdyvv7vG3eNRhK3CczEHeMd/LtsHAuD7PbrxvI2envCY2v7HI1vC1aBRzKw==", - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.29.3", - "@vue/shared": "3.5.35", - "entities": "^7.0.1", - "estree-walker": "^2.0.2", - "source-map-js": "^1.2.1" - } - }, - "node_modules/@vue/compiler-dom": { - "version": "3.5.35", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.35.tgz", - "integrity": "sha512-k+bprkXxuqhVajgTx5mUHuir7TwQzUKOWR40ng1ncAqQRPnrLngGGgqVEEhOnTMlc8btHYVKmrP8s5Qyg0hvYA==", - "license": "MIT", - "dependencies": { - "@vue/compiler-core": "3.5.35", - "@vue/shared": "3.5.35" - } - }, - "node_modules/@vue/compiler-sfc": { - "version": "3.5.35", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.35.tgz", - "integrity": "sha512-G5VPMcXTSywXBgtFOZOnHKBxKSrwXUcvY1iaF5/hRcy7t0J6CH/d8ha9F4nzi00Fax1eLV0QHM7v4mQu68jydw==", - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.29.3", - "@vue/compiler-core": "3.5.35", - "@vue/compiler-dom": "3.5.35", - "@vue/compiler-ssr": "3.5.35", - "@vue/shared": "3.5.35", - "estree-walker": "^2.0.2", - "magic-string": "^0.30.21", - "postcss": "^8.5.15", - "source-map-js": "^1.2.1" - } - }, - "node_modules/@vue/compiler-ssr": { - "version": "3.5.35", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.35.tgz", - "integrity": "sha512-rGhAeXgdM7/ffTJGXT69rCCdTmjDewnFuUZfBQQHTdcEBeWdT5HCGY60y2ytLJr9/Dsu7IntUi5z/w0h6Rjnzw==", - "license": "MIT", - "dependencies": { - "@vue/compiler-dom": "3.5.35", - "@vue/shared": "3.5.35" - } - }, - "node_modules/@vue/devtools-api": { - "version": "7.7.9", - "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-7.7.9.tgz", - "integrity": "sha512-kIE8wvwlcZ6TJTbNeU2HQNtaxLx3a84aotTITUuL/4bzfPxzajGBOoqjMhwZJ8L9qFYDU/lAYMEEm11dnZOD6g==", - "license": "MIT", - "dependencies": { - "@vue/devtools-kit": "^7.7.9" - } - }, - "node_modules/@vue/devtools-kit": { - "version": "7.7.9", - "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-7.7.9.tgz", - "integrity": "sha512-PyQ6odHSgiDVd4hnTP+aDk2X4gl2HmLDfiyEnn3/oV+ckFDuswRs4IbBT7vacMuGdwY/XemxBoh302ctbsptuA==", - "license": "MIT", - "dependencies": { - "@vue/devtools-shared": "^7.7.9", - "birpc": "^2.3.0", - "hookable": "^5.5.3", - "mitt": "^3.0.1", - "perfect-debounce": "^1.0.0", - "speakingurl": "^14.0.1", - "superjson": "^2.2.2" - } - }, - "node_modules/@vue/devtools-shared": { - "version": "7.7.9", - "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-7.7.9.tgz", - "integrity": "sha512-iWAb0v2WYf0QWmxCGy0seZNDPdO3Sp5+u78ORnyeonS6MT4PC7VPrryX2BpMJrwlDeaZ6BD4vP4XKjK0SZqaeA==", - "license": "MIT", - "dependencies": { - "rfdc": "^1.4.1" - } - }, - "node_modules/@vue/reactivity": { - "version": "3.5.35", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.35.tgz", - "integrity": "sha512-tVc+SsHConvh/Lz64qq1pP3rYArBmK42xonovEcxY74SQtvctZodG/zhq54P5dr38cVuw25d27cPNRdlMidpGQ==", - "license": "MIT", - "dependencies": { - "@vue/shared": "3.5.35" - } - }, - "node_modules/@vue/runtime-core": { - "version": "3.5.35", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.35.tgz", - "integrity": "sha512-A/xFNX9loIcWDygeQuNCfKuh0CoYBzxhqEMNah5TSFg9Z53DrFYEN2qi5CU9necjM1OWYegYREUTHmXTmhfXtg==", - "license": "MIT", - "dependencies": { - "@vue/reactivity": "3.5.35", - "@vue/shared": "3.5.35" - } - }, - "node_modules/@vue/runtime-dom": { - "version": "3.5.35", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.35.tgz", - "integrity": "sha512-odrJ1C391dbGnyDRh8U+rnP7J2amIEzfmRk5vXy7xi3aZhEXofTvpi0T4HJb6jlNqQZTNPR5MPHSB3RHNkIORA==", - "license": "MIT", - "dependencies": { - "@vue/reactivity": "3.5.35", - "@vue/runtime-core": "3.5.35", - "@vue/shared": "3.5.35", - "csstype": "^3.2.3" - } - }, - "node_modules/@vue/server-renderer": { - "version": "3.5.35", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.35.tgz", - "integrity": "sha512-NkebSOYdB97wi8OQcO3HqzZSlymJi/aWsN/7h74OSVhRTm6qGs3Jp3e0rCXynmWwSlKeRrnlIug+ilYoHBmQDA==", - "license": "MIT", - "dependencies": { - "@vue/compiler-ssr": "3.5.35", - "@vue/shared": "3.5.35" - }, - "peerDependencies": { - "vue": "3.5.35" - } - }, - "node_modules/@vue/shared": { - "version": "3.5.35", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.35.tgz", - "integrity": "sha512-zSbjL7gRXwks2ZQLRGCajBtBXEOXW9Ddhn/HvSdrGkE2dqGnumzW8XtusRrxrE9LvqtiqDXQ+A60Hp6mvdYxfA==", - "license": "MIT" - }, - "node_modules/@vue/test-utils": { - "version": "2.4.10", - "resolved": "https://registry.npmjs.org/@vue/test-utils/-/test-utils-2.4.10.tgz", - "integrity": "sha512-SmoZ5EA1kYiAFs9NkYdiFFQF+cSnUwnvlYEbY+DogWQZUiqOm/Y29eSbc5T6yi75SgSF9863SBeXniIEoPajCA==", - "dev": true, - "license": "MIT", - "dependencies": { - "js-beautify": "^1.14.9", - "vue-component-type-helpers": "^3.0.0" - }, - "peerDependencies": { - "@vue/compiler-dom": "3.x", - "@vue/server-renderer": "3.x", - "vue": "3.x" - }, - "peerDependenciesMeta": { - "@vue/server-renderer": { - "optional": true - } - } - }, - "node_modules/@vue/vue3-jest": { - "version": "29.2.6", - "resolved": "https://registry.npmjs.org/@vue/vue3-jest/-/vue3-jest-29.2.6.tgz", - "integrity": "sha512-Hy4i2BsV5fUmER5LplYiAeRkLTDCSB3ZbnAeEawXtjto/ILaOnamBAoAvEqARgPpR6NRtiYjSgGKmllMtnFd9g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/plugin-transform-modules-commonjs": "^7.2.0", - "chalk": "^2.1.0", - "convert-source-map": "^1.6.0", - "css-tree": "^2.0.1", - "source-map": "0.5.6", - "tsconfig": "^7.0.0" - }, - "engines": { - "node": ">10" - }, - "peerDependencies": { - "@babel/core": "7.x", - "babel-jest": "29.x", - "jest": "29.x", - "typescript": ">= 4.3", - "vue": "^3.0.0-0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@vue/vue3-jest/node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true, - "license": "MIT" - }, - "node_modules/@vuetify/loader-shared": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@vuetify/loader-shared/-/loader-shared-2.1.2.tgz", - "integrity": "sha512-X+1jBLmXHkpQEnC0vyOb4rtX2QSkBiFhaFXz8yhQqN2A4vQ6k2nChxN4Ol7VAY5KoqMdFoRMnmNdp/1qYXDQig==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "upath": "^2.0.1" - }, - "peerDependencies": { - "vue": "^3.0.0", - "vuetify": ">=3" - } - }, - "node_modules/@vueuse/core": { - "version": "11.3.0", - "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-11.3.0.tgz", - "integrity": "sha512-7OC4Rl1f9G8IT6rUfi9JrKiXy4bfmHhZ5x2Ceojy0jnd3mHNEvV4JaRygH362ror6/NZ+Nl+n13LPzGiPN8cKA==", - "license": "MIT", - "dependencies": { - "@types/web-bluetooth": "^0.0.20", - "@vueuse/metadata": "11.3.0", - "@vueuse/shared": "11.3.0", - "vue-demi": ">=0.14.10" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@vueuse/core/node_modules/vue-demi": { - "version": "0.14.10", - "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz", - "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==", - "hasInstallScript": true, - "license": "MIT", - "bin": { - "vue-demi-fix": "bin/vue-demi-fix.js", - "vue-demi-switch": "bin/vue-demi-switch.js" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "@vue/composition-api": "^1.0.0-rc.1", - "vue": "^3.0.0-0 || ^2.6.0" - }, - "peerDependenciesMeta": { - "@vue/composition-api": { - "optional": true - } - } - }, - "node_modules/@vueuse/metadata": { - "version": "11.3.0", - "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-11.3.0.tgz", - "integrity": "sha512-pwDnDspTqtTo2HwfLw4Rp6yywuuBdYnPYDq+mO38ZYKGebCUQC/nVj/PXSiK9HX5otxLz8Fn7ECPbjiRz2CC3g==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@vueuse/shared": { - "version": "11.3.0", - "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-11.3.0.tgz", - "integrity": "sha512-P8gSSWQeucH5821ek2mn/ciCk+MS/zoRKqdQIM3bHq6p7GXDAJLmnRRKmF5F65sAVJIfzQlwR3aDzwCn10s8hA==", - "license": "MIT", - "dependencies": { - "vue-demi": ">=0.14.10" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@vueuse/shared/node_modules/vue-demi": { - "version": "0.14.10", - "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz", - "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==", - "hasInstallScript": true, - "license": "MIT", - "bin": { - "vue-demi-fix": "bin/vue-demi-fix.js", - "vue-demi-switch": "bin/vue-demi-switch.js" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "@vue/composition-api": "^1.0.0-rc.1", - "vue": "^3.0.0-0 || ^2.6.0" - }, - "peerDependenciesMeta": { - "@vue/composition-api": { - "optional": true - } - } - }, - "node_modules/abab": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", - "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", - "deprecated": "Use your platform's native atob() and btoa() methods instead", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/abbrev": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", - "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/acorn": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", - "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", - "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-globals": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-7.0.1.tgz", - "integrity": "sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "acorn": "^8.1.0", - "acorn-walk": "^8.0.2" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/acorn-walk": { - "version": "8.3.5", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.5.tgz", - "integrity": "sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==", - "dev": true, - "license": "MIT", - "dependencies": { - "acorn": "^8.11.0" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "license": "MIT", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/ajv": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", - "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "license": "ISC", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "license": "MIT", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "license": "MIT" - }, - "node_modules/axios": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.16.1.tgz", - "integrity": "sha512-caYkukvroVPO8KrzuJEb50Hm07KwfBZPEC3VeFHTsqWHvKTsy54hjJz9BS/cdaypROE2rH6xvm9mHX4fgWkr3A==", - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.16.0", - "form-data": "^4.0.5", - "https-proxy-agent": "^5.0.1", - "proxy-from-env": "^2.1.0" - } - }, - "node_modules/babel-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", - "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/transform": "^29.7.0", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^29.6.3", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.8.0" - } - }, - "node_modules/babel-jest/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/babel-jest/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/babel-jest/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/babel-jest/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" - }, - "node_modules/babel-jest/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-jest/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-plugin-jest-hoist": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", - "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.1.14", - "@types/babel__traverse": "^7.0.6" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.17", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.17.tgz", - "integrity": "sha512-aTyf30K/rqAsNwN76zYrdtx8obu0E4KoUME29B1xj+B3WxgvWkp943vYQ+z8Mv3lw9xHXMHpvSPOBxzAkIa94w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.28.6", - "@babel/helper-define-polyfill-provider": "^0.6.8", - "semver": "^6.3.1" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.14.2.tgz", - "integrity": "sha512-coWpDLJ410R781Npmn/SIBZEsAetR4xVi0SxLMXPaMO4lSf1MwnkGYMtkFxew0Dn8B3/CpbpYxN0JCgg8mn67g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.8", - "core-js-compat": "^3.48.0" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.6.8", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.8.tgz", - "integrity": "sha512-M762rNHfSF1EV3SLtnCJXFoQbbIIz0OyRwnCmV0KPC7qosSfCO0QLTSuJX3ayAebubhE6oYBAYPrBA5ljowaZg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.8" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-preset-current-node-syntax": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz", - "integrity": "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-import-attributes": "^7.24.7", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5" - }, - "peerDependencies": { - "@babel/core": "^7.0.0 || ^8.0.0-0" - } - }, - "node_modules/babel-preset-jest": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", - "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", - "dev": true, - "license": "MIT", - "dependencies": { - "babel-plugin-jest-hoist": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/balanced-match": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", - "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "18 || 20 || >=22" - } - }, - "node_modules/baseline-browser-mapping": { - "version": "2.10.33", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.33.tgz", - "integrity": "sha512-bA6+tcSLpz2tIEdDXZPpPTIuxBcC4+w6SieaYyfigIa4h8GlFxbA17v22Vx3JUtuZQj9SgOsnbK+aTBzyDyEuw==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "baseline-browser-mapping": "dist/cli.cjs" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/birpc": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/birpc/-/birpc-2.9.0.tgz", - "integrity": "sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "dev": true, - "license": "ISC" - }, - "node_modules/brace-expansion": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", - "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^4.0.2" - }, - "engines": { - "node": "18 || 20 || >=22" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.28.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", - "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "baseline-browser-mapping": "^2.10.12", - "caniuse-lite": "^1.0.30001782", - "electron-to-chromium": "^1.5.328", - "node-releases": "^2.0.36", - "update-browserslist-db": "^1.2.3" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/bs-logger": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", - "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-json-stable-stringify": "2.x" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "node-int64": "^0.4.0" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001793", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001793.tgz", - "integrity": "sha512-iwSsYWaCOoh26cV8NwNRViHlrfUvYsHDfRVcbtmw0Kg6PJIZZXwMkj1442FYLBGkeUf1juAsU3DTfxW579mrPA==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0" - }, - "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/chokidar": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", - "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "readdirp": "^5.0.0" - }, - "engines": { - "node": ">= 20.19.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/cjs-module-lexer": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz", - "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", - "dev": true, - "license": "MIT", - "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" - } - }, - "node_modules/collect-v8-coverage": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.3.tgz", - "integrity": "sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==", - "dev": true, - "license": "MIT" - }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true, - "license": "MIT" - }, - "node_modules/colorjs.io": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/colorjs.io/-/colorjs.io-0.5.2.tgz", - "integrity": "sha512-twmVoizEW7ylZSN32OgKdXRmo1qg+wT5/6C3xu5b9QsWzSFAhHLn2xd8ro0diCsKfCj1RdaTP/nrcW+vAoQPIw==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commander": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", - "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14" - } - }, - "node_modules/config-chain": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", - "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ini": "^1.3.4", - "proto-list": "~1.2.1" - } - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true, - "license": "MIT" - }, - "node_modules/copy-anything": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-4.0.5.tgz", - "integrity": "sha512-7Vv6asjS4gMOuILabD3l739tsaxFQmC+a7pLZm02zyvs8p977bL3zEgq3yDk5rn9B0PbYgIv++jmHcuUab4RhA==", - "license": "MIT", - "dependencies": { - "is-what": "^5.2.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/mesqueeb" - } - }, - "node_modules/core-js-compat": { - "version": "3.49.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.49.0.tgz", - "integrity": "sha512-VQXt1jr9cBz03b331DFDCCP90b3fanciLkgiOoy8SBHy06gNf+vQ1A3WFLqG7I8TipYIKeYK9wxd0tUrvHcOZA==", - "dev": true, - "license": "MIT", - "dependencies": { - "browserslist": "^4.28.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/create-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", - "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "prompts": "^2.0.1" - }, - "bin": { - "create-jest": "bin/create-jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/create-jest/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/create-jest/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/create-jest/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/create-jest/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" - }, - "node_modules/create-jest/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/create-jest/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/css-select": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", - "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.1.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/css-tree": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", - "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", - "dev": true, - "license": "MIT", - "dependencies": { - "mdn-data": "2.0.30", - "source-map-js": "^1.0.1" - }, - "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" - } - }, - "node_modules/css-what": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", - "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/csso": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", - "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "css-tree": "~2.2.0" - }, - "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/csso/node_modules/css-tree": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", - "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", - "dev": true, - "license": "MIT", - "dependencies": { - "mdn-data": "2.0.28", - "source-map-js": "^1.0.1" - }, - "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/csso/node_modules/mdn-data": { - "version": "2.0.28", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", - "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", - "dev": true, - "license": "CC0-1.0" - }, - "node_modules/cssom": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", - "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==", - "dev": true, - "license": "MIT" - }, - "node_modules/cssstyle": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", - "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", - "dev": true, - "license": "MIT", - "dependencies": { - "cssom": "~0.3.6" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cssstyle/node_modules/cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", - "dev": true, - "license": "MIT" - }, - "node_modules/csstype": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", - "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", - "license": "MIT" - }, - "node_modules/data-urls": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz", - "integrity": "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "abab": "^2.0.6", - "whatwg-mimetype": "^3.0.0", - "whatwg-url": "^11.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decimal.js": { - "version": "10.6.0", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz", - "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==", - "dev": true, - "license": "MIT" - }, - "node_modules/dedent": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.2.tgz", - "integrity": "sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "babel-plugin-macros": "^3.1.0" - }, - "peerDependenciesMeta": { - "babel-plugin-macros": { - "optional": true - } - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/detect-libc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", - "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", - "devOptional": true, - "license": "Apache-2.0", - "engines": { - "node": ">=8" - } - }, - "node_modules/detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/diff-sequences": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", - "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "dev": true, - "license": "MIT", - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/dom-serializer/node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "BSD-2-Clause" - }, - "node_modules/domexception": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", - "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", - "deprecated": "Use your platform's native DOMException instead", - "dev": true, - "license": "MIT", - "dependencies": { - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "domelementtype": "^2.3.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/domutils": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", - "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true, - "license": "MIT" - }, - "node_modules/editorconfig": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-1.0.7.tgz", - "integrity": "sha512-e0GOtq/aTQhVdNyDU9e02+wz9oDDM+SIOQxWME2QRjzRX5yyLAuHDE+0aE8vHb9XRC8XD37eO2u57+F09JqFhw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@one-ini/wasm": "0.1.1", - "commander": "^10.0.0", - "minimatch": "^9.0.1", - "semver": "^7.5.3" - }, - "bin": { - "editorconfig": "bin/editorconfig" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/editorconfig/node_modules/minimatch": { - "version": "9.0.9", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", - "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.2" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/editorconfig/node_modules/semver": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.1.tgz", - "integrity": "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.5.366", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.366.tgz", - "integrity": "sha512-OlRuhb688YTCzzU3gXPLn6nGyd+F+53INE1qaKKlu6kETErE8FYsyDh0XqXEU+uBRn0MpCzz2vfNwORhkap8qg==", - "dev": true, - "license": "ISC" - }, - "node_modules/emittery": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", - "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" - } - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/entities": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", - "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/error-ex": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", - "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-object-atoms": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", - "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/escodegen": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", - "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=6.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" - } - }, - "node_modules/escodegen/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "license": "BSD-3-Clause", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint": { - "version": "10.4.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.4.1.tgz", - "integrity": "sha512-AyIKhnOBuOAdueD7RB3xB+YeAWScb9jHsJBgH2Hcde8InP5JYhqrRR6iTMHyTEwgENK54Cp44e4v8BwNhsuHuw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.8.0", - "@eslint-community/regexpp": "^4.12.2", - "@eslint/config-array": "^0.23.5", - "@eslint/config-helpers": "^0.6.0", - "@eslint/core": "^1.2.1", - "@eslint/plugin-kit": "^0.7.2", - "@humanfs/node": "^0.16.6", - "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.4.2", - "@types/estree": "^1.0.6", - "ajv": "^6.14.0", - "cross-spawn": "^7.0.6", - "debug": "^4.3.2", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^9.1.2", - "eslint-visitor-keys": "^5.0.1", - "espree": "^11.2.0", - "esquery": "^1.7.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^8.0.0", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "minimatch": "^10.2.4", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - }, - "funding": { - "url": "https://eslint.org/donate" - }, - "peerDependencies": { - "jiti": "*" - }, - "peerDependenciesMeta": { - "jiti": { - "optional": true - } - } - }, - "node_modules/eslint-scope": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-9.1.2.tgz", - "integrity": "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@types/esrecurse": "^4.3.1", - "@types/estree": "^1.0.8", - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", - "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/minimatch": { - "version": "10.2.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", - "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "brace-expansion": "^5.0.5" - }, - "engines": { - "node": "18 || 20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/eslint/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/espree": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-11.2.0.tgz", - "integrity": "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "acorn": "^8.16.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^5.0.1" - }, - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/esquery": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", - "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "license": "MIT" - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/expect-utils": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true, - "license": "MIT" - }, - "node_modules/fb-watchman": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "bser": "2.1.1" - } - }, - "node_modules/file-entry-cache": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", - "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "flat-cache": "^4.0.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/flat-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", - "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", - "dev": true, - "license": "MIT", - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.4" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/flatted": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", - "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", - "dev": true, - "license": "ISC" - }, - "node_modules/follow-redirects": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", - "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "license": "MIT", - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/foreground-child": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", - "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", - "dev": true, - "license": "ISC", - "dependencies": { - "cross-spawn": "^7.0.6", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/foreground-child/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, - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/form-data": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", - "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.2", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true, - "license": "ISC" - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "license": "ISC", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/handlebars": { - "version": "4.7.9", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.9.tgz", - "integrity": "sha512-4E71E0rpOaQuJR2A3xDZ+GM1HyWYv1clR58tC8emQNeQe3RH7MAzSbat+V0wG78LQBo6m6bzSG/L4pBuCsgnUQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "minimist": "^1.2.5", - "neo-async": "^2.6.2", - "source-map": "^0.6.1", - "wordwrap": "^1.0.0" - }, - "bin": { - "handlebars": "bin/handlebars" - }, - "engines": { - "node": ">=0.4.7" - }, - "optionalDependencies": { - "uglify-js": "^3.1.4" - } - }, - "node_modules/handlebars/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", - "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/hookable": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz", - "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==", - "license": "MIT" - }, - "node_modules/html-encoding-sniffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", - "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", - "dev": true, - "license": "MIT", - "dependencies": { - "whatwg-encoding": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true, - "license": "MIT" - }, - "node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "license": "MIT", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/immutable": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.6.tgz", - "integrity": "sha512-q1swsS8K7L8usSHuOqF2TAoCCkonYz0SG38wLAggaa4Wml70zixIvt2ql4coQ2C2B3hTjltJry4r6bULwgAXLQ==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/import-local": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", - "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", - "dev": true, - "license": "MIT", - "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "dev": true, - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true, - "license": "ISC" - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true, - "license": "MIT" - }, - "node_modules/is-core-module": { - "version": "2.16.2", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz", - "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==", - "dev": true, - "license": "MIT", - "dependencies": { - "hasown": "^2.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-potential-custom-element-name": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-what": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/is-what/-/is-what-5.5.0.tgz", - "integrity": "sha512-oG7cgbmg5kLYae2N5IVd3jm2s+vldjxJzK1pcu9LfpGuQ93MQSzo0okvRna+7y5ifrD+20FE8FvjusyGaz14fw==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/mesqueeb" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true, - "license": "ISC" - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-report": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-report/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-report/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-source-maps/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/istanbul-reports": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", - "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", - "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/core": "^29.7.0", - "@jest/types": "^29.6.3", - "import-local": "^3.0.2", - "jest-cli": "^29.7.0" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-changed-files": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", - "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", - "dev": true, - "license": "MIT", - "dependencies": { - "execa": "^5.0.0", - "jest-util": "^29.7.0", - "p-limit": "^3.1.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-circus": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", - "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^1.0.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^29.7.0", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "p-limit": "^3.1.0", - "pretty-format": "^29.7.0", - "pure-rand": "^6.0.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-circus/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-circus/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-circus/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-circus/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" - }, - "node_modules/jest-circus/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-circus/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-cli": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", - "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/core": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "create-jest": "^29.7.0", - "exit": "^0.1.2", - "import-local": "^3.0.2", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "yargs": "^17.3.1" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-cli/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-cli/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-cli/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-cli/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" - }, - "node_modules/jest-cli/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-cli/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-config": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", - "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.7.0", - "@jest/types": "^29.6.3", - "babel-jest": "^29.7.0", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-circus": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "micromatch": "^4.0.4", - "parse-json": "^5.2.0", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@types/node": "*", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/jest-config/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-config/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-config/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-config/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" - }, - "node_modules/jest-config/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-config/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-diff": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", - "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^29.6.3", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-diff/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-diff/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-diff/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-diff/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" - }, - "node_modules/jest-diff/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-diff/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-docblock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", - "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "detect-newline": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-each": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", - "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "jest-util": "^29.7.0", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-each/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-each/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-each/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-each/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" - }, - "node_modules/jest-each/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-each/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-environment-jsdom": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-29.7.0.tgz", - "integrity": "sha512-k9iQbsf9OyOfdzWH8HDmrRT0gSIcX+FLNW7IQq94tFX0gynPwqDTW0Ho6iMVNjGz/nb+l/vW3dWM2bbLLpkbXA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/jsdom": "^20.0.0", - "@types/node": "*", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0", - "jsdom": "^20.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "canvas": "^2.5.0" - }, - "peerDependenciesMeta": { - "canvas": { - "optional": true - } - } - }, - "node_modules/jest-environment-node": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", - "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-get-type": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", - "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-haste-map": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", - "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "micromatch": "^4.0.4", - "walker": "^1.0.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "optionalDependencies": { - "fsevents": "^2.3.2" - } - }, - "node_modules/jest-leak-detector": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", - "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", - "dev": true, - "license": "MIT", - "dependencies": { - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-matcher-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", - "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-matcher-utils/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-matcher-utils/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-matcher-utils/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-matcher-utils/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" - }, - "node_modules/jest-matcher-utils/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-matcher-utils/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-message-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", - "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.6.3", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-message-util/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-message-util/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-message-util/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-message-util/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" - }, - "node_modules/jest-message-util/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-message-util/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-mock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", - "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-pnp-resolver": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", - "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - }, - "peerDependencies": { - "jest-resolve": "*" - }, - "peerDependenciesMeta": { - "jest-resolve": { - "optional": true - } - } - }, - "node_modules/jest-regex-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", - "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-resolve": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", - "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "resolve": "^1.20.0", - "resolve.exports": "^2.0.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-resolve-dependencies": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", - "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", - "dev": true, - "license": "MIT", - "dependencies": { - "jest-regex-util": "^29.6.3", - "jest-snapshot": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-resolve/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-resolve/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-resolve/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-resolve/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" - }, - "node_modules/jest-resolve/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-resolve/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-runner": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", - "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/console": "^29.7.0", - "@jest/environment": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "graceful-fs": "^4.2.9", - "jest-docblock": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-leak-detector": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-resolve": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-util": "^29.7.0", - "jest-watcher": "^29.7.0", - "jest-worker": "^29.7.0", - "p-limit": "^3.1.0", - "source-map-support": "0.5.13" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runner/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-runner/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-runner/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-runner/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" - }, - "node_modules/jest-runner/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-runner/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-runtime": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", - "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/globals": "^29.7.0", - "@jest/source-map": "^29.6.3", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runtime/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-runtime/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-runtime/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-runtime/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" - }, - "node_modules/jest-runtime/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-runtime/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-snapshot": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", - "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.11.6", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-jsx": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "natural-compare": "^1.4.0", - "pretty-format": "^29.7.0", - "semver": "^7.5.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-snapshot/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-snapshot/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-snapshot/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-snapshot/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" - }, - "node_modules/jest-snapshot/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-snapshot/node_modules/semver": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.1.tgz", - "integrity": "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jest-snapshot/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-util/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-util/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-util/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-util/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" - }, - "node_modules/jest-util/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-util/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-validate": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", - "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "leven": "^3.1.0", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-validate/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-validate/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-validate/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-validate/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-validate/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" - }, - "node_modules/jest-validate/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-validate/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-watcher": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", - "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "jest-util": "^29.7.0", - "string-length": "^4.0.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-watcher/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-watcher/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-watcher/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-watcher/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" - }, - "node_modules/jest-watcher/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-watcher/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-worker": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", - "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "jest-util": "^29.7.0", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-worker/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/js-beautify": { - "version": "1.15.4", - "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.15.4.tgz", - "integrity": "sha512-9/KXeZUKKJwqCXUdBxFJ3vPh467OCckSBmYDwSK/EtV090K+iMJ7zx2S3HLVDIWFQdqMIsZWbnaGiba18aWhaA==", - "dev": true, - "license": "MIT", - "dependencies": { - "config-chain": "^1.1.13", - "editorconfig": "^1.0.4", - "glob": "^10.4.2", - "js-cookie": "^3.0.5", - "nopt": "^7.2.1" - }, - "bin": { - "css-beautify": "js/bin/css-beautify.js", - "html-beautify": "js/bin/html-beautify.js", - "js-beautify": "js/bin/js-beautify.js" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/js-beautify/node_modules/glob": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", - "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", - "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", - "dev": true, - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/js-beautify/node_modules/minimatch": { - "version": "9.0.9", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", - "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.2" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/js-cookie": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.8.tgz", - "integrity": "sha512-yeJd4aNAdYZQjaon2bpD/Gb0B/omw7HQOsynXXcOiWVCacbBcPlgn8S/d1X6blFSaHao7ozqtW7NZW19xpCtIw==", - "dev": true, - "license": "MIT" - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/js-yaml": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", - "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsdom": { - "version": "20.0.3", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-20.0.3.tgz", - "integrity": "sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "abab": "^2.0.6", - "acorn": "^8.8.1", - "acorn-globals": "^7.0.0", - "cssom": "^0.5.0", - "cssstyle": "^2.3.0", - "data-urls": "^3.0.2", - "decimal.js": "^10.4.2", - "domexception": "^4.0.0", - "escodegen": "^2.0.0", - "form-data": "^4.0.0", - "html-encoding-sniffer": "^3.0.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.1", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.2", - "parse5": "^7.1.1", - "saxes": "^6.0.0", - "symbol-tree": "^3.2.4", - "tough-cookie": "^4.1.2", - "w3c-xmlserializer": "^4.0.0", - "webidl-conversions": "^7.0.0", - "whatwg-encoding": "^2.0.0", - "whatwg-mimetype": "^3.0.0", - "whatwg-url": "^11.0.0", - "ws": "^8.11.0", - "xml-name-validator": "^4.0.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "canvas": "^2.5.0" - }, - "peerDependenciesMeta": { - "canvas": { - "optional": true - } - } - }, - "node_modules/jsesc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", - "dev": true, - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true, - "license": "MIT" - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "license": "MIT" - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, - "license": "MIT", - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lightningcss": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", - "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", - "devOptional": true, - "license": "MPL-2.0", - "dependencies": { - "detect-libc": "^2.0.3" - }, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "optionalDependencies": { - "lightningcss-android-arm64": "1.32.0", - "lightningcss-darwin-arm64": "1.32.0", - "lightningcss-darwin-x64": "1.32.0", - "lightningcss-freebsd-x64": "1.32.0", - "lightningcss-linux-arm-gnueabihf": "1.32.0", - "lightningcss-linux-arm64-gnu": "1.32.0", - "lightningcss-linux-arm64-musl": "1.32.0", - "lightningcss-linux-x64-gnu": "1.32.0", - "lightningcss-linux-x64-musl": "1.32.0", - "lightningcss-win32-arm64-msvc": "1.32.0", - "lightningcss-win32-x64-msvc": "1.32.0" - } - }, - "node_modules/lightningcss-android-arm64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", - "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", - "cpu": [ - "arm64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-darwin-arm64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", - "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", - "cpu": [ - "arm64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-darwin-x64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", - "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", - "cpu": [ - "x64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-freebsd-x64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", - "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", - "cpu": [ - "x64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm-gnueabihf": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", - "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", - "cpu": [ - "arm" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-gnu": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", - "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", - "cpu": [ - "arm64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-musl": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", - "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", - "cpu": [ - "arm64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-gnu": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", - "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", - "cpu": [ - "x64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-musl": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", - "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", - "cpu": [ - "x64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-win32-arm64-msvc": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", - "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", - "cpu": [ - "arm64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-win32-x64-msvc": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", - "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", - "cpu": [ - "x64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true, - "license": "MIT" - }, - "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", - "dev": true, - "license": "MIT" - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/magic-string": { - "version": "0.30.21", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", - "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.5" - } - }, - "node_modules/make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-dir/node_modules/semver": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.1.tgz", - "integrity": "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true, - "license": "ISC" - }, - "node_modules/makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "tmpl": "1.0.5" - } - }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/mdn-data": { - "version": "2.0.30", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", - "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", - "dev": true, - "license": "CC0-1.0" - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true, - "license": "MIT" - }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dev": true, - "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/minimatch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/minipass": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", - "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", - "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "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==", - "license": "MIT" - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "node_modules/nanoid": { - "version": "3.3.12", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", - "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true, - "license": "MIT" - }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true, - "license": "MIT" - }, - "node_modules/node-addon-api": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", - "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", - "license": "MIT", - "optional": true - }, - "node_modules/node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "dev": true, - "license": "MIT" - }, - "node_modules/node-releases": { - "version": "2.0.47", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.47.tgz", - "integrity": "sha512-Uzmd6LXpouKo8EUK68IjH4+E01w/hXyV3R3g/geCJo+rXLNfh1xucB+LOzYEOQPSiUK3h/xZf0cQGcSsmyL2Og==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/nopt": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.1.tgz", - "integrity": "sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==", - "dev": true, - "license": "ISC", - "dependencies": { - "abbrev": "^2.0.0" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } - }, - "node_modules/nwsapi": { - "version": "2.2.23", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.23.tgz", - "integrity": "sha512-7wfH4sLbt4M0gCDzGE6vzQBo0bfTKjU7Sfpqy/7gs1qBfYz2vEJH6vXcBKpO3+6Yu1telwd0t9HpyOoLEQQbIQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/optionator": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", - "dev": true, - "license": "MIT", - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.5" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-locate/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/package-json-from-dist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", - "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", - "dev": true, - "license": "BlueOak-1.0.0" - }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parse5": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", - "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", - "dev": true, - "license": "MIT", - "dependencies": { - "entities": "^6.0.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/parse5/node_modules/entities": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", - "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "license": "MIT", - "engines": { - "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": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true, - "license": "MIT" - }, - "node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true, - "license": "ISC" - }, - "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==", - "license": "MIT" - }, - "node_modules/perfect-scrollbar": { - "version": "1.5.6", - "resolved": "https://registry.npmjs.org/perfect-scrollbar/-/perfect-scrollbar-1.5.6.tgz", - "integrity": "sha512-rixgxw3SxyJbCaSpo1n35A/fwI1r2rdwMKOTCg/AcG+xOEyZcE8UHVjpZMFCVImzsFoCZeJTT+M/rdEIQYO2nw==", - "license": "MIT" - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", - "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pinia": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/pinia/-/pinia-3.0.4.tgz", - "integrity": "sha512-l7pqLUFTI/+ESXn6k3nu30ZIzW5E2WZF/LaHJEpoq6ElcLD+wduZoB2kBN19du6K/4FDpPMazY2wJr+IndBtQw==", - "license": "MIT", - "dependencies": { - "@vue/devtools-api": "^7.7.7" - }, - "funding": { - "url": "https://github.com/sponsors/posva" - }, - "peerDependencies": { - "typescript": ">=4.5.0", - "vue": "^3.5.11" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/pirates": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", - "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/postcss": { - "version": "8.5.15", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz", - "integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.12", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/proto-list": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", - "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", - "dev": true, - "license": "ISC" - }, - "node_modules/proxy-from-env": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz", - "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==", - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/psl": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz", - "integrity": "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==", - "dev": true, - "license": "MIT", - "dependencies": { - "punycode": "^2.3.1" - }, - "funding": { - "url": "https://github.com/sponsors/lupomontero" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/pure-rand": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", - "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/dubzzz" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fast-check" - } - ], - "license": "MIT" - }, - "node_modules/querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true, - "license": "MIT" - }, - "node_modules/readdirp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz", - "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">= 20.19.0" - }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "dev": true, - "license": "MIT" - }, - "node_modules/regenerate-unicode-properties": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.2.tgz", - "integrity": "sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==", - "dev": true, - "license": "MIT", - "dependencies": { - "regenerate": "^1.4.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regexpu-core": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.4.0.tgz", - "integrity": "sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==", - "dev": true, - "license": "MIT", - "dependencies": { - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.2.2", - "regjsgen": "^0.8.0", - "regjsparser": "^0.13.0", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.2.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regjsgen": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/regjsparser": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.1.tgz", - "integrity": "sha512-dLsljMd9sqwRkby8zhO1gSg3PnJIBFid8f4CQj/sXx+7cKx+E7u0PKhZ+U4wmhx7EfmtvnA318oVaIkAB1lRJw==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "jsesc": "~3.1.0" - }, - "bin": { - "regjsparser": "bin/parser" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/resolve": { - "version": "1.22.12", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", - "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "is-core-module": "^2.16.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve.exports": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz", - "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/rfdc": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", - "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", - "license": "MIT" - }, - "node_modules/rolldown": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.3.tgz", - "integrity": "sha512-i00lAJ2ks1BYr7rjNjKC7BcqAS7nVfiT3QX1SI5aY+AFHblCmaUf9OE9dbdzDvW6dJxbi2ZCZiy9v3CcwOiX3g==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "@oxc-project/types": "=0.133.0", - "@rolldown/pluginutils": "^1.0.0" - }, - "bin": { - "rolldown": "bin/cli.mjs" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "optionalDependencies": { - "@rolldown/binding-android-arm64": "1.0.3", - "@rolldown/binding-darwin-arm64": "1.0.3", - "@rolldown/binding-darwin-x64": "1.0.3", - "@rolldown/binding-freebsd-x64": "1.0.3", - "@rolldown/binding-linux-arm-gnueabihf": "1.0.3", - "@rolldown/binding-linux-arm64-gnu": "1.0.3", - "@rolldown/binding-linux-arm64-musl": "1.0.3", - "@rolldown/binding-linux-ppc64-gnu": "1.0.3", - "@rolldown/binding-linux-s390x-gnu": "1.0.3", - "@rolldown/binding-linux-x64-gnu": "1.0.3", - "@rolldown/binding-linux-x64-musl": "1.0.3", - "@rolldown/binding-openharmony-arm64": "1.0.3", - "@rolldown/binding-wasm32-wasi": "1.0.3", - "@rolldown/binding-win32-arm64-msvc": "1.0.3", - "@rolldown/binding-win32-x64-msvc": "1.0.3" - } - }, - "node_modules/rxjs": { - "version": "7.8.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", - "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", - "devOptional": true, - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true, - "license": "MIT" - }, - "node_modules/sass": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.100.0.tgz", - "integrity": "sha512-B5j0rYMlinhhOo9tjQebMVVn0TfyXAF+wB3b2ggZUuJ/is/Y+7+JGjirAMxHZ9Z3hIP98NPfamlAkBHa1lAaXQ==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "chokidar": "^5.0.0", - "immutable": "^5.1.5", - "source-map-js": ">=0.6.2 <2.0.0" - }, - "bin": { - "sass": "sass.js" - }, - "engines": { - "node": ">=20.19.0" - }, - "optionalDependencies": { - "@parcel/watcher": "^2.4.1" - } - }, - "node_modules/sass-embedded": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded/-/sass-embedded-1.100.0.tgz", - "integrity": "sha512-Ut8wlQSk19tm7jMK6mz6cF1+e+E7tUnW2tM02zQDPnOTcVbV8qCQG8UWxZkkNlY50+hV3hqP24OOkUlMz8xBpw==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "@bufbuild/protobuf": "^2.5.0", - "colorjs.io": "^0.5.0", - "immutable": "^5.1.5", - "rxjs": "^7.4.0", - "supports-color": "^8.1.1", - "sync-child-process": "^1.0.2", - "varint": "^6.0.0" - }, - "bin": { - "sass": "dist/bin/sass.js" - }, - "engines": { - "node": ">=16.0.0" - }, - "optionalDependencies": { - "sass-embedded-all-unknown": "1.100.0", - "sass-embedded-android-arm": "1.100.0", - "sass-embedded-android-arm64": "1.100.0", - "sass-embedded-android-riscv64": "1.100.0", - "sass-embedded-android-x64": "1.100.0", - "sass-embedded-darwin-arm64": "1.100.0", - "sass-embedded-darwin-x64": "1.100.0", - "sass-embedded-linux-arm": "1.100.0", - "sass-embedded-linux-arm64": "1.100.0", - "sass-embedded-linux-musl-arm": "1.100.0", - "sass-embedded-linux-musl-arm64": "1.100.0", - "sass-embedded-linux-musl-riscv64": "1.100.0", - "sass-embedded-linux-musl-x64": "1.100.0", - "sass-embedded-linux-riscv64": "1.100.0", - "sass-embedded-linux-x64": "1.100.0", - "sass-embedded-unknown-all": "1.100.0", - "sass-embedded-win32-arm64": "1.100.0", - "sass-embedded-win32-x64": "1.100.0" - } - }, - "node_modules/sass-embedded-all-unknown": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded-all-unknown/-/sass-embedded-all-unknown-1.100.0.tgz", - "integrity": "sha512-auFtXY/kwYILmSVjtBDwyj0axcLbYYiffOKWoaXHnI5bsYwiRbBh3EneR1rpbX2ZIZCrwX93i5pxKLTZF/662Q==", - "cpu": [ - "!arm", - "!arm64", - "!riscv64", - "!x64" - ], - "license": "MIT", - "optional": true, - "dependencies": { - "sass": "1.100.0" - } - }, - "node_modules/sass-embedded-android-arm": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded-android-arm/-/sass-embedded-android-arm-1.100.0.tgz", - "integrity": "sha512-70f3HgX2pFNmzpGQ86n5e6QfWn2fP4QUQGfFQK0P1XH73ZLIzLo2YqygrGKGKeeqtc5eU2Wl1/xQzhzuKnO4kw==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-android-arm64": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.100.0.tgz", - "integrity": "sha512-W+Ru9JwTnfU0UX3jSZcbqFdtKFMcYdfFwytc57h2DgnqCOIiAqI2E06mABZBZC+r3LwXCBuS5GbXAGeVgvVDkA==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-android-riscv64": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded-android-riscv64/-/sass-embedded-android-riscv64-1.100.0.tgz", - "integrity": "sha512-icU3o0V/uCSytSpf+tX5Lf51BvyQEbLzDUJfUi9etSauYBGHpPKkdtdZH0si4v98phq11Kl8rSV1SggksxF1Hg==", - "cpu": [ - "riscv64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-android-x64": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded-android-x64/-/sass-embedded-android-x64-1.100.0.tgz", - "integrity": "sha512-mevF9VQk6gEYByy8+jusaHGmd7Usb2ytX/DsEOd0JtOGCtcf1kh575xJ6OUBDIcJ15uLnbau/0iy1eP6WVBvWA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-darwin-arm64": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.100.0.tgz", - "integrity": "sha512-1PVlYi61POo93IT/FfrG1mc1tAHxeSTyUALF2aOFmXGWjVXr3bQzEQiBGCOvQbj/ix+5hNyXFXcEMEyKvtUJJA==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-darwin-x64": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.100.0.tgz", - "integrity": "sha512-x97o3JnGyImZNCIVs9wQHJUE5QCvmVIKaH1cwrz/5dK7OT1FpeNiW+u9TUomP9hG6Ekjd8EL8NBHpxTfIhdjmg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-linux-arm": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.100.0.tgz", - "integrity": "sha512-9Ul7O1eKrc5YlhwWjkp8tZPSe3UEwSZ1uwUZOQom1HL0pRlBA6F/IlGZYFTLwnHMIP1fc77MMNaBRfc05mKMpw==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-linux-arm64": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.100.0.tgz", - "integrity": "sha512-Dwjmj8Z6VRy7rAi53JAdEwIyUjpfl7PhpSc2/LpQPQx+aO5Dp7Spaipkax0ufJl1SoDUdchCsM4y/88YaluorQ==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-linux-musl-arm": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.100.0.tgz", - "integrity": "sha512-sl0JgbGloPyJg66XXx5UDSDScZ0oU85DpMQU4JU/sCUCFj1Z8zZ69SJWKTCNE4/jwnce7WI2zPCV5AG+RHOZJw==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-linux-musl-arm64": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.100.0.tgz", - "integrity": "sha512-XpACJB2KjSLjf2e9uuvGVdOURsoNrFqgRiihhXyUHK9W0t3LIHb7z5MA/7XGPIT9bWSOO2zyw+rH/FHtDV/Yrg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-linux-musl-riscv64": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-riscv64/-/sass-embedded-linux-musl-riscv64-1.100.0.tgz", - "integrity": "sha512-ShvI0Kx04mwoCARwZ0UjiT97isQvzO80tAt91zmFyHLN9kelc/IrQi940farSm2xQVPCKdeVyeG0ekBsokSpYQ==", - "cpu": [ - "riscv64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-linux-musl-x64": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.100.0.tgz", - "integrity": "sha512-TDBCRWNuS4RDLQXvRc1gjZlWiWTWaWGp0Bwu/IKwJxov81lsvrCs3TihTyNXtW7V5aoN4Ky3r0QOkNb3mwmBnA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-linux-riscv64": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-riscv64/-/sass-embedded-linux-riscv64-1.100.0.tgz", - "integrity": "sha512-j4ENJGOheO+fm3j/yorLxCjBP6/XskrZx7dTLlT+lXYwN/qqCqoA/gsNLI0McS3DFM6GBwPiffzWsdWS8t6sEQ==", - "cpu": [ - "riscv64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-linux-x64": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.100.0.tgz", - "integrity": "sha512-0vUSN8j0WGtCJIOPh//EmUvYGHW0QOe5iul8qyhPk50MAcw49MA0r34AhftjDdx94ILPF6vApFs0gwHPQRlpVA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-unknown-all": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded-unknown-all/-/sass-embedded-unknown-all-1.100.0.tgz", - "integrity": "sha512-c+naBgWId4MIpToXcI0DgqetjdAkwTTAxFAuOaBz7HUXLdyG1oZRrEvSsbe41nEdQOKH0vgofVFCeSQgoXOG9A==", - "license": "MIT", - "optional": true, - "os": [ - "!android", - "!darwin", - "!linux", - "!win32" - ], - "dependencies": { - "sass": "1.100.0" - } - }, - "node_modules/sass-embedded-win32-arm64": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.100.0.tgz", - "integrity": "sha512-iE+yxj+hUXwwbqpHkXxgAWTzeRfcWxJ7SSTQEPMk48lwq3oCrWLlz5sQuWHbuTK/i0GKQfROdP+hOmPi89yjUg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-win32-x64": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.100.0.tgz", - "integrity": "sha512-qI4F8MI7/KYoy9NdjJfhSspG42WPkADSNDvwEV7qWvCSFC83koJssRsKO2/PfY+niZz6BG65Ic/D+A11h959hw==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/sass-embedded/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/sax": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.0.tgz", - "integrity": "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==", - "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=11.0.0" - } - }, - "node_modules/saxes": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", - "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", - "dev": true, - "license": "ISC", - "dependencies": { - "xmlchars": "^2.2.0" - }, - "engines": { - "node": ">=v12.22.7" - } - }, - "node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true, - "license": "MIT" - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/source-map": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "integrity": "sha512-MjZkVp0NHr5+TPihLcadqnlVoGIoWo4IBHptutGh9wI3ttUYvCG26HkSuDi+K6lsZ25syXJXcctwgyVCt//xqA==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", - "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/source-map-support/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/speakingurl": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/speakingurl/-/speakingurl-14.0.1.tgz", - "integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/stack-utils": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "escape-string-regexp": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/stack-utils/node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/superjson": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/superjson/-/superjson-2.2.6.tgz", - "integrity": "sha512-H+ue8Zo4vJmV2nRjpx86P35lzwDT3nItnIsocgumgr0hHMQ+ZGq5vrERg9kJBo5AWGmxZDhzDo+WVIJqkB0cGA==", - "license": "MIT", - "dependencies": { - "copy-anything": "^4" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/svgo": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.3.tgz", - "integrity": "sha512-+wn7I4p7YgJhHs38k2TNjy1vCfPIfLIJWR5MnCStsN8WuuTcBnRKcMHQLMM2ijxGZmDoZwNv8ipl5aTTen62ng==", - "dev": true, - "license": "MIT", - "dependencies": { - "commander": "^7.2.0", - "css-select": "^5.1.0", - "css-tree": "^2.3.1", - "css-what": "^6.1.0", - "csso": "^5.0.5", - "picocolors": "^1.0.0", - "sax": "^1.5.0" - }, - "bin": { - "svgo": "bin/svgo" - }, - "engines": { - "node": ">=14.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/svgo" - } - }, - "node_modules/svgo/node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, - "node_modules/symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "dev": true, - "license": "MIT" - }, - "node_modules/sync-child-process": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/sync-child-process/-/sync-child-process-1.0.2.tgz", - "integrity": "sha512-8lD+t2KrrScJ/7KXCSyfhT3/hRq78rC0wBFqNJXv3mZyn6hW2ypM05JmlSvtqRbeq6jqA94oHbxAr2vYsJ8vDA==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "sync-message-port": "^1.0.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/sync-message-port": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/sync-message-port/-/sync-message-port-1.2.0.tgz", - "integrity": "sha512-gAQ9qrUN/UCypHtGFbbe7Rc/f9bzO88IwrG8TDo/aMKAApKyD6E3W4Cm0EfhfBb6Z6SKt59tTCTfD+n1xmAvMg==", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "license": "ISC", - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/tinyglobby": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", - "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "fdir": "^6.5.0", - "picomatch": "^4.0.4" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, - "node_modules/tinyglobby/node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/tough-cookie": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", - "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.2.0", - "url-parse": "^1.5.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tr46": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", - "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", - "dev": true, - "license": "MIT", - "dependencies": { - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/ts-jest": { - "version": "29.4.11", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.4.11.tgz", - "integrity": "sha512-IrFl7l9AuB/qrNw5quqvAv/hmKMb8dhWOH4jQOGo0Oq8tCeo1O86/iTFG1FaRimgUkF13l4PcepO8ATFT6Ns4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "bs-logger": "^0.2.6", - "fast-json-stable-stringify": "^2.1.0", - "handlebars": "^4.7.9", - "json5": "^2.2.3", - "lodash.memoize": "^4.1.2", - "make-error": "^1.3.6", - "semver": "^7.8.0", - "type-fest": "^4.41.0", - "yargs-parser": "^21.1.1" - }, - "bin": { - "ts-jest": "cli.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0" - }, - "peerDependencies": { - "@babel/core": ">=7.0.0-beta.0 <8", - "@jest/transform": "^29.0.0 || ^30.0.0", - "@jest/types": "^29.0.0 || ^30.0.0", - "babel-jest": "^29.0.0 || ^30.0.0", - "jest": "^29.0.0 || ^30.0.0", - "jest-util": "^29.0.0 || ^30.0.0", - "typescript": ">=4.3 <7" - }, - "peerDependenciesMeta": { - "@babel/core": { - "optional": true - }, - "@jest/transform": { - "optional": true - }, - "@jest/types": { - "optional": true - }, - "babel-jest": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "jest-util": { - "optional": true - } - } - }, - "node_modules/ts-jest/node_modules/semver": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.1.tgz", - "integrity": "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/ts-jest/node_modules/type-fest": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", - "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/tsconfig": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/tsconfig/-/tsconfig-7.0.0.tgz", - "integrity": "sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/strip-bom": "^3.0.0", - "@types/strip-json-comments": "0.0.30", - "strip-bom": "^3.0.0", - "strip-json-comments": "^2.0.0" - } - }, - "node_modules/tsconfig/node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/tsconfig/node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "devOptional": true, - "license": "0BSD" - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "devOptional": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/uglify-js": { - "version": "3.19.3", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", - "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", - "dev": true, - "license": "BSD-2-Clause", - "optional": true, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/undici-types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", - "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.1.tgz", - "integrity": "sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-property-aliases-ecmascript": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.2.0.tgz", - "integrity": "sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/universalify": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", - "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/upath": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/upath/-/upath-2.0.1.tgz", - "integrity": "sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">=4", - "yarn": "*" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", - "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/url-parse": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", - "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, - "node_modules/v8-to-istanbul": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", - "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", - "dev": true, - "license": "ISC", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^2.0.0" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/varint": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/varint/-/varint-6.0.0.tgz", - "integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/vite": { - "version": "8.0.16", - "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.16.tgz", - "integrity": "sha512-h9bXPmJichP5fLmVQo3PyaGSDE2n3aPuomeAlVRm0JLmt4rY6zmPKd59HYI4LNW8oTK7tlTsuC7l/m7awx9Jcw==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "lightningcss": "^1.32.0", - "picomatch": "^4.0.4", - "postcss": "^8.5.15", - "rolldown": "1.0.3", - "tinyglobby": "^0.2.17" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^20.19.0 || >=22.12.0", - "@vitejs/devtools": "^0.1.18", - "esbuild": "^0.27.0 || ^0.28.0", - "jiti": ">=1.21.0", - "less": "^4.0.0", - "sass": "^1.70.0", - "sass-embedded": "^1.70.0", - "stylus": ">=0.54.8", - "sugarss": "^5.0.0", - "terser": "^5.16.0", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "@vitejs/devtools": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "jiti": { - "optional": true - }, - "less": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } - } - }, - "node_modules/vite-plugin-vuetify": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/vite-plugin-vuetify/-/vite-plugin-vuetify-2.1.3.tgz", - "integrity": "sha512-Q4SC/4TqbNvaZIFb9YsfBqkGlYHbJJJ6uU3CnRBZqLUF3s5eCMVZAaV4GkTbehIH/bhSj42lMXztOwc71u6rVw==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "@vuetify/loader-shared": "^2.1.2", - "debug": "^4.3.3", - "upath": "^2.0.1" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "peerDependencies": { - "vite": ">=5", - "vue": "^3.0.0", - "vuetify": ">=3" - } - }, - "node_modules/vite-svg-loader": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/vite-svg-loader/-/vite-svg-loader-5.1.1.tgz", - "integrity": "sha512-RPzcXA/EpKJA0585x58DBgs7my2VfeJ+j2j1EoHY4Zh82Y7hV4cR1fElgy2aZi85+QSrcLLoTStQ5uZjD68u+Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.3.4", - "svgo": "^3.3.3" - }, - "peerDependencies": { - "vue": ">=3.2.13" - } - }, - "node_modules/vite/node_modules/picomatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/vue": { - "version": "3.5.35", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.35.tgz", - "integrity": "sha512-cx89fnr+0kVGHiNFG6y6s0bdjypJRFNZn6x3WPstNdQR1bi1mbB7h4v5IBGTsPJU3nK1+0Iqj3Zf+hZWMieR4Q==", - "license": "MIT", - "dependencies": { - "@vue/compiler-dom": "3.5.35", - "@vue/compiler-sfc": "3.5.35", - "@vue/runtime-dom": "3.5.35", - "@vue/server-renderer": "3.5.35", - "@vue/shared": "3.5.35" - }, - "peerDependencies": { - "typescript": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/vue-component-type-helpers": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/vue-component-type-helpers/-/vue-component-type-helpers-3.3.3.tgz", - "integrity": "sha512-x4nsFpy5Pe8fqPzp/5vkTPeTTDBpAx4WVtV47Ejt0+2FQrq4pRRsJs7JmYRqMFzTu/LW+pCWEjQ3YVCkPV7f9g==", - "dev": true, - "license": "MIT" - }, - "node_modules/vue-router": { - "version": "4.6.4", - "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.6.4.tgz", - "integrity": "sha512-Hz9q5sa33Yhduglwz6g9skT8OBPii+4bFn88w6J+J4MfEo4KRRpmiNG/hHHkdbRFlLBOqxN8y8gf2Fb0MTUgVg==", - "license": "MIT", - "dependencies": { - "@vue/devtools-api": "^6.6.4" - }, - "funding": { - "url": "https://github.com/sponsors/posva" - }, - "peerDependencies": { - "vue": "^3.5.0" - } - }, - "node_modules/vue-router/node_modules/@vue/devtools-api": { - "version": "6.6.4", - "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.4.tgz", - "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==", - "license": "MIT" - }, - "node_modules/vue3-perfect-scrollbar": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/vue3-perfect-scrollbar/-/vue3-perfect-scrollbar-2.0.0.tgz", - "integrity": "sha512-nSWVcRyViCgt0Pe3RhU3w/BllLcFSrEzYOGlRBjSyhVmiZlERHHziffW+9P8L0IMEWouC5t+uYrgNJGSAElqMA==", - "dependencies": { - "perfect-scrollbar": "^1.5.5" - }, - "peerDependencies": { - "vue": "^3.0.0" - } - }, - "node_modules/vuetify": { - "version": "3.12.8", - "resolved": "https://registry.npmjs.org/vuetify/-/vuetify-3.12.8.tgz", - "integrity": "sha512-gvmOWeLd6CG7LVh2Qonft5YrIb7MpbKZglRjg0ItEloSbu6hfUII2RZmRSVxGKYdiXTf7J1hI3BRSHr8J9LkxA==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/johnleider" - }, - "peerDependencies": { - "typescript": ">=4.7", - "vite-plugin-vuetify": ">=2.1.0", - "vue": "^3.5.0", - "webpack-plugin-vuetify": ">=3.1.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - }, - "vite-plugin-vuetify": { - "optional": true - }, - "webpack-plugin-vuetify": { - "optional": true - } - } - }, - "node_modules/w3c-xmlserializer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz", - "integrity": "sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==", - "dev": true, - "license": "MIT", - "dependencies": { - "xml-name-validator": "^4.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "makeerror": "1.0.12" - } - }, - "node_modules/webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - } - }, - "node_modules/whatwg-encoding": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", - "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", - "deprecated": "Use @exodus/bytes instead for a more spec-conformant and faster implementation", - "dev": true, - "license": "MIT", - "dependencies": { - "iconv-lite": "0.6.3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/whatwg-mimetype": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", - "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - } - }, - "node_modules/whatwg-url": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", - "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "tr46": "^3.0.0", - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/word-wrap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/wrap-ansi/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/write-file-atomic": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", - "dev": true, - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/ws": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.0.tgz", - "integrity": "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/xml-name-validator": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", - "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=12" - } - }, - "node_modules/xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "dev": true, - "license": "MIT" - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true, - "license": "ISC" - }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - } -} +{ + "name": "mic-check-admin", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "mic-check-admin", + "version": "1.0.0", + "dependencies": { + "@iconify-json/bxl": "^1.2.0", + "@iconify-json/ri": "^1.2.0", + "@iconify/vue": "^4.1.0", + "@vueuse/core": "^11.0.0", + "axios": "^1.15.0", + "pinia": "^3.0.4", + "vue": "^3.4.0", + "vue-router": "^4.3.0", + "vue3-perfect-scrollbar": "^2.0.0", + "vuetify": "^3.7.5" + }, + "devDependencies": { + "@babel/core": "^7.24.0", + "@babel/preset-env": "^7.24.0", + "@babel/preset-typescript": "^7.24.0", + "@types/jest": "^29.5.12", + "@types/node": "^20.12.0", + "@vitejs/plugin-vue": "^6.0.6", + "@vue/test-utils": "^2.4.6", + "@vue/vue3-jest": "^29.2.6", + "babel-jest": "^29.7.0", + "eslint": "^10.4.1", + "jest": "^29.7.0", + "jest-environment-jsdom": "^29.7.0", + "sass": "^1.77.2", + "sass-embedded": "^1.77.0", + "ts-jest": "^29.1.4", + "typescript": "^5.4.5", + "vite": "^8.0.8", + "vite-plugin-vuetify": "^2.1.3", + "vite-svg-loader": "^5.1.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.29.7", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", + "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", + "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helpers": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz", + "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.29.7.tgz", + "integrity": "sha512-OoK6239jHPuSQOoS0kfTVKn0b/rVTk0seKq4Gd2UMLtmOVLjDC0ki3e+c90Trqv2gMfvJFqkiljrr568+qddiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", + "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.29.7.tgz", + "integrity": "sha512-IY3ZD9Tmooqr3TUhc3DUWxiuo8xx1DWLhd5M7hQ+ZWJamqM2BbalrBJb2MisSLoYorOj75U03qULCxQTY9r3hg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.29.7", + "@babel/helper-member-expression-to-functions": "^7.29.7", + "@babel/helper-optimise-call-expression": "^7.29.7", + "@babel/helper-replace-supers": "^7.29.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7", + "@babel/traverse": "^7.29.7", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.29.7.tgz", + "integrity": "sha512-907Uymvqgg1dwUA+7IGwFAOSYzQOuzPXKNJ1yxzwPffzkYFg2q2eHi1fIOs6sXkG9NbIUMunnUlkYsfRFNvomg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.29.7", + "regexpu-core": "^6.3.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.8.tgz", + "integrity": "sha512-47UwBLPpQi1NoWzLuHNjRoHlYXMwIJoBf7MFou6viC/sIHWYygpvr0B6IAyh5sBdA2nr2LPIRww8lfaUVQINBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "debug": "^4.4.3", + "lodash.debounce": "^4.0.8", + "resolve": "^1.22.11" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.29.7.tgz", + "integrity": "sha512-j+7JYmk1JYDtACIGj0QJqqWZjoUpMoEikQGADMaHgCMCSDqd2+P32rfcibUNrGOMWrlzK1WJBdxrB3JJQZwWtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", + "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", + "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.29.7.tgz", + "integrity": "sha512-+kmGVjcT9RGYzoDwdwEqEvGgKe3BYq+O1iGzjFubaNgZHwYHP6lsF2Yghf4kEuv9BV7tYDZ913aBW9am6YKong==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.29.7.tgz", + "integrity": "sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.29.7.tgz", + "integrity": "sha512-16AMiW26DbXWBbr3B8wNozKM0ydMLB892vaOaJW/fPJdnT8vJk5sdkQcU/isqUxyCE0cEoa8wZOcbgDuC4b6Og==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.29.7", + "@babel/helper-wrap-function": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.29.7.tgz", + "integrity": "sha512-atfGXWSeCiF4DnKZIfmJfQRkSw9b9gNNXR1kqKjbhG4pGYCOnkp8OcTB8E3NXjBu8NpheSnOeNKz8KT7UNFTmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.29.7", + "@babel/helper-optimise-call-expression": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.29.7.tgz", + "integrity": "sha512-brcMGQaVzIeUb+6/bs1Av0f8YuNNjKY2JyvfRCsFuFsdKccEQ5Ges2y74D74NZ1Rz8lKJ9ksJkfqwQFJ/iNEyQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", + "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.29.7.tgz", + "integrity": "sha512-iES0Skag9ERIF68aXadpO6dbXa03mNWK3sEqJaMnLNs/eC3l0lkImdfoy6Y09/SfkpawdAB4RjQ7PVA7TcVGdw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.29.7", + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz", + "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", + "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.7" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.29.7.tgz", + "integrity": "sha512-j8SrR0zLZrRsC09DlszEx8FpMiwukKffYXMK0d5LmOglO7vGG6sz/BR/20yHqWH+Lnn31JTt2PE3hIWNgM2J6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.29.7.tgz", + "integrity": "sha512-r8j8escF+U2FUHo0KOhPUdMzUO+jp9fInva6+ACVAF3Y97Ev+5iNZwiqTghmzNeWwDkOPlYuTcfb1vDaoZKmAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.29.7.tgz", + "integrity": "sha512-GE1TFSiuFeGsCxmYXZl8HwoPrVlwe4rHPFE8weieGKZqnDORK+Ar3vgWMgW+AOxQ6/2TgLSKx9p6W7O4rC6qgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-rest-destructuring-rhs-array": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-rest-destructuring-rhs-array/-/plugin-bugfix-safari-rest-destructuring-rhs-array-7.29.7.tgz", + "integrity": "sha512-oBNVCvnO5tND+xSopWvV8WNGfpTfgP4Zr/YXXSj8zfmcPktp5Ku/aZlsIowgSD4fjmgHn6sGmB9APVsU5zOdhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.29.7.tgz", + "integrity": "sha512-QQt9qKHZ2sg/kivaLr7lnQr8HVrQDdBNSfCsTjiDxRuX/K5ORyKq+Bu8Xr0cDE3Dfkv0cw28Ve0EKyKMvulkOw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7", + "@babel/plugin-transform-optional-chaining": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.29.7.tgz", + "integrity": "sha512-pn6QacGLgvCcwc+syUhKE/qSjV2D1IHDB84RNxWYSt1mW3K/SCtjinZ2p0cETJxAWBjPy3K/1lHwG5BjjPxNlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.29.7.tgz", + "integrity": "sha512-/An1OCBN93thpBAGyfsK2pcf0jvju1SAtKkL2Ny++B5Sy6sqgzXDQH1cZxWbF96Wuk+bn41MDA9bLd4VVAw6rw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.29.7.tgz", + "integrity": "sha512-zGYcYfq/WmZ4V+kBIXQon9dSSc8ircGZqw9ZaNhhGj9nZkeBu1jHLBDQqYYi5WA9uawvA2sIMbry2nCFhf5Djg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.29.7.tgz", + "integrity": "sha512-TSu8+mHCoEaaCDEZ0I3+6mvTBYR4PCxQwf2z9/r5Tbztv6NaLR3B9thGTTxX2WGuGHJqRiAbKPeGTJ5XWXVg6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.29.7.tgz", + "integrity": "sha512-ngr+82Sh0xMz25TPCZi+nC2iTzjfCdWS2ONXTp/PtSCHCgaCNBpdMqgvJ2ccdLlClVZ7sisIgB914j/JFe+RZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.29.7.tgz", + "integrity": "sha512-N7zArUXWzAMzm+/N0uPBeVB3Fam5lMxtUwMmDK5f/IBBS7a7p1qeUoxd/6CckXoxUdgsntq1Dh8xNW06maZbDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.29.7.tgz", + "integrity": "sha512-d98gXZkgswvkyohMBABkhm3GeXhYj8psWfwQ2C7gtfrKGTykQa/iOIi+JJhwMjPlZ6Vm2XN+DCf3Es1EoG4ZLA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-remap-async-to-generator": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.29.7.tgz", + "integrity": "sha512-pcUb2SS+RMo9TWVBwKGI5ShtoG7R+zBsFmCKDa6fe8c+hPr3XJlZgoE5j6i8W7gDjhyvy+85vmYexanvXh3d1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-remap-async-to-generator": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.29.7.tgz", + "integrity": "sha512-cUSmjh72N+rN4PrkFlN1dJwNCwjVp5d38/CQrEsFggkD10UiFlBFgdH3tv5dNsLuHY+3S8db2xCHjhZcv5WgvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.29.7.tgz", + "integrity": "sha512-ONyr4+AZhKh8yKWInVxU9AXA9EbsyeLcL6V0dJy6M2/62vuvpGm29zzuymbTpdc451GEpDIdAyPLP3r+P61yKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.29.7.tgz", + "integrity": "sha512-GtcpjFvanPfzNQi3eTitsCqtRRmmqzpy/A+yhTR1HaZo1Ly3EA8ZXxlPyHdR8/IuRMYc3E4wdGBewB2QKQjAaA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.29.7.tgz", + "integrity": "sha512-kibJgmEdX2iMwsHY2tSZNDgj8PwIlCQz7FK9KuGKO8zsuoUwSEhoNnNVp/emKWrbY4HeO6kkXfdMqRKKKXBm2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.29.7.tgz", + "integrity": "sha512-qV0OGGBVacduzQHE649JyCneOFI/maT+YKsO+K4Yi3xv2wTPNjM/W2o2gdzMwEAZz7fXNTHAe0NcSg30bIN69g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.29.7", + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-globals": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-replace-supers": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.29.7.tgz", + "integrity": "sha512-RK7/IyU5phpuCdBAuig5VkzG/EnbDaui5SQGdU9BFrHdV+mV4cUjLMQ9lJDjLNtWHsqtiefpGZUXQP2BiTYMsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/template": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.29.7.tgz", + "integrity": "sha512-iPX8aD6H9zV5s7ZsqTdNocPN/MGQ5sSMnElKrktxjJRMnB2jN/1p2+R7GkfD6CAYoVFqy5A4XnSIUeGgJzIWpg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.29.7.tgz", + "integrity": "sha512-3qc18hsD2RdZiyJNDNc7HQpv6xbncwh8FYtxNFFzclSyh/trPD9KkVR9BDECUjDLvb7yJVF15GfYUuC+LMkkiQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.29.7.tgz", + "integrity": "sha512-6IvRRriEMqnBwD6chtxdLpMYCHWEzN+oL5cyQtjykya19UgzbmKhxmhZgKC/LHxS2nYr9Q/qYPZ5Lr6jOL9+yQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.29.7.tgz", + "integrity": "sha512-2wiIyo2BjtgU7HufSeDnL9L2O7zr8jmhFKuSr65VpRkUiRKRNpb0mdlk56+XPPKoIrfHqzbMuglDvZun0RISsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.29.7.tgz", + "integrity": "sha512-giOlEm/EFjfjr+te9NsdjkUo2v4f8rS/SXPumRVHAtbNcyNlvtREkU1dZzaIDclNpnaVhlCqRdFKhJBjBikzLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-explicit-resource-management": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.29.7.tgz", + "integrity": "sha512-Rstj7coNz8sE+7Ju7ihpHLI564lsK5pUpNNlvptCIC/16E/S5hbl6n3kESPKdNRmqEWlpn5xpS5Q2dvXBsySLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/plugin-transform-destructuring": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.29.7.tgz", + "integrity": "sha512-zFpMOTLZBdW5LfObqcSbL6kefg4R4eLdmvS0wbN9M6D5Mym/sKm9toOoWyVOa+xDjvCnuWcHls2YonXwHvH3CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.29.7.tgz", + "integrity": "sha512-24B2nOy2TeJSMheqwPD4DDQOV/elLSIlKxjZt4i05H5AgdPdWR3n18HnNrcJ+j76WJd9gbwb9jPjNYUy6RautA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.29.7.tgz", + "integrity": "sha512-zeSIHh0+E1Um1WJRXCFlHQYu2ieJNdivLLjlBEp+dIBu3S51n+SZZmIXjxnItw6pz56Cn+KvK68BIBVsxq2JiQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.29.7.tgz", + "integrity": "sha512-otRWaHXE6fbAGkePvaj/kvs3HsqXfPhlnzwSOlnFgbqCPMd975dW+4wZ00WFBt+/YlBGcJwNrARQTOJOb4ZrIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.29.7.tgz", + "integrity": "sha512-RRnE2+eon1rJAq8MnoF1b5kTpY1vU88twHcvcKMrsqP/jxIRqDVs9iJB5fqPuqyeFAW0wJo4MlUIPpQCq/aRsg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.29.7.tgz", + "integrity": "sha512-DZ/oLP21ZuWx1vKqnoNv6/tvEK48AQOBRai40CX9dTjGluvT/YZCyY3rryDtyUqCEoyNroy5KKPwX2iQCiRvyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.29.7.tgz", + "integrity": "sha512-A0H91hh6W8MFRkp5TqJmMr39jzGD1A1E1Ysiv2O06Sfbhkapm+XyIzxWCEh5kqwOZ1/8QZ0dY3SeQ7XBqfJd5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.29.7.tgz", + "integrity": "sha512-hl1kwFZCCiDyfH25Xmco9jTrkPgnS9pmOzSG7W5I4SaGbLeqKv417hcU2RKmaxoPEgsoJh7ZPOrnPGq99bHoUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.29.7.tgz", + "integrity": "sha512-fxtQoH3m5ywUSIfaH0FGCzWu4McsYon5bD3K4XnskC7f+OyQMj7rsOMi4NvvmJ83WwBAg4UCe+ov4VZlqEvyew==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.29.7.tgz", + "integrity": "sha512-j0vCldybPC5b5dwCQOJ21uKtHzt7hxLygJTg9eF1ScfaikEDNfzn94XoW5Fi+seBR0nCyL23xaBFFkq7dTM8XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.29.7.tgz", + "integrity": "sha512-TM2ZcQLoG2/y4HODiStCo10DibYhWhGWAwVv+EQKmG/7GFl0N+AAmUiXOMKM+aiJ9XBJ9AHVZBvTzMnJ2sM3cQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.29.7.tgz", + "integrity": "sha512-B4UkaTK3QpgCwJnrxKfMPKdo92CN7OKXAlpAAnM3UPu0Q0lCCk57ylA9AJbRy2v8dDKOPAAWcoR6CMyeoHwRCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.29.7.tgz", + "integrity": "sha512-vuFoLwr4qnv2xbZ16SQd6uPcH5FNrLHhk/Jzo++0XJFcaDsr4gjJVg6j398oMHiC+83k/GiBzviwF5KBJkPUtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.29.7.tgz", + "integrity": "sha512-fEo41GmsOUhOBlw8ioo6zvjX5Xc2Lqkzlyfqbpsk3eB6TReV18uhxZ0esfEokVbY2+PVJAQHNKxER6lGrzNd3A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.29.7.tgz", + "integrity": "sha512-idmp1dFaekP9GbcMvG24Kvw2BfhFZjHnNJCkV4WuIY4PskJzwI3f1N5OdgYke38T7rftO6ERulFRn2cFeZwRkg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.29.7.tgz", + "integrity": "sha512-zR7fv/z14OjgHl4AgRtkDBvBMhIzCxqV/qN/2BCRC7LjFwvuzjYe7gDWxC4Wl/SNsLM6SE1IWvRPYMgSJaUvNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.29.7.tgz", + "integrity": "sha512-Ld98jn4c0smUywL57m7SgsHq3OpThOa6LqZJif3G6jYOovPleoFhVrBJ1WegRApSFB2wu4+RelAj9AC9G08Z4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/plugin-transform-destructuring": "^7.29.7", + "@babel/plugin-transform-parameters": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.29.7.tgz", + "integrity": "sha512-Ea/diGcw0twB5IlZPO5sgET6fJsLJqPABqTuFWIR+iMPGPZJkATEIWx0wa+aEQ5UY1CBQyP/gkAiLEqn1vBiQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-replace-supers": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.29.7.tgz", + "integrity": "sha512-sLsyndxK2VwX6yNUOakMb7Sh553ZTe/vVM1XJ+9Z5aW1ytsc8xOIwmyk05NNjN60vkc5/KqoTH6hB4V41LJhng==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.29.7.tgz", + "integrity": "sha512-6GM1dhvK3gNODkXcEcMCOLEDCLSoZ/sBbro2Ax8HURyasQ4NshagQixkRFdh5niI6E4gmA/jYI/4aT7rRos3ZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.29.7.tgz", + "integrity": "sha512-ZDOBqV/qLYJI0YElr8DcENEyARsFQeESqWXH6gZlghYXuPPjvweuDhP4VyEi4BlUBlLRFZVjxoZDMjxhLW766g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.29.7.tgz", + "integrity": "sha512-/6Rz4DK1ETDEM/bWHsPHcaEe7ZaT1EqSXjtSP/L0DijOYuaUhiRiOKcwpZ8P7zR4xXEHc2ITdiCgBm9Tpyv9ug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.29.7.tgz", + "integrity": "sha512-+BNo06dnrzdNNqCm1X6YUaVv0DKk8Q+JYcoZfOkLhYWNCXzlwTSRq8zGWayT1csjcpNXV9CQTBRRbmTLZac5cA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.29.7", + "@babel/helper-create-class-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.29.7.tgz", + "integrity": "sha512-bOMRLQuI0A5ZqHq3OWJ89/rXpJ/NJrbVhXiP4zwPGMs6kpcVsuTUNjwoE30K0Qm3mf48a/TnRYYD6vPNqcg6jA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.29.7.tgz", + "integrity": "sha512-rNNFV0DBAJp988xW2DOntfDoYn1eR8GGF5AT5vYc+rjyfaQkM242c9tZUHHPe7KYaiJizXPWhQTzzdbXySyhBw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regexp-modifiers": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.29.7.tgz", + "integrity": "sha512-mB5Fs0VWrJ42ZCmc8114v60qetdaUVNkj9PmSZRmanCZM3S9hm0CFRLjRmYIsuXav14l2jvZ+4T8iiCGnhj3nQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.29.7.tgz", + "integrity": "sha512-5+YhdpVgmfSmwZyLMftfaiffLRMHjzIRHFHHLdibcSyJm2pasMrKHrO3Ptrt2DRshjvpgjEJJ1zVW14WPq/6QA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.29.7.tgz", + "integrity": "sha512-I+WYbGBAiCn7nA6xBrlgPH+MB7HWb4u8pv5S0Pv7OtwNvIFvCCb24YlttKEeUFVurfBCEaOTnuhlqsb7f0Z5Dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.29.7.tgz", + "integrity": "sha512-/u5K1QWada7tbYNqTjMh96718g9NTwh9tfPJMsSmVsQwGT447FskV+KcfeXkXq2GWki4EM/MuTdmBec+hOuVTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.29.7.tgz", + "integrity": "sha512-BCHzNYJGe9l7EpwwDBN/ztlL2NYFFq8hp9ddjtUEM9f2O7S7kKV/lL6Fwo7IF7NSkYhPK2vO+86nIGltA90MsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.29.7.tgz", + "integrity": "sha512-NCSEJ4sLFU2gqAub45HYh4fus2yQ36rr6ei6vpU7NdoJqCpxvEG8E6eJpscGyXP3VHD2Ny+fSXr04k1hoUrFqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.29.7.tgz", + "integrity": "sha512-223mNGoTkBiTEWFoK+Q6Go3tueMRclO8vxxxxquNCYuNI4jWOofFKJRRDu6SDrB8Sgo1UEGW9T4GAQ8ZyRso1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.29.7.tgz", + "integrity": "sha512-jK52h8LaLc7JarhQV2ofeFMts4H7vnOXnqZNA6fYglBTZewRBE51KWt3BUltW1P+KoPsYkHoJeXePuz4zo2LMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.29.7", + "@babel/helper-create-class-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7", + "@babel/plugin-syntax-typescript": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.29.7.tgz", + "integrity": "sha512-jCfXxSjf94lf4E0hKE0AByxF6F3/pVFqRdUUNkDJhsY0m1ZKjnN6ZYyMeHNpzflxb/0q5b7t3p+BE+SLF1WOtA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.29.7.tgz", + "integrity": "sha512-OgZ+zoAJgZLUCunsTRQ5LAjOywDv5zzZ2/hQ5aMw1pGXyY2rtE8/chXYUmu3AlVHKpm10KEdG9aMwbI/K76ZGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.29.7.tgz", + "integrity": "sha512-7D/x/23/d/3VqZ0QA+LGbZMlGwZjztBygSWWWsfTPoQ1oQ6Q1P6Mr3d0kk42XabyUVw+fha3LqdRsFqeKqvCyA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.29.7.tgz", + "integrity": "sha512-BLOhLht9DOJwIxlmp91wHvkXv1lguuHS3/FwUO8HL1H0u8s4hR1gASVFyilu9iGtcTRYqjTZmlsFFeQletntEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.29.7.tgz", + "integrity": "sha512-GYzX36n1nsciIb0uyH0GHwxwtNwPQIcpxSeiVLDtG/B7jB5xXgchnmL1f/jCX5o+pwnaDBtO60ONSJhEBJfxYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.29.7", + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.29.7", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.29.7", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.29.7", + "@babel/plugin-bugfix-safari-rest-destructuring-rhs-array": "^7.29.7", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.29.7", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.29.7", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-import-assertions": "^7.29.7", + "@babel/plugin-syntax-import-attributes": "^7.29.7", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.29.7", + "@babel/plugin-transform-async-generator-functions": "^7.29.7", + "@babel/plugin-transform-async-to-generator": "^7.29.7", + "@babel/plugin-transform-block-scoped-functions": "^7.29.7", + "@babel/plugin-transform-block-scoping": "^7.29.7", + "@babel/plugin-transform-class-properties": "^7.29.7", + "@babel/plugin-transform-class-static-block": "^7.29.7", + "@babel/plugin-transform-classes": "^7.29.7", + "@babel/plugin-transform-computed-properties": "^7.29.7", + "@babel/plugin-transform-destructuring": "^7.29.7", + "@babel/plugin-transform-dotall-regex": "^7.29.7", + "@babel/plugin-transform-duplicate-keys": "^7.29.7", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.29.7", + "@babel/plugin-transform-dynamic-import": "^7.29.7", + "@babel/plugin-transform-explicit-resource-management": "^7.29.7", + "@babel/plugin-transform-exponentiation-operator": "^7.29.7", + "@babel/plugin-transform-export-namespace-from": "^7.29.7", + "@babel/plugin-transform-for-of": "^7.29.7", + "@babel/plugin-transform-function-name": "^7.29.7", + "@babel/plugin-transform-json-strings": "^7.29.7", + "@babel/plugin-transform-literals": "^7.29.7", + "@babel/plugin-transform-logical-assignment-operators": "^7.29.7", + "@babel/plugin-transform-member-expression-literals": "^7.29.7", + "@babel/plugin-transform-modules-amd": "^7.29.7", + "@babel/plugin-transform-modules-commonjs": "^7.29.7", + "@babel/plugin-transform-modules-systemjs": "^7.29.7", + "@babel/plugin-transform-modules-umd": "^7.29.7", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.29.7", + "@babel/plugin-transform-new-target": "^7.29.7", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.29.7", + "@babel/plugin-transform-numeric-separator": "^7.29.7", + "@babel/plugin-transform-object-rest-spread": "^7.29.7", + "@babel/plugin-transform-object-super": "^7.29.7", + "@babel/plugin-transform-optional-catch-binding": "^7.29.7", + "@babel/plugin-transform-optional-chaining": "^7.29.7", + "@babel/plugin-transform-parameters": "^7.29.7", + "@babel/plugin-transform-private-methods": "^7.29.7", + "@babel/plugin-transform-private-property-in-object": "^7.29.7", + "@babel/plugin-transform-property-literals": "^7.29.7", + "@babel/plugin-transform-regenerator": "^7.29.7", + "@babel/plugin-transform-regexp-modifiers": "^7.29.7", + "@babel/plugin-transform-reserved-words": "^7.29.7", + "@babel/plugin-transform-shorthand-properties": "^7.29.7", + "@babel/plugin-transform-spread": "^7.29.7", + "@babel/plugin-transform-sticky-regex": "^7.29.7", + "@babel/plugin-transform-template-literals": "^7.29.7", + "@babel/plugin-transform-typeof-symbol": "^7.29.7", + "@babel/plugin-transform-unicode-escapes": "^7.29.7", + "@babel/plugin-transform-unicode-property-regex": "^7.29.7", + "@babel/plugin-transform-unicode-regex": "^7.29.7", + "@babel/plugin-transform-unicode-sets-regex": "^7.29.7", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.15", + "babel-plugin-polyfill-corejs3": "^0.14.0", + "babel-plugin-polyfill-regenerator": "^0.6.6", + "core-js-compat": "^3.48.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/preset-typescript": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.29.7.tgz", + "integrity": "sha512-/Foi8vKY2EVbed/1eZx0gJEEwHAIxogrySI7rULcRIvhZzbvoE/b5qG5Ghc0WKAFKOHA9SD1x7RsFlOYdutIiQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", + "@babel/plugin-syntax-jsx": "^7.29.7", + "@babel/plugin-transform-modules-commonjs": "^7.29.7", + "@babel/plugin-transform-typescript": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz", + "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", + "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@bufbuild/protobuf": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@bufbuild/protobuf/-/protobuf-2.12.0.tgz", + "integrity": "sha512-B/XlCaFIP8LOwzo+bz5uFzATYokcwCKQcghqnlfwSmM5eX/qTkvDBnDPs+gXtX/RyjxJ4DRikECcPJbyALA8FA==", + "devOptional": true, + "license": "(Apache-2.0 AND BSD-3-Clause)" + }, + "node_modules/@emnapi/core": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.10.0.tgz", + "integrity": "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==", + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.1", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz", + "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz", + "integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.23.5", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.23.5.tgz", + "integrity": "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^3.0.5", + "debug": "^4.3.1", + "minimatch": "^10.2.4" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/config-array/node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.6.0.tgz", + "integrity": "sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^1.2.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/core": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.2.1.tgz", + "integrity": "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/object-schema": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-3.0.5.tgz", + "integrity": "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.7.2.tgz", + "integrity": "sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^1.2.1", + "levn": "^0.4.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz", + "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/types": "^0.15.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz", + "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.2", + "@humanfs/types": "^0.15.0", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/types": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz", + "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@iconify-json/bxl": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@iconify-json/bxl/-/bxl-1.2.4.tgz", + "integrity": "sha512-R6gVQSxB1+XeVClK7KdACnk1SfP8xiAu6LHuKZmp6Ro5zwMQbpe9vFBv30F6eHMDL8lZ7eXuac5SRJ9C8DKehQ==", + "license": "MIT", + "dependencies": { + "@iconify/types": "*" + } + }, + "node_modules/@iconify-json/ri": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/@iconify-json/ri/-/ri-1.2.10.tgz", + "integrity": "sha512-WWMhoncVVM+Xmu9T5fgu2lhYRrKTEWhKk3Com0KiM111EeEsRLiASjpsFKnC/SrB6covhUp95r2mH8tGxhgd5Q==", + "license": "Apache-2.0", + "dependencies": { + "@iconify/types": "*" + } + }, + "node_modules/@iconify/types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz", + "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==", + "license": "MIT" + }, + "node_modules/@iconify/vue": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@iconify/vue/-/vue-4.3.0.tgz", + "integrity": "sha512-Xq0h6zMrHBbrW8jXJ9fISi+x8oDQllg5hTDkDuxnWiskJ63rpJu9CvJshj8VniHVTbsxCg9fVoPAaNp3RQI5OQ==", + "license": "MIT", + "dependencies": { + "@iconify/types": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/cyberalien" + }, + "peerDependencies": { + "vue": ">=3" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.6.tgz", + "integrity": "sha512-+Sg6GCR/wy1oSmQDFq4LQDAhm3ETKnorxN+y5nbLULOR3P0c14f2Wurzj3/xqPXtasLFfHd5iRFQ7AJt4KH2cw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/console/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/console/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/console/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/console/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jest/console/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/core": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/core/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/core/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/core/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/core/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jest/core/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/core/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/environment": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-get-type": "^29.6.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/types": "^29.6.3", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/reporters/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/reporters/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/reporters/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/reporters/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jest/reporters/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/reporters/node_modules/istanbul-lib-instrument": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@jest/reporters/node_modules/semver": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.1.tgz", + "integrity": "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@jest/reporters/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", + "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.18", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/transform/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/transform/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/transform/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jest/transform/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/transform/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/types/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/types/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/types/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jest/types/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/types/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.4.tgz", + "integrity": "sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==", + "license": "MIT", + "optional": true, + "dependencies": { + "@tybys/wasm-util": "^0.10.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "peerDependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1" + } + }, + "node_modules/@one-ini/wasm": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@one-ini/wasm/-/wasm-0.1.1.tgz", + "integrity": "sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@oxc-project/types": { + "version": "0.133.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.133.0.tgz", + "integrity": "sha512-KzkdCd6Uxqnf6l3HOw1xfatAlUURA0g14cvBYFyJ5SaNOQbOUvBr9PKArcPcrNIeRsBdgcUzOGrhKveVpvOIGA==", + "devOptional": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, + "node_modules/@parcel/watcher": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.6.tgz", + "integrity": "sha512-tmmZ3lQxAe/k/+rNnXQRawJ4NjxO2hqiOLTHvWchtGZULp4RyFeh6aU4XdOYBFe2KE1oShQTv4AblOs2iOrNnQ==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "detect-libc": "^2.0.3", + "is-glob": "^4.0.3", + "node-addon-api": "^7.0.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "@parcel/watcher-android-arm64": "2.5.6", + "@parcel/watcher-darwin-arm64": "2.5.6", + "@parcel/watcher-darwin-x64": "2.5.6", + "@parcel/watcher-freebsd-x64": "2.5.6", + "@parcel/watcher-linux-arm-glibc": "2.5.6", + "@parcel/watcher-linux-arm-musl": "2.5.6", + "@parcel/watcher-linux-arm64-glibc": "2.5.6", + "@parcel/watcher-linux-arm64-musl": "2.5.6", + "@parcel/watcher-linux-x64-glibc": "2.5.6", + "@parcel/watcher-linux-x64-musl": "2.5.6", + "@parcel/watcher-win32-arm64": "2.5.6", + "@parcel/watcher-win32-ia32": "2.5.6", + "@parcel/watcher-win32-x64": "2.5.6" + } + }, + "node_modules/@parcel/watcher-android-arm64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.6.tgz", + "integrity": "sha512-YQxSS34tPF/6ZG7r/Ih9xy+kP/WwediEUsqmtf0cuCV5TPPKw/PQHRhueUo6JdeFJaqV3pyjm0GdYjZotbRt/A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-arm64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.6.tgz", + "integrity": "sha512-Z2ZdrnwyXvvvdtRHLmM4knydIdU9adO3D4n/0cVipF3rRiwP+3/sfzpAwA/qKFL6i1ModaabkU7IbpeMBgiVEA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-x64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.6.tgz", + "integrity": "sha512-HgvOf3W9dhithcwOWX9uDZyn1lW9R+7tPZ4sug+NGrGIo4Rk1hAXLEbcH1TQSqxts0NYXXlOWqVpvS1SFS4fRg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-freebsd-x64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.6.tgz", + "integrity": "sha512-vJVi8yd/qzJxEKHkeemh7w3YAn6RJCtYlE4HPMoVnCpIXEzSrxErBW5SJBgKLbXU3WdIpkjBTeUNtyBVn8TRng==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-glibc": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.6.tgz", + "integrity": "sha512-9JiYfB6h6BgV50CCfasfLf/uvOcJskMSwcdH1PHH9rvS1IrNy8zad6IUVPVUfmXr+u+Km9IxcfMLzgdOudz9EQ==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-musl": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.6.tgz", + "integrity": "sha512-Ve3gUCG57nuUUSyjBq/MAM0CzArtuIOxsBdQ+ftz6ho8n7s1i9E1Nmk/xmP323r2YL0SONs1EuwqBp2u1k5fxg==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-glibc": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.6.tgz", + "integrity": "sha512-f2g/DT3NhGPdBmMWYoxixqYr3v/UXcmLOYy16Bx0TM20Tchduwr4EaCbmxh1321TABqPGDpS8D/ggOTaljijOA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-musl": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.6.tgz", + "integrity": "sha512-qb6naMDGlbCwdhLj6hgoVKJl2odL34z2sqkC7Z6kzir8b5W65WYDpLB6R06KabvZdgoHI/zxke4b3zR0wAbDTA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-glibc": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.6.tgz", + "integrity": "sha512-kbT5wvNQlx7NaGjzPFu8nVIW1rWqV780O7ZtkjuWaPUgpv2NMFpjYERVi0UYj1msZNyCzGlaCWEtzc+exjMGbQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-musl": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.6.tgz", + "integrity": "sha512-1JRFeC+h7RdXwldHzTsmdtYR/Ku8SylLgTU/reMuqdVD7CtLwf0VR1FqeprZ0eHQkO0vqsbvFLXUmYm/uNKJBg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-arm64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.6.tgz", + "integrity": "sha512-3ukyebjc6eGlw9yRt678DxVF7rjXatWiHvTXqphZLvo7aC5NdEgFufVwjFfY51ijYEWpXbqF5jtrK275z52D4Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-ia32": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.6.tgz", + "integrity": "sha512-k35yLp1ZMwwee3Ez/pxBi5cf4AoBKYXj00CZ80jUz5h8prpiaQsiRPKQMxoLstNuqe2vR4RNPEAEcjEFzhEz/g==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-x64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.6.tgz", + "integrity": "sha512-hbQlYcCq5dlAX9Qx+kFb0FHue6vbjlf0FrNzSKdYK2APUf7tGfGxQCk2ihEREmbR6ZMc0MVAD5RIX/41gpUzTw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.3.tgz", + "integrity": "sha512-454rs7jHngixp/NMxd5srYD57OnzSlZ/eFTETjORQHLwJG1lRtmNOJcBerZlfu4GjKqeq8aCCIQrMdHyhI51Hw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.3.tgz", + "integrity": "sha512-PcAhP+ynjURNyy8SKGl5DQP94aGuB/7JrXJb/t7P+hanXvQVMWzUvRRhBAcg/lNRadBhoUPqSoP4xw5tR/KBEA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.3.tgz", + "integrity": "sha512-9YpfeUvSE2RS7wysJ81uOZkXJz7f7Q55H2Gvp3VEw/EsahqDtrphrZ0EwDLK5vvKOzaCrBsjF8JmnMLcUt78Gg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.3.tgz", + "integrity": "sha512-yB1IlAsSNHncV6SCTL27/MVGR5htvQsoGxIv5KMGXALp+Ll1wYsn+x98M9MW7qa+NdSbvrrY7ANI4wLJ0n1e6g==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.3.tgz", + "integrity": "sha512-Yi30IVAAfLUCy2MseFjbB1jAMDl1VMCAas5StnYp8da9+CKvMd2H2cbEjWcw5NPaPqzvYkVIaF1nNUG+b7u/sw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.3.tgz", + "integrity": "sha512-jsO7R8To+AdlYgUmN5sHSCZbfhtMBkO0WUx8iORQnPcMMdgr7qM2DQmMwgabs3GhNztdmoKkMKQFHD6DTMCIQw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.3.tgz", + "integrity": "sha512-VWkUHwWriDciit80wleYwKILoR/KMvxh/IdwS/paX+ZgpuRpCrKLUdadJbc0NpBEiyhpYawsJ73j9aCvOH+f7Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.3.tgz", + "integrity": "sha512-5f1laC0SlIR0yDbFCd8acUhvJIag6N3zC5P7oUPN6wX0aOma+uKJ0wBDH5aq7I1PVI2ttTlhJwzwRIBnLiSGEg==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.3.tgz", + "integrity": "sha512-Iq4ko0r4XsgbrF/LunNgHtAGLRRVE2kXonAXQ/MV0mC6jQpMOhW1SvtZja2EhC/kd05++bP78dsqBeIQyYJ6Yg==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.3.tgz", + "integrity": "sha512-B8m6tD5+/N5FeNQFbKlLA/2yVq9ycQP1SeedyEYYKWBNR3ZQbkvIUcNnDNM03lO1l5F2roiiFJGgvoLLyZXtSg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.3.tgz", + "integrity": "sha512-pSdpdUJHkuCxun9LE7jvgUB9qsRgaiyNNCX7m/AvHTcq67AiT/Yhoxvw5zPfhrM8k/BfP8ce/hMOpthKDpEUow==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.3.tgz", + "integrity": "sha512-OXXS3RKJgX2uLwM+gYyuH5omcH8fL1LJs96pZGgtetVCahON57+d4SJHzTgZiOjxgGkSnpXpOsWuPDGAKAigEg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-wasm32-wasi": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.3.tgz", + "integrity": "sha512-JTtb8BWFynicNSoPrehsCzBtOKjZ6jhMiPFEmOiuXg1Fl8dn2KHQob+GuPSGR0dryQa1PQJbzjF3dqO/whhjLg==", + "cpu": [ + "wasm32" + ], + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "1.10.0", + "@emnapi/runtime": "1.10.0", + "@napi-rs/wasm-runtime": "^1.1.4" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.3.tgz", + "integrity": "sha512-gEdFFEN70A/jxb2svrWsN3aDL7OUtmvlOy+6fa2jxG8K0wQ1ZbdeLGnidov6Yu5/733dI5ySfzFlQ/cb0bSz1g==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.3.tgz", + "integrity": "sha512-eXB7CHuaQdqmJcc3koCNtNPmT/bj2gc999kUFgBxG8Ac0NdgXc4rkCHhqrgrhN3zddvvvrgzj1e90SuSfmyIXA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", + "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.10", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.10.tgz", + "integrity": "sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/@tootallnate/once": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.1.tgz", + "integrity": "sha512-HqmEUIGRJ5fSXchkVgR5F7qn48bDBzv0kWj/Kfu5e6uci4UlEeng4331LnBkWffb++Ei3FOVLxo8JJWMFBDMeQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.2.tgz", + "integrity": "sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "node_modules/@types/esrecurse": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@types/esrecurse/-/esrecurse-4.3.1.tgz", + "integrity": "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jest": { + "version": "29.5.14", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.14.tgz", + "integrity": "sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "expect": "^29.0.0", + "pretty-format": "^29.0.0" + } + }, + "node_modules/@types/jsdom": { + "version": "20.0.1", + "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-20.0.1.tgz", + "integrity": "sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/tough-cookie": "*", + "parse5": "^7.0.0" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "20.19.41", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.41.tgz", + "integrity": "sha512-ECymXOukMnOoVkC2bb1Vc/w/836DXncOg5m8Xj1RH7xSHZJWNYY6Zh7EH477vcnD5egKNNfy2RpNOmuChhFPgQ==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-xevGOReSYGM7g/kUBZzPqCrR/KYAo+F0yiPc85WFTJa0MSLtyFTVTU6cJu/aV4mid7IffDIWqo69THF2o4JiEQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/strip-json-comments": { + "version": "0.0.30", + "resolved": "https://registry.npmjs.org/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz", + "integrity": "sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/tough-cookie": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", + "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/web-bluetooth": { + "version": "0.0.20", + "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.20.tgz", + "integrity": "sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==", + "license": "MIT" + }, + "node_modules/@types/yargs": { + "version": "17.0.35", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz", + "integrity": "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vitejs/plugin-vue": { + "version": "6.0.7", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-6.0.7.tgz", + "integrity": "sha512-km+p+XdSz9Sxm5rqUbqcSfZYaAniKxWBj1KURl+Jr7UaPvvX7BmaWMdP69I5rrFDeQGyxAG7NXdc57vz+snhWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rolldown/pluginutils": "^1.0.1" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.5.35", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.35.tgz", + "integrity": "sha512-BUmHaR1J+O+CKZ9uJucdVTEr1LHsdyvv7vG3eNRhK3CczEHeMd/LtsHAuD7PbrxvI2envCY2v7HI1vC1aBRzKw==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.3", + "@vue/shared": "3.5.35", + "entities": "^7.0.1", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.35", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.35.tgz", + "integrity": "sha512-k+bprkXxuqhVajgTx5mUHuir7TwQzUKOWR40ng1ncAqQRPnrLngGGgqVEEhOnTMlc8btHYVKmrP8s5Qyg0hvYA==", + "license": "MIT", + "dependencies": { + "@vue/compiler-core": "3.5.35", + "@vue/shared": "3.5.35" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.5.35", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.35.tgz", + "integrity": "sha512-G5VPMcXTSywXBgtFOZOnHKBxKSrwXUcvY1iaF5/hRcy7t0J6CH/d8ha9F4nzi00Fax1eLV0QHM7v4mQu68jydw==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.3", + "@vue/compiler-core": "3.5.35", + "@vue/compiler-dom": "3.5.35", + "@vue/compiler-ssr": "3.5.35", + "@vue/shared": "3.5.35", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.21", + "postcss": "^8.5.15", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.5.35", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.35.tgz", + "integrity": "sha512-rGhAeXgdM7/ffTJGXT69rCCdTmjDewnFuUZfBQQHTdcEBeWdT5HCGY60y2ytLJr9/Dsu7IntUi5z/w0h6Rjnzw==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.35", + "@vue/shared": "3.5.35" + } + }, + "node_modules/@vue/devtools-api": { + "version": "7.7.9", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-7.7.9.tgz", + "integrity": "sha512-kIE8wvwlcZ6TJTbNeU2HQNtaxLx3a84aotTITUuL/4bzfPxzajGBOoqjMhwZJ8L9qFYDU/lAYMEEm11dnZOD6g==", + "license": "MIT", + "dependencies": { + "@vue/devtools-kit": "^7.7.9" + } + }, + "node_modules/@vue/devtools-kit": { + "version": "7.7.9", + "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-7.7.9.tgz", + "integrity": "sha512-PyQ6odHSgiDVd4hnTP+aDk2X4gl2HmLDfiyEnn3/oV+ckFDuswRs4IbBT7vacMuGdwY/XemxBoh302ctbsptuA==", + "license": "MIT", + "dependencies": { + "@vue/devtools-shared": "^7.7.9", + "birpc": "^2.3.0", + "hookable": "^5.5.3", + "mitt": "^3.0.1", + "perfect-debounce": "^1.0.0", + "speakingurl": "^14.0.1", + "superjson": "^2.2.2" + } + }, + "node_modules/@vue/devtools-shared": { + "version": "7.7.9", + "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-7.7.9.tgz", + "integrity": "sha512-iWAb0v2WYf0QWmxCGy0seZNDPdO3Sp5+u78ORnyeonS6MT4PC7VPrryX2BpMJrwlDeaZ6BD4vP4XKjK0SZqaeA==", + "license": "MIT", + "dependencies": { + "rfdc": "^1.4.1" + } + }, + "node_modules/@vue/reactivity": { + "version": "3.5.35", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.35.tgz", + "integrity": "sha512-tVc+SsHConvh/Lz64qq1pP3rYArBmK42xonovEcxY74SQtvctZodG/zhq54P5dr38cVuw25d27cPNRdlMidpGQ==", + "license": "MIT", + "dependencies": { + "@vue/shared": "3.5.35" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.5.35", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.35.tgz", + "integrity": "sha512-A/xFNX9loIcWDygeQuNCfKuh0CoYBzxhqEMNah5TSFg9Z53DrFYEN2qi5CU9necjM1OWYegYREUTHmXTmhfXtg==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.35", + "@vue/shared": "3.5.35" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.5.35", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.35.tgz", + "integrity": "sha512-odrJ1C391dbGnyDRh8U+rnP7J2amIEzfmRk5vXy7xi3aZhEXofTvpi0T4HJb6jlNqQZTNPR5MPHSB3RHNkIORA==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.35", + "@vue/runtime-core": "3.5.35", + "@vue/shared": "3.5.35", + "csstype": "^3.2.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.5.35", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.35.tgz", + "integrity": "sha512-NkebSOYdB97wi8OQcO3HqzZSlymJi/aWsN/7h74OSVhRTm6qGs3Jp3e0rCXynmWwSlKeRrnlIug+ilYoHBmQDA==", + "license": "MIT", + "dependencies": { + "@vue/compiler-ssr": "3.5.35", + "@vue/shared": "3.5.35" + }, + "peerDependencies": { + "vue": "3.5.35" + } + }, + "node_modules/@vue/shared": { + "version": "3.5.35", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.35.tgz", + "integrity": "sha512-zSbjL7gRXwks2ZQLRGCajBtBXEOXW9Ddhn/HvSdrGkE2dqGnumzW8XtusRrxrE9LvqtiqDXQ+A60Hp6mvdYxfA==", + "license": "MIT" + }, + "node_modules/@vue/test-utils": { + "version": "2.4.10", + "resolved": "https://registry.npmjs.org/@vue/test-utils/-/test-utils-2.4.10.tgz", + "integrity": "sha512-SmoZ5EA1kYiAFs9NkYdiFFQF+cSnUwnvlYEbY+DogWQZUiqOm/Y29eSbc5T6yi75SgSF9863SBeXniIEoPajCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "js-beautify": "^1.14.9", + "vue-component-type-helpers": "^3.0.0" + }, + "peerDependencies": { + "@vue/compiler-dom": "3.x", + "@vue/server-renderer": "3.x", + "vue": "3.x" + }, + "peerDependenciesMeta": { + "@vue/server-renderer": { + "optional": true + } + } + }, + "node_modules/@vue/vue3-jest": { + "version": "29.2.6", + "resolved": "https://registry.npmjs.org/@vue/vue3-jest/-/vue3-jest-29.2.6.tgz", + "integrity": "sha512-Hy4i2BsV5fUmER5LplYiAeRkLTDCSB3ZbnAeEawXtjto/ILaOnamBAoAvEqARgPpR6NRtiYjSgGKmllMtnFd9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/plugin-transform-modules-commonjs": "^7.2.0", + "chalk": "^2.1.0", + "convert-source-map": "^1.6.0", + "css-tree": "^2.0.1", + "source-map": "0.5.6", + "tsconfig": "^7.0.0" + }, + "engines": { + "node": ">10" + }, + "peerDependencies": { + "@babel/core": "7.x", + "babel-jest": "29.x", + "jest": "29.x", + "typescript": ">= 4.3", + "vue": "^3.0.0-0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@vue/vue3-jest/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vuetify/loader-shared": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@vuetify/loader-shared/-/loader-shared-2.1.2.tgz", + "integrity": "sha512-X+1jBLmXHkpQEnC0vyOb4rtX2QSkBiFhaFXz8yhQqN2A4vQ6k2nChxN4Ol7VAY5KoqMdFoRMnmNdp/1qYXDQig==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "upath": "^2.0.1" + }, + "peerDependencies": { + "vue": "^3.0.0", + "vuetify": ">=3" + } + }, + "node_modules/@vueuse/core": { + "version": "11.3.0", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-11.3.0.tgz", + "integrity": "sha512-7OC4Rl1f9G8IT6rUfi9JrKiXy4bfmHhZ5x2Ceojy0jnd3mHNEvV4JaRygH362ror6/NZ+Nl+n13LPzGiPN8cKA==", + "license": "MIT", + "dependencies": { + "@types/web-bluetooth": "^0.0.20", + "@vueuse/metadata": "11.3.0", + "@vueuse/shared": "11.3.0", + "vue-demi": ">=0.14.10" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/core/node_modules/vue-demi": { + "version": "0.14.10", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz", + "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/@vueuse/metadata": { + "version": "11.3.0", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-11.3.0.tgz", + "integrity": "sha512-pwDnDspTqtTo2HwfLw4Rp6yywuuBdYnPYDq+mO38ZYKGebCUQC/nVj/PXSiK9HX5otxLz8Fn7ECPbjiRz2CC3g==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/shared": { + "version": "11.3.0", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-11.3.0.tgz", + "integrity": "sha512-P8gSSWQeucH5821ek2mn/ciCk+MS/zoRKqdQIM3bHq6p7GXDAJLmnRRKmF5F65sAVJIfzQlwR3aDzwCn10s8hA==", + "license": "MIT", + "dependencies": { + "vue-demi": ">=0.14.10" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/shared/node_modules/vue-demi": { + "version": "0.14.10", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz", + "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/abab": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + "deprecated": "Use your platform's native atob() and btoa() methods instead", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/abbrev": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", + "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/acorn": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-globals": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-7.0.1.tgz", + "integrity": "sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.1.0", + "acorn-walk": "^8.0.2" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.5", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.5.tgz", + "integrity": "sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/ajv": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/axios": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.16.1.tgz", + "integrity": "sha512-caYkukvroVPO8KrzuJEb50Hm07KwfBZPEC3VeFHTsqWHvKTsy54hjJz9BS/cdaypROE2rH6xvm9mHX4fgWkr3A==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.16.0", + "form-data": "^4.0.5", + "https-proxy-agent": "^5.0.1", + "proxy-from-env": "^2.1.0" + } + }, + "node_modules/babel-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/transform": "^29.7.0", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.6.3", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-jest/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/babel-jest/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/babel-jest/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/babel-jest/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/babel-jest/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-jest/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", + "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.17", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.17.tgz", + "integrity": "sha512-aTyf30K/rqAsNwN76zYrdtx8obu0E4KoUME29B1xj+B3WxgvWkp943vYQ+z8Mv3lw9xHXMHpvSPOBxzAkIa94w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-define-polyfill-provider": "^0.6.8", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.14.2.tgz", + "integrity": "sha512-coWpDLJ410R781Npmn/SIBZEsAetR4xVi0SxLMXPaMO4lSf1MwnkGYMtkFxew0Dn8B3/CpbpYxN0JCgg8mn67g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.8", + "core-js-compat": "^3.48.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.8.tgz", + "integrity": "sha512-M762rNHfSF1EV3SLtnCJXFoQbbIIz0OyRwnCmV0KPC7qosSfCO0QLTSuJX3ayAebubhE6oYBAYPrBA5ljowaZg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.8" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz", + "integrity": "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-import-attributes": "^7.24.7", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5" + }, + "peerDependencies": { + "@babel/core": "^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/babel-preset-jest": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", + "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", + "dev": true, + "license": "MIT", + "dependencies": { + "babel-plugin-jest-hoist": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.33", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.33.tgz", + "integrity": "sha512-bA6+tcSLpz2tIEdDXZPpPTIuxBcC4+w6SieaYyfigIa4h8GlFxbA17v22Vx3JUtuZQj9SgOsnbK+aTBzyDyEuw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/birpc": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/birpc/-/birpc-2.9.0.tgz", + "integrity": "sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true, + "license": "ISC" + }, + "node_modules/brace-expansion": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", + "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.28.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", + "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.10.12", + "caniuse-lite": "^1.0.30001782", + "electron-to-chromium": "^1.5.328", + "node-releases": "^2.0.36", + "update-browserslist-db": "^1.2.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-json-stable-stringify": "2.x" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001793", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001793.tgz", + "integrity": "sha512-iwSsYWaCOoh26cV8NwNRViHlrfUvYsHDfRVcbtmw0Kg6PJIZZXwMkj1442FYLBGkeUf1juAsU3DTfxW579mrPA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/chokidar": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", + "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "readdirp": "^5.0.0" + }, + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz", + "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.3.tgz", + "integrity": "sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==", + "dev": true, + "license": "MIT" + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true, + "license": "MIT" + }, + "node_modules/colorjs.io": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/colorjs.io/-/colorjs.io-0.5.2.tgz", + "integrity": "sha512-twmVoizEW7ylZSN32OgKdXRmo1qg+wT5/6C3xu5b9QsWzSFAhHLn2xd8ro0diCsKfCj1RdaTP/nrcW+vAoQPIw==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/config-chain": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", + "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/copy-anything": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-4.0.5.tgz", + "integrity": "sha512-7Vv6asjS4gMOuILabD3l739tsaxFQmC+a7pLZm02zyvs8p977bL3zEgq3yDk5rn9B0PbYgIv++jmHcuUab4RhA==", + "license": "MIT", + "dependencies": { + "is-what": "^5.2.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/core-js-compat": { + "version": "3.49.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.49.0.tgz", + "integrity": "sha512-VQXt1jr9cBz03b331DFDCCP90b3fanciLkgiOoy8SBHy06gNf+vQ1A3WFLqG7I8TipYIKeYK9wxd0tUrvHcOZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.28.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/create-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-jest/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/create-jest/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/create-jest/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/create-jest/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/create-jest/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/create-jest/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css-select": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", + "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-tree": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", + "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.30", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/css-what": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", + "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/csso": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", + "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "css-tree": "~2.2.0" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/css-tree": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", + "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.28", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.28", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", + "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/cssom": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", + "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==", + "dev": true, + "license": "MIT" + }, + "node_modules/cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssom": "~0.3.6" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cssstyle/node_modules/cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true, + "license": "MIT" + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "license": "MIT" + }, + "node_modules/data-urls": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz", + "integrity": "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "abab": "^2.0.6", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decimal.js": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz", + "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==", + "dev": true, + "license": "MIT" + }, + "node_modules/dedent": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.2.tgz", + "integrity": "sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "devOptional": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dev": true, + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/dom-serializer/node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domexception": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", + "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", + "deprecated": "Use your platform's native DOMException instead", + "dev": true, + "license": "MIT", + "dependencies": { + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true, + "license": "MIT" + }, + "node_modules/editorconfig": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-1.0.7.tgz", + "integrity": "sha512-e0GOtq/aTQhVdNyDU9e02+wz9oDDM+SIOQxWME2QRjzRX5yyLAuHDE+0aE8vHb9XRC8XD37eO2u57+F09JqFhw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@one-ini/wasm": "0.1.1", + "commander": "^10.0.0", + "minimatch": "^9.0.1", + "semver": "^7.5.3" + }, + "bin": { + "editorconfig": "bin/editorconfig" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/editorconfig/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/editorconfig/node_modules/semver": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.1.tgz", + "integrity": "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.366", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.366.tgz", + "integrity": "sha512-OlRuhb688YTCzzU3gXPLn6nGyd+F+53INE1qaKKlu6kETErE8FYsyDh0XqXEU+uBRn0MpCzz2vfNwORhkap8qg==", + "dev": true, + "license": "ISC" + }, + "node_modules/emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/entities": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", + "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/error-ex": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", + "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/escodegen/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint": { + "version": "10.4.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.4.1.tgz", + "integrity": "sha512-AyIKhnOBuOAdueD7RB3xB+YeAWScb9jHsJBgH2Hcde8InP5JYhqrRR6iTMHyTEwgENK54Cp44e4v8BwNhsuHuw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.2", + "@eslint/config-array": "^0.23.5", + "@eslint/config-helpers": "^0.6.0", + "@eslint/core": "^1.2.1", + "@eslint/plugin-kit": "^0.7.2", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.14.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^9.1.2", + "eslint-visitor-keys": "^5.0.1", + "espree": "^11.2.0", + "esquery": "^1.7.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "minimatch": "^10.2.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-scope": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-9.1.2.tgz", + "integrity": "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@types/esrecurse": "^4.3.1", + "@types/estree": "^1.0.8", + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/eslint/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/espree": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-11.2.0.tgz", + "integrity": "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.16.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^5.0.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/expect-utils": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", + "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", + "dev": true, + "license": "ISC" + }, + "node_modules/follow-redirects": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", + "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/foreground-child/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, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/form-data": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/handlebars": { + "version": "4.7.9", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.9.tgz", + "integrity": "sha512-4E71E0rpOaQuJR2A3xDZ+GM1HyWYv1clR58tC8emQNeQe3RH7MAzSbat+V0wG78LQBo6m6bzSG/L4pBuCsgnUQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, + "node_modules/handlebars/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hookable": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz", + "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==", + "license": "MIT" + }, + "node_modules/html-encoding-sniffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", + "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-encoding": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true, + "license": "MIT" + }, + "node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/immutable": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.6.tgz", + "integrity": "sha512-q1swsS8K7L8usSHuOqF2TAoCCkonYz0SG38wLAggaa4Wml70zixIvt2ql4coQ2C2B3hTjltJry4r6bULwgAXLQ==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/import-local": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", + "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true, + "license": "ISC" + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-core-module": { + "version": "2.16.2", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz", + "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-what": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-5.5.0.tgz", + "integrity": "sha512-oG7cgbmg5kLYae2N5IVd3jm2s+vldjxJzK1pcu9LfpGuQ93MQSzo0okvRna+7y5ifrD+20FE8FvjusyGaz14fw==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/istanbul-reports": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", + "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", + "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/types": "^29.6.3", + "import-local": "^3.0.2", + "jest-cli": "^29.7.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "execa": "^5.0.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^1.0.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0", + "pretty-format": "^29.7.0", + "pure-rand": "^6.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-circus/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-circus/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-circus/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-circus/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-circus/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-cli": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "create-jest": "^29.7.0", + "exit": "^0.1.2", + "import-local": "^3.0.2", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-cli/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-cli/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-cli/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-cli/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-cli/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-cli/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-config": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-jest": "^29.7.0", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-config/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-config/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-config/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-config/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-config/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-config/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-diff": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-diff/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-diff/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-diff/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-diff/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-diff/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-diff/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-docblock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-each/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-each/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-each/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-each/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-each/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-environment-jsdom": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-29.7.0.tgz", + "integrity": "sha512-k9iQbsf9OyOfdzWH8HDmrRT0gSIcX+FLNW7IQq94tFX0gynPwqDTW0Ho6iMVNjGz/nb+l/vW3dWM2bbLLpkbXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/jsdom": "^20.0.0", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0", + "jsdom": "^20.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jest-environment-node": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-leak-detector": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-matcher-utils/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-matcher-utils/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-matcher-utils/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-matcher-utils/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-matcher-utils/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-message-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-message-util/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-message-util/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-message-util/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-message-util/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-message-util/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-mock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-regex-util": "^29.6.3", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-resolve/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-resolve/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-resolve/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-resolve/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-resolve/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runner": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-runner/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-runner/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-runner/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-runner/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runner/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", + "@jest/source-map": "^29.6.3", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runtime/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-runtime/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-runtime/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-runtime/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-runtime/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-snapshot": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "natural-compare": "^1.4.0", + "pretty-format": "^29.7.0", + "semver": "^7.5.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-snapshot/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-snapshot/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-snapshot/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-snapshot/node_modules/semver": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.1.tgz", + "integrity": "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-snapshot/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-util/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-util/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-util/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-util/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-util/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-util/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-validate": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "leven": "^3.1.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-validate/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-validate/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-validate/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-validate/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-validate/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-watcher": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.7.0", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-watcher/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-watcher/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-watcher/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-watcher/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-watcher/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-watcher/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/js-beautify": { + "version": "1.15.4", + "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.15.4.tgz", + "integrity": "sha512-9/KXeZUKKJwqCXUdBxFJ3vPh467OCckSBmYDwSK/EtV090K+iMJ7zx2S3HLVDIWFQdqMIsZWbnaGiba18aWhaA==", + "dev": true, + "license": "MIT", + "dependencies": { + "config-chain": "^1.1.13", + "editorconfig": "^1.0.4", + "glob": "^10.4.2", + "js-cookie": "^3.0.5", + "nopt": "^7.2.1" + }, + "bin": { + "css-beautify": "js/bin/css-beautify.js", + "html-beautify": "js/bin/html-beautify.js", + "js-beautify": "js/bin/js-beautify.js" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/js-beautify/node_modules/glob": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/js-beautify/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/js-cookie": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.8.tgz", + "integrity": "sha512-yeJd4aNAdYZQjaon2bpD/Gb0B/omw7HQOsynXXcOiWVCacbBcPlgn8S/d1X6blFSaHao7ozqtW7NZW19xpCtIw==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", + "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsdom": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-20.0.3.tgz", + "integrity": "sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "abab": "^2.0.6", + "acorn": "^8.8.1", + "acorn-globals": "^7.0.0", + "cssom": "^0.5.0", + "cssstyle": "^2.3.0", + "data-urls": "^3.0.2", + "decimal.js": "^10.4.2", + "domexception": "^4.0.0", + "escodegen": "^2.0.0", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^3.0.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.1", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.2", + "parse5": "^7.1.1", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.1.2", + "w3c-xmlserializer": "^4.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^2.0.0", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0", + "ws": "^8.11.0", + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lightningcss": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "devOptional": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.32.0", + "lightningcss-darwin-arm64": "1.32.0", + "lightningcss-darwin-x64": "1.32.0", + "lightningcss-freebsd-x64": "1.32.0", + "lightningcss-linux-arm-gnueabihf": "1.32.0", + "lightningcss-linux-arm64-gnu": "1.32.0", + "lightningcss-linux-arm64-musl": "1.32.0", + "lightningcss-linux-x64-gnu": "1.32.0", + "lightningcss-linux-x64-musl": "1.32.0", + "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-win32-x64-msvc": "1.32.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "cpu": [ + "arm" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT" + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true, + "license": "MIT" + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.1.tgz", + "integrity": "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true, + "license": "ISC" + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mdn-data": { + "version": "2.0.30", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", + "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true, + "license": "MIT" + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", + "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "license": "MIT", + "optional": true + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.47", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.47.tgz", + "integrity": "sha512-Uzmd6LXpouKo8EUK68IjH4+E01w/hXyV3R3g/geCJo+rXLNfh1xucB+LOzYEOQPSiUK3h/xZf0cQGcSsmyL2Og==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/nopt": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.1.tgz", + "integrity": "sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==", + "dev": true, + "license": "ISC", + "dependencies": { + "abbrev": "^2.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/nwsapi": { + "version": "2.2.23", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.23.tgz", + "integrity": "sha512-7wfH4sLbt4M0gCDzGE6vzQBo0bfTKjU7Sfpqy/7gs1qBfYz2vEJH6vXcBKpO3+6Yu1telwd0t9HpyOoLEQQbIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-locate/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true, + "license": "BlueOak-1.0.0" + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse5": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "entities": "^6.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5/node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "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": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "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==", + "license": "MIT" + }, + "node_modules/perfect-scrollbar": { + "version": "1.5.6", + "resolved": "https://registry.npmjs.org/perfect-scrollbar/-/perfect-scrollbar-1.5.6.tgz", + "integrity": "sha512-rixgxw3SxyJbCaSpo1n35A/fwI1r2rdwMKOTCg/AcG+xOEyZcE8UHVjpZMFCVImzsFoCZeJTT+M/rdEIQYO2nw==", + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pinia": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/pinia/-/pinia-3.0.4.tgz", + "integrity": "sha512-l7pqLUFTI/+ESXn6k3nu30ZIzW5E2WZF/LaHJEpoq6ElcLD+wduZoB2kBN19du6K/4FDpPMazY2wJr+IndBtQw==", + "license": "MIT", + "dependencies": { + "@vue/devtools-api": "^7.7.7" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "typescript": ">=4.5.0", + "vue": "^3.5.11" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/pirates": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/postcss": { + "version": "8.5.15", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz", + "integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.12", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", + "dev": true, + "license": "ISC" + }, + "node_modules/proxy-from-env": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz", + "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/psl": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz", + "integrity": "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.3.1" + }, + "funding": { + "url": "https://github.com/sponsors/lupomontero" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/pure-rand": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", + "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], + "license": "MIT" + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true, + "license": "MIT" + }, + "node_modules/readdirp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz", + "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true, + "license": "MIT" + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.2.tgz", + "integrity": "sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regexpu-core": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.4.0.tgz", + "integrity": "sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.2.2", + "regjsgen": "^0.8.0", + "regjsparser": "^0.13.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.2.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/regjsparser": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.1.tgz", + "integrity": "sha512-dLsljMd9sqwRkby8zhO1gSg3PnJIBFid8f4CQj/sXx+7cKx+E7u0PKhZ+U4wmhx7EfmtvnA318oVaIkAB1lRJw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "jsesc": "~3.1.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/resolve": { + "version": "1.22.12", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", + "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve.exports": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz", + "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "license": "MIT" + }, + "node_modules/rolldown": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.3.tgz", + "integrity": "sha512-i00lAJ2ks1BYr7rjNjKC7BcqAS7nVfiT3QX1SI5aY+AFHblCmaUf9OE9dbdzDvW6dJxbi2ZCZiy9v3CcwOiX3g==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@oxc-project/types": "=0.133.0", + "@rolldown/pluginutils": "^1.0.0" + }, + "bin": { + "rolldown": "bin/cli.mjs" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "optionalDependencies": { + "@rolldown/binding-android-arm64": "1.0.3", + "@rolldown/binding-darwin-arm64": "1.0.3", + "@rolldown/binding-darwin-x64": "1.0.3", + "@rolldown/binding-freebsd-x64": "1.0.3", + "@rolldown/binding-linux-arm-gnueabihf": "1.0.3", + "@rolldown/binding-linux-arm64-gnu": "1.0.3", + "@rolldown/binding-linux-arm64-musl": "1.0.3", + "@rolldown/binding-linux-ppc64-gnu": "1.0.3", + "@rolldown/binding-linux-s390x-gnu": "1.0.3", + "@rolldown/binding-linux-x64-gnu": "1.0.3", + "@rolldown/binding-linux-x64-musl": "1.0.3", + "@rolldown/binding-openharmony-arm64": "1.0.3", + "@rolldown/binding-wasm32-wasi": "1.0.3", + "@rolldown/binding-win32-arm64-msvc": "1.0.3", + "@rolldown/binding-win32-x64-msvc": "1.0.3" + } + }, + "node_modules/rxjs": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", + "devOptional": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/sass": { + "version": "1.100.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.100.0.tgz", + "integrity": "sha512-B5j0rYMlinhhOo9tjQebMVVn0TfyXAF+wB3b2ggZUuJ/is/Y+7+JGjirAMxHZ9Z3hIP98NPfamlAkBHa1lAaXQ==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "chokidar": "^5.0.0", + "immutable": "^5.1.5", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=20.19.0" + }, + "optionalDependencies": { + "@parcel/watcher": "^2.4.1" + } + }, + "node_modules/sass-embedded": { + "version": "1.100.0", + "resolved": "https://registry.npmjs.org/sass-embedded/-/sass-embedded-1.100.0.tgz", + "integrity": "sha512-Ut8wlQSk19tm7jMK6mz6cF1+e+E7tUnW2tM02zQDPnOTcVbV8qCQG8UWxZkkNlY50+hV3hqP24OOkUlMz8xBpw==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@bufbuild/protobuf": "^2.5.0", + "colorjs.io": "^0.5.0", + "immutable": "^5.1.5", + "rxjs": "^7.4.0", + "supports-color": "^8.1.1", + "sync-child-process": "^1.0.2", + "varint": "^6.0.0" + }, + "bin": { + "sass": "dist/bin/sass.js" + }, + "engines": { + "node": ">=16.0.0" + }, + "optionalDependencies": { + "sass-embedded-all-unknown": "1.100.0", + "sass-embedded-android-arm": "1.100.0", + "sass-embedded-android-arm64": "1.100.0", + "sass-embedded-android-riscv64": "1.100.0", + "sass-embedded-android-x64": "1.100.0", + "sass-embedded-darwin-arm64": "1.100.0", + "sass-embedded-darwin-x64": "1.100.0", + "sass-embedded-linux-arm": "1.100.0", + "sass-embedded-linux-arm64": "1.100.0", + "sass-embedded-linux-musl-arm": "1.100.0", + "sass-embedded-linux-musl-arm64": "1.100.0", + "sass-embedded-linux-musl-riscv64": "1.100.0", + "sass-embedded-linux-musl-x64": "1.100.0", + "sass-embedded-linux-riscv64": "1.100.0", + "sass-embedded-linux-x64": "1.100.0", + "sass-embedded-unknown-all": "1.100.0", + "sass-embedded-win32-arm64": "1.100.0", + "sass-embedded-win32-x64": "1.100.0" + } + }, + "node_modules/sass-embedded-all-unknown": { + "version": "1.100.0", + "resolved": "https://registry.npmjs.org/sass-embedded-all-unknown/-/sass-embedded-all-unknown-1.100.0.tgz", + "integrity": "sha512-auFtXY/kwYILmSVjtBDwyj0axcLbYYiffOKWoaXHnI5bsYwiRbBh3EneR1rpbX2ZIZCrwX93i5pxKLTZF/662Q==", + "cpu": [ + "!arm", + "!arm64", + "!riscv64", + "!x64" + ], + "license": "MIT", + "optional": true, + "dependencies": { + "sass": "1.100.0" + } + }, + "node_modules/sass-embedded-android-arm": { + "version": "1.100.0", + "resolved": "https://registry.npmjs.org/sass-embedded-android-arm/-/sass-embedded-android-arm-1.100.0.tgz", + "integrity": "sha512-70f3HgX2pFNmzpGQ86n5e6QfWn2fP4QUQGfFQK0P1XH73ZLIzLo2YqygrGKGKeeqtc5eU2Wl1/xQzhzuKnO4kw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-android-arm64": { + "version": "1.100.0", + "resolved": "https://registry.npmjs.org/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.100.0.tgz", + "integrity": "sha512-W+Ru9JwTnfU0UX3jSZcbqFdtKFMcYdfFwytc57h2DgnqCOIiAqI2E06mABZBZC+r3LwXCBuS5GbXAGeVgvVDkA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-android-riscv64": { + "version": "1.100.0", + "resolved": "https://registry.npmjs.org/sass-embedded-android-riscv64/-/sass-embedded-android-riscv64-1.100.0.tgz", + "integrity": "sha512-icU3o0V/uCSytSpf+tX5Lf51BvyQEbLzDUJfUi9etSauYBGHpPKkdtdZH0si4v98phq11Kl8rSV1SggksxF1Hg==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-android-x64": { + "version": "1.100.0", + "resolved": "https://registry.npmjs.org/sass-embedded-android-x64/-/sass-embedded-android-x64-1.100.0.tgz", + "integrity": "sha512-mevF9VQk6gEYByy8+jusaHGmd7Usb2ytX/DsEOd0JtOGCtcf1kh575xJ6OUBDIcJ15uLnbau/0iy1eP6WVBvWA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-darwin-arm64": { + "version": "1.100.0", + "resolved": "https://registry.npmjs.org/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.100.0.tgz", + "integrity": "sha512-1PVlYi61POo93IT/FfrG1mc1tAHxeSTyUALF2aOFmXGWjVXr3bQzEQiBGCOvQbj/ix+5hNyXFXcEMEyKvtUJJA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-darwin-x64": { + "version": "1.100.0", + "resolved": "https://registry.npmjs.org/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.100.0.tgz", + "integrity": "sha512-x97o3JnGyImZNCIVs9wQHJUE5QCvmVIKaH1cwrz/5dK7OT1FpeNiW+u9TUomP9hG6Ekjd8EL8NBHpxTfIhdjmg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-arm": { + "version": "1.100.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.100.0.tgz", + "integrity": "sha512-9Ul7O1eKrc5YlhwWjkp8tZPSe3UEwSZ1uwUZOQom1HL0pRlBA6F/IlGZYFTLwnHMIP1fc77MMNaBRfc05mKMpw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-arm64": { + "version": "1.100.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.100.0.tgz", + "integrity": "sha512-Dwjmj8Z6VRy7rAi53JAdEwIyUjpfl7PhpSc2/LpQPQx+aO5Dp7Spaipkax0ufJl1SoDUdchCsM4y/88YaluorQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-musl-arm": { + "version": "1.100.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.100.0.tgz", + "integrity": "sha512-sl0JgbGloPyJg66XXx5UDSDScZ0oU85DpMQU4JU/sCUCFj1Z8zZ69SJWKTCNE4/jwnce7WI2zPCV5AG+RHOZJw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-musl-arm64": { + "version": "1.100.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.100.0.tgz", + "integrity": "sha512-XpACJB2KjSLjf2e9uuvGVdOURsoNrFqgRiihhXyUHK9W0t3LIHb7z5MA/7XGPIT9bWSOO2zyw+rH/FHtDV/Yrg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-musl-riscv64": { + "version": "1.100.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-riscv64/-/sass-embedded-linux-musl-riscv64-1.100.0.tgz", + "integrity": "sha512-ShvI0Kx04mwoCARwZ0UjiT97isQvzO80tAt91zmFyHLN9kelc/IrQi940farSm2xQVPCKdeVyeG0ekBsokSpYQ==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-musl-x64": { + "version": "1.100.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.100.0.tgz", + "integrity": "sha512-TDBCRWNuS4RDLQXvRc1gjZlWiWTWaWGp0Bwu/IKwJxov81lsvrCs3TihTyNXtW7V5aoN4Ky3r0QOkNb3mwmBnA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-riscv64": { + "version": "1.100.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-riscv64/-/sass-embedded-linux-riscv64-1.100.0.tgz", + "integrity": "sha512-j4ENJGOheO+fm3j/yorLxCjBP6/XskrZx7dTLlT+lXYwN/qqCqoA/gsNLI0McS3DFM6GBwPiffzWsdWS8t6sEQ==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-x64": { + "version": "1.100.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.100.0.tgz", + "integrity": "sha512-0vUSN8j0WGtCJIOPh//EmUvYGHW0QOe5iul8qyhPk50MAcw49MA0r34AhftjDdx94ILPF6vApFs0gwHPQRlpVA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-unknown-all": { + "version": "1.100.0", + "resolved": "https://registry.npmjs.org/sass-embedded-unknown-all/-/sass-embedded-unknown-all-1.100.0.tgz", + "integrity": "sha512-c+naBgWId4MIpToXcI0DgqetjdAkwTTAxFAuOaBz7HUXLdyG1oZRrEvSsbe41nEdQOKH0vgofVFCeSQgoXOG9A==", + "license": "MIT", + "optional": true, + "os": [ + "!android", + "!darwin", + "!linux", + "!win32" + ], + "dependencies": { + "sass": "1.100.0" + } + }, + "node_modules/sass-embedded-win32-arm64": { + "version": "1.100.0", + "resolved": "https://registry.npmjs.org/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.100.0.tgz", + "integrity": "sha512-iE+yxj+hUXwwbqpHkXxgAWTzeRfcWxJ7SSTQEPMk48lwq3oCrWLlz5sQuWHbuTK/i0GKQfROdP+hOmPi89yjUg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-win32-x64": { + "version": "1.100.0", + "resolved": "https://registry.npmjs.org/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.100.0.tgz", + "integrity": "sha512-qI4F8MI7/KYoy9NdjJfhSspG42WPkADSNDvwEV7qWvCSFC83koJssRsKO2/PfY+niZz6BG65Ic/D+A11h959hw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/sass-embedded/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/sax": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.0.tgz", + "integrity": "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=11.0.0" + } + }, + "node_modules/saxes": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "dev": true, + "license": "ISC", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=v12.22.7" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true, + "license": "MIT" + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "integrity": "sha512-MjZkVp0NHr5+TPihLcadqnlVoGIoWo4IBHptutGh9wI3ttUYvCG26HkSuDi+K6lsZ25syXJXcctwgyVCt//xqA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/speakingurl": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/speakingurl/-/speakingurl-14.0.1.tgz", + "integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/superjson": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/superjson/-/superjson-2.2.6.tgz", + "integrity": "sha512-H+ue8Zo4vJmV2nRjpx86P35lzwDT3nItnIsocgumgr0hHMQ+ZGq5vrERg9kJBo5AWGmxZDhzDo+WVIJqkB0cGA==", + "license": "MIT", + "dependencies": { + "copy-anything": "^4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svgo": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.3.tgz", + "integrity": "sha512-+wn7I4p7YgJhHs38k2TNjy1vCfPIfLIJWR5MnCStsN8WuuTcBnRKcMHQLMM2ijxGZmDoZwNv8ipl5aTTen62ng==", + "dev": true, + "license": "MIT", + "dependencies": { + "commander": "^7.2.0", + "css-select": "^5.1.0", + "css-tree": "^2.3.1", + "css-what": "^6.1.0", + "csso": "^5.0.5", + "picocolors": "^1.0.0", + "sax": "^1.5.0" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/svgo" + } + }, + "node_modules/svgo/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true, + "license": "MIT" + }, + "node_modules/sync-child-process": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/sync-child-process/-/sync-child-process-1.0.2.tgz", + "integrity": "sha512-8lD+t2KrrScJ/7KXCSyfhT3/hRq78rC0wBFqNJXv3mZyn6hW2ypM05JmlSvtqRbeq6jqA94oHbxAr2vYsJ8vDA==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "sync-message-port": "^1.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/sync-message-port": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/sync-message-port/-/sync-message-port-1.2.0.tgz", + "integrity": "sha512-gAQ9qrUN/UCypHtGFbbe7Rc/f9bzO88IwrG8TDo/aMKAApKyD6E3W4Cm0EfhfBb6Z6SKt59tTCTfD+n1xmAvMg==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "license": "ISC", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tough-cookie": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", + "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tr46": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", + "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/ts-jest": { + "version": "29.4.11", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.4.11.tgz", + "integrity": "sha512-IrFl7l9AuB/qrNw5quqvAv/hmKMb8dhWOH4jQOGo0Oq8tCeo1O86/iTFG1FaRimgUkF13l4PcepO8ATFT6Ns4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "bs-logger": "^0.2.6", + "fast-json-stable-stringify": "^2.1.0", + "handlebars": "^4.7.9", + "json5": "^2.2.3", + "lodash.memoize": "^4.1.2", + "make-error": "^1.3.6", + "semver": "^7.8.0", + "type-fest": "^4.41.0", + "yargs-parser": "^21.1.1" + }, + "bin": { + "ts-jest": "cli.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "@babel/core": ">=7.0.0-beta.0 <8", + "@jest/transform": "^29.0.0 || ^30.0.0", + "@jest/types": "^29.0.0 || ^30.0.0", + "babel-jest": "^29.0.0 || ^30.0.0", + "jest": "^29.0.0 || ^30.0.0", + "jest-util": "^29.0.0 || ^30.0.0", + "typescript": ">=4.3 <7" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@jest/transform": { + "optional": true + }, + "@jest/types": { + "optional": true + }, + "babel-jest": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jest-util": { + "optional": true + } + } + }, + "node_modules/ts-jest/node_modules/semver": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.1.tgz", + "integrity": "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ts-jest/node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tsconfig": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/tsconfig/-/tsconfig-7.0.0.tgz", + "integrity": "sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/strip-bom": "^3.0.0", + "@types/strip-json-comments": "0.0.30", + "strip-bom": "^3.0.0", + "strip-json-comments": "^2.0.0" + } + }, + "node_modules/tsconfig/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/tsconfig/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "devOptional": true, + "license": "0BSD" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "devOptional": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/uglify-js": { + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", + "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", + "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", + "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.1.tgz", + "integrity": "sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.2.0.tgz", + "integrity": "sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/upath": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/upath/-/upath-2.0.1.tgz", + "integrity": "sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=4", + "yarn": "*" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/v8-to-istanbul": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", + "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", + "dev": true, + "license": "ISC", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/varint": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/varint/-/varint-6.0.0.tgz", + "integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/vite": { + "version": "8.0.16", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.16.tgz", + "integrity": "sha512-h9bXPmJichP5fLmVQo3PyaGSDE2n3aPuomeAlVRm0JLmt4rY6zmPKd59HYI4LNW8oTK7tlTsuC7l/m7awx9Jcw==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "lightningcss": "^1.32.0", + "picomatch": "^4.0.4", + "postcss": "^8.5.15", + "rolldown": "1.0.3", + "tinyglobby": "^0.2.17" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "@vitejs/devtools": "^0.1.18", + "esbuild": "^0.27.0 || ^0.28.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "@vitejs/devtools": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vite-plugin-vuetify": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/vite-plugin-vuetify/-/vite-plugin-vuetify-2.1.3.tgz", + "integrity": "sha512-Q4SC/4TqbNvaZIFb9YsfBqkGlYHbJJJ6uU3CnRBZqLUF3s5eCMVZAaV4GkTbehIH/bhSj42lMXztOwc71u6rVw==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@vuetify/loader-shared": "^2.1.2", + "debug": "^4.3.3", + "upath": "^2.0.1" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "vite": ">=5", + "vue": "^3.0.0", + "vuetify": ">=3" + } + }, + "node_modules/vite-svg-loader": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/vite-svg-loader/-/vite-svg-loader-5.1.1.tgz", + "integrity": "sha512-RPzcXA/EpKJA0585x58DBgs7my2VfeJ+j2j1EoHY4Zh82Y7hV4cR1fElgy2aZi85+QSrcLLoTStQ5uZjD68u+Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4", + "svgo": "^3.3.3" + }, + "peerDependencies": { + "vue": ">=3.2.13" + } + }, + "node_modules/vite/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/vue": { + "version": "3.5.35", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.35.tgz", + "integrity": "sha512-cx89fnr+0kVGHiNFG6y6s0bdjypJRFNZn6x3WPstNdQR1bi1mbB7h4v5IBGTsPJU3nK1+0Iqj3Zf+hZWMieR4Q==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.35", + "@vue/compiler-sfc": "3.5.35", + "@vue/runtime-dom": "3.5.35", + "@vue/server-renderer": "3.5.35", + "@vue/shared": "3.5.35" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/vue-component-type-helpers": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/vue-component-type-helpers/-/vue-component-type-helpers-3.3.3.tgz", + "integrity": "sha512-x4nsFpy5Pe8fqPzp/5vkTPeTTDBpAx4WVtV47Ejt0+2FQrq4pRRsJs7JmYRqMFzTu/LW+pCWEjQ3YVCkPV7f9g==", + "dev": true, + "license": "MIT" + }, + "node_modules/vue-router": { + "version": "4.6.4", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.6.4.tgz", + "integrity": "sha512-Hz9q5sa33Yhduglwz6g9skT8OBPii+4bFn88w6J+J4MfEo4KRRpmiNG/hHHkdbRFlLBOqxN8y8gf2Fb0MTUgVg==", + "license": "MIT", + "dependencies": { + "@vue/devtools-api": "^6.6.4" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "vue": "^3.5.0" + } + }, + "node_modules/vue-router/node_modules/@vue/devtools-api": { + "version": "6.6.4", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.4.tgz", + "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==", + "license": "MIT" + }, + "node_modules/vue3-perfect-scrollbar": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/vue3-perfect-scrollbar/-/vue3-perfect-scrollbar-2.0.0.tgz", + "integrity": "sha512-nSWVcRyViCgt0Pe3RhU3w/BllLcFSrEzYOGlRBjSyhVmiZlERHHziffW+9P8L0IMEWouC5t+uYrgNJGSAElqMA==", + "dependencies": { + "perfect-scrollbar": "^1.5.5" + }, + "peerDependencies": { + "vue": "^3.0.0" + } + }, + "node_modules/vuetify": { + "version": "3.12.8", + "resolved": "https://registry.npmjs.org/vuetify/-/vuetify-3.12.8.tgz", + "integrity": "sha512-gvmOWeLd6CG7LVh2Qonft5YrIb7MpbKZglRjg0ItEloSbu6hfUII2RZmRSVxGKYdiXTf7J1hI3BRSHr8J9LkxA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/johnleider" + }, + "peerDependencies": { + "typescript": ">=4.7", + "vite-plugin-vuetify": ">=2.1.0", + "vue": "^3.5.0", + "webpack-plugin-vuetify": ">=3.1.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + }, + "vite-plugin-vuetify": { + "optional": true + }, + "webpack-plugin-vuetify": { + "optional": true + } + } + }, + "node_modules/w3c-xmlserializer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz", + "integrity": "sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==", + "dev": true, + "license": "MIT", + "dependencies": { + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-encoding": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", + "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", + "deprecated": "Use @exodus/bytes instead for a more spec-conformant and faster implementation", + "dev": true, + "license": "MIT", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-mimetype": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", + "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-url": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", + "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/ws": { + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.0.tgz", + "integrity": "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xml-name-validator": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", + "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true, + "license": "MIT" + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/src/admin/package.json b/src/admin/package.json old mode 100644 new mode 100755 index 1cd0e78..004615d --- a/src/admin/package.json +++ b/src/admin/package.json @@ -1,48 +1,48 @@ -{ - "name": "mic-check-admin", - "version": "1.0.0", - "private": true, - "scripts": { - "build": "vite build", - "build:dev": "vite build --mode development", - "serve": "vite", - "preview": "vite preview", - "test": "jest --passWithNoTests" - }, - "dependencies": { - "@iconify-json/bxl": "^1.2.0", - "@iconify-json/ri": "^1.2.0", - "@iconify/vue": "^4.1.0", - "@vueuse/core": "^11.0.0", - "axios": "^1.15.0", - "pinia": "^3.0.4", - "vue": "^3.4.0", - "vue-router": "^4.3.0", - "vue3-perfect-scrollbar": "^2.0.0", - "vuetify": "^3.7.5" - }, - "devDependencies": { - "@babel/core": "^7.24.0", - "@babel/preset-env": "^7.24.0", - "@babel/preset-typescript": "^7.24.0", - "@types/jest": "^29.5.12", - "@types/node": "^20.12.0", - "@vitejs/plugin-vue": "^6.0.6", - "@vue/test-utils": "^2.4.6", - "@vue/vue3-jest": "^29.2.6", - "babel-jest": "^29.7.0", - "eslint": "^10.4.1", - "jest": "^29.7.0", - "jest-environment-jsdom": "^29.7.0", - "sass": "^1.77.2", - "sass-embedded": "^1.77.0", - "ts-jest": "^29.1.4", - "typescript": "^5.4.5", - "vite": "^8.0.8", - "vite-plugin-vuetify": "^2.1.3", - "vite-svg-loader": "^5.1.0" - }, - "overrides": { - "brace-expansion": "^5.0.5" - } -} +{ + "name": "mic-check-admin", + "version": "1.0.0", + "private": true, + "scripts": { + "build": "vite build", + "build:dev": "vite build --mode development", + "serve": "vite", + "preview": "vite preview", + "test": "jest --passWithNoTests" + }, + "dependencies": { + "@iconify-json/bxl": "^1.2.0", + "@iconify-json/ri": "^1.2.0", + "@iconify/vue": "^4.1.0", + "@vueuse/core": "^11.0.0", + "axios": "^1.15.0", + "pinia": "^3.0.4", + "vue": "^3.4.0", + "vue-router": "^4.3.0", + "vue3-perfect-scrollbar": "^2.0.0", + "vuetify": "^3.7.5" + }, + "devDependencies": { + "@babel/core": "^7.24.0", + "@babel/preset-env": "^7.24.0", + "@babel/preset-typescript": "^7.24.0", + "@types/jest": "^29.5.12", + "@types/node": "^20.12.0", + "@vitejs/plugin-vue": "^6.0.6", + "@vue/test-utils": "^2.4.6", + "@vue/vue3-jest": "^29.2.6", + "babel-jest": "^29.7.0", + "eslint": "^10.4.1", + "jest": "^29.7.0", + "jest-environment-jsdom": "^29.7.0", + "sass": "^1.77.2", + "sass-embedded": "^1.77.0", + "ts-jest": "^29.1.4", + "typescript": "^5.4.5", + "vite": "^8.0.8", + "vite-plugin-vuetify": "^2.1.3", + "vite-svg-loader": "^5.1.0" + }, + "overrides": { + "brace-expansion": "^5.0.5" + } +} diff --git a/src/admin/src/@core/components/MoreBtn.vue b/src/admin/src/@core/components/MoreBtn.vue old mode 100644 new mode 100755 diff --git a/src/admin/src/@core/components/ThemeSwitcher.vue b/src/admin/src/@core/components/ThemeSwitcher.vue old mode 100644 new mode 100755 diff --git a/src/admin/src/@core/components/cards/CardStatisticsHorizontal.vue b/src/admin/src/@core/components/cards/CardStatisticsHorizontal.vue old mode 100644 new mode 100755 diff --git a/src/admin/src/@core/components/cards/CardStatisticsVertical.vue b/src/admin/src/@core/components/cards/CardStatisticsVertical.vue old mode 100644 new mode 100755 diff --git a/src/admin/src/@core/components/cards/CardStatisticsWithImages.vue b/src/admin/src/@core/components/cards/CardStatisticsWithImages.vue old mode 100644 new mode 100755 diff --git a/src/admin/src/@core/scss/base/_components.scss b/src/admin/src/@core/scss/base/_components.scss old mode 100644 new mode 100755 diff --git a/src/admin/src/@core/scss/base/_dark.scss b/src/admin/src/@core/scss/base/_dark.scss old mode 100644 new mode 100755 diff --git a/src/admin/src/@core/scss/base/_default-layout-w-vertical-nav.scss b/src/admin/src/@core/scss/base/_default-layout-w-vertical-nav.scss old mode 100644 new mode 100755 diff --git a/src/admin/src/@core/scss/base/_default-layout.scss b/src/admin/src/@core/scss/base/_default-layout.scss old mode 100644 new mode 100755 diff --git a/src/admin/src/@core/scss/base/_index.scss b/src/admin/src/@core/scss/base/_index.scss old mode 100644 new mode 100755 diff --git a/src/admin/src/@core/scss/base/_layouts.scss b/src/admin/src/@core/scss/base/_layouts.scss old mode 100644 new mode 100755 diff --git a/src/admin/src/@core/scss/base/_misc.scss b/src/admin/src/@core/scss/base/_misc.scss old mode 100644 new mode 100755 diff --git a/src/admin/src/@core/scss/base/_mixins.scss b/src/admin/src/@core/scss/base/_mixins.scss old mode 100644 new mode 100755 diff --git a/src/admin/src/@core/scss/base/_utilities.scss b/src/admin/src/@core/scss/base/_utilities.scss old mode 100644 new mode 100755 diff --git a/src/admin/src/@core/scss/base/_utils.scss b/src/admin/src/@core/scss/base/_utils.scss old mode 100644 new mode 100755 diff --git a/src/admin/src/@core/scss/base/_variables.scss b/src/admin/src/@core/scss/base/_variables.scss old mode 100644 new mode 100755 diff --git a/src/admin/src/@core/scss/base/_vertical-nav.scss b/src/admin/src/@core/scss/base/_vertical-nav.scss old mode 100644 new mode 100755 diff --git a/src/admin/src/@core/scss/base/libs/_perfect-scrollbar.scss b/src/admin/src/@core/scss/base/libs/_perfect-scrollbar.scss old mode 100644 new mode 100755 diff --git a/src/admin/src/@core/scss/base/libs/vuetify/_index.scss b/src/admin/src/@core/scss/base/libs/vuetify/_index.scss old mode 100644 new mode 100755 diff --git a/src/admin/src/@core/scss/base/libs/vuetify/_overrides.scss b/src/admin/src/@core/scss/base/libs/vuetify/_overrides.scss old mode 100644 new mode 100755 diff --git a/src/admin/src/@core/scss/base/libs/vuetify/_variables.scss b/src/admin/src/@core/scss/base/libs/vuetify/_variables.scss old mode 100644 new mode 100755 diff --git a/src/admin/src/@core/scss/base/placeholders/_default-layout-vertical-nav.scss b/src/admin/src/@core/scss/base/placeholders/_default-layout-vertical-nav.scss old mode 100644 new mode 100755 diff --git a/src/admin/src/@core/scss/base/placeholders/_default-layout.scss b/src/admin/src/@core/scss/base/placeholders/_default-layout.scss old mode 100644 new mode 100755 diff --git a/src/admin/src/@core/scss/base/placeholders/_index.scss b/src/admin/src/@core/scss/base/placeholders/_index.scss old mode 100644 new mode 100755 diff --git a/src/admin/src/@core/scss/base/placeholders/_misc.scss b/src/admin/src/@core/scss/base/placeholders/_misc.scss old mode 100644 new mode 100755 diff --git a/src/admin/src/@core/scss/base/placeholders/_nav.scss b/src/admin/src/@core/scss/base/placeholders/_nav.scss old mode 100644 new mode 100755 diff --git a/src/admin/src/@core/scss/base/placeholders/_vertical-nav.scss b/src/admin/src/@core/scss/base/placeholders/_vertical-nav.scss old mode 100644 new mode 100755 diff --git a/src/admin/src/@core/scss/template/_default-layout-w-vertical-nav.scss b/src/admin/src/@core/scss/template/_default-layout-w-vertical-nav.scss old mode 100644 new mode 100755 diff --git a/src/admin/src/@core/scss/template/_mixins.scss b/src/admin/src/@core/scss/template/_mixins.scss old mode 100644 new mode 100755 diff --git a/src/admin/src/@core/scss/template/_utilities.scss b/src/admin/src/@core/scss/template/_utilities.scss old mode 100644 new mode 100755 diff --git a/src/admin/src/@core/scss/template/_utils.scss b/src/admin/src/@core/scss/template/_utils.scss old mode 100644 new mode 100755 diff --git a/src/admin/src/@core/scss/template/_variables.scss b/src/admin/src/@core/scss/template/_variables.scss old mode 100644 new mode 100755 diff --git a/src/admin/src/@core/scss/template/_vertical-nav.scss b/src/admin/src/@core/scss/template/_vertical-nav.scss old mode 100644 new mode 100755 diff --git a/src/admin/src/@core/scss/template/index.scss b/src/admin/src/@core/scss/template/index.scss old mode 100644 new mode 100755 diff --git a/src/admin/src/@core/scss/template/libs/apex-chart.scss b/src/admin/src/@core/scss/template/libs/apex-chart.scss old mode 100644 new mode 100755 diff --git a/src/admin/src/@core/scss/template/libs/vuetify/_overrides.scss b/src/admin/src/@core/scss/template/libs/vuetify/_overrides.scss old mode 100644 new mode 100755 diff --git a/src/admin/src/@core/scss/template/libs/vuetify/_variables.scss b/src/admin/src/@core/scss/template/libs/vuetify/_variables.scss old mode 100644 new mode 100755 diff --git a/src/admin/src/@core/scss/template/libs/vuetify/components/_alert.scss b/src/admin/src/@core/scss/template/libs/vuetify/components/_alert.scss old mode 100644 new mode 100755 diff --git a/src/admin/src/@core/scss/template/libs/vuetify/components/_avatar.scss b/src/admin/src/@core/scss/template/libs/vuetify/components/_avatar.scss old mode 100644 new mode 100755 diff --git a/src/admin/src/@core/scss/template/libs/vuetify/components/_badge.scss b/src/admin/src/@core/scss/template/libs/vuetify/components/_badge.scss old mode 100644 new mode 100755 diff --git a/src/admin/src/@core/scss/template/libs/vuetify/components/_button.scss b/src/admin/src/@core/scss/template/libs/vuetify/components/_button.scss old mode 100644 new mode 100755 diff --git a/src/admin/src/@core/scss/template/libs/vuetify/components/_cards.scss b/src/admin/src/@core/scss/template/libs/vuetify/components/_cards.scss old mode 100644 new mode 100755 diff --git a/src/admin/src/@core/scss/template/libs/vuetify/components/_checkbox.scss b/src/admin/src/@core/scss/template/libs/vuetify/components/_checkbox.scss old mode 100644 new mode 100755 diff --git a/src/admin/src/@core/scss/template/libs/vuetify/components/_chip.scss b/src/admin/src/@core/scss/template/libs/vuetify/components/_chip.scss old mode 100644 new mode 100755 diff --git a/src/admin/src/@core/scss/template/libs/vuetify/components/_dialog.scss b/src/admin/src/@core/scss/template/libs/vuetify/components/_dialog.scss old mode 100644 new mode 100755 diff --git a/src/admin/src/@core/scss/template/libs/vuetify/components/_expansion-panels.scss b/src/admin/src/@core/scss/template/libs/vuetify/components/_expansion-panels.scss old mode 100644 new mode 100755 diff --git a/src/admin/src/@core/scss/template/libs/vuetify/components/_field.scss b/src/admin/src/@core/scss/template/libs/vuetify/components/_field.scss old mode 100644 new mode 100755 diff --git a/src/admin/src/@core/scss/template/libs/vuetify/components/_list.scss b/src/admin/src/@core/scss/template/libs/vuetify/components/_list.scss old mode 100644 new mode 100755 diff --git a/src/admin/src/@core/scss/template/libs/vuetify/components/_menu.scss b/src/admin/src/@core/scss/template/libs/vuetify/components/_menu.scss old mode 100644 new mode 100755 diff --git a/src/admin/src/@core/scss/template/libs/vuetify/components/_otp-input.scss b/src/admin/src/@core/scss/template/libs/vuetify/components/_otp-input.scss old mode 100644 new mode 100755 diff --git a/src/admin/src/@core/scss/template/libs/vuetify/components/_pagination.scss b/src/admin/src/@core/scss/template/libs/vuetify/components/_pagination.scss old mode 100644 new mode 100755 diff --git a/src/admin/src/@core/scss/template/libs/vuetify/components/_progress.scss b/src/admin/src/@core/scss/template/libs/vuetify/components/_progress.scss old mode 100644 new mode 100755 diff --git a/src/admin/src/@core/scss/template/libs/vuetify/components/_radio.scss b/src/admin/src/@core/scss/template/libs/vuetify/components/_radio.scss old mode 100644 new mode 100755 diff --git a/src/admin/src/@core/scss/template/libs/vuetify/components/_rating.scss b/src/admin/src/@core/scss/template/libs/vuetify/components/_rating.scss old mode 100644 new mode 100755 diff --git a/src/admin/src/@core/scss/template/libs/vuetify/components/_slider.scss b/src/admin/src/@core/scss/template/libs/vuetify/components/_slider.scss old mode 100644 new mode 100755 diff --git a/src/admin/src/@core/scss/template/libs/vuetify/components/_snackbar.scss b/src/admin/src/@core/scss/template/libs/vuetify/components/_snackbar.scss old mode 100644 new mode 100755 diff --git a/src/admin/src/@core/scss/template/libs/vuetify/components/_switch.scss b/src/admin/src/@core/scss/template/libs/vuetify/components/_switch.scss old mode 100644 new mode 100755 diff --git a/src/admin/src/@core/scss/template/libs/vuetify/components/_table.scss b/src/admin/src/@core/scss/template/libs/vuetify/components/_table.scss old mode 100644 new mode 100755 diff --git a/src/admin/src/@core/scss/template/libs/vuetify/components/_tabs.scss b/src/admin/src/@core/scss/template/libs/vuetify/components/_tabs.scss old mode 100644 new mode 100755 diff --git a/src/admin/src/@core/scss/template/libs/vuetify/components/_textarea.scss b/src/admin/src/@core/scss/template/libs/vuetify/components/_textarea.scss old mode 100644 new mode 100755 diff --git a/src/admin/src/@core/scss/template/libs/vuetify/components/_timeline.scss b/src/admin/src/@core/scss/template/libs/vuetify/components/_timeline.scss old mode 100644 new mode 100755 diff --git a/src/admin/src/@core/scss/template/libs/vuetify/components/_tooltip.scss b/src/admin/src/@core/scss/template/libs/vuetify/components/_tooltip.scss old mode 100644 new mode 100755 diff --git a/src/admin/src/@core/scss/template/libs/vuetify/components/index.scss b/src/admin/src/@core/scss/template/libs/vuetify/components/index.scss old mode 100644 new mode 100755 diff --git a/src/admin/src/@core/scss/template/libs/vuetify/index.scss b/src/admin/src/@core/scss/template/libs/vuetify/index.scss old mode 100644 new mode 100755 diff --git a/src/admin/src/@core/scss/template/pages/misc.scss b/src/admin/src/@core/scss/template/pages/misc.scss old mode 100644 new mode 100755 diff --git a/src/admin/src/@core/scss/template/pages/page-auth.scss b/src/admin/src/@core/scss/template/pages/page-auth.scss old mode 100644 new mode 100755 diff --git a/src/admin/src/@core/scss/template/placeholders/_default-layout-vertical-nav.scss b/src/admin/src/@core/scss/template/placeholders/_default-layout-vertical-nav.scss old mode 100644 new mode 100755 diff --git a/src/admin/src/@core/scss/template/placeholders/_index.scss b/src/admin/src/@core/scss/template/placeholders/_index.scss old mode 100644 new mode 100755 diff --git a/src/admin/src/@core/scss/template/placeholders/_misc.scss b/src/admin/src/@core/scss/template/placeholders/_misc.scss old mode 100644 new mode 100755 diff --git a/src/admin/src/@core/scss/template/placeholders/_nav.scss b/src/admin/src/@core/scss/template/placeholders/_nav.scss old mode 100644 new mode 100755 diff --git a/src/admin/src/@core/scss/template/placeholders/_vertical-nav.scss b/src/admin/src/@core/scss/template/placeholders/_vertical-nav.scss old mode 100644 new mode 100755 diff --git a/src/admin/src/@core/utils/colorConverter.ts b/src/admin/src/@core/utils/colorConverter.ts old mode 100644 new mode 100755 diff --git a/src/admin/src/@core/utils/formatters.ts b/src/admin/src/@core/utils/formatters.ts old mode 100644 new mode 100755 diff --git a/src/admin/src/@core/utils/helpers.ts b/src/admin/src/@core/utils/helpers.ts old mode 100644 new mode 100755 diff --git a/src/admin/src/@core/utils/plugins.ts b/src/admin/src/@core/utils/plugins.ts old mode 100644 new mode 100755 diff --git a/src/admin/src/@layouts/components.ts b/src/admin/src/@layouts/components.ts old mode 100644 new mode 100755 diff --git a/src/admin/src/@layouts/components/TransitionExpand.vue b/src/admin/src/@layouts/components/TransitionExpand.vue old mode 100644 new mode 100755 diff --git a/src/admin/src/@layouts/components/VerticalNav.vue b/src/admin/src/@layouts/components/VerticalNav.vue old mode 100644 new mode 100755 diff --git a/src/admin/src/@layouts/components/VerticalNavGroup.vue b/src/admin/src/@layouts/components/VerticalNavGroup.vue old mode 100644 new mode 100755 diff --git a/src/admin/src/@layouts/components/VerticalNavLayout.vue b/src/admin/src/@layouts/components/VerticalNavLayout.vue old mode 100644 new mode 100755 diff --git a/src/admin/src/@layouts/components/VerticalNavLink.vue b/src/admin/src/@layouts/components/VerticalNavLink.vue old mode 100644 new mode 100755 diff --git a/src/admin/src/@layouts/components/VerticalNavSectionTitle.vue b/src/admin/src/@layouts/components/VerticalNavSectionTitle.vue old mode 100644 new mode 100755 diff --git a/src/admin/src/@layouts/enums.ts b/src/admin/src/@layouts/enums.ts old mode 100644 new mode 100755 diff --git a/src/admin/src/@layouts/index.ts b/src/admin/src/@layouts/index.ts old mode 100644 new mode 100755 diff --git a/src/admin/src/@layouts/styles/_classes.scss b/src/admin/src/@layouts/styles/_classes.scss old mode 100644 new mode 100755 diff --git a/src/admin/src/@layouts/styles/_default-layout.scss b/src/admin/src/@layouts/styles/_default-layout.scss old mode 100644 new mode 100755 diff --git a/src/admin/src/@layouts/styles/_global.scss b/src/admin/src/@layouts/styles/_global.scss old mode 100644 new mode 100755 diff --git a/src/admin/src/@layouts/styles/_mixins.scss b/src/admin/src/@layouts/styles/_mixins.scss old mode 100644 new mode 100755 diff --git a/src/admin/src/@layouts/styles/_placeholders.scss b/src/admin/src/@layouts/styles/_placeholders.scss old mode 100644 new mode 100755 diff --git a/src/admin/src/@layouts/styles/_rtl.scss b/src/admin/src/@layouts/styles/_rtl.scss old mode 100644 new mode 100755 diff --git a/src/admin/src/@layouts/styles/_variables.scss b/src/admin/src/@layouts/styles/_variables.scss old mode 100644 new mode 100755 diff --git a/src/admin/src/@layouts/styles/index.scss b/src/admin/src/@layouts/styles/index.scss old mode 100644 new mode 100755 diff --git a/src/admin/src/@layouts/types.ts b/src/admin/src/@layouts/types.ts old mode 100644 new mode 100755 diff --git a/src/admin/src/@layouts/utils.ts b/src/admin/src/@layouts/utils.ts old mode 100644 new mode 100755 diff --git a/src/admin/src/App.vue b/src/admin/src/App.vue old mode 100644 new mode 100755 diff --git a/src/admin/src/api/apiKeys.ts b/src/admin/src/api/apiKeys.ts old mode 100644 new mode 100755 diff --git a/src/admin/src/api/auditLogs.ts b/src/admin/src/api/auditLogs.ts old mode 100644 new mode 100755 diff --git a/src/admin/src/api/auth.ts b/src/admin/src/api/auth.ts old mode 100644 new mode 100755 diff --git a/src/admin/src/api/client.ts b/src/admin/src/api/client.ts old mode 100644 new mode 100755 diff --git a/src/admin/src/api/environments.ts b/src/admin/src/api/environments.ts old mode 100644 new mode 100755 diff --git a/src/admin/src/api/featureSegments.ts b/src/admin/src/api/featureSegments.ts old mode 100644 new mode 100755 diff --git a/src/admin/src/api/featureStates.ts b/src/admin/src/api/featureStates.ts old mode 100644 new mode 100755 diff --git a/src/admin/src/api/features.ts b/src/admin/src/api/features.ts old mode 100644 new mode 100755 diff --git a/src/admin/src/api/identities.ts b/src/admin/src/api/identities.ts old mode 100644 new mode 100755 diff --git a/src/admin/src/api/organizations.ts b/src/admin/src/api/organizations.ts old mode 100644 new mode 100755 diff --git a/src/admin/src/api/projects.ts b/src/admin/src/api/projects.ts old mode 100644 new mode 100755 diff --git a/src/admin/src/api/segments.ts b/src/admin/src/api/segments.ts old mode 100644 new mode 100755 diff --git a/src/admin/src/api/tags.ts b/src/admin/src/api/tags.ts old mode 100644 new mode 100755 diff --git a/src/admin/src/api/users.ts b/src/admin/src/api/users.ts old mode 100644 new mode 100755 diff --git a/src/admin/src/api/webhooks.ts b/src/admin/src/api/webhooks.ts old mode 100644 new mode 100755 diff --git a/src/admin/src/assets/images/logo.svg b/src/admin/src/assets/images/logo.svg old mode 100644 new mode 100755 diff --git a/src/admin/src/assets/images/svg/checkbox-checked.svg b/src/admin/src/assets/images/svg/checkbox-checked.svg old mode 100644 new mode 100755 diff --git a/src/admin/src/assets/images/svg/checkbox-indeterminate.svg b/src/admin/src/assets/images/svg/checkbox-indeterminate.svg old mode 100644 new mode 100755 diff --git a/src/admin/src/assets/images/svg/checkbox-unchecked.svg b/src/admin/src/assets/images/svg/checkbox-unchecked.svg old mode 100644 new mode 100755 diff --git a/src/admin/src/assets/images/svg/radio-checked.svg b/src/admin/src/assets/images/svg/radio-checked.svg old mode 100644 new mode 100755 diff --git a/src/admin/src/assets/images/svg/radio-unchecked.svg b/src/admin/src/assets/images/svg/radio-unchecked.svg old mode 100644 new mode 100755 diff --git a/src/admin/src/assets/logo.svg b/src/admin/src/assets/logo.svg old mode 100644 new mode 100755 diff --git a/src/admin/src/assets/styles/styles/styles.scss b/src/admin/src/assets/styles/styles/styles.scss old mode 100644 new mode 100755 diff --git a/src/admin/src/assets/styles/styles/variables/_template.scss b/src/admin/src/assets/styles/styles/variables/_template.scss old mode 100644 new mode 100755 diff --git a/src/admin/src/assets/styles/styles/variables/_vuetify.scss b/src/admin/src/assets/styles/styles/variables/_vuetify.scss old mode 100644 new mode 100755 diff --git a/src/admin/src/assets/styles/variables/_template.scss b/src/admin/src/assets/styles/variables/_template.scss old mode 100644 new mode 100755 diff --git a/src/admin/src/assets/styles/variables/_vuetify.scss b/src/admin/src/assets/styles/variables/_vuetify.scss old mode 100644 new mode 100755 diff --git a/src/admin/src/components/features/FeatureDetail.vue b/src/admin/src/components/features/FeatureDetail.vue old mode 100644 new mode 100755 diff --git a/src/admin/src/components/features/FeatureDialog.vue b/src/admin/src/components/features/FeatureDialog.vue old mode 100644 new mode 100755 diff --git a/src/admin/src/components/features/FeatureValueEditor.vue b/src/admin/src/components/features/FeatureValueEditor.vue old mode 100644 new mode 100755 diff --git a/src/admin/src/components/features/TagsChipInput.vue b/src/admin/src/components/features/TagsChipInput.vue old mode 100644 new mode 100755 diff --git a/src/admin/src/components/identities/IdentityDetail.vue b/src/admin/src/components/identities/IdentityDetail.vue old mode 100644 new mode 100755 diff --git a/src/admin/src/components/nav/EnvironmentTabBar.vue b/src/admin/src/components/nav/EnvironmentTabBar.vue old mode 100644 new mode 100755 diff --git a/src/admin/src/components/nav/OrgSelector.vue b/src/admin/src/components/nav/OrgSelector.vue old mode 100644 new mode 100755 diff --git a/src/admin/src/components/nav/ProjectSelector.vue b/src/admin/src/components/nav/ProjectSelector.vue old mode 100644 new mode 100755 diff --git a/src/admin/src/components/segments/ConditionEditor.vue b/src/admin/src/components/segments/ConditionEditor.vue old mode 100644 new mode 100755 diff --git a/src/admin/src/components/segments/RuleGroupEditor.vue b/src/admin/src/components/segments/RuleGroupEditor.vue old mode 100644 new mode 100755 diff --git a/src/admin/src/components/segments/SegmentEditor.vue b/src/admin/src/components/segments/SegmentEditor.vue old mode 100644 new mode 100755 diff --git a/src/admin/src/components/settings/WebhookDeliveryHistory.vue b/src/admin/src/components/settings/WebhookDeliveryHistory.vue old mode 100644 new mode 100755 diff --git a/src/admin/src/components/settings/WebhookDialog.vue b/src/admin/src/components/settings/WebhookDialog.vue old mode 100644 new mode 100755 diff --git a/src/admin/src/components/settings/WebhooksPanel.vue b/src/admin/src/components/settings/WebhooksPanel.vue old mode 100644 new mode 100755 diff --git a/src/admin/src/layouts/blank.vue b/src/admin/src/layouts/blank.vue old mode 100644 new mode 100755 diff --git a/src/admin/src/layouts/components/DefaultLayoutWithVerticalNav.vue b/src/admin/src/layouts/components/DefaultLayoutWithVerticalNav.vue old mode 100644 new mode 100755 diff --git a/src/admin/src/layouts/components/Footer.vue b/src/admin/src/layouts/components/Footer.vue old mode 100644 new mode 100755 diff --git a/src/admin/src/layouts/components/NavItems.vue b/src/admin/src/layouts/components/NavItems.vue old mode 100644 new mode 100755 diff --git a/src/admin/src/layouts/components/NavbarThemeSwitcher.vue b/src/admin/src/layouts/components/NavbarThemeSwitcher.vue old mode 100644 new mode 100755 diff --git a/src/admin/src/layouts/components/UserProfile.vue b/src/admin/src/layouts/components/UserProfile.vue old mode 100644 new mode 100755 diff --git a/src/admin/src/layouts/default.vue b/src/admin/src/layouts/default.vue old mode 100644 new mode 100755 diff --git a/src/admin/src/main.ts b/src/admin/src/main.ts old mode 100644 new mode 100755 diff --git a/src/admin/src/plugins/vuetify/defaults.ts b/src/admin/src/plugins/vuetify/defaults.ts old mode 100644 new mode 100755 diff --git a/src/admin/src/plugins/vuetify/icons.ts b/src/admin/src/plugins/vuetify/icons.ts old mode 100644 new mode 100755 diff --git a/src/admin/src/plugins/vuetify/index.ts b/src/admin/src/plugins/vuetify/index.ts old mode 100644 new mode 100755 diff --git a/src/admin/src/plugins/vuetify/theme.ts b/src/admin/src/plugins/vuetify/theme.ts old mode 100644 new mode 100755 diff --git a/src/admin/src/router/index.ts b/src/admin/src/router/index.ts old mode 100644 new mode 100755 diff --git a/src/admin/src/shims-vue.d.ts b/src/admin/src/shims-vue.d.ts old mode 100644 new mode 100755 diff --git a/src/admin/src/stores/auth.ts b/src/admin/src/stores/auth.ts old mode 100644 new mode 100755 diff --git a/src/admin/src/stores/context.ts b/src/admin/src/stores/context.ts old mode 100644 new mode 100755 diff --git a/src/admin/src/stores/theme.ts b/src/admin/src/stores/theme.ts old mode 100644 new mode 100755 diff --git a/src/admin/src/types/api.ts b/src/admin/src/types/api.ts old mode 100644 new mode 100755 diff --git a/src/admin/src/utils/validation.ts b/src/admin/src/utils/validation.ts old mode 100644 new mode 100755 diff --git a/src/admin/src/views/AcceptInviteView.vue b/src/admin/src/views/AcceptInviteView.vue old mode 100644 new mode 100755 diff --git a/src/admin/src/views/AuditLogsView.vue b/src/admin/src/views/AuditLogsView.vue old mode 100644 new mode 100755 diff --git a/src/admin/src/views/DashboardView.vue b/src/admin/src/views/DashboardView.vue old mode 100644 new mode 100755 diff --git a/src/admin/src/views/EnvironmentsView.vue b/src/admin/src/views/EnvironmentsView.vue old mode 100644 new mode 100755 diff --git a/src/admin/src/views/FeaturesView.vue b/src/admin/src/views/FeaturesView.vue old mode 100644 new mode 100755 diff --git a/src/admin/src/views/IdentitiesView.vue b/src/admin/src/views/IdentitiesView.vue old mode 100644 new mode 100755 diff --git a/src/admin/src/views/LoginView.vue b/src/admin/src/views/LoginView.vue old mode 100644 new mode 100755 diff --git a/src/admin/src/views/ProfileView.vue b/src/admin/src/views/ProfileView.vue old mode 100644 new mode 100755 diff --git a/src/admin/src/views/ProjectsView.vue b/src/admin/src/views/ProjectsView.vue old mode 100644 new mode 100755 diff --git a/src/admin/src/views/RegisterView.vue b/src/admin/src/views/RegisterView.vue old mode 100644 new mode 100755 diff --git a/src/admin/src/views/SegmentsView.vue b/src/admin/src/views/SegmentsView.vue old mode 100644 new mode 100755 diff --git a/src/admin/src/views/SettingsView.vue b/src/admin/src/views/SettingsView.vue old mode 100644 new mode 100755 diff --git a/src/admin/src/views/UserView.vue b/src/admin/src/views/UserView.vue old mode 100644 new mode 100755 diff --git a/src/admin/tests/__mocks__/fileMock.js b/src/admin/tests/__mocks__/fileMock.js old mode 100644 new mode 100755 diff --git a/src/admin/tests/__mocks__/styleMock.js b/src/admin/tests/__mocks__/styleMock.js old mode 100644 new mode 100755 diff --git a/src/admin/tests/setup.ts b/src/admin/tests/setup.ts old mode 100644 new mode 100755 diff --git a/src/admin/tests/unit/api/client.spec.ts b/src/admin/tests/unit/api/client.spec.ts old mode 100644 new mode 100755 diff --git a/src/admin/tests/unit/components/EnvironmentTabBar.spec.ts b/src/admin/tests/unit/components/EnvironmentTabBar.spec.ts old mode 100644 new mode 100755 diff --git a/src/admin/tests/unit/components/OrgSelector.spec.ts b/src/admin/tests/unit/components/OrgSelector.spec.ts old mode 100644 new mode 100755 diff --git a/src/admin/tests/unit/components/ProjectSelector.spec.ts b/src/admin/tests/unit/components/ProjectSelector.spec.ts old mode 100644 new mode 100755 diff --git a/src/admin/tests/unit/components/features/FeatureDetail.spec.ts b/src/admin/tests/unit/components/features/FeatureDetail.spec.ts old mode 100644 new mode 100755 diff --git a/src/admin/tests/unit/components/features/FeatureDialog.spec.ts b/src/admin/tests/unit/components/features/FeatureDialog.spec.ts old mode 100644 new mode 100755 diff --git a/src/admin/tests/unit/components/features/TagsChipInput.spec.ts b/src/admin/tests/unit/components/features/TagsChipInput.spec.ts old mode 100644 new mode 100755 diff --git a/src/admin/tests/unit/components/identities/IdentityDetail.spec.ts b/src/admin/tests/unit/components/identities/IdentityDetail.spec.ts old mode 100644 new mode 100755 diff --git a/src/admin/tests/unit/components/segments/SegmentEditor.spec.ts b/src/admin/tests/unit/components/segments/SegmentEditor.spec.ts old mode 100644 new mode 100755 diff --git a/src/admin/tests/unit/components/settings/WebhookDeliveryHistory.spec.ts b/src/admin/tests/unit/components/settings/WebhookDeliveryHistory.spec.ts old mode 100644 new mode 100755 diff --git a/src/admin/tests/unit/components/settings/WebhookDialog.spec.ts b/src/admin/tests/unit/components/settings/WebhookDialog.spec.ts old mode 100644 new mode 100755 diff --git a/src/admin/tests/unit/components/settings/WebhooksPanel.spec.ts b/src/admin/tests/unit/components/settings/WebhooksPanel.spec.ts old mode 100644 new mode 100755 diff --git a/src/admin/tests/unit/router/router.spec.ts b/src/admin/tests/unit/router/router.spec.ts old mode 100644 new mode 100755 diff --git a/src/admin/tests/unit/stores/auth.spec.ts b/src/admin/tests/unit/stores/auth.spec.ts old mode 100644 new mode 100755 diff --git a/src/admin/tests/unit/stores/context.spec.ts b/src/admin/tests/unit/stores/context.spec.ts old mode 100644 new mode 100755 diff --git a/src/admin/tests/unit/views/AuditLogsView.spec.ts b/src/admin/tests/unit/views/AuditLogsView.spec.ts old mode 100644 new mode 100755 diff --git a/src/admin/tests/unit/views/FeaturesView.spec.ts b/src/admin/tests/unit/views/FeaturesView.spec.ts old mode 100644 new mode 100755 diff --git a/src/admin/tests/unit/views/IdentitiesView.spec.ts b/src/admin/tests/unit/views/IdentitiesView.spec.ts old mode 100644 new mode 100755 diff --git a/src/admin/tests/unit/views/ProfileView.spec.ts b/src/admin/tests/unit/views/ProfileView.spec.ts old mode 100644 new mode 100755 diff --git a/src/admin/tests/unit/views/SegmentsView.spec.ts b/src/admin/tests/unit/views/SegmentsView.spec.ts old mode 100644 new mode 100755 diff --git a/src/admin/tests/unit/views/SettingsView.spec.ts b/src/admin/tests/unit/views/SettingsView.spec.ts old mode 100644 new mode 100755 diff --git a/src/admin/tsconfig.json b/src/admin/tsconfig.json old mode 100644 new mode 100755 diff --git a/src/admin/vite.config.ts b/src/admin/vite.config.ts old mode 100644 new mode 100755 index 462a8a2..e2f9a0a --- a/src/admin/vite.config.ts +++ b/src/admin/vite.config.ts @@ -22,6 +22,18 @@ export default defineConfig({ }, }, define: { 'process.env': {} }, + server: { + proxy: { + '/api': { + target: + process.env.services__api__https__0 ?? + process.env.services__api__http__0 ?? + 'http://localhost:5000', + changeOrigin: true, + secure: false, + }, + }, + }, resolve: { alias: { '@': fileURLToPath(new URL('./src', import.meta.url)), diff --git a/src/api/MicCheck.Api/ApiKeys/ApiKey.cs b/src/api/MicCheck.Api/ApiKeys/ApiKey.cs new file mode 100755 index 0000000..c3319e0 --- /dev/null +++ b/src/api/MicCheck.Api/ApiKeys/ApiKey.cs @@ -0,0 +1,13 @@ +namespace MicCheck.Api.ApiKeys; + +public class ApiKey +{ + public int Id { get; init; } + public required string Key { get; set; } + public required string Prefix { get; set; } + public required string Name { get; set; } + public int OrganizationId { get; init; } + public bool IsActive { get; set; } + public DateTimeOffset? ExpiresAt { get; set; } + public DateTimeOffset CreatedAt { get; init; } +} diff --git a/src/api/MicCheck.Api/ApiKeys/ApiKeyEndpoints.cs b/src/api/MicCheck.Api/ApiKeys/ApiKeyEndpoints.cs new file mode 100755 index 0000000..ca100f9 --- /dev/null +++ b/src/api/MicCheck.Api/ApiKeys/ApiKeyEndpoints.cs @@ -0,0 +1,46 @@ +using MicCheck.Api.Authorization; + +namespace MicCheck.Api.ApiKeys; + +public static class ApiKeyEndpoints +{ + public static void MapApiKeyEndpoints(this WebApplication app) + { + var group = app + .MapGroup("/api/v1/organisations/{organizationId:int}/api-keys") + .RequireAuthorization(AuthorizationPolicies.OrganizationAdmin) + .WithTags("ApiKeys"); + + group.MapPost("/", async ( + int organizationId, + CreateApiKeyRequest request, + ApiKeyService apiKeyService, + CancellationToken ct) => + { + var (key, rawKey) = await apiKeyService.CreateAsync( + organizationId, request.Name, request.ExpiresAt, ct); + + return Results.Ok(new CreateApiKeyResponse(key.Id, key.Name, rawKey, key.Prefix, key.ExpiresAt)); + }).WithName("CreateApiKey"); + + group.MapGet("/", async ( + int organizationId, + ApiKeyService apiKeyService, + CancellationToken ct) => + { + var keys = await apiKeyService.ListAsync(organizationId, ct); + return Results.Ok(keys.Select(k => + new ApiKeyResponse(k.Id, k.Name, k.Prefix, k.IsActive, k.ExpiresAt, k.CreatedAt))); + }).WithName("ListApiKeys"); + + group.MapDelete("/{keyId:int}", async ( + int organizationId, + int keyId, + ApiKeyService apiKeyService, + CancellationToken ct) => + { + await apiKeyService.RevokeAsync(organizationId, keyId, ct); + return Results.NoContent(); + }).WithName("RevokeApiKey"); + } +} diff --git a/src/api/MicCheck.Api/ApiKeys/ApiKeyHasher.cs b/src/api/MicCheck.Api/ApiKeys/ApiKeyHasher.cs new file mode 100755 index 0000000..63a7445 --- /dev/null +++ b/src/api/MicCheck.Api/ApiKeys/ApiKeyHasher.cs @@ -0,0 +1,22 @@ +using System.Security.Cryptography; +using System.Text; + +namespace MicCheck.Api.ApiKeys; + +public static class ApiKeyHasher +{ + public static string Hash(string key) + { + var bytes = SHA256.HashData(Encoding.UTF8.GetBytes(key)); + return Convert.ToHexString(bytes).ToLowerInvariant(); + } + + public static string GenerateKey() + { + var bytes = RandomNumberGenerator.GetBytes(32); + return Convert.ToBase64String(bytes) + .TrimEnd('=') + .Replace('+', '-') + .Replace('/', '_'); + } +} diff --git a/src/api/MicCheck.Api/ApiKeys/ApiKeyResponse.cs b/src/api/MicCheck.Api/ApiKeys/ApiKeyResponse.cs new file mode 100755 index 0000000..98e32d5 --- /dev/null +++ b/src/api/MicCheck.Api/ApiKeys/ApiKeyResponse.cs @@ -0,0 +1,9 @@ +namespace MicCheck.Api.ApiKeys; + +public record ApiKeyResponse( + int Id, + string Name, + string Prefix, + bool IsActive, + DateTimeOffset? ExpiresAt, + DateTimeOffset CreatedAt); diff --git a/src/api/MicCheck.Api/ApiKeys/ApiKeyService.cs b/src/api/MicCheck.Api/ApiKeys/ApiKeyService.cs new file mode 100755 index 0000000..f697c5a --- /dev/null +++ b/src/api/MicCheck.Api/ApiKeys/ApiKeyService.cs @@ -0,0 +1,50 @@ +using MicCheck.Api.Data; +using Microsoft.EntityFrameworkCore; + +namespace MicCheck.Api.ApiKeys; + +public class ApiKeyService(MicCheckDbContext db) +{ + public async Task<(ApiKey Key, string RawKey)> CreateAsync( + int organizationId, string name, DateTimeOffset? expiresAt, CancellationToken ct = default) + { + var rawKey = ApiKeyHasher.GenerateKey(); + var hashedKey = ApiKeyHasher.Hash(rawKey); + var prefix = rawKey.Length >= 8 ? rawKey[..8] : rawKey; + + var apiKey = new ApiKey + { + Key = hashedKey, + Prefix = prefix, + Name = name, + OrganizationId = organizationId, + IsActive = true, + ExpiresAt = expiresAt, + CreatedAt = DateTimeOffset.UtcNow + }; + + db.ApiKeys.Add(apiKey); + await db.SaveChangesAsync(ct); + + return (apiKey, rawKey); + } + + public async Task> ListAsync(int organizationId, CancellationToken ct = default) + { + return await db.ApiKeys + .Where(k => k.OrganizationId == organizationId) + .ToListAsync(ct); + } + + public async Task RevokeAsync(int organizationId, int keyId, CancellationToken ct = default) + { + var key = await db.ApiKeys + .FirstOrDefaultAsync(k => k.Id == keyId && k.OrganizationId == organizationId, ct); + + if (key is null) + return; + + key.IsActive = false; + await db.SaveChangesAsync(ct); + } +} diff --git a/src/api/MicCheck.Api/ApiKeys/CreateApiKeyRequest.cs b/src/api/MicCheck.Api/ApiKeys/CreateApiKeyRequest.cs new file mode 100755 index 0000000..f495617 --- /dev/null +++ b/src/api/MicCheck.Api/ApiKeys/CreateApiKeyRequest.cs @@ -0,0 +1,3 @@ +namespace MicCheck.Api.ApiKeys; + +public record CreateApiKeyRequest(string Name, DateTimeOffset? ExpiresAt); diff --git a/src/api/MicCheck.Api/ApiKeys/CreateApiKeyResponse.cs b/src/api/MicCheck.Api/ApiKeys/CreateApiKeyResponse.cs new file mode 100755 index 0000000..615ede6 --- /dev/null +++ b/src/api/MicCheck.Api/ApiKeys/CreateApiKeyResponse.cs @@ -0,0 +1,8 @@ +namespace MicCheck.Api.ApiKeys; + +public record CreateApiKeyResponse( + int Id, + string Name, + string Key, + string Prefix, + DateTimeOffset? ExpiresAt); diff --git a/src/api/MicCheck.Api/Audit/AuditLog.cs b/src/api/MicCheck.Api/Audit/AuditLog.cs old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/Audit/AuditLogFilter.cs b/src/api/MicCheck.Api/Audit/AuditLogFilter.cs old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/Audit/AuditLogQueryService.cs b/src/api/MicCheck.Api/Audit/AuditLogQueryService.cs old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/Audit/AuditLogResponse.cs b/src/api/MicCheck.Api/Audit/AuditLogResponse.cs old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/Audit/AuditLogsController.cs b/src/api/MicCheck.Api/Audit/AuditLogsController.cs old mode 100644 new mode 100755 index 1ae381f..dde0b3e --- a/src/api/MicCheck.Api/Audit/AuditLogsController.cs +++ b/src/api/MicCheck.Api/Audit/AuditLogsController.cs @@ -1,59 +1,59 @@ -using MicCheck.Api.Common.Security.Authorization; -using MicCheck.Api.Common; -using MicCheck.Api.Environments; -using MicCheck.Api.Projects; -using MicCheck.Api.Organizations; -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Mvc; -using Microsoft.AspNetCore.RateLimiting; - -namespace MicCheck.Api.Audit; - -[ApiController] -[Authorize(Policy = AuthorizationPolicies.AdminApiAccess)] -[EnableRateLimiting("AdminApi")] -public class AuditLogsController( - AuditLogQueryService auditLogQueryService, - OrganizationService organizationService, - ProjectService projectService, - EnvironmentService environmentService) : ControllerBase -{ - [HttpGet("api/v1/organisations/{id}/audit-logs")] - public async Task>> ListByOrganization( - int id, - [FromQuery] AuditLogFilter filter, - CancellationToken ct) - { - var org = await organizationService.FindByIdAsync(id, ct); - if (org is null) return NotFound(); - - var (total, logs) = await auditLogQueryService.ListByOrganizationAsync(id, filter, ct); - return Ok(new PaginatedResponse(total, null, null, logs.ToList())); - } - - [HttpGet("api/v1/projects/{projectId}/audit-logs")] - public async Task>> ListByProject( - int projectId, - [FromQuery] AuditLogFilter filter, - CancellationToken ct) - { - var project = await projectService.FindByIdAsync(projectId, ct); - if (project is null) return NotFound(); - - var (total, logs) = await auditLogQueryService.ListByProjectAsync(projectId, filter, ct); - return Ok(new PaginatedResponse(total, null, null, logs.ToList())); - } - - [HttpGet("api/v1/environments/{apiKey}/audit-logs")] - public async Task>> ListByEnvironment( - string apiKey, - [FromQuery] AuditLogFilter filter, - CancellationToken ct) - { - var environment = await environmentService.FindByApiKeyAsync(apiKey, ct); - if (environment is null) return NotFound(); - - var (total, logs) = await auditLogQueryService.ListByEnvironmentAsync(environment.Id, filter, ct); - return Ok(new PaginatedResponse(total, null, null, logs.ToList())); - } -} +using MicCheck.Api.Common.Security.Authorization; +using MicCheck.Api.Common; +using MicCheck.Api.Environments; +using MicCheck.Api.Projects; +using MicCheck.Api.Organizations; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.RateLimiting; + +namespace MicCheck.Api.Audit; + +[ApiController] +[Authorize(Policy = AuthorizationPolicies.AdminApiAccess)] +[EnableRateLimiting("AdminApi")] +public class AuditLogsController( + AuditLogQueryService auditLogQueryService, + OrganizationService organizationService, + ProjectService projectService, + EnvironmentService environmentService) : ControllerBase +{ + [HttpGet("api/v1/organisations/{id}/audit-logs")] + public async Task>> ListByOrganization( + int id, + [FromQuery] AuditLogFilter filter, + CancellationToken ct) + { + var org = await organizationService.FindByIdAsync(id, ct); + if (org is null) return NotFound(); + + var (total, logs) = await auditLogQueryService.ListByOrganizationAsync(id, filter, ct); + return Ok(new PaginatedResponse(total, null, null, logs.ToList())); + } + + [HttpGet("api/v1/projects/{projectId}/audit-logs")] + public async Task>> ListByProject( + int projectId, + [FromQuery] AuditLogFilter filter, + CancellationToken ct) + { + var project = await projectService.FindByIdAsync(projectId, ct); + if (project is null) return NotFound(); + + var (total, logs) = await auditLogQueryService.ListByProjectAsync(projectId, filter, ct); + return Ok(new PaginatedResponse(total, null, null, logs.ToList())); + } + + [HttpGet("api/v1/environments/{apiKey}/audit-logs")] + public async Task>> ListByEnvironment( + string apiKey, + [FromQuery] AuditLogFilter filter, + CancellationToken ct) + { + var environment = await environmentService.FindByApiKeyAsync(apiKey, ct); + if (environment is null) return NotFound(); + + var (total, logs) = await auditLogQueryService.ListByEnvironmentAsync(environment.Id, filter, ct); + return Ok(new PaginatedResponse(total, null, null, logs.ToList())); + } +} diff --git a/src/api/MicCheck.Api/Audit/AuditService.cs b/src/api/MicCheck.Api/Audit/AuditService.cs old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/Authentication/ApiKeyAuthenticationHandler.cs b/src/api/MicCheck.Api/Authentication/ApiKeyAuthenticationHandler.cs new file mode 100755 index 0000000..859bbe7 --- /dev/null +++ b/src/api/MicCheck.Api/Authentication/ApiKeyAuthenticationHandler.cs @@ -0,0 +1,60 @@ +using System.Security.Claims; +using System.Text.Encodings.Web; +using MicCheck.Api.ApiKeys; +using MicCheck.Api.Data; +using Microsoft.AspNetCore.Authentication; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Options; + +namespace MicCheck.Api.Authentication; + +public class ApiKeyAuthenticationHandler( + IOptionsMonitor options, + ILoggerFactory logger, + UrlEncoder encoder, + MicCheckDbContext db) + : AuthenticationHandler(options, logger, encoder) +{ + public const string SchemeName = "ApiKey"; + private const string ApiKeyPrefix = "Api-Key "; + + protected override async Task HandleAuthenticateAsync() + { + if (!Request.Headers.TryGetValue("Authorization", out var authHeader)) + return AuthenticateResult.NoResult(); + + var headerValue = authHeader.FirstOrDefault(); + if (string.IsNullOrWhiteSpace(headerValue) || + !headerValue.StartsWith(ApiKeyPrefix, StringComparison.OrdinalIgnoreCase)) + return AuthenticateResult.NoResult(); + + var rawKey = headerValue[ApiKeyPrefix.Length..].Trim(); + if (string.IsNullOrWhiteSpace(rawKey)) + return AuthenticateResult.Fail("API key value is empty."); + + var hashedKey = ApiKeyHasher.Hash(rawKey); + + var apiKey = await db.ApiKeys + .FirstOrDefaultAsync(k => k.Key == hashedKey); + + if (apiKey is null) + return AuthenticateResult.Fail("Invalid API key."); + + if (!apiKey.IsActive) + return AuthenticateResult.Fail("API key is inactive."); + + if (apiKey.ExpiresAt.HasValue && apiKey.ExpiresAt.Value < DateTimeOffset.UtcNow) + return AuthenticateResult.Fail("API key has expired."); + + var claims = new[] + { + new Claim("OrganizationId", apiKey.OrganizationId.ToString()), + new Claim("OrganizationRole", "Admin") + }; + + var identity = new ClaimsIdentity(claims, Scheme.Name); + var ticket = new AuthenticationTicket(new ClaimsPrincipal(identity), Scheme.Name); + + return AuthenticateResult.Success(ticket); + } +} diff --git a/src/api/MicCheck.Api/Authentication/EnvironmentKeyAuthenticationHandler.cs b/src/api/MicCheck.Api/Authentication/EnvironmentKeyAuthenticationHandler.cs new file mode 100755 index 0000000..42cfe0f --- /dev/null +++ b/src/api/MicCheck.Api/Authentication/EnvironmentKeyAuthenticationHandler.cs @@ -0,0 +1,45 @@ +using System.Security.Claims; +using System.Text.Encodings.Web; +using MicCheck.Api.Data; +using Microsoft.AspNetCore.Authentication; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Options; + +namespace MicCheck.Api.Authentication; + +public class EnvironmentKeyAuthenticationHandler( + IOptionsMonitor options, + ILoggerFactory logger, + UrlEncoder encoder, + MicCheckDbContext db) + : AuthenticationHandler(options, logger, encoder) +{ + public const string SchemeName = "EnvironmentKey"; + + protected override async Task HandleAuthenticateAsync() + { + if (!Request.Headers.TryGetValue("X-Environment-Key", out var keyValues)) + return AuthenticateResult.NoResult(); + + var key = keyValues.FirstOrDefault(); + if (string.IsNullOrWhiteSpace(key)) + return AuthenticateResult.Fail("X-Environment-Key header is empty."); + + var environment = await db.Environments + .FirstOrDefaultAsync(e => e.ApiKey == key); + + if (environment is null) + return AuthenticateResult.Fail("Invalid environment key."); + + var claims = new[] + { + new Claim("EnvironmentId", environment.Id.ToString()), + new Claim("ProjectId", environment.ProjectId.ToString()) + }; + + var identity = new ClaimsIdentity(claims, Scheme.Name); + var ticket = new AuthenticationTicket(new ClaimsPrincipal(identity), Scheme.Name); + + return AuthenticateResult.Success(ticket); + } +} diff --git a/src/api/MicCheck.Api/Authorization/AuthEndpoints.cs b/src/api/MicCheck.Api/Authorization/AuthEndpoints.cs new file mode 100755 index 0000000..77b1477 --- /dev/null +++ b/src/api/MicCheck.Api/Authorization/AuthEndpoints.cs @@ -0,0 +1,66 @@ +using Microsoft.AspNetCore.Mvc; + +namespace MicCheck.Api.Authorization; + +public static class AuthEndpoints +{ + public static void MapAuthEndpoints(this WebApplication app) + { + var group = app.MapGroup("/api/v1/auth").AllowAnonymous().WithTags("Auth"); + + group.MapPost("/login", async ( + [FromBody] LoginRequest request, + AuthService authService, + CancellationToken ct) => + { + if (string.IsNullOrWhiteSpace(request.Email) || string.IsNullOrWhiteSpace(request.Password)) + return Results.BadRequest("Email and password are required."); + + var response = await authService.LoginAsync(request.Email, request.Password, ct); + return response is null + ? Results.Unauthorized() + : Results.Ok(response); + }).WithName("Login"); + + group.MapPost("/register", async ( + [FromBody] RegisterRequest request, + AuthService authService, + CancellationToken ct) => + { + if (string.IsNullOrWhiteSpace(request.Email) || string.IsNullOrWhiteSpace(request.Password)) + return Results.BadRequest("Email and password are required."); + + var response = await authService.RegisterAsync( + request.Email, request.Password, + request.FirstName, request.LastName, + request.OrganizationName, ct); + + return response is null + ? Results.Conflict("An account with this email already exists.") + : Results.Ok(response); + }).WithName("Register"); + + group.MapPost("/refresh", async ( + [FromBody] RefreshRequest request, + AuthService authService, + CancellationToken ct) => + { + if (string.IsNullOrWhiteSpace(request.Token)) + return Results.BadRequest("Refresh token is required."); + + var response = await authService.RefreshAsync(request.Token, ct); + return response is null + ? Results.Unauthorized() + : Results.Ok(response); + }).WithName("RefreshToken"); + + group.MapPost("/logout", async ( + [FromBody] LogoutRequest request, + AuthService authService, + CancellationToken ct) => + { + await authService.LogoutAsync(request.Token, ct); + return Results.NoContent(); + }).WithName("Logout"); + } +} diff --git a/src/api/MicCheck.Api/Authorization/AuthService.cs b/src/api/MicCheck.Api/Authorization/AuthService.cs new file mode 100755 index 0000000..714ced0 --- /dev/null +++ b/src/api/MicCheck.Api/Authorization/AuthService.cs @@ -0,0 +1,145 @@ +using System.Security.Cryptography; +using MicCheck.Api.Data; +using MicCheck.Api.Organizations; +using MicCheck.Api.Users; +using Microsoft.AspNetCore.Identity; +using Microsoft.EntityFrameworkCore; + +namespace MicCheck.Api.Authorization; + +public class AuthService( + MicCheckDbContext db, + ITokenService tokenService, + IPasswordHasher passwordHasher) +{ + public async Task LoginAsync(string email, string password, CancellationToken ct = default) + { + var user = await db.Users + .Include(u => u.Organizations) + .FirstOrDefaultAsync(u => u.Email == email && u.IsActive, ct); + + if (user is null) + return null; + + var result = passwordHasher.VerifyHashedPassword(user, user.PasswordHash, password); + if (result == PasswordVerificationResult.Failed) + return null; + + var accessToken = tokenService.GenerateToken(user); + var refreshTokenValue = GenerateSecureToken(); + + db.RefreshTokens.Add(new RefreshToken + { + Token = refreshTokenValue, + UserId = user.Id, + ExpiresAt = DateTimeOffset.UtcNow.AddDays(30), + CreatedAt = DateTimeOffset.UtcNow + }); + + user.LastLoginAt = DateTimeOffset.UtcNow; + await db.SaveChangesAsync(ct); + + return new LoginResponse(accessToken.Token, refreshTokenValue, accessToken.ExpiresAt); + } + + public async Task RegisterAsync( + string email, string password, + string firstName, string lastName, + string organizationName, + CancellationToken ct = default) + { + if (await db.Users.AnyAsync(u => u.Email == email, ct)) + return null; + + var user = new User + { + Email = email, + FirstName = firstName, + LastName = lastName, + IsActive = true, + CreatedAt = DateTimeOffset.UtcNow, + PasswordHash = string.Empty + }; + user.PasswordHash = passwordHasher.HashPassword(user, password); + + db.Users.Add(user); + await db.SaveChangesAsync(ct); + + var organization = new Organization + { + Name = organizationName, + CreatedAt = DateTimeOffset.UtcNow + }; + db.Organizations.Add(organization); + await db.SaveChangesAsync(ct); + + db.OrganizationUsers.Add(new OrganizationUser + { + OrganizationId = organization.Id, + UserId = user.Id, + Role = OrganizationRole.Admin + }); + await db.SaveChangesAsync(ct); + + await db.Entry(user).Collection(u => u.Organizations).LoadAsync(ct); + + var accessToken = tokenService.GenerateToken(user); + var refreshTokenValue = GenerateSecureToken(); + + db.RefreshTokens.Add(new RefreshToken + { + Token = refreshTokenValue, + UserId = user.Id, + ExpiresAt = DateTimeOffset.UtcNow.AddDays(30), + CreatedAt = DateTimeOffset.UtcNow + }); + await db.SaveChangesAsync(ct); + + return new LoginResponse(accessToken.Token, refreshTokenValue, accessToken.ExpiresAt); + } + + public async Task RefreshAsync(string refreshToken, CancellationToken ct = default) + { + var token = await db.RefreshTokens + .Include(rt => rt.User) + .ThenInclude(u => u.Organizations) + .FirstOrDefaultAsync(rt => rt.Token == refreshToken && !rt.IsRevoked, ct); + + if (token is null || token.ExpiresAt < DateTimeOffset.UtcNow) + return null; + + token.IsRevoked = true; + + var accessToken = tokenService.GenerateToken(token.User); + var newRefreshTokenValue = GenerateSecureToken(); + + db.RefreshTokens.Add(new RefreshToken + { + Token = newRefreshTokenValue, + UserId = token.UserId, + ExpiresAt = DateTimeOffset.UtcNow.AddDays(30), + CreatedAt = DateTimeOffset.UtcNow + }); + await db.SaveChangesAsync(ct); + + return new LoginResponse(accessToken.Token, newRefreshTokenValue, accessToken.ExpiresAt); + } + + public async Task LogoutAsync(string refreshToken, CancellationToken ct = default) + { + var token = await db.RefreshTokens + .FirstOrDefaultAsync(rt => rt.Token == refreshToken && !rt.IsRevoked, ct); + + if (token is null) + return; + + token.IsRevoked = true; + await db.SaveChangesAsync(ct); + } + + private static string GenerateSecureToken() + { + var bytes = RandomNumberGenerator.GetBytes(64); + return Convert.ToBase64String(bytes); + } +} diff --git a/src/api/MicCheck.Api/Authorization/AuthorizationPolicies.cs b/src/api/MicCheck.Api/Authorization/AuthorizationPolicies.cs new file mode 100755 index 0000000..005befd --- /dev/null +++ b/src/api/MicCheck.Api/Authorization/AuthorizationPolicies.cs @@ -0,0 +1,8 @@ +namespace MicCheck.Api.Authorization; + +public static class AuthorizationPolicies +{ + public const string FlagsApiAccess = "FlagsApiAccess"; + public const string AdminApiAccess = "AdminApiAccess"; + public const string OrganizationAdmin = "OrganizationAdmin"; +} diff --git a/src/api/MicCheck.Api/Authorization/ITokenService.cs b/src/api/MicCheck.Api/Authorization/ITokenService.cs new file mode 100755 index 0000000..bbbfba1 --- /dev/null +++ b/src/api/MicCheck.Api/Authorization/ITokenService.cs @@ -0,0 +1,8 @@ +using MicCheck.Api.Users; + +namespace MicCheck.Api.Authorization; + +public interface ITokenService +{ + TokenResponse GenerateToken(User user); +} diff --git a/src/api/MicCheck.Api/Authorization/LoginRequest.cs b/src/api/MicCheck.Api/Authorization/LoginRequest.cs new file mode 100755 index 0000000..f1fbd85 --- /dev/null +++ b/src/api/MicCheck.Api/Authorization/LoginRequest.cs @@ -0,0 +1,3 @@ +namespace MicCheck.Api.Authorization; + +public record LoginRequest(string Email, string Password); diff --git a/src/api/MicCheck.Api/Authorization/LoginResponse.cs b/src/api/MicCheck.Api/Authorization/LoginResponse.cs new file mode 100755 index 0000000..e13a8d8 --- /dev/null +++ b/src/api/MicCheck.Api/Authorization/LoginResponse.cs @@ -0,0 +1,3 @@ +namespace MicCheck.Api.Authorization; + +public record LoginResponse(string AccessToken, string RefreshToken, DateTime ExpiresAt); diff --git a/src/api/MicCheck.Api/Authorization/LogoutRequest.cs b/src/api/MicCheck.Api/Authorization/LogoutRequest.cs new file mode 100755 index 0000000..b379da0 --- /dev/null +++ b/src/api/MicCheck.Api/Authorization/LogoutRequest.cs @@ -0,0 +1,3 @@ +namespace MicCheck.Api.Authorization; + +public record LogoutRequest(string Token); diff --git a/src/api/MicCheck.Api/Authorization/ProjectPermission.cs b/src/api/MicCheck.Api/Authorization/ProjectPermission.cs new file mode 100755 index 0000000..83d795b --- /dev/null +++ b/src/api/MicCheck.Api/Authorization/ProjectPermission.cs @@ -0,0 +1,17 @@ +namespace MicCheck.Api.Authorization; + +public enum ProjectPermission +{ + ViewProject, + CreateFeature, + EditFeature, + DeleteFeature, + CreateEnvironment, + EditEnvironment, + DeleteEnvironment, + CreateSegment, + EditSegment, + DeleteSegment, + ManageWebhooks, + ViewAuditLog +} diff --git a/src/api/MicCheck.Api/Authorization/ProjectPermissionRequirement.cs b/src/api/MicCheck.Api/Authorization/ProjectPermissionRequirement.cs new file mode 100755 index 0000000..af864db --- /dev/null +++ b/src/api/MicCheck.Api/Authorization/ProjectPermissionRequirement.cs @@ -0,0 +1,10 @@ +using Microsoft.AspNetCore.Authorization; + +namespace MicCheck.Api.Authorization; + +public class ProjectPermissionRequirement : IAuthorizationRequirement +{ + public ProjectPermission Permission { get; } + + public ProjectPermissionRequirement(ProjectPermission permission) => Permission = permission; +} diff --git a/src/api/MicCheck.Api/Authorization/ProjectPermissionRequirementHandler.cs b/src/api/MicCheck.Api/Authorization/ProjectPermissionRequirementHandler.cs new file mode 100755 index 0000000..c550931 --- /dev/null +++ b/src/api/MicCheck.Api/Authorization/ProjectPermissionRequirementHandler.cs @@ -0,0 +1,54 @@ +using System.IdentityModel.Tokens.Jwt; +using MicCheck.Api.Data; +using MicCheck.Api.Organizations; +using Microsoft.AspNetCore.Authorization; +using Microsoft.EntityFrameworkCore; + +namespace MicCheck.Api.Authorization; + +public class ProjectPermissionRequirementHandler( + MicCheckDbContext db, + IHttpContextAccessor httpContextAccessor) + : AuthorizationHandler +{ + protected override async Task HandleRequirementAsync( + AuthorizationHandlerContext context, + ProjectPermissionRequirement requirement) + { + var userIdClaim = context.User.FindFirst(JwtRegisteredClaimNames.Sub); + if (userIdClaim is null || !int.TryParse(userIdClaim.Value, out var userId)) + { + context.Fail(); + return; + } + + if (context.User.HasClaim("OrganizationRole", OrganizationRole.Admin.ToString())) + { + context.Succeed(requirement); + return; + } + + var httpContext = httpContextAccessor.HttpContext; + if (httpContext is null || + !httpContext.Request.RouteValues.TryGetValue("projectId", out var projectIdValue) || + !int.TryParse(projectIdValue?.ToString(), out var projectId)) + { + context.Fail(); + return; + } + + var permission = await db.UserProjectPermissions + .FirstOrDefaultAsync(p => p.UserId == userId && p.ProjectId == projectId); + + if (permission is null) + { + context.Fail(); + return; + } + + if (permission.IsAdmin || permission.Permissions.Contains(requirement.Permission)) + context.Succeed(requirement); + else + context.Fail(); + } +} diff --git a/src/api/MicCheck.Api/Authorization/RefreshRequest.cs b/src/api/MicCheck.Api/Authorization/RefreshRequest.cs new file mode 100755 index 0000000..94aa24e --- /dev/null +++ b/src/api/MicCheck.Api/Authorization/RefreshRequest.cs @@ -0,0 +1,3 @@ +namespace MicCheck.Api.Authorization; + +public record RefreshRequest(string Token); diff --git a/src/api/MicCheck.Api/Authorization/RegisterRequest.cs b/src/api/MicCheck.Api/Authorization/RegisterRequest.cs new file mode 100755 index 0000000..58dcffe --- /dev/null +++ b/src/api/MicCheck.Api/Authorization/RegisterRequest.cs @@ -0,0 +1,8 @@ +namespace MicCheck.Api.Authorization; + +public record RegisterRequest( + string Email, + string Password, + string FirstName, + string LastName, + string OrganizationName); diff --git a/src/api/MicCheck.Api/Authorization/TokenResponse.cs b/src/api/MicCheck.Api/Authorization/TokenResponse.cs new file mode 100755 index 0000000..0439497 --- /dev/null +++ b/src/api/MicCheck.Api/Authorization/TokenResponse.cs @@ -0,0 +1,3 @@ +namespace MicCheck.Api.Authorization; + +public record TokenResponse(string Token, DateTime ExpiresAt); diff --git a/src/api/MicCheck.Api/Authorization/TokenService.cs b/src/api/MicCheck.Api/Authorization/TokenService.cs new file mode 100755 index 0000000..089fb53 --- /dev/null +++ b/src/api/MicCheck.Api/Authorization/TokenService.cs @@ -0,0 +1,52 @@ +using System.IdentityModel.Tokens.Jwt; +using System.Security.Claims; +using System.Text; +using MicCheck.Api.Users; +using Microsoft.IdentityModel.Tokens; + +namespace MicCheck.Api.Authorization; + +public class TokenService(IConfiguration configuration) : ITokenService +{ + public TokenResponse GenerateToken(User user) + { + var secretKey = configuration["Jwt:SecretKey"] + ?? throw new InvalidOperationException("Jwt:SecretKey is not configured."); + var issuer = configuration["Jwt:Issuer"] + ?? throw new InvalidOperationException("Jwt:Issuer is not configured."); + var audience = configuration["Jwt:Audience"] + ?? throw new InvalidOperationException("Jwt:Audience is not configured."); + var expiryMinutes = int.Parse(configuration["Jwt:ExpiryMinutes"] ?? "60"); + + var securityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(secretKey)); + var credentials = new SigningCredentials(securityKey, SecurityAlgorithms.HmacSha256); + var expiresAt = DateTime.UtcNow.AddMinutes(expiryMinutes); + + var claims = new List + { + new(JwtRegisteredClaimNames.Sub, user.Id.ToString()), + new(JwtRegisteredClaimNames.Email, user.Email), + new(JwtRegisteredClaimNames.GivenName, user.FirstName), + new(JwtRegisteredClaimNames.FamilyName, user.LastName), + new(JwtRegisteredClaimNames.Iat, + DateTimeOffset.UtcNow.ToUnixTimeSeconds().ToString(), + ClaimValueTypes.Integer64), + new(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()), + }; + + foreach (var org in user.Organizations) + { + claims.Add(new Claim("OrganizationId", org.OrganizationId.ToString())); + claims.Add(new Claim("OrganizationRole", org.Role.ToString())); + } + + var token = new JwtSecurityToken( + issuer: issuer, + audience: audience, + claims: claims, + expires: expiresAt, + signingCredentials: credentials); + + return new TokenResponse(new JwtSecurityTokenHandler().WriteToken(token), expiresAt); + } +} diff --git a/src/api/MicCheck.Api/Authorization/UserProjectPermission.cs b/src/api/MicCheck.Api/Authorization/UserProjectPermission.cs new file mode 100755 index 0000000..34001bd --- /dev/null +++ b/src/api/MicCheck.Api/Authorization/UserProjectPermission.cs @@ -0,0 +1,9 @@ +namespace MicCheck.Api.Authorization; + +public class UserProjectPermission +{ + public int UserId { get; init; } + public int ProjectId { get; init; } + public List Permissions { get; set; } = []; + public bool IsAdmin { get; set; } +} diff --git a/src/api/MicCheck.Api/Common/DomainException.cs b/src/api/MicCheck.Api/Common/DomainException.cs old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/Common/PaginatedResponse.cs b/src/api/MicCheck.Api/Common/PaginatedResponse.cs old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/Common/Security/ApiKeys/ApiKey.cs b/src/api/MicCheck.Api/Common/Security/ApiKeys/ApiKey.cs old mode 100644 new mode 100755 index b208ea5..8a7df52 --- a/src/api/MicCheck.Api/Common/Security/ApiKeys/ApiKey.cs +++ b/src/api/MicCheck.Api/Common/Security/ApiKeys/ApiKey.cs @@ -1,13 +1,13 @@ -namespace MicCheck.Api.Common.Security.ApiKeys; - -public class ApiKey -{ - public int Id { get; init; } - public required string Key { get; set; } - public required string Prefix { get; set; } - public required string Name { get; set; } - public int OrganizationId { get; init; } - public bool IsActive { get; set; } - public DateTimeOffset? ExpiresAt { get; set; } - public DateTimeOffset CreatedAt { get; init; } -} +namespace MicCheck.Api.Common.Security.ApiKeys; + +public class ApiKey +{ + public int Id { get; init; } + public required string Key { get; set; } + public required string Prefix { get; set; } + public required string Name { get; set; } + public int OrganizationId { get; init; } + public bool IsActive { get; set; } + public DateTimeOffset? ExpiresAt { get; set; } + public DateTimeOffset CreatedAt { get; init; } +} diff --git a/src/api/MicCheck.Api/Common/Security/ApiKeys/ApiKeyEndpoints.cs b/src/api/MicCheck.Api/Common/Security/ApiKeys/ApiKeyEndpoints.cs old mode 100644 new mode 100755 index aae7fe9..99232f4 --- a/src/api/MicCheck.Api/Common/Security/ApiKeys/ApiKeyEndpoints.cs +++ b/src/api/MicCheck.Api/Common/Security/ApiKeys/ApiKeyEndpoints.cs @@ -1,46 +1,37 @@ -using MicCheck.Api.Common.Security.Authorization; - -namespace MicCheck.Api.Common.Security.ApiKeys; - -public static class ApiKeyEndpoints -{ - public static void MapApiKeyEndpoints(this WebApplication app) - { - var group = app - .MapGroup("/api/v1/organisations/{organizationId:int}/api-keys") - .RequireAuthorization(AuthorizationPolicies.OrganizationAdmin) - .WithTags("ApiKeys"); - - group.MapPost("/", async ( - int organizationId, - CreateApiKeyRequest request, - ApiKeyService apiKeyService, - CancellationToken ct) => - { - var (key, rawKey) = await apiKeyService.CreateAsync( - organizationId, request.Name, request.ExpiresAt, ct); - - return Results.Ok(new CreateApiKeyResponse(key.Id, key.Name, rawKey, key.Prefix, key.ExpiresAt)); - }).WithName("CreateApiKey"); - - group.MapGet("/", async ( - int organizationId, - ApiKeyService apiKeyService, - CancellationToken ct) => - { - var keys = await apiKeyService.ListAsync(organizationId, ct); - return Results.Ok(keys.Select(k => - new ApiKeyResponse(k.Id, k.Name, k.Prefix, k.IsActive, k.ExpiresAt, k.CreatedAt))); - }).WithName("ListApiKeys"); - - group.MapDelete("/{keyId:int}", async ( - int organizationId, - int keyId, - ApiKeyService apiKeyService, - CancellationToken ct) => - { - await apiKeyService.RevokeAsync(organizationId, keyId, ct); - return Results.NoContent(); - }).WithName("RevokeApiKey"); - } -} +using MicCheck.Api.Common.Security.Authorization; + +namespace MicCheck.Api.Common.Security.ApiKeys; + +public static class ApiKeyEndpoints +{ + public static void MapApiKeyEndpoints(this WebApplication app) + { + var group = app + .MapGroup("/api/v1/organisations/{organizationId:int}/api-keys") + .RequireAuthorization(AuthorizationPolicies.OrganizationAdmin) + .WithTags("ApiKeys"); + + group.MapPost("/", async (int organizationId, CreateApiKeyRequest request, ApiKeyService apiKeyService, CancellationToken ct) => + { + var (key, rawKey) = await apiKeyService.CreateAsync( + organizationId, request.Name, request.ExpiresAt, ct); + + return Results.Ok(new CreateApiKeyResponse(key.Id, key.Name, rawKey, key.Prefix, key.ExpiresAt)); + + }).WithName("CreateApiKey"); + + group.MapGet("/", async (int organizationId, ApiKeyService apiKeyService, CancellationToken ct) => + { + var keys = await apiKeyService.ListAsync(organizationId, ct); + return Results.Ok(keys.Select(k => new ApiKeyResponse(k.Id, k.Name, k.Prefix, k.IsActive, k.ExpiresAt, k.CreatedAt))); + + }).WithName("ListApiKeys"); + + group.MapDelete("/{keyId:int}", async (int organizationId, int keyId, ApiKeyService apiKeyService, CancellationToken ct) => + { + await apiKeyService.RevokeAsync(organizationId, keyId, ct); + return Results.NoContent(); + + }).WithName("RevokeApiKey"); + } +} diff --git a/src/api/MicCheck.Api/Common/Security/ApiKeys/ApiKeyHasher.cs b/src/api/MicCheck.Api/Common/Security/ApiKeys/ApiKeyHasher.cs old mode 100644 new mode 100755 index f53c2e6..82459d3 --- a/src/api/MicCheck.Api/Common/Security/ApiKeys/ApiKeyHasher.cs +++ b/src/api/MicCheck.Api/Common/Security/ApiKeys/ApiKeyHasher.cs @@ -1,22 +1,22 @@ -using System.Security.Cryptography; -using System.Text; - -namespace MicCheck.Api.Common.Security.ApiKeys; - -public static class ApiKeyHasher -{ - public static string Hash(string key) - { - var bytes = SHA256.HashData(Encoding.UTF8.GetBytes(key)); - return Convert.ToHexString(bytes).ToLowerInvariant(); - } - - public static string GenerateKey() - { - var bytes = RandomNumberGenerator.GetBytes(32); - return Convert.ToBase64String(bytes) - .TrimEnd('=') - .Replace('+', '-') - .Replace('/', '_'); - } -} +using System.Security.Cryptography; +using System.Text; + +namespace MicCheck.Api.Common.Security.ApiKeys; + +public static class ApiKeyHasher +{ + public static string Hash(string key) + { + var bytes = SHA256.HashData(Encoding.UTF8.GetBytes(key)); + return Convert.ToHexString(bytes).ToLowerInvariant(); + } + + public static string GenerateKey() + { + var bytes = RandomNumberGenerator.GetBytes(32); + return Convert.ToBase64String(bytes) + .TrimEnd('=') + .Replace('+', '-') + .Replace('/', '_'); + } +} diff --git a/src/api/MicCheck.Api/Common/Security/ApiKeys/ApiKeyResponse.cs b/src/api/MicCheck.Api/Common/Security/ApiKeys/ApiKeyResponse.cs old mode 100644 new mode 100755 index 07e3fed..3ffa955 --- a/src/api/MicCheck.Api/Common/Security/ApiKeys/ApiKeyResponse.cs +++ b/src/api/MicCheck.Api/Common/Security/ApiKeys/ApiKeyResponse.cs @@ -1,9 +1,9 @@ -namespace MicCheck.Api.Common.Security.ApiKeys; - -public record ApiKeyResponse( - int Id, - string Name, - string Prefix, - bool IsActive, - DateTimeOffset? ExpiresAt, - DateTimeOffset CreatedAt); +namespace MicCheck.Api.Common.Security.ApiKeys; + +public record ApiKeyResponse( + int Id, + string Name, + string Prefix, + bool IsActive, + DateTimeOffset? ExpiresAt, + DateTimeOffset CreatedAt); diff --git a/src/api/MicCheck.Api/Common/Security/ApiKeys/ApiKeyService.cs b/src/api/MicCheck.Api/Common/Security/ApiKeys/ApiKeyService.cs old mode 100644 new mode 100755 index d2ee38f..a343597 --- a/src/api/MicCheck.Api/Common/Security/ApiKeys/ApiKeyService.cs +++ b/src/api/MicCheck.Api/Common/Security/ApiKeys/ApiKeyService.cs @@ -1,50 +1,50 @@ -using MicCheck.Api.Data; -using Microsoft.EntityFrameworkCore; - -namespace MicCheck.Api.Common.Security.ApiKeys; - -public class ApiKeyService(MicCheckDbContext db) -{ - public async Task<(ApiKey Key, string RawKey)> CreateAsync( - int organizationId, string name, DateTimeOffset? expiresAt, CancellationToken ct = default) - { - var rawKey = ApiKeyHasher.GenerateKey(); - var hashedKey = ApiKeyHasher.Hash(rawKey); - var prefix = rawKey.Length >= 8 ? rawKey[..8] : rawKey; - - var apiKey = new ApiKey - { - Key = hashedKey, - Prefix = prefix, - Name = name, - OrganizationId = organizationId, - IsActive = true, - ExpiresAt = expiresAt, - CreatedAt = DateTimeOffset.UtcNow - }; - - db.ApiKeys.Add(apiKey); - await db.SaveChangesAsync(ct); - - return (apiKey, rawKey); - } - - public async Task> ListAsync(int organizationId, CancellationToken ct = default) - { - return await db.ApiKeys - .Where(k => k.OrganizationId == organizationId) - .ToListAsync(ct); - } - - public async Task RevokeAsync(int organizationId, int keyId, CancellationToken ct = default) - { - var key = await db.ApiKeys - .FirstOrDefaultAsync(k => k.Id == keyId && k.OrganizationId == organizationId, ct); - - if (key is null) - return; - - key.IsActive = false; - await db.SaveChangesAsync(ct); - } -} +using MicCheck.Api.Data; +using Microsoft.EntityFrameworkCore; + +namespace MicCheck.Api.Common.Security.ApiKeys; + +public class ApiKeyService(MicCheckDbContext db) +{ + public async Task<(ApiKey Key, string RawKey)> CreateAsync( + int organizationId, string name, DateTimeOffset? expiresAt, CancellationToken ct = default) + { + var rawKey = ApiKeyHasher.GenerateKey(); + var hashedKey = ApiKeyHasher.Hash(rawKey); + var prefix = rawKey.Length >= 8 ? rawKey[..8] : rawKey; + + var apiKey = new ApiKey + { + Key = hashedKey, + Prefix = prefix, + Name = name, + OrganizationId = organizationId, + IsActive = true, + ExpiresAt = expiresAt, + CreatedAt = DateTimeOffset.UtcNow + }; + + db.ApiKeys.Add(apiKey); + await db.SaveChangesAsync(ct); + + return (apiKey, rawKey); + } + + public async Task> ListAsync(int organizationId, CancellationToken ct = default) + { + return await db.ApiKeys + .Where(k => k.OrganizationId == organizationId) + .ToListAsync(ct); + } + + public async Task RevokeAsync(int organizationId, int keyId, CancellationToken ct = default) + { + var key = await db.ApiKeys + .FirstOrDefaultAsync(k => k.Id == keyId && k.OrganizationId == organizationId, ct); + + if (key is null) + return; + + key.IsActive = false; + await db.SaveChangesAsync(ct); + } +} diff --git a/src/api/MicCheck.Api/Common/Security/ApiKeys/CreateApiKeyRequest.cs b/src/api/MicCheck.Api/Common/Security/ApiKeys/CreateApiKeyRequest.cs old mode 100644 new mode 100755 index 5cb5d6e..c629d00 --- a/src/api/MicCheck.Api/Common/Security/ApiKeys/CreateApiKeyRequest.cs +++ b/src/api/MicCheck.Api/Common/Security/ApiKeys/CreateApiKeyRequest.cs @@ -1,3 +1,3 @@ -namespace MicCheck.Api.Common.Security.ApiKeys; - -public record CreateApiKeyRequest(string Name, DateTimeOffset? ExpiresAt); +namespace MicCheck.Api.Common.Security.ApiKeys; + +public record CreateApiKeyRequest(string Name, DateTimeOffset? ExpiresAt); diff --git a/src/api/MicCheck.Api/Common/Security/ApiKeys/CreateApiKeyResponse.cs b/src/api/MicCheck.Api/Common/Security/ApiKeys/CreateApiKeyResponse.cs old mode 100644 new mode 100755 index 8f24621..89ad8e2 --- a/src/api/MicCheck.Api/Common/Security/ApiKeys/CreateApiKeyResponse.cs +++ b/src/api/MicCheck.Api/Common/Security/ApiKeys/CreateApiKeyResponse.cs @@ -1,8 +1,8 @@ -namespace MicCheck.Api.Common.Security.ApiKeys; - -public record CreateApiKeyResponse( - int Id, - string Name, - string Key, - string Prefix, - DateTimeOffset? ExpiresAt); +namespace MicCheck.Api.Common.Security.ApiKeys; + +public record CreateApiKeyResponse( + int Id, + string Name, + string Key, + string Prefix, + DateTimeOffset? ExpiresAt); diff --git a/src/api/MicCheck.Api/Common/Security/Authentication/ApiKeyAuthenticationHandler.cs b/src/api/MicCheck.Api/Common/Security/Authentication/ApiKeyAuthenticationHandler.cs old mode 100644 new mode 100755 index 9d3a67c..cae4780 --- a/src/api/MicCheck.Api/Common/Security/Authentication/ApiKeyAuthenticationHandler.cs +++ b/src/api/MicCheck.Api/Common/Security/Authentication/ApiKeyAuthenticationHandler.cs @@ -1,56 +1,56 @@ -using System.Security.Claims; -using System.Text.Encodings.Web; -using MicCheck.Api.Common.Security.ApiKeys; -using MicCheck.Api.Data; -using Microsoft.AspNetCore.Authentication; -using Microsoft.EntityFrameworkCore; -using Microsoft.Extensions.Options; - -namespace MicCheck.Api.Common.Security.Authentication; - -public class ApiKeyAuthenticationHandler(IOptionsMonitor options, ILoggerFactory logger, UrlEncoder encoder, MicCheckDbContext db) - : AuthenticationHandler(options, logger, encoder) -{ - public const string SchemeName = "ApiKey"; - private const string ApiKeyPrefix = "Api-Key "; - - protected override async Task HandleAuthenticateAsync() - { - if (!Request.Headers.TryGetValue("Authorization", out var authHeader)) - return AuthenticateResult.NoResult(); - - var headerValue = authHeader.FirstOrDefault(); - if (string.IsNullOrWhiteSpace(headerValue) || - !headerValue.StartsWith(ApiKeyPrefix, StringComparison.OrdinalIgnoreCase)) - return AuthenticateResult.NoResult(); - - var rawKey = headerValue[ApiKeyPrefix.Length..].Trim(); - if (string.IsNullOrWhiteSpace(rawKey)) - return AuthenticateResult.Fail("API key value is empty."); - - var hashedKey = ApiKeyHasher.Hash(rawKey); - - var apiKey = await db.ApiKeys - .FirstOrDefaultAsync(k => k.Key == hashedKey); - - if (apiKey is null) - return AuthenticateResult.Fail("Invalid API key."); - - if (!apiKey.IsActive) - return AuthenticateResult.Fail("API key is inactive."); - - if (apiKey.ExpiresAt.HasValue && apiKey.ExpiresAt.Value < DateTimeOffset.UtcNow) - return AuthenticateResult.Fail("API key has expired."); - - var claims = new[] - { - new Claim("OrganizationId", apiKey.OrganizationId.ToString()), - new Claim("OrganizationRole", "Admin") - }; - - var identity = new ClaimsIdentity(claims, Scheme.Name); - var ticket = new AuthenticationTicket(new ClaimsPrincipal(identity), Scheme.Name); - - return AuthenticateResult.Success(ticket); - } -} +using System.Security.Claims; +using System.Text.Encodings.Web; +using MicCheck.Api.Common.Security.ApiKeys; +using MicCheck.Api.Data; +using Microsoft.AspNetCore.Authentication; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Options; + +namespace MicCheck.Api.Common.Security.Authentication; + +public class ApiKeyAuthenticationHandler(IOptionsMonitor options, ILoggerFactory logger, UrlEncoder encoder, MicCheckDbContext db) + : AuthenticationHandler(options, logger, encoder) +{ + public const string SchemeName = "ApiKey"; + private const string ApiKeyPrefix = "Api-Key "; + + protected override async Task HandleAuthenticateAsync() + { + if (!Request.Headers.TryGetValue("Authorization", out var authHeader)) + return AuthenticateResult.NoResult(); + + var headerValue = authHeader.FirstOrDefault(); + if (string.IsNullOrWhiteSpace(headerValue) || + !headerValue.StartsWith(ApiKeyPrefix, StringComparison.OrdinalIgnoreCase)) + return AuthenticateResult.NoResult(); + + var rawKey = headerValue[ApiKeyPrefix.Length..].Trim(); + if (string.IsNullOrWhiteSpace(rawKey)) + return AuthenticateResult.Fail("API key value is empty."); + + var hashedKey = ApiKeyHasher.Hash(rawKey); + + var apiKey = await db.ApiKeys + .FirstOrDefaultAsync(k => k.Key == hashedKey); + + if (apiKey is null) + return AuthenticateResult.Fail("Invalid API key."); + + if (!apiKey.IsActive) + return AuthenticateResult.Fail("API key is inactive."); + + if (apiKey.ExpiresAt.HasValue && apiKey.ExpiresAt.Value < DateTimeOffset.UtcNow) + return AuthenticateResult.Fail("API key has expired."); + + var claims = new[] + { + new Claim("OrganizationId", apiKey.OrganizationId.ToString()), + new Claim("OrganizationRole", "Admin") + }; + + var identity = new ClaimsIdentity(claims, Scheme.Name); + var ticket = new AuthenticationTicket(new ClaimsPrincipal(identity), Scheme.Name); + + return AuthenticateResult.Success(ticket); + } +} diff --git a/src/api/MicCheck.Api/Common/Security/Authentication/EnvironmentKeyAuthenticationHandler.cs b/src/api/MicCheck.Api/Common/Security/Authentication/EnvironmentKeyAuthenticationHandler.cs old mode 100644 new mode 100755 index 611acbf..42ba736 --- a/src/api/MicCheck.Api/Common/Security/Authentication/EnvironmentKeyAuthenticationHandler.cs +++ b/src/api/MicCheck.Api/Common/Security/Authentication/EnvironmentKeyAuthenticationHandler.cs @@ -1,41 +1,41 @@ -using System.Security.Claims; -using System.Text.Encodings.Web; -using MicCheck.Api.Data; -using Microsoft.AspNetCore.Authentication; -using Microsoft.EntityFrameworkCore; -using Microsoft.Extensions.Options; - -namespace MicCheck.Api.Common.Security.Authentication; - -public class EnvironmentKeyAuthenticationHandler(IOptionsMonitor options, ILoggerFactory logger, UrlEncoder encoder, MicCheckDbContext db) - : AuthenticationHandler(options, logger, encoder) -{ - public const string SchemeName = "EnvironmentKey"; - - protected override async Task HandleAuthenticateAsync() - { - if (!Request.Headers.TryGetValue("X-Environment-Key", out var keyValues)) - return AuthenticateResult.NoResult(); - - var key = keyValues.FirstOrDefault(); - if (string.IsNullOrWhiteSpace(key)) - return AuthenticateResult.Fail("X-Environment-Key header is empty."); - - var environment = await db.Environments - .FirstOrDefaultAsync(e => e.ApiKey == key); - - if (environment is null) - return AuthenticateResult.Fail("Invalid environment key."); - - var claims = new[] - { - new Claim("EnvironmentId", environment.Id.ToString()), - new Claim("ProjectId", environment.ProjectId.ToString()) - }; - - var identity = new ClaimsIdentity(claims, Scheme.Name); - var ticket = new AuthenticationTicket(new ClaimsPrincipal(identity), Scheme.Name); - - return AuthenticateResult.Success(ticket); - } -} +using System.Security.Claims; +using System.Text.Encodings.Web; +using MicCheck.Api.Data; +using Microsoft.AspNetCore.Authentication; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Options; + +namespace MicCheck.Api.Common.Security.Authentication; + +public class EnvironmentKeyAuthenticationHandler(IOptionsMonitor options, ILoggerFactory logger, UrlEncoder encoder, MicCheckDbContext db) + : AuthenticationHandler(options, logger, encoder) +{ + public const string SchemeName = "EnvironmentKey"; + + protected override async Task HandleAuthenticateAsync() + { + if (!Request.Headers.TryGetValue("X-Environment-Key", out var keyValues)) + return AuthenticateResult.NoResult(); + + var key = keyValues.FirstOrDefault(); + if (string.IsNullOrWhiteSpace(key)) + return AuthenticateResult.Fail("X-Environment-Key header is empty."); + + var environment = await db.Environments + .FirstOrDefaultAsync(e => e.ApiKey == key); + + if (environment is null) + return AuthenticateResult.Fail("Invalid environment key."); + + var claims = new[] + { + new Claim("EnvironmentId", environment.Id.ToString()), + new Claim("ProjectId", environment.ProjectId.ToString()) + }; + + var identity = new ClaimsIdentity(claims, Scheme.Name); + var ticket = new AuthenticationTicket(new ClaimsPrincipal(identity), Scheme.Name); + + return AuthenticateResult.Success(ticket); + } +} diff --git a/src/api/MicCheck.Api/Common/Security/Authorization/AuthEndpoints.cs b/src/api/MicCheck.Api/Common/Security/Authorization/AuthEndpoints.cs old mode 100644 new mode 100755 index 3cd0578..c413ff9 --- a/src/api/MicCheck.Api/Common/Security/Authorization/AuthEndpoints.cs +++ b/src/api/MicCheck.Api/Common/Security/Authorization/AuthEndpoints.cs @@ -1,58 +1,58 @@ -using Microsoft.AspNetCore.Mvc; - -namespace MicCheck.Api.Common.Security.Authorization; - -public static class AuthEndpoints -{ - public static void MapAuthEndpoints(this WebApplication app) - { - var group = app.MapGroup("/api/v1/auth").AllowAnonymous().WithTags("Auth"); - - group.MapPost("/login", async ([FromBody] LoginRequest request, AuthService authService, CancellationToken ct) => - { - if (string.IsNullOrWhiteSpace(request.Email) || string.IsNullOrWhiteSpace(request.Password)) - return Results.BadRequest("Email and password are required."); - - var response = await authService.LoginAsync(request.Email, request.Password, ct); - return response is null - ? Results.Unauthorized() - : Results.Ok(response); - - }).WithName("Login"); - - group.MapPost("/register", async ([FromBody] RegisterRequest request, AuthService authService, CancellationToken ct) => - { - if (string.IsNullOrWhiteSpace(request.Email) || string.IsNullOrWhiteSpace(request.Password)) - return Results.BadRequest("Email and password are required."); - - var response = await authService.RegisterAsync( - request.Email, request.Password, - request.FirstName, request.LastName, - request.OrganizationName, ct); - - return response is null - ? Results.Conflict("An account with this email already exists.") - : Results.Ok(response); - - }).WithName("Register"); - - group.MapPost("/refresh", async ([FromBody] RefreshRequest request, AuthService authService, CancellationToken ct) => - { - if (string.IsNullOrWhiteSpace(request.Token)) - return Results.BadRequest("Refresh token is required."); - - var response = await authService.RefreshAsync(request.Token, ct); - return response is null - ? Results.Unauthorized() - : Results.Ok(response); - - }).WithName("RefreshToken"); - - group.MapPost("/logout", async ([FromBody] LogoutRequest request, AuthService authService, CancellationToken ct) => - { - await authService.LogoutAsync(request.Token, ct); - return Results.NoContent(); - - }).WithName("Logout"); - } -} +using Microsoft.AspNetCore.Mvc; + +namespace MicCheck.Api.Common.Security.Authorization; + +public static class AuthEndpoints +{ + public static void MapAuthEndpoints(this WebApplication app) + { + var group = app.MapGroup("/api/v1/auth").AllowAnonymous().WithTags("Auth"); + + group.MapPost("/login", async ([FromBody] LoginRequest request, AuthService authService, CancellationToken ct) => + { + if (string.IsNullOrWhiteSpace(request.Email) || string.IsNullOrWhiteSpace(request.Password)) + return Results.BadRequest("Email and password are required."); + + var response = await authService.LoginAsync(request.Email, request.Password, ct); + return response is null + ? Results.Unauthorized() + : Results.Ok(response); + + }).WithName("Login"); + + group.MapPost("/register", async ([FromBody] RegisterRequest request, AuthService authService, CancellationToken ct) => + { + if (string.IsNullOrWhiteSpace(request.Email) || string.IsNullOrWhiteSpace(request.Password)) + return Results.BadRequest("Email and password are required."); + + var response = await authService.RegisterAsync( + request.Email, request.Password, + request.FirstName, request.LastName, + request.OrganizationName, ct); + + return response is null + ? Results.Conflict("An account with this email already exists.") + : Results.Ok(response); + + }).WithName("Register"); + + group.MapPost("/refresh", async ([FromBody] RefreshRequest request, AuthService authService, CancellationToken ct) => + { + if (string.IsNullOrWhiteSpace(request.Token)) + return Results.BadRequest("Refresh token is required."); + + var response = await authService.RefreshAsync(request.Token, ct); + return response is null + ? Results.Unauthorized() + : Results.Ok(response); + + }).WithName("RefreshToken"); + + group.MapPost("/logout", async ([FromBody] LogoutRequest request, AuthService authService, CancellationToken ct) => + { + await authService.LogoutAsync(request.Token, ct); + return Results.NoContent(); + + }).WithName("Logout"); + } +} diff --git a/src/api/MicCheck.Api/Common/Security/Authorization/AuthService.cs b/src/api/MicCheck.Api/Common/Security/Authorization/AuthService.cs old mode 100644 new mode 100755 index c19c290..141b479 --- a/src/api/MicCheck.Api/Common/Security/Authorization/AuthService.cs +++ b/src/api/MicCheck.Api/Common/Security/Authorization/AuthService.cs @@ -1,145 +1,145 @@ -using System.Security.Cryptography; -using MicCheck.Api.Data; -using MicCheck.Api.Organizations; -using MicCheck.Api.Users; -using Microsoft.AspNetCore.Identity; -using Microsoft.EntityFrameworkCore; - -namespace MicCheck.Api.Common.Security.Authorization; - -public class AuthService( - MicCheckDbContext db, - ITokenService tokenService, - IPasswordHasher passwordHasher) -{ - public async Task LoginAsync(string email, string password, CancellationToken ct = default) - { - var user = await db.Users - .Include(u => u.Organizations) - .FirstOrDefaultAsync(u => u.Email == email && u.IsActive, ct); - - if (user is null) - return null; - - var result = passwordHasher.VerifyHashedPassword(user, user.PasswordHash, password); - if (result == PasswordVerificationResult.Failed) - return null; - - var accessToken = tokenService.GenerateToken(user); - var refreshTokenValue = GenerateSecureToken(); - - db.RefreshTokens.Add(new RefreshToken - { - Token = refreshTokenValue, - UserId = user.Id, - ExpiresAt = DateTimeOffset.UtcNow.AddDays(30), - CreatedAt = DateTimeOffset.UtcNow - }); - - user.LastLoginAt = DateTimeOffset.UtcNow; - await db.SaveChangesAsync(ct); - - return new LoginResponse(accessToken.Token, refreshTokenValue, accessToken.ExpiresAt); - } - - public async Task RegisterAsync( - string email, string password, - string firstName, string lastName, - string organizationName, - CancellationToken ct = default) - { - if (await db.Users.AnyAsync(u => u.Email == email, ct)) - return null; - - var user = new User - { - Email = email, - FirstName = firstName, - LastName = lastName, - IsActive = true, - CreatedAt = DateTimeOffset.UtcNow, - PasswordHash = string.Empty - }; - user.PasswordHash = passwordHasher.HashPassword(user, password); - - db.Users.Add(user); - await db.SaveChangesAsync(ct); - - var organization = new Organization - { - Name = organizationName, - CreatedAt = DateTimeOffset.UtcNow - }; - db.Organizations.Add(organization); - await db.SaveChangesAsync(ct); - - db.OrganizationUsers.Add(new OrganizationUser - { - OrganizationId = organization.Id, - UserId = user.Id, - Role = OrganizationRole.Admin - }); - await db.SaveChangesAsync(ct); - - await db.Entry(user).Collection(u => u.Organizations).LoadAsync(ct); - - var accessToken = tokenService.GenerateToken(user); - var refreshTokenValue = GenerateSecureToken(); - - db.RefreshTokens.Add(new RefreshToken - { - Token = refreshTokenValue, - UserId = user.Id, - ExpiresAt = DateTimeOffset.UtcNow.AddDays(30), - CreatedAt = DateTimeOffset.UtcNow - }); - await db.SaveChangesAsync(ct); - - return new LoginResponse(accessToken.Token, refreshTokenValue, accessToken.ExpiresAt); - } - - public async Task RefreshAsync(string refreshToken, CancellationToken ct = default) - { - var token = await db.RefreshTokens - .Include(rt => rt.User) - .ThenInclude(u => u.Organizations) - .FirstOrDefaultAsync(rt => rt.Token == refreshToken && !rt.IsRevoked, ct); - - if (token is null || token.ExpiresAt < DateTimeOffset.UtcNow) - return null; - - token.IsRevoked = true; - - var accessToken = tokenService.GenerateToken(token.User); - var newRefreshTokenValue = GenerateSecureToken(); - - db.RefreshTokens.Add(new RefreshToken - { - Token = newRefreshTokenValue, - UserId = token.UserId, - ExpiresAt = DateTimeOffset.UtcNow.AddDays(30), - CreatedAt = DateTimeOffset.UtcNow - }); - await db.SaveChangesAsync(ct); - - return new LoginResponse(accessToken.Token, newRefreshTokenValue, accessToken.ExpiresAt); - } - - public async Task LogoutAsync(string refreshToken, CancellationToken ct = default) - { - var token = await db.RefreshTokens - .FirstOrDefaultAsync(rt => rt.Token == refreshToken && !rt.IsRevoked, ct); - - if (token is null) - return; - - token.IsRevoked = true; - await db.SaveChangesAsync(ct); - } - - private static string GenerateSecureToken() - { - var bytes = RandomNumberGenerator.GetBytes(64); - return Convert.ToBase64String(bytes); - } -} +using System.Security.Cryptography; +using MicCheck.Api.Data; +using MicCheck.Api.Organizations; +using MicCheck.Api.Users; +using Microsoft.AspNetCore.Identity; +using Microsoft.EntityFrameworkCore; + +namespace MicCheck.Api.Common.Security.Authorization; + +public class AuthService( + MicCheckDbContext db, + ITokenService tokenService, + IPasswordHasher passwordHasher) +{ + public async Task LoginAsync(string email, string password, CancellationToken ct = default) + { + var user = await db.Users + .Include(u => u.Organizations) + .FirstOrDefaultAsync(u => u.Email == email && u.IsActive, ct); + + if (user is null) + return null; + + var result = passwordHasher.VerifyHashedPassword(user, user.PasswordHash, password); + if (result == PasswordVerificationResult.Failed) + return null; + + var accessToken = tokenService.GenerateToken(user); + var refreshTokenValue = GenerateSecureToken(); + + db.RefreshTokens.Add(new RefreshToken + { + Token = refreshTokenValue, + UserId = user.Id, + ExpiresAt = DateTimeOffset.UtcNow.AddDays(30), + CreatedAt = DateTimeOffset.UtcNow + }); + + user.LastLoginAt = DateTimeOffset.UtcNow; + await db.SaveChangesAsync(ct); + + return new LoginResponse(accessToken.Token, refreshTokenValue, accessToken.ExpiresAt); + } + + public async Task RegisterAsync( + string email, string password, + string firstName, string lastName, + string organizationName, + CancellationToken ct = default) + { + if (await db.Users.AnyAsync(u => u.Email == email, ct)) + return null; + + var user = new User + { + Email = email, + FirstName = firstName, + LastName = lastName, + IsActive = true, + CreatedAt = DateTimeOffset.UtcNow, + PasswordHash = string.Empty + }; + user.PasswordHash = passwordHasher.HashPassword(user, password); + + db.Users.Add(user); + await db.SaveChangesAsync(ct); + + var organization = new Organization + { + Name = organizationName, + CreatedAt = DateTimeOffset.UtcNow + }; + db.Organizations.Add(organization); + await db.SaveChangesAsync(ct); + + db.OrganizationUsers.Add(new OrganizationUser + { + OrganizationId = organization.Id, + UserId = user.Id, + Role = OrganizationRole.Admin + }); + await db.SaveChangesAsync(ct); + + await db.Entry(user).Collection(u => u.Organizations).LoadAsync(ct); + + var accessToken = tokenService.GenerateToken(user); + var refreshTokenValue = GenerateSecureToken(); + + db.RefreshTokens.Add(new RefreshToken + { + Token = refreshTokenValue, + UserId = user.Id, + ExpiresAt = DateTimeOffset.UtcNow.AddDays(30), + CreatedAt = DateTimeOffset.UtcNow + }); + await db.SaveChangesAsync(ct); + + return new LoginResponse(accessToken.Token, refreshTokenValue, accessToken.ExpiresAt); + } + + public async Task RefreshAsync(string refreshToken, CancellationToken ct = default) + { + var token = await db.RefreshTokens + .Include(rt => rt.User) + .ThenInclude(u => u.Organizations) + .FirstOrDefaultAsync(rt => rt.Token == refreshToken && !rt.IsRevoked, ct); + + if (token is null || token.ExpiresAt < DateTimeOffset.UtcNow) + return null; + + token.IsRevoked = true; + + var accessToken = tokenService.GenerateToken(token.User); + var newRefreshTokenValue = GenerateSecureToken(); + + db.RefreshTokens.Add(new RefreshToken + { + Token = newRefreshTokenValue, + UserId = token.UserId, + ExpiresAt = DateTimeOffset.UtcNow.AddDays(30), + CreatedAt = DateTimeOffset.UtcNow + }); + await db.SaveChangesAsync(ct); + + return new LoginResponse(accessToken.Token, newRefreshTokenValue, accessToken.ExpiresAt); + } + + public async Task LogoutAsync(string refreshToken, CancellationToken ct = default) + { + var token = await db.RefreshTokens + .FirstOrDefaultAsync(rt => rt.Token == refreshToken && !rt.IsRevoked, ct); + + if (token is null) + return; + + token.IsRevoked = true; + await db.SaveChangesAsync(ct); + } + + private static string GenerateSecureToken() + { + var bytes = RandomNumberGenerator.GetBytes(64); + return Convert.ToBase64String(bytes); + } +} diff --git a/src/api/MicCheck.Api/Common/Security/Authorization/AuthorizationPolicies.cs b/src/api/MicCheck.Api/Common/Security/Authorization/AuthorizationPolicies.cs old mode 100644 new mode 100755 index 632b2ff..9d1d692 --- a/src/api/MicCheck.Api/Common/Security/Authorization/AuthorizationPolicies.cs +++ b/src/api/MicCheck.Api/Common/Security/Authorization/AuthorizationPolicies.cs @@ -1,8 +1,8 @@ -namespace MicCheck.Api.Common.Security.Authorization; - -public static class AuthorizationPolicies -{ - public const string FlagsApiAccess = "FlagsApiAccess"; - public const string AdminApiAccess = "AdminApiAccess"; - public const string OrganizationAdmin = "OrganizationAdmin"; -} +namespace MicCheck.Api.Common.Security.Authorization; + +public static class AuthorizationPolicies +{ + public const string FlagsApiAccess = "FlagsApiAccess"; + public const string AdminApiAccess = "AdminApiAccess"; + public const string OrganizationAdmin = "OrganizationAdmin"; +} diff --git a/src/api/MicCheck.Api/Common/Security/Authorization/LoginRequest.cs b/src/api/MicCheck.Api/Common/Security/Authorization/LoginRequest.cs old mode 100644 new mode 100755 index a38b90d..290e81e --- a/src/api/MicCheck.Api/Common/Security/Authorization/LoginRequest.cs +++ b/src/api/MicCheck.Api/Common/Security/Authorization/LoginRequest.cs @@ -1,3 +1,3 @@ -namespace MicCheck.Api.Common.Security.Authorization; - -public record LoginRequest(string Email, string Password); +namespace MicCheck.Api.Common.Security.Authorization; + +public record LoginRequest(string Email, string Password); diff --git a/src/api/MicCheck.Api/Common/Security/Authorization/LoginResponse.cs b/src/api/MicCheck.Api/Common/Security/Authorization/LoginResponse.cs old mode 100644 new mode 100755 index e522832..8e2478d --- a/src/api/MicCheck.Api/Common/Security/Authorization/LoginResponse.cs +++ b/src/api/MicCheck.Api/Common/Security/Authorization/LoginResponse.cs @@ -1,3 +1,3 @@ -namespace MicCheck.Api.Common.Security.Authorization; - -public record LoginResponse(string AccessToken, string RefreshToken, DateTime ExpiresAt); +namespace MicCheck.Api.Common.Security.Authorization; + +public record LoginResponse(string AccessToken, string RefreshToken, DateTime ExpiresAt); diff --git a/src/api/MicCheck.Api/Common/Security/Authorization/LogoutRequest.cs b/src/api/MicCheck.Api/Common/Security/Authorization/LogoutRequest.cs old mode 100644 new mode 100755 index 7e7b4a9..bef9cb9 --- a/src/api/MicCheck.Api/Common/Security/Authorization/LogoutRequest.cs +++ b/src/api/MicCheck.Api/Common/Security/Authorization/LogoutRequest.cs @@ -1,3 +1,3 @@ -namespace MicCheck.Api.Common.Security.Authorization; - -public record LogoutRequest(string Token); +namespace MicCheck.Api.Common.Security.Authorization; + +public record LogoutRequest(string Token); diff --git a/src/api/MicCheck.Api/Common/Security/Authorization/ProjectPermission.cs b/src/api/MicCheck.Api/Common/Security/Authorization/ProjectPermission.cs old mode 100644 new mode 100755 index 68be4c4..b5308f6 --- a/src/api/MicCheck.Api/Common/Security/Authorization/ProjectPermission.cs +++ b/src/api/MicCheck.Api/Common/Security/Authorization/ProjectPermission.cs @@ -1,17 +1,17 @@ -namespace MicCheck.Api.Common.Security.Authorization; - -public enum ProjectPermission -{ - ViewProject, - CreateFeature, - EditFeature, - DeleteFeature, - CreateEnvironment, - EditEnvironment, - DeleteEnvironment, - CreateSegment, - EditSegment, - DeleteSegment, - ManageWebhooks, - ViewAuditLog -} +namespace MicCheck.Api.Common.Security.Authorization; + +public enum ProjectPermission +{ + ViewProject, + CreateFeature, + EditFeature, + DeleteFeature, + CreateEnvironment, + EditEnvironment, + DeleteEnvironment, + CreateSegment, + EditSegment, + DeleteSegment, + ManageWebhooks, + ViewAuditLog +} diff --git a/src/api/MicCheck.Api/Common/Security/Authorization/ProjectPermissionRequirement.cs b/src/api/MicCheck.Api/Common/Security/Authorization/ProjectPermissionRequirement.cs old mode 100644 new mode 100755 index cf772ec..503447a --- a/src/api/MicCheck.Api/Common/Security/Authorization/ProjectPermissionRequirement.cs +++ b/src/api/MicCheck.Api/Common/Security/Authorization/ProjectPermissionRequirement.cs @@ -1,10 +1,10 @@ -using Microsoft.AspNetCore.Authorization; - -namespace MicCheck.Api.Common.Security.Authorization; - -public class ProjectPermissionRequirement : IAuthorizationRequirement -{ - public ProjectPermission Permission { get; } - - public ProjectPermissionRequirement(ProjectPermission permission) => Permission = permission; -} +using Microsoft.AspNetCore.Authorization; + +namespace MicCheck.Api.Common.Security.Authorization; + +public class ProjectPermissionRequirement : IAuthorizationRequirement +{ + public ProjectPermission Permission { get; } + + public ProjectPermissionRequirement(ProjectPermission permission) => Permission = permission; +} diff --git a/src/api/MicCheck.Api/Common/Security/Authorization/ProjectPermissionRequirementHandler.cs b/src/api/MicCheck.Api/Common/Security/Authorization/ProjectPermissionRequirementHandler.cs old mode 100644 new mode 100755 index 2aa0f11..00a4237 --- a/src/api/MicCheck.Api/Common/Security/Authorization/ProjectPermissionRequirementHandler.cs +++ b/src/api/MicCheck.Api/Common/Security/Authorization/ProjectPermissionRequirementHandler.cs @@ -1,54 +1,54 @@ -using System.IdentityModel.Tokens.Jwt; -using MicCheck.Api.Data; -using MicCheck.Api.Organizations; -using Microsoft.AspNetCore.Authorization; -using Microsoft.EntityFrameworkCore; - -namespace MicCheck.Api.Common.Security.Authorization; - -public class ProjectPermissionRequirementHandler( - MicCheckDbContext db, - IHttpContextAccessor httpContextAccessor) - : AuthorizationHandler -{ - protected override async Task HandleRequirementAsync( - AuthorizationHandlerContext context, - ProjectPermissionRequirement requirement) - { - var userIdClaim = context.User.FindFirst(JwtRegisteredClaimNames.Sub); - if (userIdClaim is null || !int.TryParse(userIdClaim.Value, out var userId)) - { - context.Fail(); - return; - } - - if (context.User.HasClaim("OrganizationRole", OrganizationRole.Admin.ToString())) - { - context.Succeed(requirement); - return; - } - - var httpContext = httpContextAccessor.HttpContext; - if (httpContext is null || - !httpContext.Request.RouteValues.TryGetValue("projectId", out var projectIdValue) || - !int.TryParse(projectIdValue?.ToString(), out var projectId)) - { - context.Fail(); - return; - } - - var permission = await db.UserProjectPermissions - .FirstOrDefaultAsync(p => p.UserId == userId && p.ProjectId == projectId); - - if (permission is null) - { - context.Fail(); - return; - } - - if (permission.IsAdmin || permission.Permissions.Contains(requirement.Permission)) - context.Succeed(requirement); - else - context.Fail(); - } -} +using System.IdentityModel.Tokens.Jwt; +using MicCheck.Api.Data; +using MicCheck.Api.Organizations; +using Microsoft.AspNetCore.Authorization; +using Microsoft.EntityFrameworkCore; + +namespace MicCheck.Api.Common.Security.Authorization; + +public class ProjectPermissionRequirementHandler( + MicCheckDbContext db, + IHttpContextAccessor httpContextAccessor) + : AuthorizationHandler +{ + protected override async Task HandleRequirementAsync( + AuthorizationHandlerContext context, + ProjectPermissionRequirement requirement) + { + var userIdClaim = context.User.FindFirst(JwtRegisteredClaimNames.Sub); + if (userIdClaim is null || !int.TryParse(userIdClaim.Value, out var userId)) + { + context.Fail(); + return; + } + + if (context.User.HasClaim("OrganizationRole", OrganizationRole.Admin.ToString())) + { + context.Succeed(requirement); + return; + } + + var httpContext = httpContextAccessor.HttpContext; + if (httpContext is null || + !httpContext.Request.RouteValues.TryGetValue("projectId", out var projectIdValue) || + !int.TryParse(projectIdValue?.ToString(), out var projectId)) + { + context.Fail(); + return; + } + + var permission = await db.UserProjectPermissions + .FirstOrDefaultAsync(p => p.UserId == userId && p.ProjectId == projectId); + + if (permission is null) + { + context.Fail(); + return; + } + + if (permission.IsAdmin || permission.Permissions.Contains(requirement.Permission)) + context.Succeed(requirement); + else + context.Fail(); + } +} diff --git a/src/api/MicCheck.Api/Common/Security/Authorization/RefreshRequest.cs b/src/api/MicCheck.Api/Common/Security/Authorization/RefreshRequest.cs old mode 100644 new mode 100755 index bc3894f..00f4c30 --- a/src/api/MicCheck.Api/Common/Security/Authorization/RefreshRequest.cs +++ b/src/api/MicCheck.Api/Common/Security/Authorization/RefreshRequest.cs @@ -1,3 +1,3 @@ -namespace MicCheck.Api.Common.Security.Authorization; - -public record RefreshRequest(string Token); +namespace MicCheck.Api.Common.Security.Authorization; + +public record RefreshRequest(string Token); diff --git a/src/api/MicCheck.Api/Common/Security/Authorization/RegisterRequest.cs b/src/api/MicCheck.Api/Common/Security/Authorization/RegisterRequest.cs old mode 100644 new mode 100755 index 291a79c..7f3ce05 --- a/src/api/MicCheck.Api/Common/Security/Authorization/RegisterRequest.cs +++ b/src/api/MicCheck.Api/Common/Security/Authorization/RegisterRequest.cs @@ -1,8 +1,8 @@ -namespace MicCheck.Api.Common.Security.Authorization; - -public record RegisterRequest( - string Email, - string Password, - string FirstName, - string LastName, - string OrganizationName); +namespace MicCheck.Api.Common.Security.Authorization; + +public record RegisterRequest( + string Email, + string Password, + string FirstName, + string LastName, + string OrganizationName); diff --git a/src/api/MicCheck.Api/Common/Security/Authorization/TokenResponse.cs b/src/api/MicCheck.Api/Common/Security/Authorization/TokenResponse.cs old mode 100644 new mode 100755 index 09ba213..1d26f82 --- a/src/api/MicCheck.Api/Common/Security/Authorization/TokenResponse.cs +++ b/src/api/MicCheck.Api/Common/Security/Authorization/TokenResponse.cs @@ -1,3 +1,3 @@ -namespace MicCheck.Api.Common.Security.Authorization; - -public record TokenResponse(string Token, DateTime ExpiresAt); +namespace MicCheck.Api.Common.Security.Authorization; + +public record TokenResponse(string Token, DateTime ExpiresAt); diff --git a/src/api/MicCheck.Api/Common/Security/Authorization/TokenService.cs b/src/api/MicCheck.Api/Common/Security/Authorization/TokenService.cs old mode 100644 new mode 100755 index 4e212d4..0c57d2c --- a/src/api/MicCheck.Api/Common/Security/Authorization/TokenService.cs +++ b/src/api/MicCheck.Api/Common/Security/Authorization/TokenService.cs @@ -1,55 +1,55 @@ -using System.IdentityModel.Tokens.Jwt; -using System.Security.Claims; -using System.Text; -using MicCheck.Api.Users; -using Microsoft.IdentityModel.Tokens; - -namespace MicCheck.Api.Common.Security.Authorization; - -public class TokenService(IConfiguration configuration) : ITokenService -{ - public TokenResponse GenerateToken(User user) - { - var secretKey = configuration["Jwt:SecretKey"] - ?? throw new InvalidOperationException("Jwt:SecretKey is not configured."); - var issuer = configuration["Jwt:Issuer"] - ?? throw new InvalidOperationException("Jwt:Issuer is not configured."); - var audience = configuration["Jwt:Audience"] - ?? throw new InvalidOperationException("Jwt:Audience is not configured."); - var expiryMinutes = int.Parse(configuration["Jwt:ExpiryMinutes"] ?? "60"); - - var securityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(secretKey)); - var credentials = new SigningCredentials(securityKey, SecurityAlgorithms.HmacSha256); - var expiresAt = DateTime.UtcNow.AddMinutes(expiryMinutes); - - var claims = new List - { - new(JwtRegisteredClaimNames.Sub, user.Id.ToString()), - new(JwtRegisteredClaimNames.Email, user.Email), - new(JwtRegisteredClaimNames.GivenName, user.FirstName), - new(JwtRegisteredClaimNames.FamilyName, user.LastName), - new(JwtRegisteredClaimNames.Iat, DateTimeOffset.UtcNow.ToUnixTimeSeconds().ToString(), ClaimValueTypes.Integer64), - new(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()), - }; - - foreach (var org in user.Organizations) - { - claims.Add(new Claim("OrganizationId", org.OrganizationId.ToString())); - claims.Add(new Claim("OrganizationRole", org.Role.ToString())); - } - - var token = new JwtSecurityToken( - issuer: issuer, - audience: audience, - claims: claims, - expires: expiresAt, - signingCredentials: credentials); - - return new TokenResponse(new JwtSecurityTokenHandler().WriteToken(token), expiresAt); - } -} - -public interface ITokenService -{ - TokenResponse GenerateToken(User user); -} +using System.IdentityModel.Tokens.Jwt; +using System.Security.Claims; +using System.Text; +using MicCheck.Api.Users; +using Microsoft.IdentityModel.Tokens; + +namespace MicCheck.Api.Common.Security.Authorization; + +public class TokenService(IConfiguration configuration) : ITokenService +{ + public TokenResponse GenerateToken(User user) + { + var secretKey = configuration["Jwt:SecretKey"] + ?? throw new InvalidOperationException("Jwt:SecretKey is not configured."); + var issuer = configuration["Jwt:Issuer"] + ?? throw new InvalidOperationException("Jwt:Issuer is not configured."); + var audience = configuration["Jwt:Audience"] + ?? throw new InvalidOperationException("Jwt:Audience is not configured."); + var expiryMinutes = int.Parse(configuration["Jwt:ExpiryMinutes"] ?? "60"); + + var securityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(secretKey)); + var credentials = new SigningCredentials(securityKey, SecurityAlgorithms.HmacSha256); + var expiresAt = DateTime.UtcNow.AddMinutes(expiryMinutes); + + var claims = new List + { + new(JwtRegisteredClaimNames.Sub, user.Id.ToString()), + new(JwtRegisteredClaimNames.Email, user.Email), + new(JwtRegisteredClaimNames.GivenName, user.FirstName), + new(JwtRegisteredClaimNames.FamilyName, user.LastName), + new(JwtRegisteredClaimNames.Iat, DateTimeOffset.UtcNow.ToUnixTimeSeconds().ToString(), ClaimValueTypes.Integer64), + new(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()), + }; + + foreach (var org in user.Organizations) + { + claims.Add(new Claim("OrganizationId", org.OrganizationId.ToString())); + claims.Add(new Claim("OrganizationRole", org.Role.ToString())); + } + + var token = new JwtSecurityToken( + issuer: issuer, + audience: audience, + claims: claims, + expires: expiresAt, + signingCredentials: credentials); + + return new TokenResponse(new JwtSecurityTokenHandler().WriteToken(token), expiresAt); + } +} + +public interface ITokenService +{ + TokenResponse GenerateToken(User user); +} diff --git a/src/api/MicCheck.Api/Common/Security/Authorization/UserProjectPermission.cs b/src/api/MicCheck.Api/Common/Security/Authorization/UserProjectPermission.cs old mode 100644 new mode 100755 index ab9c850..b265845 --- a/src/api/MicCheck.Api/Common/Security/Authorization/UserProjectPermission.cs +++ b/src/api/MicCheck.Api/Common/Security/Authorization/UserProjectPermission.cs @@ -1,9 +1,9 @@ -namespace MicCheck.Api.Common.Security.Authorization; - -public class UserProjectPermission -{ - public int UserId { get; init; } - public int ProjectId { get; init; } - public List Permissions { get; set; } = []; - public bool IsAdmin { get; set; } -} +namespace MicCheck.Api.Common.Security.Authorization; + +public class UserProjectPermission +{ + public int UserId { get; init; } + public int ProjectId { get; init; } + public List Permissions { get; set; } = []; + public bool IsAdmin { get; set; } +} diff --git a/src/api/MicCheck.Api/Data/Configurations/ApiKeyConfiguration.cs b/src/api/MicCheck.Api/Data/Configurations/ApiKeyConfiguration.cs old mode 100644 new mode 100755 index dc5d998..82bfbda --- a/src/api/MicCheck.Api/Data/Configurations/ApiKeyConfiguration.cs +++ b/src/api/MicCheck.Api/Data/Configurations/ApiKeyConfiguration.cs @@ -1,19 +1,19 @@ -using MicCheck.Api.Common.Security.ApiKeys; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Metadata.Builders; - -namespace MicCheck.Api.Data.Configurations; - -public class ApiKeyConfiguration : IEntityTypeConfiguration -{ - public void Configure(EntityTypeBuilder builder) - { - builder.HasKey(k => k.Id); - builder.Property(k => k.Key).HasMaxLength(512).IsRequired(); - builder.Property(k => k.Prefix).HasMaxLength(8).IsRequired(); - builder.Property(k => k.Name).HasMaxLength(200).IsRequired(); - builder.Property(k => k.CreatedAt).IsRequired(); - - builder.HasIndex(k => k.Key).IsUnique(); - } -} +using MicCheck.Api.Common.Security.ApiKeys; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; + +namespace MicCheck.Api.Data.Configurations; + +public class ApiKeyConfiguration : IEntityTypeConfiguration +{ + public void Configure(EntityTypeBuilder builder) + { + builder.HasKey(k => k.Id); + builder.Property(k => k.Key).HasMaxLength(512).IsRequired(); + builder.Property(k => k.Prefix).HasMaxLength(8).IsRequired(); + builder.Property(k => k.Name).HasMaxLength(200).IsRequired(); + builder.Property(k => k.CreatedAt).IsRequired(); + + builder.HasIndex(k => k.Key).IsUnique(); + } +} diff --git a/src/api/MicCheck.Api/Data/Configurations/AuditLogConfiguration.cs b/src/api/MicCheck.Api/Data/Configurations/AuditLogConfiguration.cs old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/Data/Configurations/EnvironmentConfiguration.cs b/src/api/MicCheck.Api/Data/Configurations/EnvironmentConfiguration.cs old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/Data/Configurations/FeatureConfiguration.cs b/src/api/MicCheck.Api/Data/Configurations/FeatureConfiguration.cs old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/Data/Configurations/FeatureSegmentConfiguration.cs b/src/api/MicCheck.Api/Data/Configurations/FeatureSegmentConfiguration.cs old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/Data/Configurations/FeatureStateConfiguration.cs b/src/api/MicCheck.Api/Data/Configurations/FeatureStateConfiguration.cs old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/Data/Configurations/IdentityConfiguration.cs b/src/api/MicCheck.Api/Data/Configurations/IdentityConfiguration.cs old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/Data/Configurations/IdentityTraitConfiguration.cs b/src/api/MicCheck.Api/Data/Configurations/IdentityTraitConfiguration.cs old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/Data/Configurations/OrganizationConfiguration.cs b/src/api/MicCheck.Api/Data/Configurations/OrganizationConfiguration.cs old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/Data/Configurations/OrganizationUserConfiguration.cs b/src/api/MicCheck.Api/Data/Configurations/OrganizationUserConfiguration.cs old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/Data/Configurations/ProjectConfiguration.cs b/src/api/MicCheck.Api/Data/Configurations/ProjectConfiguration.cs old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/Data/Configurations/RefreshTokenConfiguration.cs b/src/api/MicCheck.Api/Data/Configurations/RefreshTokenConfiguration.cs old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/Data/Configurations/SegmentConditionConfiguration.cs b/src/api/MicCheck.Api/Data/Configurations/SegmentConditionConfiguration.cs old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/Data/Configurations/SegmentConfiguration.cs b/src/api/MicCheck.Api/Data/Configurations/SegmentConfiguration.cs old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/Data/Configurations/SegmentRuleConfiguration.cs b/src/api/MicCheck.Api/Data/Configurations/SegmentRuleConfiguration.cs old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/Data/Configurations/TagConfiguration.cs b/src/api/MicCheck.Api/Data/Configurations/TagConfiguration.cs old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/Data/Configurations/UserConfiguration.cs b/src/api/MicCheck.Api/Data/Configurations/UserConfiguration.cs old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/Data/Configurations/UserProjectPermissionConfiguration.cs b/src/api/MicCheck.Api/Data/Configurations/UserProjectPermissionConfiguration.cs old mode 100644 new mode 100755 index 87a8f32..7035bd6 --- a/src/api/MicCheck.Api/Data/Configurations/UserProjectPermissionConfiguration.cs +++ b/src/api/MicCheck.Api/Data/Configurations/UserProjectPermissionConfiguration.cs @@ -1,22 +1,22 @@ -using MicCheck.Api.Common.Security.Authorization; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Metadata.Builders; - -namespace MicCheck.Api.Data.Configurations; - -public class UserProjectPermissionConfiguration : IEntityTypeConfiguration -{ - public void Configure(EntityTypeBuilder builder) - { - builder.HasKey(p => new { p.UserId, p.ProjectId }); - - builder.Property(p => p.Permissions) - .HasConversion( - v => string.Join(',', v.Select(p => p.ToString())), - v => string.IsNullOrEmpty(v) - ? new List() - : v.Split(',', StringSplitOptions.RemoveEmptyEntries) - .Select(Enum.Parse) - .ToList()); - } -} +using MicCheck.Api.Common.Security.Authorization; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; + +namespace MicCheck.Api.Data.Configurations; + +public class UserProjectPermissionConfiguration : IEntityTypeConfiguration +{ + public void Configure(EntityTypeBuilder builder) + { + builder.HasKey(p => new { p.UserId, p.ProjectId }); + + builder.Property(p => p.Permissions) + .HasConversion( + v => string.Join(',', v.Select(p => p.ToString())), + v => string.IsNullOrEmpty(v) + ? new List() + : v.Split(',', StringSplitOptions.RemoveEmptyEntries) + .Select(Enum.Parse) + .ToList()); + } +} diff --git a/src/api/MicCheck.Api/Data/Configurations/WebhookConfiguration.cs b/src/api/MicCheck.Api/Data/Configurations/WebhookConfiguration.cs old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/Data/Configurations/WebhookDeliveryLogConfiguration.cs b/src/api/MicCheck.Api/Data/Configurations/WebhookDeliveryLogConfiguration.cs old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/Data/DatabaseSeeder.cs b/src/api/MicCheck.Api/Data/DatabaseSeeder.cs old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/Data/DatabaseStartupExtensions.cs b/src/api/MicCheck.Api/Data/DatabaseStartupExtensions.cs old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/Data/DatabaseUrlParser.cs b/src/api/MicCheck.Api/Data/DatabaseUrlParser.cs old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/Data/MicCheckDbContext.cs b/src/api/MicCheck.Api/Data/MicCheckDbContext.cs old mode 100644 new mode 100755 index 11387d8..fae2550 --- a/src/api/MicCheck.Api/Data/MicCheckDbContext.cs +++ b/src/api/MicCheck.Api/Data/MicCheckDbContext.cs @@ -1,43 +1,43 @@ -using MicCheck.Api.Common.Security.ApiKeys; -using MicCheck.Api.Audit; -using MicCheck.Api.Common.Security.Authorization; -using MicCheck.Api.Features; -using MicCheck.Api.Identities; -using MicCheck.Api.Organizations; -using MicCheck.Api.Projects; -using MicCheck.Api.Segments; -using MicCheck.Api.Users; -using MicCheck.Api.Webhooks; -using Microsoft.EntityFrameworkCore; -using AppEnvironment = MicCheck.Api.Environments.Environment; - -namespace MicCheck.Api.Data; - -public class MicCheckDbContext : DbContext -{ - public MicCheckDbContext(DbContextOptions options) : base(options) { } - - public DbSet Organizations => Set(); - public DbSet OrganizationUsers => Set(); - public DbSet Projects => Set(); - public DbSet Environments => Set(); - public DbSet Features => Set(); - public DbSet FeatureStates => Set(); - public DbSet FeatureSegments => Set(); - public DbSet Tags => Set(); - public DbSet Segments => Set(); - public DbSet SegmentRules => Set(); - public DbSet SegmentConditions => Set(); - public DbSet Identities => Set(); - public DbSet IdentityTraits => Set(); - public DbSet AuditLogs => Set(); - public DbSet Webhooks => Set(); - public DbSet WebhookDeliveryLogs => Set(); - public DbSet ApiKeys => Set(); - public DbSet Users => Set(); - public DbSet RefreshTokens => Set(); - public DbSet UserProjectPermissions => Set(); - - protected override void OnModelCreating(ModelBuilder modelBuilder) - => modelBuilder.ApplyConfigurationsFromAssembly(typeof(MicCheckDbContext).Assembly); -} +using MicCheck.Api.Common.Security.ApiKeys; +using MicCheck.Api.Audit; +using MicCheck.Api.Common.Security.Authorization; +using MicCheck.Api.Features; +using MicCheck.Api.Identities; +using MicCheck.Api.Organizations; +using MicCheck.Api.Projects; +using MicCheck.Api.Segments; +using MicCheck.Api.Users; +using MicCheck.Api.Webhooks; +using Microsoft.EntityFrameworkCore; +using AppEnvironment = MicCheck.Api.Environments.Environment; + +namespace MicCheck.Api.Data; + +public class MicCheckDbContext : DbContext +{ + public MicCheckDbContext(DbContextOptions options) : base(options) { } + + public DbSet Organizations => Set(); + public DbSet OrganizationUsers => Set(); + public DbSet Projects => Set(); + public DbSet Environments => Set(); + public DbSet Features => Set(); + public DbSet FeatureStates => Set(); + public DbSet FeatureSegments => Set(); + public DbSet Tags => Set(); + public DbSet Segments => Set(); + public DbSet SegmentRules => Set(); + public DbSet SegmentConditions => Set(); + public DbSet Identities => Set(); + public DbSet IdentityTraits => Set(); + public DbSet AuditLogs => Set(); + public DbSet Webhooks => Set(); + public DbSet WebhookDeliveryLogs => Set(); + public DbSet ApiKeys => Set(); + public DbSet Users => Set(); + public DbSet RefreshTokens => Set(); + public DbSet UserProjectPermissions => Set(); + + protected override void OnModelCreating(ModelBuilder modelBuilder) + => modelBuilder.ApplyConfigurationsFromAssembly(typeof(MicCheckDbContext).Assembly); +} diff --git a/src/api/MicCheck.Api/Dockerfile b/src/api/MicCheck.Api/Dockerfile old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/Environments/CloneEnvironmentRequest.cs b/src/api/MicCheck.Api/Environments/CloneEnvironmentRequest.cs old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/Environments/CreateEnvironmentRequest.cs b/src/api/MicCheck.Api/Environments/CreateEnvironmentRequest.cs old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/Environments/Environment.cs b/src/api/MicCheck.Api/Environments/Environment.cs old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/Environments/EnvironmentDocumentController.cs b/src/api/MicCheck.Api/Environments/EnvironmentDocumentController.cs old mode 100644 new mode 100755 index 69c9ad1..5185973 --- a/src/api/MicCheck.Api/Environments/EnvironmentDocumentController.cs +++ b/src/api/MicCheck.Api/Environments/EnvironmentDocumentController.cs @@ -1,20 +1,20 @@ -using MicCheck.Api.Common.Security.Authorization; -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Mvc; - -namespace MicCheck.Api.Environments; - -[ApiController] -[Route("api/v1/environment-document")] -[Authorize(Policy = AuthorizationPolicies.FlagsApiAccess)] -public class EnvironmentDocumentController(EnvironmentDocumentService environmentDocumentService) : ControllerBase -{ - [HttpGet] - public async Task> Get(CancellationToken ct) - { - var environmentId = int.Parse(User.FindFirst("EnvironmentId")!.Value); - var document = await environmentDocumentService.GetAsync(environmentId, ct); - - return document is null ? NotFound() : Ok(document); - } -} +using MicCheck.Api.Common.Security.Authorization; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; + +namespace MicCheck.Api.Environments; + +[ApiController] +[Route("api/v1/environment-document")] +[Authorize(Policy = AuthorizationPolicies.FlagsApiAccess)] +public class EnvironmentDocumentController(EnvironmentDocumentService environmentDocumentService) : ControllerBase +{ + [HttpGet] + public async Task> Get(CancellationToken ct) + { + var environmentId = int.Parse(User.FindFirst("EnvironmentId")!.Value); + var document = await environmentDocumentService.GetAsync(environmentId, ct); + + return document is null ? NotFound() : Ok(document); + } +} diff --git a/src/api/MicCheck.Api/Environments/EnvironmentDocumentResponse.cs b/src/api/MicCheck.Api/Environments/EnvironmentDocumentResponse.cs old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/Environments/EnvironmentDocumentService.cs b/src/api/MicCheck.Api/Environments/EnvironmentDocumentService.cs old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/Environments/EnvironmentResponse.cs b/src/api/MicCheck.Api/Environments/EnvironmentResponse.cs old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/Environments/EnvironmentService.cs b/src/api/MicCheck.Api/Environments/EnvironmentService.cs old mode 100644 new mode 100755 index bdefadf..5fe015d --- a/src/api/MicCheck.Api/Environments/EnvironmentService.cs +++ b/src/api/MicCheck.Api/Environments/EnvironmentService.cs @@ -1,135 +1,135 @@ -using MicCheck.Api.Common.Security.ApiKeys; -using MicCheck.Api.Audit; -using MicCheck.Api.Data; -using MicCheck.Api.Features; -using Microsoft.EntityFrameworkCore; -using AppEnvironment = MicCheck.Api.Environments.Environment; - -namespace MicCheck.Api.Environments; - -public class EnvironmentService(MicCheckDbContext db, AuditService auditService) -{ - public async Task> ListByProjectAsync(int projectId, CancellationToken ct = default) - { - return await db.Environments - .Where(e => e.ProjectId == projectId) - .ToListAsync(ct); - } - - public async Task FindByApiKeyAsync(string apiKey, CancellationToken ct = default) - { - return await db.Environments.FirstOrDefaultAsync(e => e.ApiKey == apiKey, ct); - } - - public async Task CreateAsync(int projectId, string name, CancellationToken ct = default) - { - var apiKey = ApiKeyHasher.GenerateKey(); - - var environment = new AppEnvironment - { - Name = name, - ApiKey = apiKey, - ProjectId = projectId, - CreatedAt = DateTimeOffset.UtcNow - }; - db.Environments.Add(environment); - await db.SaveChangesAsync(ct); - - var features = await db.Features - .Where(f => f.ProjectId == projectId) - .ToListAsync(ct); - - foreach (var feature in features) - { - db.FeatureStates.Add(new FeatureState - { - FeatureId = feature.Id, - EnvironmentId = environment.Id, - Enabled = feature.DefaultEnabled, - Value = feature.InitialValue, - CreatedAt = DateTimeOffset.UtcNow, - UpdatedAt = DateTimeOffset.UtcNow - }); - } - - if (features.Count > 0) - await db.SaveChangesAsync(ct); - - var project = await db.Projects.FirstOrDefaultAsync(p => p.Id == projectId, ct); - if (project is not null) - await auditService.LogAsync("Environment", environment.Id.ToString(), "created", - project.OrganizationId, projectId, environment.Id, ct: ct); - - return environment; - } - - public async Task UpdateAsync(string apiKey, string name, CancellationToken ct = default) - { - var environment = await db.Environments.FirstOrDefaultAsync(e => e.ApiKey == apiKey, ct) - ?? throw new KeyNotFoundException($"Environment with key '{apiKey}' not found."); - - environment.Name = name; - await db.SaveChangesAsync(ct); - - var project = await db.Projects.FirstOrDefaultAsync(p => p.Id == environment.ProjectId, ct); - if (project is not null) - await auditService.LogAsync("Environment", environment.Id.ToString(), "updated", - project.OrganizationId, environment.ProjectId, environment.Id, ct: ct); - - return environment; - } - - public async Task DeleteAsync(string apiKey, CancellationToken ct = default) - { - var environment = await db.Environments.FirstOrDefaultAsync(e => e.ApiKey == apiKey, ct); - if (environment is null) return; - - db.Environments.Remove(environment); - await db.SaveChangesAsync(ct); - } - - public async Task CloneAsync(string sourceApiKey, string newName, CancellationToken ct = default) - { - var source = await db.Environments.FirstOrDefaultAsync(e => e.ApiKey == sourceApiKey, ct) - ?? throw new KeyNotFoundException($"Source environment with key '{sourceApiKey}' not found."); - - var newApiKey = ApiKeyHasher.GenerateKey(); - - var cloned = new AppEnvironment - { - Name = newName, - ApiKey = newApiKey, - ProjectId = source.ProjectId, - CreatedAt = DateTimeOffset.UtcNow - }; - db.Environments.Add(cloned); - await db.SaveChangesAsync(ct); - - var sourceStates = await db.FeatureStates - .Where(fs => fs.EnvironmentId == source.Id && fs.IdentityId == null && fs.FeatureSegmentId == null) - .ToListAsync(ct); - - foreach (var state in sourceStates) - { - db.FeatureStates.Add(new FeatureState - { - FeatureId = state.FeatureId, - EnvironmentId = cloned.Id, - Enabled = state.Enabled, - Value = state.Value, - CreatedAt = DateTimeOffset.UtcNow, - UpdatedAt = DateTimeOffset.UtcNow - }); - } - - if (sourceStates.Count > 0) - await db.SaveChangesAsync(ct); - - var project = await db.Projects.FirstOrDefaultAsync(p => p.Id == source.ProjectId, ct); - if (project is not null) - await auditService.LogAsync("Environment", cloned.Id.ToString(), "cloned", - project.OrganizationId, source.ProjectId, cloned.Id, ct: ct); - - return cloned; - } -} +using MicCheck.Api.Common.Security.ApiKeys; +using MicCheck.Api.Audit; +using MicCheck.Api.Data; +using MicCheck.Api.Features; +using Microsoft.EntityFrameworkCore; +using AppEnvironment = MicCheck.Api.Environments.Environment; + +namespace MicCheck.Api.Environments; + +public class EnvironmentService(MicCheckDbContext db, AuditService auditService) +{ + public async Task> ListByProjectAsync(int projectId, CancellationToken ct = default) + { + return await db.Environments + .Where(e => e.ProjectId == projectId) + .ToListAsync(ct); + } + + public async Task FindByApiKeyAsync(string apiKey, CancellationToken ct = default) + { + return await db.Environments.FirstOrDefaultAsync(e => e.ApiKey == apiKey, ct); + } + + public async Task CreateAsync(int projectId, string name, CancellationToken ct = default) + { + var apiKey = ApiKeyHasher.GenerateKey(); + + var environment = new AppEnvironment + { + Name = name, + ApiKey = apiKey, + ProjectId = projectId, + CreatedAt = DateTimeOffset.UtcNow + }; + db.Environments.Add(environment); + await db.SaveChangesAsync(ct); + + var features = await db.Features + .Where(f => f.ProjectId == projectId) + .ToListAsync(ct); + + foreach (var feature in features) + { + db.FeatureStates.Add(new FeatureState + { + FeatureId = feature.Id, + EnvironmentId = environment.Id, + Enabled = feature.DefaultEnabled, + Value = feature.InitialValue, + CreatedAt = DateTimeOffset.UtcNow, + UpdatedAt = DateTimeOffset.UtcNow + }); + } + + if (features.Count > 0) + await db.SaveChangesAsync(ct); + + var project = await db.Projects.FirstOrDefaultAsync(p => p.Id == projectId, ct); + if (project is not null) + await auditService.LogAsync("Environment", environment.Id.ToString(), "created", + project.OrganizationId, projectId, environment.Id, ct: ct); + + return environment; + } + + public async Task UpdateAsync(string apiKey, string name, CancellationToken ct = default) + { + var environment = await db.Environments.FirstOrDefaultAsync(e => e.ApiKey == apiKey, ct) + ?? throw new KeyNotFoundException($"Environment with key '{apiKey}' not found."); + + environment.Name = name; + await db.SaveChangesAsync(ct); + + var project = await db.Projects.FirstOrDefaultAsync(p => p.Id == environment.ProjectId, ct); + if (project is not null) + await auditService.LogAsync("Environment", environment.Id.ToString(), "updated", + project.OrganizationId, environment.ProjectId, environment.Id, ct: ct); + + return environment; + } + + public async Task DeleteAsync(string apiKey, CancellationToken ct = default) + { + var environment = await db.Environments.FirstOrDefaultAsync(e => e.ApiKey == apiKey, ct); + if (environment is null) return; + + db.Environments.Remove(environment); + await db.SaveChangesAsync(ct); + } + + public async Task CloneAsync(string sourceApiKey, string newName, CancellationToken ct = default) + { + var source = await db.Environments.FirstOrDefaultAsync(e => e.ApiKey == sourceApiKey, ct) + ?? throw new KeyNotFoundException($"Source environment with key '{sourceApiKey}' not found."); + + var newApiKey = ApiKeyHasher.GenerateKey(); + + var cloned = new AppEnvironment + { + Name = newName, + ApiKey = newApiKey, + ProjectId = source.ProjectId, + CreatedAt = DateTimeOffset.UtcNow + }; + db.Environments.Add(cloned); + await db.SaveChangesAsync(ct); + + var sourceStates = await db.FeatureStates + .Where(fs => fs.EnvironmentId == source.Id && fs.IdentityId == null && fs.FeatureSegmentId == null) + .ToListAsync(ct); + + foreach (var state in sourceStates) + { + db.FeatureStates.Add(new FeatureState + { + FeatureId = state.FeatureId, + EnvironmentId = cloned.Id, + Enabled = state.Enabled, + Value = state.Value, + CreatedAt = DateTimeOffset.UtcNow, + UpdatedAt = DateTimeOffset.UtcNow + }); + } + + if (sourceStates.Count > 0) + await db.SaveChangesAsync(ct); + + var project = await db.Projects.FirstOrDefaultAsync(p => p.Id == source.ProjectId, ct); + if (project is not null) + await auditService.LogAsync("Environment", cloned.Id.ToString(), "cloned", + project.OrganizationId, source.ProjectId, cloned.Id, ct: ct); + + return cloned; + } +} diff --git a/src/api/MicCheck.Api/Environments/EnvironmentsController.cs b/src/api/MicCheck.Api/Environments/EnvironmentsController.cs old mode 100644 new mode 100755 index f2121ed..a39bde4 --- a/src/api/MicCheck.Api/Environments/EnvironmentsController.cs +++ b/src/api/MicCheck.Api/Environments/EnvironmentsController.cs @@ -1,443 +1,443 @@ -using MicCheck.Api.Common.Security.Authorization; -using MicCheck.Api.Common; -using MicCheck.Api.Webhooks; -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Mvc; -using Microsoft.AspNetCore.RateLimiting; - -namespace MicCheck.Api.Environments; - -[ApiController] -[Route("api/v1/environments")] -[Authorize(Policy = AuthorizationPolicies.AdminApiAccess)] -[EnableRateLimiting("AdminApi")] -public class EnvironmentsController(EnvironmentService environmentService, WebhookService webhookService) : ControllerBase -{ - [HttpGet] - public async Task>> List( - [FromQuery] int projectId, - [FromQuery] int page = 1, - [FromQuery] int pageSize = 20, - CancellationToken ct = default) - { - pageSize = Math.Clamp(pageSize, 1, 100); - var all = await environmentService.ListByProjectAsync(projectId, ct); - var paged = all.Skip((page - 1) * pageSize).Take(pageSize).Select(EnvironmentResponse.From).ToList(); - return Ok(new PaginatedResponse(all.Count, null, null, paged)); - } - - [HttpPost] - public async Task> Create(CreateEnvironmentRequest request, CancellationToken ct) - { - var environment = await environmentService.CreateAsync(request.ProjectId, request.Name, ct); - return CreatedAtAction(nameof(GetByApiKey), new { apiKey = environment.ApiKey }, EnvironmentResponse.From(environment)); - } - - [HttpGet("{apiKey}")] - public async Task> GetByApiKey(string apiKey, CancellationToken ct) - { - var environment = await environmentService.FindByApiKeyAsync(apiKey, ct); - if (environment is null) return NotFound(); - return Ok(EnvironmentResponse.From(environment)); - } - - [HttpPut("{apiKey}")] - public async Task> Update(string apiKey, UpdateEnvironmentRequest request, CancellationToken ct) - { - var environment = await environmentService.FindByApiKeyAsync(apiKey, ct); - if (environment is null) return NotFound(); - - var updated = await environmentService.UpdateAsync(apiKey, request.Name, ct); - return Ok(EnvironmentResponse.From(updated)); - } - - [HttpDelete("{apiKey}")] - public async Task Delete(string apiKey, CancellationToken ct) - { - var environment = await environmentService.FindByApiKeyAsync(apiKey, ct); - if (environment is null) return NotFound(); - - await environmentService.DeleteAsync(apiKey, ct); - return NoContent(); - } - - [HttpPost("{apiKey}/clone")] - public async Task> Clone(string apiKey, CloneEnvironmentRequest request, CancellationToken ct) - { - var source = await environmentService.FindByApiKeyAsync(apiKey, ct); - if (source is null) return NotFound(); - - var cloned = await environmentService.CloneAsync(apiKey, request.Name, ct); - return CreatedAtAction(nameof(GetByApiKey), new { apiKey = cloned.ApiKey }, EnvironmentResponse.From(cloned)); - } - - [HttpGet("{apiKey}/webhooks")] - public async Task>> ListWebhooks(string apiKey, CancellationToken ct) - { - var environment = await environmentService.FindByApiKeyAsync(apiKey, ct); - if (environment is null) return NotFound(); - - var webhooks = await webhookService.ListByEnvironmentAsync(environment.Id, ct); - return Ok(webhooks.Select(WebhookResponse.From).ToList()); - } - - [HttpPost("{apiKey}/webhooks")] - public async Task> CreateWebhook( - string apiKey, CreateWebhookRequest request, CancellationToken ct) - { - var environment = await environmentService.FindByApiKeyAsync(apiKey, ct); - if (environment is null) return NotFound(); - - var webhook = await webhookService.CreateAsync(environment.Id, request.Url, request.Secret, request.Enabled, ct); - return CreatedAtAction(nameof(GetByApiKey), new { apiKey }, WebhookResponse.From(webhook)); - } - - [HttpPut("{apiKey}/webhooks/{id}")] - public async Task> UpdateWebhook( - string apiKey, int id, CreateWebhookRequest request, CancellationToken ct) - { - var environment = await environmentService.FindByApiKeyAsync(apiKey, ct); - if (environment is null) return NotFound(); - - var webhook = await webhookService.FindByIdAsync(id, ct); - if (webhook is null || webhook.EnvironmentId != environment.Id) return NotFound(); - - var updated = await webhookService.UpdateAsync(id, request.Url, request.Secret, request.Enabled, ct); - return Ok(WebhookResponse.From(updated)); - } - - [HttpGet("{apiKey}/webhooks/{id}/deliveries")] - public async Task>> ListWebhookDeliveries( - string apiKey, int id, CancellationToken ct) - { - var environment = await environmentService.FindByApiKeyAsync(apiKey, ct); - if (environment is null) return NotFound(); - - var webhook = await webhookService.FindByIdAsync(id, ct); - if (webhook is null || webhook.EnvironmentId != environment.Id) return NotFound(); - - var logs = await webhookService.ListDeliveriesAsync(id, ct); - return Ok(logs.Select(WebhookDeliveryLogResponse.From).ToList()); - } - - [HttpDelete("{apiKey}/webhooks/{id}")] - public async Task DeleteWebhook(string apiKey, int id, CancellationToken ct) - { - var environment = await environmentService.FindByApiKeyAsync(apiKey, ct); - if (environment is null) return NotFound(); - - var webhook = await webhookService.FindByIdAsync(id, ct); - if (webhook is null || webhook.EnvironmentId != environment.Id) return NotFound(); - - await webhookService.DeleteAsync(id, ct); - return NoContent(); - } - - [HttpGet("{apiKey}/audit-logs")] - public async Task>> ListAuditLogs( - string apiKey, - [FromServices] Audit.AuditLogQueryService auditLogQueryService, - CancellationToken ct) - { - var environment = await environmentService.FindByApiKeyAsync(apiKey, ct); - if (environment is null) return NotFound(); - - var (_, logs) = await auditLogQueryService.ListByEnvironmentAsync(environment.Id, new Audit.AuditLogFilter(), ct); - return Ok(logs.ToList()); - } - - [HttpGet("{apiKey}/identities")] - public async Task>> ListIdentities( - string apiKey, - [FromServices] Identities.AdminIdentityService adminIdentityService, - [FromQuery] int page = 1, - [FromQuery] int pageSize = 20, - CancellationToken ct = default) - { - pageSize = Math.Clamp(pageSize, 1, 100); - var environment = await environmentService.FindByApiKeyAsync(apiKey, ct); - if (environment is null) return NotFound(); - - var (total, items) = await adminIdentityService.ListAsync(environment.Id, page, pageSize, ct); - var results = items.Select(Identities.AdminIdentityResponse.From).ToList(); - return Ok(new PaginatedResponse(total, null, null, results)); - } - - [HttpPost("{apiKey}/identities")] - public async Task> CreateIdentity( - string apiKey, - [FromBody] Identities.CreateIdentityRequest request, - [FromServices] Identities.AdminIdentityService adminIdentityService, - CancellationToken ct) - { - var environment = await environmentService.FindByApiKeyAsync(apiKey, ct); - if (environment is null) return NotFound(); - - var identity = await adminIdentityService.CreateAsync(environment.Id, request.Identifier, ct); - if (identity is null) - return Conflict(new { error = "An identity with this identifier already exists in the environment." }); - - return CreatedAtAction(nameof(GetIdentity), new { apiKey, id = identity.Id }, - Identities.AdminIdentityResponse.From(identity)); - } - - [HttpGet("{apiKey}/identities/{id}")] - public async Task> GetIdentity( - string apiKey, int id, - [FromServices] Identities.AdminIdentityService adminIdentityService, - CancellationToken ct) - { - var environment = await environmentService.FindByApiKeyAsync(apiKey, ct); - if (environment is null) return NotFound(); - - var identity = await adminIdentityService.FindByIdAsync(id, environment.Id, ct); - if (identity is null) return NotFound(); - return Ok(Identities.AdminIdentityResponse.From(identity)); - } - - [HttpDelete("{apiKey}/identities/{id}")] - public async Task DeleteIdentity( - string apiKey, int id, - [FromServices] Identities.AdminIdentityService adminIdentityService, - CancellationToken ct) - { - var environment = await environmentService.FindByApiKeyAsync(apiKey, ct); - if (environment is null) return NotFound(); - - var identity = await adminIdentityService.FindByIdAsync(id, environment.Id, ct); - if (identity is null) return NotFound(); - - await adminIdentityService.DeleteAsync(id, ct); - return NoContent(); - } - - [HttpPut("{apiKey}/identities/{id}/traits/{key}")] - public async Task> UpsertIdentityTrait( - string apiKey, int id, string key, - [FromBody] Identities.UpsertTraitRequest request, - [FromServices] Identities.AdminIdentityService adminIdentityService, - CancellationToken ct) - { - var environment = await environmentService.FindByApiKeyAsync(apiKey, ct); - if (environment is null) return NotFound(); - - var result = await adminIdentityService.UpsertTraitAsync(id, environment.Id, key, request.Value, ct); - if (result is null) return NotFound(); - return Ok(result); - } - - [HttpDelete("{apiKey}/identities/{id}/traits/{key}")] - public async Task DeleteIdentityTrait( - string apiKey, int id, string key, - [FromServices] Identities.AdminIdentityService adminIdentityService, - CancellationToken ct) - { - var environment = await environmentService.FindByApiKeyAsync(apiKey, ct); - if (environment is null) return NotFound(); - - var deleted = await adminIdentityService.DeleteTraitAsync(id, environment.Id, key, ct); - if (!deleted) return NotFound(); - return NoContent(); - } - - [HttpGet("{apiKey}/identities/{id}/featurestates")] - public async Task>> GetIdentityFeatureStates( - string apiKey, int id, - [FromServices] Identities.AdminIdentityService adminIdentityService, - CancellationToken ct) - { - var environment = await environmentService.FindByApiKeyAsync(apiKey, ct); - if (environment is null) return NotFound(); - - var identity = await adminIdentityService.FindByIdAsync(id, environment.Id, ct); - if (identity is null) return NotFound(); - - var states = await adminIdentityService.GetFeatureStatesAsync(id, environment.Id, ct); - return Ok(states.Select(Features.FeatureStateResponse.From).ToList()); - } - - [HttpPut("{apiKey}/identities/{id}/featurestates/{featureId}")] - public async Task> SetIdentityFeatureState( - string apiKey, int id, int featureId, - Features.UpdateFeatureStateRequest request, - [FromServices] Identities.AdminIdentityService adminIdentityService, - CancellationToken ct) - { - var environment = await environmentService.FindByApiKeyAsync(apiKey, ct); - if (environment is null) return NotFound(); - - var identity = await adminIdentityService.FindByIdAsync(id, environment.Id, ct); - if (identity is null) return NotFound(); - - var state = await adminIdentityService.SetFeatureStateAsync(id, environment.Id, featureId, request.Enabled, request.Value, ct); - return Ok(Features.FeatureStateResponse.From(state)); - } - - [HttpDelete("{apiKey}/identities/{id}/featurestates/{featureId}")] - public async Task DeleteIdentityFeatureState( - string apiKey, int id, int featureId, - [FromServices] Identities.AdminIdentityService adminIdentityService, - CancellationToken ct) - { - var environment = await environmentService.FindByApiKeyAsync(apiKey, ct); - if (environment is null) return NotFound(); - - var identity = await adminIdentityService.FindByIdAsync(id, environment.Id, ct); - if (identity is null) return NotFound(); - - await adminIdentityService.DeleteFeatureStateAsync(id, environment.Id, featureId, ct); - return NoContent(); - } - - [HttpGet("{apiKey}/featurestates")] - public async Task>> ListFeatureStates( - string apiKey, - [FromServices] Features.FeatureStateService featureStateService, - CancellationToken ct) - { - var environment = await environmentService.FindByApiKeyAsync(apiKey, ct); - if (environment is null) return NotFound(); - - var states = await featureStateService.ListByEnvironmentAsync(environment.Id, ct); - return Ok(states.Select(Features.FeatureStateResponse.From).ToList()); - } - - [HttpGet("{apiKey}/featurestates/{id}")] - public async Task> GetFeatureState( - string apiKey, int id, - [FromServices] Features.FeatureStateService featureStateService, - CancellationToken ct) - { - var environment = await environmentService.FindByApiKeyAsync(apiKey, ct); - if (environment is null) return NotFound(); - - var state = await featureStateService.FindByIdAsync(id, environment.Id, ct); - if (state is null) return NotFound(); - return Ok(Features.FeatureStateResponse.From(state)); - } - - [HttpPut("{apiKey}/featurestates/{id}")] - public async Task> UpdateFeatureState( - string apiKey, int id, - Features.UpdateFeatureStateRequest request, - [FromServices] Features.FeatureStateService featureStateService, - CancellationToken ct) - { - var environment = await environmentService.FindByApiKeyAsync(apiKey, ct); - if (environment is null) return NotFound(); - - var state = await featureStateService.FindByIdAsync(id, environment.Id, ct); - if (state is null) return NotFound(); - - var updated = await featureStateService.UpdateAsync(id, request.Enabled, request.Value, ct); - return Ok(Features.FeatureStateResponse.From(updated)); - } - - [HttpPatch("{apiKey}/featurestates/{id}")] - public async Task> PatchFeatureState( - string apiKey, int id, - Features.PatchFeatureStateRequest request, - [FromServices] Features.FeatureStateService featureStateService, - CancellationToken ct) - { - var environment = await environmentService.FindByApiKeyAsync(apiKey, ct); - if (environment is null) return NotFound(); - - var state = await featureStateService.FindByIdAsync(id, environment.Id, ct); - if (state is null) return NotFound(); - - var updated = await featureStateService.PatchAsync(id, request.Enabled, request.Value, ct); - return Ok(Features.FeatureStateResponse.From(updated)); - } - - // ─── Feature Segments ──────────────────────────────────────────────────── - - [HttpGet("{apiKey}/features/{featureId}/segments")] - public async Task>> ListFeatureSegments( - string apiKey, int featureId, - [FromServices] Features.FeatureSegmentService featureSegmentService, - CancellationToken ct) - { - var environment = await environmentService.FindByApiKeyAsync(apiKey, ct); - if (environment is null) return NotFound(); - - var results = await featureSegmentService.ListByFeatureAsync(featureId, environment.Id, ct); - return Ok(results); - } - - [HttpPost("{apiKey}/features/{featureId}/segments")] - public async Task> CreateFeatureSegment( - string apiKey, int featureId, - Features.CreateFeatureSegmentRequest request, - [FromServices] Features.FeatureSegmentService featureSegmentService, - CancellationToken ct) - { - var environment = await environmentService.FindByApiKeyAsync(apiKey, ct); - if (environment is null) return NotFound(); - - try - { - var result = await featureSegmentService.CreateAsync( - featureId, environment.Id, request.SegmentId, request.Priority, - request.Enabled, request.Value, ct); - return Ok(result); - } - catch (KeyNotFoundException ex) - { - return NotFound(new { error = ex.Message }); - } - } - - [HttpPut("{apiKey}/features/{featureId}/segments/{id}")] - public async Task> UpdateFeatureSegment( - string apiKey, int featureId, int id, - Features.UpdateFeatureSegmentRequest request, - [FromServices] Features.FeatureSegmentService featureSegmentService, - CancellationToken ct) - { - var environment = await environmentService.FindByApiKeyAsync(apiKey, ct); - if (environment is null) return NotFound(); - - var result = await featureSegmentService.UpdateAsync(id, request.Priority, request.Enabled, request.Value, ct); - if (result is null) return NotFound(); - return Ok(result); - } - - [HttpDelete("{apiKey}/features/{featureId}/segments/{id}")] - public async Task DeleteFeatureSegment( - string apiKey, int featureId, int id, - [FromServices] Features.FeatureSegmentService featureSegmentService, - CancellationToken ct) - { - var environment = await environmentService.FindByApiKeyAsync(apiKey, ct); - if (environment is null) return NotFound(); - - var deleted = await featureSegmentService.DeleteAsync(id, ct); - return deleted ? NoContent() : NotFound(); - } - - // ─── Identity Segments ─────────────────────────────────────────────────── - - [HttpGet("{apiKey}/identities/{id}/segments")] - public async Task>> GetIdentitySegments( - string apiKey, int id, - [FromServices] Identities.AdminIdentityService adminIdentityService, - [FromServices] Segments.SegmentService segmentService, - [FromServices] Segments.SegmentEvaluator segmentEvaluator, - CancellationToken ct) - { - var environment = await environmentService.FindByApiKeyAsync(apiKey, ct); - if (environment is null) return NotFound(); - - var identity = await adminIdentityService.FindByIdAsync(id, environment.Id, ct); - if (identity is null) return NotFound(); - - var segments = await segmentService.ListByProjectAsync(environment.ProjectId, ct); - var matching = segments - .Where(s => segmentEvaluator.Evaluate(s, identity.Traits.ToList(), identity.Identifier)) - .Select(s => new Segments.SegmentSummaryResponse(s.Id, s.Name)) - .ToList(); - - return Ok(matching); - } -} +using MicCheck.Api.Common.Security.Authorization; +using MicCheck.Api.Common; +using MicCheck.Api.Webhooks; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.RateLimiting; + +namespace MicCheck.Api.Environments; + +[ApiController] +[Route("api/v1/environments")] +[Authorize(Policy = AuthorizationPolicies.AdminApiAccess)] +[EnableRateLimiting("AdminApi")] +public class EnvironmentsController(EnvironmentService environmentService, WebhookService webhookService) : ControllerBase +{ + [HttpGet] + public async Task>> List( + [FromQuery] int projectId, + [FromQuery] int page = 1, + [FromQuery] int pageSize = 20, + CancellationToken ct = default) + { + pageSize = Math.Clamp(pageSize, 1, 100); + var all = await environmentService.ListByProjectAsync(projectId, ct); + var paged = all.Skip((page - 1) * pageSize).Take(pageSize).Select(EnvironmentResponse.From).ToList(); + return Ok(new PaginatedResponse(all.Count, null, null, paged)); + } + + [HttpPost] + public async Task> Create(CreateEnvironmentRequest request, CancellationToken ct) + { + var environment = await environmentService.CreateAsync(request.ProjectId, request.Name, ct); + return CreatedAtAction(nameof(GetByApiKey), new { apiKey = environment.ApiKey }, EnvironmentResponse.From(environment)); + } + + [HttpGet("{apiKey}")] + public async Task> GetByApiKey(string apiKey, CancellationToken ct) + { + var environment = await environmentService.FindByApiKeyAsync(apiKey, ct); + if (environment is null) return NotFound(); + return Ok(EnvironmentResponse.From(environment)); + } + + [HttpPut("{apiKey}")] + public async Task> Update(string apiKey, UpdateEnvironmentRequest request, CancellationToken ct) + { + var environment = await environmentService.FindByApiKeyAsync(apiKey, ct); + if (environment is null) return NotFound(); + + var updated = await environmentService.UpdateAsync(apiKey, request.Name, ct); + return Ok(EnvironmentResponse.From(updated)); + } + + [HttpDelete("{apiKey}")] + public async Task Delete(string apiKey, CancellationToken ct) + { + var environment = await environmentService.FindByApiKeyAsync(apiKey, ct); + if (environment is null) return NotFound(); + + await environmentService.DeleteAsync(apiKey, ct); + return NoContent(); + } + + [HttpPost("{apiKey}/clone")] + public async Task> Clone(string apiKey, CloneEnvironmentRequest request, CancellationToken ct) + { + var source = await environmentService.FindByApiKeyAsync(apiKey, ct); + if (source is null) return NotFound(); + + var cloned = await environmentService.CloneAsync(apiKey, request.Name, ct); + return CreatedAtAction(nameof(GetByApiKey), new { apiKey = cloned.ApiKey }, EnvironmentResponse.From(cloned)); + } + + [HttpGet("{apiKey}/webhooks")] + public async Task>> ListWebhooks(string apiKey, CancellationToken ct) + { + var environment = await environmentService.FindByApiKeyAsync(apiKey, ct); + if (environment is null) return NotFound(); + + var webhooks = await webhookService.ListByEnvironmentAsync(environment.Id, ct); + return Ok(webhooks.Select(WebhookResponse.From).ToList()); + } + + [HttpPost("{apiKey}/webhooks")] + public async Task> CreateWebhook( + string apiKey, CreateWebhookRequest request, CancellationToken ct) + { + var environment = await environmentService.FindByApiKeyAsync(apiKey, ct); + if (environment is null) return NotFound(); + + var webhook = await webhookService.CreateAsync(environment.Id, request.Url, request.Secret, request.Enabled, ct); + return CreatedAtAction(nameof(GetByApiKey), new { apiKey }, WebhookResponse.From(webhook)); + } + + [HttpPut("{apiKey}/webhooks/{id}")] + public async Task> UpdateWebhook( + string apiKey, int id, CreateWebhookRequest request, CancellationToken ct) + { + var environment = await environmentService.FindByApiKeyAsync(apiKey, ct); + if (environment is null) return NotFound(); + + var webhook = await webhookService.FindByIdAsync(id, ct); + if (webhook is null || webhook.EnvironmentId != environment.Id) return NotFound(); + + var updated = await webhookService.UpdateAsync(id, request.Url, request.Secret, request.Enabled, ct); + return Ok(WebhookResponse.From(updated)); + } + + [HttpGet("{apiKey}/webhooks/{id}/deliveries")] + public async Task>> ListWebhookDeliveries( + string apiKey, int id, CancellationToken ct) + { + var environment = await environmentService.FindByApiKeyAsync(apiKey, ct); + if (environment is null) return NotFound(); + + var webhook = await webhookService.FindByIdAsync(id, ct); + if (webhook is null || webhook.EnvironmentId != environment.Id) return NotFound(); + + var logs = await webhookService.ListDeliveriesAsync(id, ct); + return Ok(logs.Select(WebhookDeliveryLogResponse.From).ToList()); + } + + [HttpDelete("{apiKey}/webhooks/{id}")] + public async Task DeleteWebhook(string apiKey, int id, CancellationToken ct) + { + var environment = await environmentService.FindByApiKeyAsync(apiKey, ct); + if (environment is null) return NotFound(); + + var webhook = await webhookService.FindByIdAsync(id, ct); + if (webhook is null || webhook.EnvironmentId != environment.Id) return NotFound(); + + await webhookService.DeleteAsync(id, ct); + return NoContent(); + } + + [HttpGet("{apiKey}/audit-logs")] + public async Task>> ListAuditLogs( + string apiKey, + [FromServices] Audit.AuditLogQueryService auditLogQueryService, + CancellationToken ct) + { + var environment = await environmentService.FindByApiKeyAsync(apiKey, ct); + if (environment is null) return NotFound(); + + var (_, logs) = await auditLogQueryService.ListByEnvironmentAsync(environment.Id, new Audit.AuditLogFilter(), ct); + return Ok(logs.ToList()); + } + + [HttpGet("{apiKey}/identities")] + public async Task>> ListIdentities( + string apiKey, + [FromServices] Identities.AdminIdentityService adminIdentityService, + [FromQuery] int page = 1, + [FromQuery] int pageSize = 20, + CancellationToken ct = default) + { + pageSize = Math.Clamp(pageSize, 1, 100); + var environment = await environmentService.FindByApiKeyAsync(apiKey, ct); + if (environment is null) return NotFound(); + + var (total, items) = await adminIdentityService.ListAsync(environment.Id, page, pageSize, ct); + var results = items.Select(Identities.AdminIdentityResponse.From).ToList(); + return Ok(new PaginatedResponse(total, null, null, results)); + } + + [HttpPost("{apiKey}/identities")] + public async Task> CreateIdentity( + string apiKey, + [FromBody] Identities.CreateIdentityRequest request, + [FromServices] Identities.AdminIdentityService adminIdentityService, + CancellationToken ct) + { + var environment = await environmentService.FindByApiKeyAsync(apiKey, ct); + if (environment is null) return NotFound(); + + var identity = await adminIdentityService.CreateAsync(environment.Id, request.Identifier, ct); + if (identity is null) + return Conflict(new { error = "An identity with this identifier already exists in the environment." }); + + return CreatedAtAction(nameof(GetIdentity), new { apiKey, id = identity.Id }, + Identities.AdminIdentityResponse.From(identity)); + } + + [HttpGet("{apiKey}/identities/{id}")] + public async Task> GetIdentity( + string apiKey, int id, + [FromServices] Identities.AdminIdentityService adminIdentityService, + CancellationToken ct) + { + var environment = await environmentService.FindByApiKeyAsync(apiKey, ct); + if (environment is null) return NotFound(); + + var identity = await adminIdentityService.FindByIdAsync(id, environment.Id, ct); + if (identity is null) return NotFound(); + return Ok(Identities.AdminIdentityResponse.From(identity)); + } + + [HttpDelete("{apiKey}/identities/{id}")] + public async Task DeleteIdentity( + string apiKey, int id, + [FromServices] Identities.AdminIdentityService adminIdentityService, + CancellationToken ct) + { + var environment = await environmentService.FindByApiKeyAsync(apiKey, ct); + if (environment is null) return NotFound(); + + var identity = await adminIdentityService.FindByIdAsync(id, environment.Id, ct); + if (identity is null) return NotFound(); + + await adminIdentityService.DeleteAsync(id, ct); + return NoContent(); + } + + [HttpPut("{apiKey}/identities/{id}/traits/{key}")] + public async Task> UpsertIdentityTrait( + string apiKey, int id, string key, + [FromBody] Identities.UpsertTraitRequest request, + [FromServices] Identities.AdminIdentityService adminIdentityService, + CancellationToken ct) + { + var environment = await environmentService.FindByApiKeyAsync(apiKey, ct); + if (environment is null) return NotFound(); + + var result = await adminIdentityService.UpsertTraitAsync(id, environment.Id, key, request.Value, ct); + if (result is null) return NotFound(); + return Ok(result); + } + + [HttpDelete("{apiKey}/identities/{id}/traits/{key}")] + public async Task DeleteIdentityTrait( + string apiKey, int id, string key, + [FromServices] Identities.AdminIdentityService adminIdentityService, + CancellationToken ct) + { + var environment = await environmentService.FindByApiKeyAsync(apiKey, ct); + if (environment is null) return NotFound(); + + var deleted = await adminIdentityService.DeleteTraitAsync(id, environment.Id, key, ct); + if (!deleted) return NotFound(); + return NoContent(); + } + + [HttpGet("{apiKey}/identities/{id}/featurestates")] + public async Task>> GetIdentityFeatureStates( + string apiKey, int id, + [FromServices] Identities.AdminIdentityService adminIdentityService, + CancellationToken ct) + { + var environment = await environmentService.FindByApiKeyAsync(apiKey, ct); + if (environment is null) return NotFound(); + + var identity = await adminIdentityService.FindByIdAsync(id, environment.Id, ct); + if (identity is null) return NotFound(); + + var states = await adminIdentityService.GetFeatureStatesAsync(id, environment.Id, ct); + return Ok(states.Select(Features.FeatureStateResponse.From).ToList()); + } + + [HttpPut("{apiKey}/identities/{id}/featurestates/{featureId}")] + public async Task> SetIdentityFeatureState( + string apiKey, int id, int featureId, + Features.UpdateFeatureStateRequest request, + [FromServices] Identities.AdminIdentityService adminIdentityService, + CancellationToken ct) + { + var environment = await environmentService.FindByApiKeyAsync(apiKey, ct); + if (environment is null) return NotFound(); + + var identity = await adminIdentityService.FindByIdAsync(id, environment.Id, ct); + if (identity is null) return NotFound(); + + var state = await adminIdentityService.SetFeatureStateAsync(id, environment.Id, featureId, request.Enabled, request.Value, ct); + return Ok(Features.FeatureStateResponse.From(state)); + } + + [HttpDelete("{apiKey}/identities/{id}/featurestates/{featureId}")] + public async Task DeleteIdentityFeatureState( + string apiKey, int id, int featureId, + [FromServices] Identities.AdminIdentityService adminIdentityService, + CancellationToken ct) + { + var environment = await environmentService.FindByApiKeyAsync(apiKey, ct); + if (environment is null) return NotFound(); + + var identity = await adminIdentityService.FindByIdAsync(id, environment.Id, ct); + if (identity is null) return NotFound(); + + await adminIdentityService.DeleteFeatureStateAsync(id, environment.Id, featureId, ct); + return NoContent(); + } + + [HttpGet("{apiKey}/featurestates")] + public async Task>> ListFeatureStates( + string apiKey, + [FromServices] Features.FeatureStateService featureStateService, + CancellationToken ct) + { + var environment = await environmentService.FindByApiKeyAsync(apiKey, ct); + if (environment is null) return NotFound(); + + var states = await featureStateService.ListByEnvironmentAsync(environment.Id, ct); + return Ok(states.Select(Features.FeatureStateResponse.From).ToList()); + } + + [HttpGet("{apiKey}/featurestates/{id}")] + public async Task> GetFeatureState( + string apiKey, int id, + [FromServices] Features.FeatureStateService featureStateService, + CancellationToken ct) + { + var environment = await environmentService.FindByApiKeyAsync(apiKey, ct); + if (environment is null) return NotFound(); + + var state = await featureStateService.FindByIdAsync(id, environment.Id, ct); + if (state is null) return NotFound(); + return Ok(Features.FeatureStateResponse.From(state)); + } + + [HttpPut("{apiKey}/featurestates/{id}")] + public async Task> UpdateFeatureState( + string apiKey, int id, + Features.UpdateFeatureStateRequest request, + [FromServices] Features.FeatureStateService featureStateService, + CancellationToken ct) + { + var environment = await environmentService.FindByApiKeyAsync(apiKey, ct); + if (environment is null) return NotFound(); + + var state = await featureStateService.FindByIdAsync(id, environment.Id, ct); + if (state is null) return NotFound(); + + var updated = await featureStateService.UpdateAsync(id, request.Enabled, request.Value, ct); + return Ok(Features.FeatureStateResponse.From(updated)); + } + + [HttpPatch("{apiKey}/featurestates/{id}")] + public async Task> PatchFeatureState( + string apiKey, int id, + Features.PatchFeatureStateRequest request, + [FromServices] Features.FeatureStateService featureStateService, + CancellationToken ct) + { + var environment = await environmentService.FindByApiKeyAsync(apiKey, ct); + if (environment is null) return NotFound(); + + var state = await featureStateService.FindByIdAsync(id, environment.Id, ct); + if (state is null) return NotFound(); + + var updated = await featureStateService.PatchAsync(id, request.Enabled, request.Value, ct); + return Ok(Features.FeatureStateResponse.From(updated)); + } + + // ─── Feature Segments ──────────────────────────────────────────────────── + + [HttpGet("{apiKey}/features/{featureId}/segments")] + public async Task>> ListFeatureSegments( + string apiKey, int featureId, + [FromServices] Features.FeatureSegmentService featureSegmentService, + CancellationToken ct) + { + var environment = await environmentService.FindByApiKeyAsync(apiKey, ct); + if (environment is null) return NotFound(); + + var results = await featureSegmentService.ListByFeatureAsync(featureId, environment.Id, ct); + return Ok(results); + } + + [HttpPost("{apiKey}/features/{featureId}/segments")] + public async Task> CreateFeatureSegment( + string apiKey, int featureId, + Features.CreateFeatureSegmentRequest request, + [FromServices] Features.FeatureSegmentService featureSegmentService, + CancellationToken ct) + { + var environment = await environmentService.FindByApiKeyAsync(apiKey, ct); + if (environment is null) return NotFound(); + + try + { + var result = await featureSegmentService.CreateAsync( + featureId, environment.Id, request.SegmentId, request.Priority, + request.Enabled, request.Value, ct); + return Ok(result); + } + catch (KeyNotFoundException ex) + { + return NotFound(new { error = ex.Message }); + } + } + + [HttpPut("{apiKey}/features/{featureId}/segments/{id}")] + public async Task> UpdateFeatureSegment( + string apiKey, int featureId, int id, + Features.UpdateFeatureSegmentRequest request, + [FromServices] Features.FeatureSegmentService featureSegmentService, + CancellationToken ct) + { + var environment = await environmentService.FindByApiKeyAsync(apiKey, ct); + if (environment is null) return NotFound(); + + var result = await featureSegmentService.UpdateAsync(id, request.Priority, request.Enabled, request.Value, ct); + if (result is null) return NotFound(); + return Ok(result); + } + + [HttpDelete("{apiKey}/features/{featureId}/segments/{id}")] + public async Task DeleteFeatureSegment( + string apiKey, int featureId, int id, + [FromServices] Features.FeatureSegmentService featureSegmentService, + CancellationToken ct) + { + var environment = await environmentService.FindByApiKeyAsync(apiKey, ct); + if (environment is null) return NotFound(); + + var deleted = await featureSegmentService.DeleteAsync(id, ct); + return deleted ? NoContent() : NotFound(); + } + + // ─── Identity Segments ─────────────────────────────────────────────────── + + [HttpGet("{apiKey}/identities/{id}/segments")] + public async Task>> GetIdentitySegments( + string apiKey, int id, + [FromServices] Identities.AdminIdentityService adminIdentityService, + [FromServices] Segments.SegmentService segmentService, + [FromServices] Segments.SegmentEvaluator segmentEvaluator, + CancellationToken ct) + { + var environment = await environmentService.FindByApiKeyAsync(apiKey, ct); + if (environment is null) return NotFound(); + + var identity = await adminIdentityService.FindByIdAsync(id, environment.Id, ct); + if (identity is null) return NotFound(); + + var segments = await segmentService.ListByProjectAsync(environment.ProjectId, ct); + var matching = segments + .Where(s => segmentEvaluator.Evaluate(s, identity.Traits.ToList(), identity.Identifier)) + .Select(s => new Segments.SegmentSummaryResponse(s.Id, s.Name)) + .ToList(); + + return Ok(matching); + } +} diff --git a/src/api/MicCheck.Api/Environments/UpdateEnvironmentRequest.cs b/src/api/MicCheck.Api/Environments/UpdateEnvironmentRequest.cs old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/Features/CreateFeatureRequest.cs b/src/api/MicCheck.Api/Features/CreateFeatureRequest.cs old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/Features/CreateTagRequest.cs b/src/api/MicCheck.Api/Features/CreateTagRequest.cs old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/Features/Feature.cs b/src/api/MicCheck.Api/Features/Feature.cs old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/Features/FeatureEvaluationService.cs b/src/api/MicCheck.Api/Features/FeatureEvaluationService.cs old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/Features/FeatureResponse.cs b/src/api/MicCheck.Api/Features/FeatureResponse.cs old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/Features/FeatureSegment.cs b/src/api/MicCheck.Api/Features/FeatureSegment.cs old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/Features/FeatureSegmentRequest.cs b/src/api/MicCheck.Api/Features/FeatureSegmentRequest.cs old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/Features/FeatureSegmentResponse.cs b/src/api/MicCheck.Api/Features/FeatureSegmentResponse.cs old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/Features/FeatureSegmentService.cs b/src/api/MicCheck.Api/Features/FeatureSegmentService.cs old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/Features/FeatureService.cs b/src/api/MicCheck.Api/Features/FeatureService.cs old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/Features/FeatureState.cs b/src/api/MicCheck.Api/Features/FeatureState.cs old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/Features/FeatureStateResponse.cs b/src/api/MicCheck.Api/Features/FeatureStateResponse.cs old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/Features/FeatureStateResult.cs b/src/api/MicCheck.Api/Features/FeatureStateResult.cs old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/Features/FeatureStateService.cs b/src/api/MicCheck.Api/Features/FeatureStateService.cs old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/Features/FeatureSummaryResponse.cs b/src/api/MicCheck.Api/Features/FeatureSummaryResponse.cs old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/Features/FeaturesController.cs b/src/api/MicCheck.Api/Features/FeaturesController.cs old mode 100644 new mode 100755 index 5cbbbef..618ec11 --- a/src/api/MicCheck.Api/Features/FeaturesController.cs +++ b/src/api/MicCheck.Api/Features/FeaturesController.cs @@ -1,87 +1,87 @@ -using MicCheck.Api.Common.Security.Authorization; -using MicCheck.Api.Common; -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Mvc; -using Microsoft.AspNetCore.RateLimiting; - -namespace MicCheck.Api.Features; - -[ApiController] -[Route("api/v1/projects/{projectId}/features")] -[Authorize(Policy = AuthorizationPolicies.AdminApiAccess)] -[EnableRateLimiting("AdminApi")] -public class FeaturesController(FeatureService featureService) : ControllerBase -{ - [HttpGet] - public async Task>> List( - int projectId, - [FromQuery] int page = 1, - [FromQuery] int pageSize = 20, - CancellationToken ct = default) - { - pageSize = Math.Clamp(pageSize, 1, 100); - var all = await featureService.ListByProjectAsync(projectId, ct); - var paged = all.Skip((page - 1) * pageSize).Take(pageSize).Select(FeatureResponse.From).ToList(); - return Ok(new PaginatedResponse(all.Count, null, null, paged)); - } - - [HttpPost] - public async Task> Create( - int projectId, CreateFeatureRequest request, CancellationToken ct) - { - try - { - var feature = await featureService.CreateAsync(projectId, request.Name, request.Type, request.InitialValue, request.Description, ct); - - return CreatedAtAction(nameof(GetById), new { projectId, id = feature.Id }, FeatureResponse.From(feature)); - } - catch (DomainException ex) - { - return BadRequest(new { error = ex.Message }); - } - } - - [HttpGet("{id}")] - public async Task> GetById(int projectId, int id, CancellationToken ct) - { - var feature = await featureService.FindByIdAsync(id, ct); - if (feature is null || feature.ProjectId != projectId) return NotFound(); - return Ok(FeatureResponse.From(feature)); - } - - [HttpPut("{id}")] - public async Task> Update( - int projectId, int id, UpdateFeatureRequest request, CancellationToken ct) - { - var feature = await featureService.FindByIdAsync(id, ct); - if (feature is null || feature.ProjectId != projectId) return NotFound(); - - var updated = await featureService.UpdateAsync(id, request.Name, request.Description, ct); - return Ok(FeatureResponse.From(updated)); - } - - [HttpPatch("{id}")] - public async Task> Patch( - int projectId, int id, PatchFeatureRequest request, CancellationToken ct) - { - var feature = await featureService.FindByIdAsync(id, ct); - if (feature is null || feature.ProjectId != projectId) return NotFound(); - - if (request.Name is not null) feature.Name = request.Name; - if (request.Description is not null) feature.Description = request.Description; - if (request.DefaultEnabled.HasValue) feature.DefaultEnabled = request.DefaultEnabled.Value; - - var updated = await featureService.UpdateAsync(id, feature.Name, feature.Description, ct); - return Ok(FeatureResponse.From(updated)); - } - - [HttpDelete("{id}")] - public async Task Delete(int projectId, int id, CancellationToken ct) - { - var feature = await featureService.FindByIdAsync(id, ct); - if (feature is null || feature.ProjectId != projectId) return NotFound(); - - await featureService.DeleteAsync(id, ct); - return NoContent(); - } -} +using MicCheck.Api.Common.Security.Authorization; +using MicCheck.Api.Common; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.RateLimiting; + +namespace MicCheck.Api.Features; + +[ApiController] +[Route("api/v1/projects/{projectId}/features")] +[Authorize(Policy = AuthorizationPolicies.AdminApiAccess)] +[EnableRateLimiting("AdminApi")] +public class FeaturesController(FeatureService featureService) : ControllerBase +{ + [HttpGet] + public async Task>> List( + int projectId, + [FromQuery] int page = 1, + [FromQuery] int pageSize = 20, + CancellationToken ct = default) + { + pageSize = Math.Clamp(pageSize, 1, 100); + var all = await featureService.ListByProjectAsync(projectId, ct); + var paged = all.Skip((page - 1) * pageSize).Take(pageSize).Select(FeatureResponse.From).ToList(); + return Ok(new PaginatedResponse(all.Count, null, null, paged)); + } + + [HttpPost] + public async Task> Create( + int projectId, CreateFeatureRequest request, CancellationToken ct) + { + try + { + var feature = await featureService.CreateAsync(projectId, request.Name, request.Type, request.InitialValue, request.Description, ct); + + return CreatedAtAction(nameof(GetById), new { projectId, id = feature.Id }, FeatureResponse.From(feature)); + } + catch (DomainException ex) + { + return BadRequest(new { error = ex.Message }); + } + } + + [HttpGet("{id}")] + public async Task> GetById(int projectId, int id, CancellationToken ct) + { + var feature = await featureService.FindByIdAsync(id, ct); + if (feature is null || feature.ProjectId != projectId) return NotFound(); + return Ok(FeatureResponse.From(feature)); + } + + [HttpPut("{id}")] + public async Task> Update( + int projectId, int id, UpdateFeatureRequest request, CancellationToken ct) + { + var feature = await featureService.FindByIdAsync(id, ct); + if (feature is null || feature.ProjectId != projectId) return NotFound(); + + var updated = await featureService.UpdateAsync(id, request.Name, request.Description, ct); + return Ok(FeatureResponse.From(updated)); + } + + [HttpPatch("{id}")] + public async Task> Patch( + int projectId, int id, PatchFeatureRequest request, CancellationToken ct) + { + var feature = await featureService.FindByIdAsync(id, ct); + if (feature is null || feature.ProjectId != projectId) return NotFound(); + + if (request.Name is not null) feature.Name = request.Name; + if (request.Description is not null) feature.Description = request.Description; + if (request.DefaultEnabled.HasValue) feature.DefaultEnabled = request.DefaultEnabled.Value; + + var updated = await featureService.UpdateAsync(id, feature.Name, feature.Description, ct); + return Ok(FeatureResponse.From(updated)); + } + + [HttpDelete("{id}")] + public async Task Delete(int projectId, int id, CancellationToken ct) + { + var feature = await featureService.FindByIdAsync(id, ct); + if (feature is null || feature.ProjectId != projectId) return NotFound(); + + await featureService.DeleteAsync(id, ct); + return NoContent(); + } +} diff --git a/src/api/MicCheck.Api/Features/FlagCache.cs b/src/api/MicCheck.Api/Features/FlagCache.cs old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/Features/FlagResponse.cs b/src/api/MicCheck.Api/Features/FlagResponse.cs old mode 100644 new mode 100755 index 06d6c6a..e2cd508 --- a/src/api/MicCheck.Api/Features/FlagResponse.cs +++ b/src/api/MicCheck.Api/Features/FlagResponse.cs @@ -1,14 +1,6 @@ namespace MicCheck.Api.Features; -public record FlagResponse( - int Id, - FeatureSummaryResponse Feature, - bool Enabled, - string? FeatureStateValue) +public record FlagResponse(int Id, FeatureSummaryResponse Feature, bool Enabled, string? FeatureStateValue) { - public static FlagResponse From(FeatureStateResult result) => new( - result.Feature.Id, - FeatureSummaryResponse.From(result.Feature), - result.Enabled, - result.Value); + public static FlagResponse From(FeatureStateResult result) => new(result.Feature.Id, FeatureSummaryResponse.From(result.Feature), result.Enabled, result.Value); } diff --git a/src/api/MicCheck.Api/Features/FlagsController.cs b/src/api/MicCheck.Api/Features/FlagsController.cs old mode 100644 new mode 100755 index 294a3ee..088bb7f --- a/src/api/MicCheck.Api/Features/FlagsController.cs +++ b/src/api/MicCheck.Api/Features/FlagsController.cs @@ -1,19 +1,19 @@ -using MicCheck.Api.Common.Security.Authorization; -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Mvc; - -namespace MicCheck.Api.Features; - -[ApiController] -[Route("api/v1/flags")] -[Authorize(Policy = AuthorizationPolicies.FlagsApiAccess)] -public class FlagsController(FeatureEvaluationService featureEvaluationService) : ControllerBase -{ - [HttpGet] - public async Task>> GetAll(CancellationToken ct) - { - var environmentId = int.Parse(User.FindFirst("EnvironmentId")!.Value); - var results = await featureEvaluationService.EvaluateForEnvironmentAsync(environmentId, ct); - return Ok(results.Select(FlagResponse.From).ToList()); - } -} +using MicCheck.Api.Common.Security.Authorization; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; + +namespace MicCheck.Api.Features; + +[ApiController] +[Route("api/v1/flags")] +[Authorize(Policy = AuthorizationPolicies.FlagsApiAccess)] +public class FlagsController(FeatureEvaluationService featureEvaluationService) : ControllerBase +{ + [HttpGet] + public async Task>> GetAll(CancellationToken ct) + { + var environmentId = int.Parse(User.FindFirst("EnvironmentId")!.Value); + var results = await featureEvaluationService.EvaluateForEnvironmentAsync(environmentId, ct); + return Ok(results.Select(FlagResponse.From).ToList()); + } +} diff --git a/src/api/MicCheck.Api/Features/PatchFeatureRequest.cs b/src/api/MicCheck.Api/Features/PatchFeatureRequest.cs old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/Features/Tag.cs b/src/api/MicCheck.Api/Features/Tag.cs old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/Features/TagResponse.cs b/src/api/MicCheck.Api/Features/TagResponse.cs old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/Features/TagService.cs b/src/api/MicCheck.Api/Features/TagService.cs old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/Features/TagsController.cs b/src/api/MicCheck.Api/Features/TagsController.cs old mode 100644 new mode 100755 index 42bbca1..281057a --- a/src/api/MicCheck.Api/Features/TagsController.cs +++ b/src/api/MicCheck.Api/Features/TagsController.cs @@ -1,37 +1,37 @@ -using MicCheck.Api.Common.Security.Authorization; -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Mvc; -using Microsoft.AspNetCore.RateLimiting; - -namespace MicCheck.Api.Features; - -[ApiController] -[Route("api/v1/projects/{projectId}/tags")] -[Authorize(Policy = AuthorizationPolicies.AdminApiAccess)] -[EnableRateLimiting("AdminApi")] -public class TagsController(TagService tagService) : ControllerBase -{ - [HttpGet] - public async Task>> List(int projectId, CancellationToken ct) - { - var tags = await tagService.ListByProjectAsync(projectId, ct); - return Ok(tags.Select(TagResponse.From).ToList()); - } - - [HttpPost] - public async Task> Create(int projectId, CreateTagRequest request, CancellationToken ct) - { - var tag = await tagService.CreateAsync(projectId, request.Label, request.Color, ct); - return CreatedAtAction(nameof(List), new { projectId }, TagResponse.From(tag)); - } - - [HttpDelete("{id}")] - public async Task Delete(int projectId, int id, CancellationToken ct) - { - var tag = await tagService.FindByIdAsync(id, ct); - if (tag is null || tag.ProjectId != projectId) return NotFound(); - - await tagService.DeleteAsync(id, ct); - return NoContent(); - } -} +using MicCheck.Api.Common.Security.Authorization; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.RateLimiting; + +namespace MicCheck.Api.Features; + +[ApiController] +[Route("api/v1/projects/{projectId}/tags")] +[Authorize(Policy = AuthorizationPolicies.AdminApiAccess)] +[EnableRateLimiting("AdminApi")] +public class TagsController(TagService tagService) : ControllerBase +{ + [HttpGet] + public async Task>> List(int projectId, CancellationToken ct) + { + var tags = await tagService.ListByProjectAsync(projectId, ct); + return Ok(tags.Select(TagResponse.From).ToList()); + } + + [HttpPost] + public async Task> Create(int projectId, CreateTagRequest request, CancellationToken ct) + { + var tag = await tagService.CreateAsync(projectId, request.Label, request.Color, ct); + return CreatedAtAction(nameof(List), new { projectId }, TagResponse.From(tag)); + } + + [HttpDelete("{id}")] + public async Task Delete(int projectId, int id, CancellationToken ct) + { + var tag = await tagService.FindByIdAsync(id, ct); + if (tag is null || tag.ProjectId != projectId) return NotFound(); + + await tagService.DeleteAsync(id, ct); + return NoContent(); + } +} diff --git a/src/api/MicCheck.Api/Features/UpdateFeatureRequest.cs b/src/api/MicCheck.Api/Features/UpdateFeatureRequest.cs old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/Features/UpdateFeatureStateRequest.cs b/src/api/MicCheck.Api/Features/UpdateFeatureStateRequest.cs old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/Identities/AdminIdentityResponse.cs b/src/api/MicCheck.Api/Identities/AdminIdentityResponse.cs old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/Identities/AdminIdentityService.cs b/src/api/MicCheck.Api/Identities/AdminIdentityService.cs old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/Identities/CreateIdentityRequest.cs b/src/api/MicCheck.Api/Identities/CreateIdentityRequest.cs old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/Identities/IdentitiesController.cs b/src/api/MicCheck.Api/Identities/IdentitiesController.cs old mode 100644 new mode 100755 index 1c8d1ec..408e416 --- a/src/api/MicCheck.Api/Identities/IdentitiesController.cs +++ b/src/api/MicCheck.Api/Identities/IdentitiesController.cs @@ -1,47 +1,47 @@ -using MicCheck.Api.Common.Security.Authorization; -using MicCheck.Api.Features; -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Mvc; - -namespace MicCheck.Api.Identities; - -[ApiController] -[Route("api/v1/identities")] -[Authorize(Policy = AuthorizationPolicies.FlagsApiAccess)] -public class IdentitiesController( - FeatureEvaluationService featureEvaluationService, - IdentityResolutionService identityResolutionService) : ControllerBase -{ - [HttpGet] - public async Task> GetByIdentifier( - [FromQuery] string identifier, CancellationToken ct) - { - if (string.IsNullOrWhiteSpace(identifier)) - return BadRequest("identifier query parameter is required."); - - var environmentId = int.Parse(User.FindFirst("EnvironmentId")!.Value!); - - var identity = await identityResolutionService.ResolveAsync(environmentId, identifier, null, ct); - var flags = await featureEvaluationService.EvaluateForIdentityAsync(environmentId, identifier, null, ct); - - return Ok(new IdentityResponse( - identity.Traits.Select(TraitResponse.From).ToList(), - flags.Select(FlagResponse.From).ToList())); - } - - [HttpPost] - public async Task> Identify( - [FromBody] IdentityRequest request, CancellationToken ct) - { - var environmentId = int.Parse(User.FindFirst("EnvironmentId")!.Value!); - - var identity = await identityResolutionService.ResolveAsync( - environmentId, request.Identifier, request.Traits, ct); - var flags = await featureEvaluationService.EvaluateForIdentityAsync( - environmentId, request.Identifier, request.Traits, ct); - - return Ok(new IdentityResponse( - identity.Traits.Select(TraitResponse.From).ToList(), - flags.Select(FlagResponse.From).ToList())); - } -} +using MicCheck.Api.Common.Security.Authorization; +using MicCheck.Api.Features; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; + +namespace MicCheck.Api.Identities; + +[ApiController] +[Route("api/v1/identities")] +[Authorize(Policy = AuthorizationPolicies.FlagsApiAccess)] +public class IdentitiesController( + FeatureEvaluationService featureEvaluationService, + IdentityResolutionService identityResolutionService) : ControllerBase +{ + [HttpGet] + public async Task> GetByIdentifier( + [FromQuery] string identifier, CancellationToken ct) + { + if (string.IsNullOrWhiteSpace(identifier)) + return BadRequest("identifier query parameter is required."); + + var environmentId = int.Parse(User.FindFirst("EnvironmentId")!.Value!); + + var identity = await identityResolutionService.ResolveAsync(environmentId, identifier, null, ct); + var flags = await featureEvaluationService.EvaluateForIdentityAsync(environmentId, identifier, null, ct); + + return Ok(new IdentityResponse( + identity.Traits.Select(TraitResponse.From).ToList(), + flags.Select(FlagResponse.From).ToList())); + } + + [HttpPost] + public async Task> Identify( + [FromBody] IdentityRequest request, CancellationToken ct) + { + var environmentId = int.Parse(User.FindFirst("EnvironmentId")!.Value!); + + var identity = await identityResolutionService.ResolveAsync( + environmentId, request.Identifier, request.Traits, ct); + var flags = await featureEvaluationService.EvaluateForIdentityAsync( + environmentId, request.Identifier, request.Traits, ct); + + return Ok(new IdentityResponse( + identity.Traits.Select(TraitResponse.From).ToList(), + flags.Select(FlagResponse.From).ToList())); + } +} diff --git a/src/api/MicCheck.Api/Identities/Identity.cs b/src/api/MicCheck.Api/Identities/Identity.cs old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/Identities/IdentityRequest.cs b/src/api/MicCheck.Api/Identities/IdentityRequest.cs old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/Identities/IdentityResolutionService.cs b/src/api/MicCheck.Api/Identities/IdentityResolutionService.cs old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/Identities/IdentityResponse.cs b/src/api/MicCheck.Api/Identities/IdentityResponse.cs old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/Identities/IdentityTrait.cs b/src/api/MicCheck.Api/Identities/IdentityTrait.cs old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/Identities/TraitInput.cs b/src/api/MicCheck.Api/Identities/TraitInput.cs old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/Identities/TraitResponse.cs b/src/api/MicCheck.Api/Identities/TraitResponse.cs old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/Identities/UpsertTraitRequest.cs b/src/api/MicCheck.Api/Identities/UpsertTraitRequest.cs old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/MicCheck.Api.csproj b/src/api/MicCheck.Api/MicCheck.Api.csproj old mode 100644 new mode 100755 index 9c73cf9..b8e72e0 --- a/src/api/MicCheck.Api/MicCheck.Api.csproj +++ b/src/api/MicCheck.Api/MicCheck.Api.csproj @@ -1,30 +1,30 @@ - - - - net10.0 - enable - enable - latest - true - - - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - - - - - - - + + + + net10.0 + enable + enable + latest + true + + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + + + + + diff --git a/src/api/MicCheck.Api/Migrations/20260408214714_InitialCreate.Designer.cs b/src/api/MicCheck.Api/Migrations/20260408214714_InitialCreate.Designer.cs old mode 100644 new mode 100755 index 2a620f1..f4d7a24 --- a/src/api/MicCheck.Api/Migrations/20260408214714_InitialCreate.Designer.cs +++ b/src/api/MicCheck.Api/Migrations/20260408214714_InitialCreate.Designer.cs @@ -1,895 +1,895 @@ -// -using System; -using MicCheck.Api.Data; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; - -#nullable disable - -namespace MicCheck.Api.Migrations -{ - [DbContext(typeof(MicCheckDbContext))] - [Migration("20260408214714_InitialCreate")] - partial class InitialCreate - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "10.0.5") - .HasAnnotation("Relational:MaxIdentifierLength", 63); - - NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); - - modelBuilder.Entity("MicCheck.Api.Common.Security.ApiKeys.ApiKey", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CreatedAt") - .HasColumnType("timestamp with time zone"); - - b.Property("ExpiresAt") - .HasColumnType("timestamp with time zone"); - - b.Property("IsActive") - .HasColumnType("boolean"); - - b.Property("Key") - .IsRequired() - .HasMaxLength(512) - .HasColumnType("character varying(512)"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(200) - .HasColumnType("character varying(200)"); - - b.Property("OrganizationId") - .HasColumnType("integer"); - - b.Property("Prefix") - .IsRequired() - .HasMaxLength(8) - .HasColumnType("character varying(8)"); - - b.HasKey("Id"); - - b.HasIndex("Key") - .IsUnique(); - - b.HasIndex("OrganizationId"); - - b.ToTable("ApiKeys"); - }); - - modelBuilder.Entity("MicCheck.Api.Audit.AuditLog", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("Action") - .IsRequired() - .HasMaxLength(50) - .HasColumnType("character varying(50)"); - - b.Property("ActorUserId") - .HasColumnType("integer"); - - b.Property("Changes") - .HasColumnType("text"); - - b.Property("CreatedAt") - .HasColumnType("timestamp with time zone"); - - b.Property("EnvironmentId") - .HasColumnType("integer"); - - b.Property("OrganizationId") - .HasColumnType("integer"); - - b.Property("ProjectId") - .HasColumnType("integer"); - - b.Property("ResourceId") - .IsRequired() - .HasMaxLength(100) - .HasColumnType("character varying(100)"); - - b.Property("ResourceType") - .IsRequired() - .HasMaxLength(100) - .HasColumnType("character varying(100)"); - - b.HasKey("Id"); - - b.HasIndex("OrganizationId", "CreatedAt"); - - b.ToTable("AuditLogs"); - }); - - modelBuilder.Entity("MicCheck.Api.Common.Security.Authorization.UserProjectPermission", b => - { - b.Property("UserId") - .HasColumnType("integer"); - - b.Property("ProjectId") - .HasColumnType("integer"); - - b.Property("IsAdmin") - .HasColumnType("boolean"); - - b.Property("Permissions") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("UserId", "ProjectId"); - - b.ToTable("UserProjectPermissions"); - }); - - modelBuilder.Entity("MicCheck.Api.Environments.Environment", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("ApiKey") - .IsRequired() - .HasMaxLength(100) - .HasColumnType("character varying(100)"); - - b.Property("CreatedAt") - .HasColumnType("timestamp with time zone"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(200) - .HasColumnType("character varying(200)"); - - b.Property("ProjectId") - .HasColumnType("integer"); - - b.HasKey("Id"); - - b.HasIndex("ApiKey") - .IsUnique(); - - b.HasIndex("ProjectId"); - - b.ToTable("Environments"); - }); - - modelBuilder.Entity("MicCheck.Api.Features.Feature", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CreatedAt") - .HasColumnType("timestamp with time zone"); - - b.Property("DefaultEnabled") - .HasColumnType("boolean"); - - b.Property("Description") - .HasMaxLength(2000) - .HasColumnType("character varying(2000)"); - - b.Property("InitialValue") - .HasMaxLength(20000) - .HasColumnType("character varying(20000)"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(150) - .HasColumnType("character varying(150)"); - - b.Property("ProjectId") - .HasColumnType("integer"); - - b.Property("Type") - .HasColumnType("integer"); - - b.HasKey("Id"); - - b.HasIndex("ProjectId", "Name") - .IsUnique(); - - b.ToTable("Features"); - }); - - modelBuilder.Entity("MicCheck.Api.Features.FeatureSegment", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("EnvironmentId") - .HasColumnType("integer"); - - b.Property("FeatureId") - .HasColumnType("integer"); - - b.Property("Priority") - .HasColumnType("integer"); - - b.Property("SegmentId") - .HasColumnType("integer"); - - b.HasKey("Id"); - - b.ToTable("FeatureSegments"); - }); - - modelBuilder.Entity("MicCheck.Api.Features.FeatureState", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CreatedAt") - .HasColumnType("timestamp with time zone"); - - b.Property("Enabled") - .HasColumnType("boolean"); - - b.Property("EnvironmentId") - .HasColumnType("integer"); - - b.Property("FeatureId") - .HasColumnType("integer"); - - b.Property("FeatureSegmentId") - .HasColumnType("integer"); - - b.Property("IdentityId") - .HasColumnType("integer"); - - b.Property("UpdatedAt") - .HasColumnType("timestamp with time zone"); - - b.Property("Value") - .HasMaxLength(20000) - .HasColumnType("character varying(20000)"); - - b.Property("Version") - .IsConcurrencyToken() - .HasColumnType("integer"); - - b.HasKey("Id"); - - b.HasIndex("EnvironmentId"); - - b.HasIndex("FeatureSegmentId") - .IsUnique(); - - b.HasIndex("IdentityId"); - - b.HasIndex("FeatureId", "EnvironmentId", "IdentityId") - .IsUnique(); - - b.ToTable("FeatureStates"); - }); - - modelBuilder.Entity("MicCheck.Api.Features.Tag", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("Color") - .IsRequired() - .HasMaxLength(20) - .HasColumnType("character varying(20)"); - - b.Property("Label") - .IsRequired() - .HasMaxLength(200) - .HasColumnType("character varying(200)"); - - b.Property("ProjectId") - .HasColumnType("integer"); - - b.HasKey("Id"); - - b.HasIndex("ProjectId"); - - b.ToTable("Tags"); - }); - - modelBuilder.Entity("MicCheck.Api.Identities.Identity", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CreatedAt") - .HasColumnType("timestamp with time zone"); - - b.Property("EnvironmentId") - .HasColumnType("integer"); - - b.Property("Identifier") - .IsRequired() - .HasMaxLength(2000) - .HasColumnType("character varying(2000)"); - - b.HasKey("Id"); - - b.HasIndex("EnvironmentId", "Identifier") - .IsUnique(); - - b.ToTable("Identities"); - }); - - modelBuilder.Entity("MicCheck.Api.Identities.IdentityTrait", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("IdentityId") - .HasColumnType("integer"); - - b.Property("Key") - .IsRequired() - .HasMaxLength(200) - .HasColumnType("character varying(200)"); - - b.Property("Value") - .IsRequired() - .HasMaxLength(2000) - .HasColumnType("character varying(2000)"); - - b.Property("ValueType") - .HasColumnType("integer"); - - b.HasKey("Id"); - - b.HasIndex("IdentityId", "Key") - .IsUnique(); - - b.ToTable("IdentityTraits"); - }); - - modelBuilder.Entity("MicCheck.Api.Organizations.Organization", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CreatedAt") - .HasColumnType("timestamp with time zone"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(200) - .HasColumnType("character varying(200)"); - - b.HasKey("Id"); - - b.ToTable("Organizations"); - }); - - modelBuilder.Entity("MicCheck.Api.Organizations.OrganizationUser", b => - { - b.Property("OrganizationId") - .HasColumnType("integer"); - - b.Property("UserId") - .HasColumnType("integer"); - - b.Property("Role") - .HasColumnType("integer"); - - b.HasKey("OrganizationId", "UserId"); - - b.HasIndex("UserId"); - - b.ToTable("OrganizationUsers"); - }); - - modelBuilder.Entity("MicCheck.Api.Projects.Project", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CreatedAt") - .HasColumnType("timestamp with time zone"); - - b.Property("HideDisabledFlags") - .HasColumnType("boolean"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(200) - .HasColumnType("character varying(200)"); - - b.Property("OrganizationId") - .HasColumnType("integer"); - - b.HasKey("Id"); - - b.HasIndex("OrganizationId"); - - b.ToTable("Projects"); - }); - - modelBuilder.Entity("MicCheck.Api.Segments.Segment", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CreatedAt") - .HasColumnType("timestamp with time zone"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(200) - .HasColumnType("character varying(200)"); - - b.Property("ProjectId") - .HasColumnType("integer"); - - b.HasKey("Id"); - - b.HasIndex("ProjectId"); - - b.ToTable("Segments"); - }); - - modelBuilder.Entity("MicCheck.Api.Segments.SegmentCondition", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("Operator") - .HasColumnType("integer"); - - b.Property("Property") - .IsRequired() - .HasMaxLength(200) - .HasColumnType("character varying(200)"); - - b.Property("RuleId") - .HasColumnType("integer"); - - b.Property("Value") - .IsRequired() - .HasMaxLength(1000) - .HasColumnType("character varying(1000)"); - - b.HasKey("Id"); - - b.HasIndex("RuleId"); - - b.ToTable("SegmentConditions"); - }); - - modelBuilder.Entity("MicCheck.Api.Segments.SegmentRule", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("ParentRuleId") - .HasColumnType("integer"); - - b.Property("SegmentId") - .HasColumnType("integer"); - - b.Property("Type") - .HasColumnType("integer"); - - b.HasKey("Id"); - - b.HasIndex("ParentRuleId"); - - b.HasIndex("SegmentId"); - - b.ToTable("SegmentRules"); - }); - - modelBuilder.Entity("MicCheck.Api.Users.RefreshToken", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CreatedAt") - .HasColumnType("timestamp with time zone"); - - b.Property("ExpiresAt") - .HasColumnType("timestamp with time zone"); - - b.Property("IsRevoked") - .HasColumnType("boolean"); - - b.Property("Token") - .IsRequired() - .HasMaxLength(512) - .HasColumnType("character varying(512)"); - - b.Property("UserId") - .HasColumnType("integer"); - - b.HasKey("Id"); - - b.HasIndex("Token") - .IsUnique(); - - b.HasIndex("UserId"); - - b.ToTable("RefreshTokens"); - }); - - modelBuilder.Entity("MicCheck.Api.Users.User", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CreatedAt") - .HasColumnType("timestamp with time zone"); - - b.Property("Email") - .IsRequired() - .HasMaxLength(500) - .HasColumnType("character varying(500)"); - - b.Property("FirstName") - .IsRequired() - .HasMaxLength(200) - .HasColumnType("character varying(200)"); - - b.Property("IsActive") - .HasColumnType("boolean"); - - b.Property("IsTwoFactorEnabled") - .HasColumnType("boolean"); - - b.Property("LastLoginAt") - .HasColumnType("timestamp with time zone"); - - b.Property("LastName") - .IsRequired() - .HasMaxLength(200) - .HasColumnType("character varying(200)"); - - b.Property("PasswordHash") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("Id"); - - b.HasIndex("Email") - .IsUnique(); - - b.ToTable("Users"); - }); - - modelBuilder.Entity("MicCheck.Api.Webhooks.Webhook", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CreatedAt") - .HasColumnType("timestamp with time zone"); - - b.Property("Enabled") - .HasColumnType("boolean"); - - b.Property("EnvironmentId") - .HasColumnType("integer"); - - b.Property("OrganizationId") - .HasColumnType("integer"); - - b.Property("Scope") - .HasColumnType("integer"); - - b.Property("Secret") - .HasMaxLength(200) - .HasColumnType("character varying(200)"); - - b.Property("Url") - .IsRequired() - .HasMaxLength(500) - .HasColumnType("character varying(500)"); - - b.HasKey("Id"); - - b.HasIndex("EnvironmentId"); - - b.ToTable("Webhooks"); - }); - - modelBuilder.Entity("MicCheck.Api.Webhooks.WebhookDeliveryLog", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("AttemptedAt") - .HasColumnType("timestamp with time zone"); - - b.Property("Duration") - .HasColumnType("interval"); - - b.Property("ErrorMessage") - .HasColumnType("text"); - - b.Property("EventType") - .IsRequired() - .HasMaxLength(100) - .HasColumnType("character varying(100)"); - - b.Property("PayloadJson") - .IsRequired() - .HasColumnType("text"); - - b.Property("ResponseBody") - .HasColumnType("text"); - - b.Property("ResponseStatusCode") - .HasColumnType("integer"); - - b.Property("Success") - .HasColumnType("boolean"); - - b.Property("WebhookId") - .HasColumnType("integer"); - - b.HasKey("Id"); - - b.HasIndex("WebhookId"); - - b.ToTable("WebhookDeliveryLogs"); - }); - - modelBuilder.Entity("MicCheck.Api.Common.Security.ApiKeys.ApiKey", b => - { - b.HasOne("MicCheck.Api.Organizations.Organization", null) - .WithMany("ApiKeys") - .HasForeignKey("OrganizationId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("MicCheck.Api.Environments.Environment", b => - { - b.HasOne("MicCheck.Api.Projects.Project", null) - .WithMany("Environments") - .HasForeignKey("ProjectId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("MicCheck.Api.Features.Feature", b => - { - b.HasOne("MicCheck.Api.Projects.Project", null) - .WithMany("Features") - .HasForeignKey("ProjectId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("MicCheck.Api.Features.FeatureState", b => - { - b.HasOne("MicCheck.Api.Environments.Environment", null) - .WithMany("FeatureStates") - .HasForeignKey("EnvironmentId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MicCheck.Api.Features.Feature", null) - .WithMany("FeatureStates") - .HasForeignKey("FeatureId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MicCheck.Api.Features.FeatureSegment", null) - .WithOne("FeatureState") - .HasForeignKey("MicCheck.Api.Features.FeatureState", "FeatureSegmentId") - .OnDelete(DeleteBehavior.SetNull); - - b.HasOne("MicCheck.Api.Identities.Identity", null) - .WithMany("FeatureStateOverrides") - .HasForeignKey("IdentityId") - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity("MicCheck.Api.Features.Tag", b => - { - b.HasOne("MicCheck.Api.Features.Feature", null) - .WithMany("Tags") - .HasForeignKey("ProjectId") - .OnDelete(DeleteBehavior.NoAction) - .IsRequired(); - }); - - modelBuilder.Entity("MicCheck.Api.Identities.IdentityTrait", b => - { - b.HasOne("MicCheck.Api.Identities.Identity", null) - .WithMany("Traits") - .HasForeignKey("IdentityId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("MicCheck.Api.Organizations.OrganizationUser", b => - { - b.HasOne("MicCheck.Api.Organizations.Organization", null) - .WithMany("Members") - .HasForeignKey("OrganizationId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MicCheck.Api.Users.User", null) - .WithMany("Organizations") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("MicCheck.Api.Projects.Project", b => - { - b.HasOne("MicCheck.Api.Organizations.Organization", null) - .WithMany("Projects") - .HasForeignKey("OrganizationId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("MicCheck.Api.Segments.Segment", b => - { - b.HasOne("MicCheck.Api.Projects.Project", null) - .WithMany("Segments") - .HasForeignKey("ProjectId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("MicCheck.Api.Segments.SegmentCondition", b => - { - b.HasOne("MicCheck.Api.Segments.SegmentRule", null) - .WithMany("Conditions") - .HasForeignKey("RuleId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("MicCheck.Api.Segments.SegmentRule", b => - { - b.HasOne("MicCheck.Api.Segments.SegmentRule", null) - .WithMany("ChildRules") - .HasForeignKey("ParentRuleId") - .OnDelete(DeleteBehavior.NoAction); - - b.HasOne("MicCheck.Api.Segments.Segment", null) - .WithMany("Rules") - .HasForeignKey("SegmentId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("MicCheck.Api.Users.RefreshToken", b => - { - b.HasOne("MicCheck.Api.Users.User", "User") - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MicCheck.Api.Environments.Environment", b => - { - b.Navigation("FeatureStates"); - }); - - modelBuilder.Entity("MicCheck.Api.Features.Feature", b => - { - b.Navigation("FeatureStates"); - - b.Navigation("Tags"); - }); - - modelBuilder.Entity("MicCheck.Api.Features.FeatureSegment", b => - { - b.Navigation("FeatureState"); - }); - - modelBuilder.Entity("MicCheck.Api.Identities.Identity", b => - { - b.Navigation("FeatureStateOverrides"); - - b.Navigation("Traits"); - }); - - modelBuilder.Entity("MicCheck.Api.Organizations.Organization", b => - { - b.Navigation("ApiKeys"); - - b.Navigation("Members"); - - b.Navigation("Projects"); - }); - - modelBuilder.Entity("MicCheck.Api.Projects.Project", b => - { - b.Navigation("Environments"); - - b.Navigation("Features"); - - b.Navigation("Segments"); - }); - - modelBuilder.Entity("MicCheck.Api.Segments.Segment", b => - { - b.Navigation("Rules"); - }); - - modelBuilder.Entity("MicCheck.Api.Segments.SegmentRule", b => - { - b.Navigation("ChildRules"); - - b.Navigation("Conditions"); - }); - - modelBuilder.Entity("MicCheck.Api.Users.User", b => - { - b.Navigation("Organizations"); - }); -#pragma warning restore 612, 618 - } - } -} +// +using System; +using MicCheck.Api.Data; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace MicCheck.Api.Migrations +{ + [DbContext(typeof(MicCheckDbContext))] + [Migration("20260408214714_InitialCreate")] + partial class InitialCreate + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "10.0.5") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("MicCheck.Api.Common.Security.ApiKeys.ApiKey", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("ExpiresAt") + .HasColumnType("timestamp with time zone"); + + b.Property("IsActive") + .HasColumnType("boolean"); + + b.Property("Key") + .IsRequired() + .HasMaxLength(512) + .HasColumnType("character varying(512)"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("OrganizationId") + .HasColumnType("integer"); + + b.Property("Prefix") + .IsRequired() + .HasMaxLength(8) + .HasColumnType("character varying(8)"); + + b.HasKey("Id"); + + b.HasIndex("Key") + .IsUnique(); + + b.HasIndex("OrganizationId"); + + b.ToTable("ApiKeys"); + }); + + modelBuilder.Entity("MicCheck.Api.Audit.AuditLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Action") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("character varying(50)"); + + b.Property("ActorUserId") + .HasColumnType("integer"); + + b.Property("Changes") + .HasColumnType("text"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("EnvironmentId") + .HasColumnType("integer"); + + b.Property("OrganizationId") + .HasColumnType("integer"); + + b.Property("ProjectId") + .HasColumnType("integer"); + + b.Property("ResourceId") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("ResourceType") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.HasKey("Id"); + + b.HasIndex("OrganizationId", "CreatedAt"); + + b.ToTable("AuditLogs"); + }); + + modelBuilder.Entity("MicCheck.Api.Common.Security.Authorization.UserProjectPermission", b => + { + b.Property("UserId") + .HasColumnType("integer"); + + b.Property("ProjectId") + .HasColumnType("integer"); + + b.Property("IsAdmin") + .HasColumnType("boolean"); + + b.Property("Permissions") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("UserId", "ProjectId"); + + b.ToTable("UserProjectPermissions"); + }); + + modelBuilder.Entity("MicCheck.Api.Environments.Environment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ApiKey") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("ProjectId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("ApiKey") + .IsUnique(); + + b.HasIndex("ProjectId"); + + b.ToTable("Environments"); + }); + + modelBuilder.Entity("MicCheck.Api.Features.Feature", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("DefaultEnabled") + .HasColumnType("boolean"); + + b.Property("Description") + .HasMaxLength(2000) + .HasColumnType("character varying(2000)"); + + b.Property("InitialValue") + .HasMaxLength(20000) + .HasColumnType("character varying(20000)"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(150) + .HasColumnType("character varying(150)"); + + b.Property("ProjectId") + .HasColumnType("integer"); + + b.Property("Type") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("ProjectId", "Name") + .IsUnique(); + + b.ToTable("Features"); + }); + + modelBuilder.Entity("MicCheck.Api.Features.FeatureSegment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("EnvironmentId") + .HasColumnType("integer"); + + b.Property("FeatureId") + .HasColumnType("integer"); + + b.Property("Priority") + .HasColumnType("integer"); + + b.Property("SegmentId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.ToTable("FeatureSegments"); + }); + + modelBuilder.Entity("MicCheck.Api.Features.FeatureState", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Enabled") + .HasColumnType("boolean"); + + b.Property("EnvironmentId") + .HasColumnType("integer"); + + b.Property("FeatureId") + .HasColumnType("integer"); + + b.Property("FeatureSegmentId") + .HasColumnType("integer"); + + b.Property("IdentityId") + .HasColumnType("integer"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Value") + .HasMaxLength(20000) + .HasColumnType("character varying(20000)"); + + b.Property("Version") + .IsConcurrencyToken() + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("EnvironmentId"); + + b.HasIndex("FeatureSegmentId") + .IsUnique(); + + b.HasIndex("IdentityId"); + + b.HasIndex("FeatureId", "EnvironmentId", "IdentityId") + .IsUnique(); + + b.ToTable("FeatureStates"); + }); + + modelBuilder.Entity("MicCheck.Api.Features.Tag", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Color") + .IsRequired() + .HasMaxLength(20) + .HasColumnType("character varying(20)"); + + b.Property("Label") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("ProjectId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("ProjectId"); + + b.ToTable("Tags"); + }); + + modelBuilder.Entity("MicCheck.Api.Identities.Identity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("EnvironmentId") + .HasColumnType("integer"); + + b.Property("Identifier") + .IsRequired() + .HasMaxLength(2000) + .HasColumnType("character varying(2000)"); + + b.HasKey("Id"); + + b.HasIndex("EnvironmentId", "Identifier") + .IsUnique(); + + b.ToTable("Identities"); + }); + + modelBuilder.Entity("MicCheck.Api.Identities.IdentityTrait", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("IdentityId") + .HasColumnType("integer"); + + b.Property("Key") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("Value") + .IsRequired() + .HasMaxLength(2000) + .HasColumnType("character varying(2000)"); + + b.Property("ValueType") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("IdentityId", "Key") + .IsUnique(); + + b.ToTable("IdentityTraits"); + }); + + modelBuilder.Entity("MicCheck.Api.Organizations.Organization", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.HasKey("Id"); + + b.ToTable("Organizations"); + }); + + modelBuilder.Entity("MicCheck.Api.Organizations.OrganizationUser", b => + { + b.Property("OrganizationId") + .HasColumnType("integer"); + + b.Property("UserId") + .HasColumnType("integer"); + + b.Property("Role") + .HasColumnType("integer"); + + b.HasKey("OrganizationId", "UserId"); + + b.HasIndex("UserId"); + + b.ToTable("OrganizationUsers"); + }); + + modelBuilder.Entity("MicCheck.Api.Projects.Project", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("HideDisabledFlags") + .HasColumnType("boolean"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("OrganizationId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("OrganizationId"); + + b.ToTable("Projects"); + }); + + modelBuilder.Entity("MicCheck.Api.Segments.Segment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("ProjectId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("ProjectId"); + + b.ToTable("Segments"); + }); + + modelBuilder.Entity("MicCheck.Api.Segments.SegmentCondition", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Operator") + .HasColumnType("integer"); + + b.Property("Property") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("RuleId") + .HasColumnType("integer"); + + b.Property("Value") + .IsRequired() + .HasMaxLength(1000) + .HasColumnType("character varying(1000)"); + + b.HasKey("Id"); + + b.HasIndex("RuleId"); + + b.ToTable("SegmentConditions"); + }); + + modelBuilder.Entity("MicCheck.Api.Segments.SegmentRule", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ParentRuleId") + .HasColumnType("integer"); + + b.Property("SegmentId") + .HasColumnType("integer"); + + b.Property("Type") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("ParentRuleId"); + + b.HasIndex("SegmentId"); + + b.ToTable("SegmentRules"); + }); + + modelBuilder.Entity("MicCheck.Api.Users.RefreshToken", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("ExpiresAt") + .HasColumnType("timestamp with time zone"); + + b.Property("IsRevoked") + .HasColumnType("boolean"); + + b.Property("Token") + .IsRequired() + .HasMaxLength(512) + .HasColumnType("character varying(512)"); + + b.Property("UserId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("Token") + .IsUnique(); + + b.HasIndex("UserId"); + + b.ToTable("RefreshTokens"); + }); + + modelBuilder.Entity("MicCheck.Api.Users.User", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Email") + .IsRequired() + .HasMaxLength(500) + .HasColumnType("character varying(500)"); + + b.Property("FirstName") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("IsActive") + .HasColumnType("boolean"); + + b.Property("IsTwoFactorEnabled") + .HasColumnType("boolean"); + + b.Property("LastLoginAt") + .HasColumnType("timestamp with time zone"); + + b.Property("LastName") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("PasswordHash") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("Email") + .IsUnique(); + + b.ToTable("Users"); + }); + + modelBuilder.Entity("MicCheck.Api.Webhooks.Webhook", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Enabled") + .HasColumnType("boolean"); + + b.Property("EnvironmentId") + .HasColumnType("integer"); + + b.Property("OrganizationId") + .HasColumnType("integer"); + + b.Property("Scope") + .HasColumnType("integer"); + + b.Property("Secret") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("Url") + .IsRequired() + .HasMaxLength(500) + .HasColumnType("character varying(500)"); + + b.HasKey("Id"); + + b.HasIndex("EnvironmentId"); + + b.ToTable("Webhooks"); + }); + + modelBuilder.Entity("MicCheck.Api.Webhooks.WebhookDeliveryLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AttemptedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Duration") + .HasColumnType("interval"); + + b.Property("ErrorMessage") + .HasColumnType("text"); + + b.Property("EventType") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("PayloadJson") + .IsRequired() + .HasColumnType("text"); + + b.Property("ResponseBody") + .HasColumnType("text"); + + b.Property("ResponseStatusCode") + .HasColumnType("integer"); + + b.Property("Success") + .HasColumnType("boolean"); + + b.Property("WebhookId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("WebhookId"); + + b.ToTable("WebhookDeliveryLogs"); + }); + + modelBuilder.Entity("MicCheck.Api.Common.Security.ApiKeys.ApiKey", b => + { + b.HasOne("MicCheck.Api.Organizations.Organization", null) + .WithMany("ApiKeys") + .HasForeignKey("OrganizationId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("MicCheck.Api.Environments.Environment", b => + { + b.HasOne("MicCheck.Api.Projects.Project", null) + .WithMany("Environments") + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("MicCheck.Api.Features.Feature", b => + { + b.HasOne("MicCheck.Api.Projects.Project", null) + .WithMany("Features") + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("MicCheck.Api.Features.FeatureState", b => + { + b.HasOne("MicCheck.Api.Environments.Environment", null) + .WithMany("FeatureStates") + .HasForeignKey("EnvironmentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("MicCheck.Api.Features.Feature", null) + .WithMany("FeatureStates") + .HasForeignKey("FeatureId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("MicCheck.Api.Features.FeatureSegment", null) + .WithOne("FeatureState") + .HasForeignKey("MicCheck.Api.Features.FeatureState", "FeatureSegmentId") + .OnDelete(DeleteBehavior.SetNull); + + b.HasOne("MicCheck.Api.Identities.Identity", null) + .WithMany("FeatureStateOverrides") + .HasForeignKey("IdentityId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("MicCheck.Api.Features.Tag", b => + { + b.HasOne("MicCheck.Api.Features.Feature", null) + .WithMany("Tags") + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.NoAction) + .IsRequired(); + }); + + modelBuilder.Entity("MicCheck.Api.Identities.IdentityTrait", b => + { + b.HasOne("MicCheck.Api.Identities.Identity", null) + .WithMany("Traits") + .HasForeignKey("IdentityId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("MicCheck.Api.Organizations.OrganizationUser", b => + { + b.HasOne("MicCheck.Api.Organizations.Organization", null) + .WithMany("Members") + .HasForeignKey("OrganizationId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("MicCheck.Api.Users.User", null) + .WithMany("Organizations") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("MicCheck.Api.Projects.Project", b => + { + b.HasOne("MicCheck.Api.Organizations.Organization", null) + .WithMany("Projects") + .HasForeignKey("OrganizationId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("MicCheck.Api.Segments.Segment", b => + { + b.HasOne("MicCheck.Api.Projects.Project", null) + .WithMany("Segments") + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("MicCheck.Api.Segments.SegmentCondition", b => + { + b.HasOne("MicCheck.Api.Segments.SegmentRule", null) + .WithMany("Conditions") + .HasForeignKey("RuleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("MicCheck.Api.Segments.SegmentRule", b => + { + b.HasOne("MicCheck.Api.Segments.SegmentRule", null) + .WithMany("ChildRules") + .HasForeignKey("ParentRuleId") + .OnDelete(DeleteBehavior.NoAction); + + b.HasOne("MicCheck.Api.Segments.Segment", null) + .WithMany("Rules") + .HasForeignKey("SegmentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("MicCheck.Api.Users.RefreshToken", b => + { + b.HasOne("MicCheck.Api.Users.User", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("MicCheck.Api.Environments.Environment", b => + { + b.Navigation("FeatureStates"); + }); + + modelBuilder.Entity("MicCheck.Api.Features.Feature", b => + { + b.Navigation("FeatureStates"); + + b.Navigation("Tags"); + }); + + modelBuilder.Entity("MicCheck.Api.Features.FeatureSegment", b => + { + b.Navigation("FeatureState"); + }); + + modelBuilder.Entity("MicCheck.Api.Identities.Identity", b => + { + b.Navigation("FeatureStateOverrides"); + + b.Navigation("Traits"); + }); + + modelBuilder.Entity("MicCheck.Api.Organizations.Organization", b => + { + b.Navigation("ApiKeys"); + + b.Navigation("Members"); + + b.Navigation("Projects"); + }); + + modelBuilder.Entity("MicCheck.Api.Projects.Project", b => + { + b.Navigation("Environments"); + + b.Navigation("Features"); + + b.Navigation("Segments"); + }); + + modelBuilder.Entity("MicCheck.Api.Segments.Segment", b => + { + b.Navigation("Rules"); + }); + + modelBuilder.Entity("MicCheck.Api.Segments.SegmentRule", b => + { + b.Navigation("ChildRules"); + + b.Navigation("Conditions"); + }); + + modelBuilder.Entity("MicCheck.Api.Users.User", b => + { + b.Navigation("Organizations"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/src/api/MicCheck.Api/Migrations/20260408214714_InitialCreate.cs b/src/api/MicCheck.Api/Migrations/20260408214714_InitialCreate.cs old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/Migrations/20260410175950_AddWebhookDeliveryAttemptNumber.Designer.cs b/src/api/MicCheck.Api/Migrations/20260410175950_AddWebhookDeliveryAttemptNumber.Designer.cs old mode 100644 new mode 100755 index 3e976cc..e7dc7fa --- a/src/api/MicCheck.Api/Migrations/20260410175950_AddWebhookDeliveryAttemptNumber.Designer.cs +++ b/src/api/MicCheck.Api/Migrations/20260410175950_AddWebhookDeliveryAttemptNumber.Designer.cs @@ -1,898 +1,898 @@ -// -using System; -using MicCheck.Api.Data; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; - -#nullable disable - -namespace MicCheck.Api.Migrations -{ - [DbContext(typeof(MicCheckDbContext))] - [Migration("20260410175950_AddWebhookDeliveryAttemptNumber")] - partial class AddWebhookDeliveryAttemptNumber - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "10.0.5") - .HasAnnotation("Relational:MaxIdentifierLength", 63); - - NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); - - modelBuilder.Entity("MicCheck.Api.Common.Security.ApiKeys.ApiKey", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CreatedAt") - .HasColumnType("timestamp with time zone"); - - b.Property("ExpiresAt") - .HasColumnType("timestamp with time zone"); - - b.Property("IsActive") - .HasColumnType("boolean"); - - b.Property("Key") - .IsRequired() - .HasMaxLength(512) - .HasColumnType("character varying(512)"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(200) - .HasColumnType("character varying(200)"); - - b.Property("OrganizationId") - .HasColumnType("integer"); - - b.Property("Prefix") - .IsRequired() - .HasMaxLength(8) - .HasColumnType("character varying(8)"); - - b.HasKey("Id"); - - b.HasIndex("Key") - .IsUnique(); - - b.HasIndex("OrganizationId"); - - b.ToTable("ApiKeys"); - }); - - modelBuilder.Entity("MicCheck.Api.Audit.AuditLog", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("Action") - .IsRequired() - .HasMaxLength(50) - .HasColumnType("character varying(50)"); - - b.Property("ActorUserId") - .HasColumnType("integer"); - - b.Property("Changes") - .HasColumnType("text"); - - b.Property("CreatedAt") - .HasColumnType("timestamp with time zone"); - - b.Property("EnvironmentId") - .HasColumnType("integer"); - - b.Property("OrganizationId") - .HasColumnType("integer"); - - b.Property("ProjectId") - .HasColumnType("integer"); - - b.Property("ResourceId") - .IsRequired() - .HasMaxLength(100) - .HasColumnType("character varying(100)"); - - b.Property("ResourceType") - .IsRequired() - .HasMaxLength(100) - .HasColumnType("character varying(100)"); - - b.HasKey("Id"); - - b.HasIndex("OrganizationId", "CreatedAt"); - - b.ToTable("AuditLogs"); - }); - - modelBuilder.Entity("MicCheck.Api.Common.Security.Authorization.UserProjectPermission", b => - { - b.Property("UserId") - .HasColumnType("integer"); - - b.Property("ProjectId") - .HasColumnType("integer"); - - b.Property("IsAdmin") - .HasColumnType("boolean"); - - b.Property("Permissions") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("UserId", "ProjectId"); - - b.ToTable("UserProjectPermissions"); - }); - - modelBuilder.Entity("MicCheck.Api.Environments.Environment", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("ApiKey") - .IsRequired() - .HasMaxLength(100) - .HasColumnType("character varying(100)"); - - b.Property("CreatedAt") - .HasColumnType("timestamp with time zone"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(200) - .HasColumnType("character varying(200)"); - - b.Property("ProjectId") - .HasColumnType("integer"); - - b.HasKey("Id"); - - b.HasIndex("ApiKey") - .IsUnique(); - - b.HasIndex("ProjectId"); - - b.ToTable("Environments"); - }); - - modelBuilder.Entity("MicCheck.Api.Features.Feature", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CreatedAt") - .HasColumnType("timestamp with time zone"); - - b.Property("DefaultEnabled") - .HasColumnType("boolean"); - - b.Property("Description") - .HasMaxLength(2000) - .HasColumnType("character varying(2000)"); - - b.Property("InitialValue") - .HasMaxLength(20000) - .HasColumnType("character varying(20000)"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(150) - .HasColumnType("character varying(150)"); - - b.Property("ProjectId") - .HasColumnType("integer"); - - b.Property("Type") - .HasColumnType("integer"); - - b.HasKey("Id"); - - b.HasIndex("ProjectId", "Name") - .IsUnique(); - - b.ToTable("Features"); - }); - - modelBuilder.Entity("MicCheck.Api.Features.FeatureSegment", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("EnvironmentId") - .HasColumnType("integer"); - - b.Property("FeatureId") - .HasColumnType("integer"); - - b.Property("Priority") - .HasColumnType("integer"); - - b.Property("SegmentId") - .HasColumnType("integer"); - - b.HasKey("Id"); - - b.ToTable("FeatureSegments"); - }); - - modelBuilder.Entity("MicCheck.Api.Features.FeatureState", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CreatedAt") - .HasColumnType("timestamp with time zone"); - - b.Property("Enabled") - .HasColumnType("boolean"); - - b.Property("EnvironmentId") - .HasColumnType("integer"); - - b.Property("FeatureId") - .HasColumnType("integer"); - - b.Property("FeatureSegmentId") - .HasColumnType("integer"); - - b.Property("IdentityId") - .HasColumnType("integer"); - - b.Property("UpdatedAt") - .HasColumnType("timestamp with time zone"); - - b.Property("Value") - .HasMaxLength(20000) - .HasColumnType("character varying(20000)"); - - b.Property("Version") - .IsConcurrencyToken() - .HasColumnType("integer"); - - b.HasKey("Id"); - - b.HasIndex("EnvironmentId"); - - b.HasIndex("FeatureSegmentId") - .IsUnique(); - - b.HasIndex("IdentityId"); - - b.HasIndex("FeatureId", "EnvironmentId", "IdentityId") - .IsUnique(); - - b.ToTable("FeatureStates"); - }); - - modelBuilder.Entity("MicCheck.Api.Features.Tag", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("Color") - .IsRequired() - .HasMaxLength(20) - .HasColumnType("character varying(20)"); - - b.Property("Label") - .IsRequired() - .HasMaxLength(200) - .HasColumnType("character varying(200)"); - - b.Property("ProjectId") - .HasColumnType("integer"); - - b.HasKey("Id"); - - b.HasIndex("ProjectId"); - - b.ToTable("Tags"); - }); - - modelBuilder.Entity("MicCheck.Api.Identities.Identity", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CreatedAt") - .HasColumnType("timestamp with time zone"); - - b.Property("EnvironmentId") - .HasColumnType("integer"); - - b.Property("Identifier") - .IsRequired() - .HasMaxLength(2000) - .HasColumnType("character varying(2000)"); - - b.HasKey("Id"); - - b.HasIndex("EnvironmentId", "Identifier") - .IsUnique(); - - b.ToTable("Identities"); - }); - - modelBuilder.Entity("MicCheck.Api.Identities.IdentityTrait", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("IdentityId") - .HasColumnType("integer"); - - b.Property("Key") - .IsRequired() - .HasMaxLength(200) - .HasColumnType("character varying(200)"); - - b.Property("Value") - .IsRequired() - .HasMaxLength(2000) - .HasColumnType("character varying(2000)"); - - b.Property("ValueType") - .HasColumnType("integer"); - - b.HasKey("Id"); - - b.HasIndex("IdentityId", "Key") - .IsUnique(); - - b.ToTable("IdentityTraits"); - }); - - modelBuilder.Entity("MicCheck.Api.Organizations.Organization", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CreatedAt") - .HasColumnType("timestamp with time zone"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(200) - .HasColumnType("character varying(200)"); - - b.HasKey("Id"); - - b.ToTable("Organizations"); - }); - - modelBuilder.Entity("MicCheck.Api.Organizations.OrganizationUser", b => - { - b.Property("OrganizationId") - .HasColumnType("integer"); - - b.Property("UserId") - .HasColumnType("integer"); - - b.Property("Role") - .HasColumnType("integer"); - - b.HasKey("OrganizationId", "UserId"); - - b.HasIndex("UserId"); - - b.ToTable("OrganizationUsers"); - }); - - modelBuilder.Entity("MicCheck.Api.Projects.Project", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CreatedAt") - .HasColumnType("timestamp with time zone"); - - b.Property("HideDisabledFlags") - .HasColumnType("boolean"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(200) - .HasColumnType("character varying(200)"); - - b.Property("OrganizationId") - .HasColumnType("integer"); - - b.HasKey("Id"); - - b.HasIndex("OrganizationId"); - - b.ToTable("Projects"); - }); - - modelBuilder.Entity("MicCheck.Api.Segments.Segment", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CreatedAt") - .HasColumnType("timestamp with time zone"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(200) - .HasColumnType("character varying(200)"); - - b.Property("ProjectId") - .HasColumnType("integer"); - - b.HasKey("Id"); - - b.HasIndex("ProjectId"); - - b.ToTable("Segments"); - }); - - modelBuilder.Entity("MicCheck.Api.Segments.SegmentCondition", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("Operator") - .HasColumnType("integer"); - - b.Property("Property") - .IsRequired() - .HasMaxLength(200) - .HasColumnType("character varying(200)"); - - b.Property("RuleId") - .HasColumnType("integer"); - - b.Property("Value") - .IsRequired() - .HasMaxLength(1000) - .HasColumnType("character varying(1000)"); - - b.HasKey("Id"); - - b.HasIndex("RuleId"); - - b.ToTable("SegmentConditions"); - }); - - modelBuilder.Entity("MicCheck.Api.Segments.SegmentRule", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("ParentRuleId") - .HasColumnType("integer"); - - b.Property("SegmentId") - .HasColumnType("integer"); - - b.Property("Type") - .HasColumnType("integer"); - - b.HasKey("Id"); - - b.HasIndex("ParentRuleId"); - - b.HasIndex("SegmentId"); - - b.ToTable("SegmentRules"); - }); - - modelBuilder.Entity("MicCheck.Api.Users.RefreshToken", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CreatedAt") - .HasColumnType("timestamp with time zone"); - - b.Property("ExpiresAt") - .HasColumnType("timestamp with time zone"); - - b.Property("IsRevoked") - .HasColumnType("boolean"); - - b.Property("Token") - .IsRequired() - .HasMaxLength(512) - .HasColumnType("character varying(512)"); - - b.Property("UserId") - .HasColumnType("integer"); - - b.HasKey("Id"); - - b.HasIndex("Token") - .IsUnique(); - - b.HasIndex("UserId"); - - b.ToTable("RefreshTokens"); - }); - - modelBuilder.Entity("MicCheck.Api.Users.User", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CreatedAt") - .HasColumnType("timestamp with time zone"); - - b.Property("Email") - .IsRequired() - .HasMaxLength(500) - .HasColumnType("character varying(500)"); - - b.Property("FirstName") - .IsRequired() - .HasMaxLength(200) - .HasColumnType("character varying(200)"); - - b.Property("IsActive") - .HasColumnType("boolean"); - - b.Property("IsTwoFactorEnabled") - .HasColumnType("boolean"); - - b.Property("LastLoginAt") - .HasColumnType("timestamp with time zone"); - - b.Property("LastName") - .IsRequired() - .HasMaxLength(200) - .HasColumnType("character varying(200)"); - - b.Property("PasswordHash") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("Id"); - - b.HasIndex("Email") - .IsUnique(); - - b.ToTable("Users"); - }); - - modelBuilder.Entity("MicCheck.Api.Webhooks.Webhook", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CreatedAt") - .HasColumnType("timestamp with time zone"); - - b.Property("Enabled") - .HasColumnType("boolean"); - - b.Property("EnvironmentId") - .HasColumnType("integer"); - - b.Property("OrganizationId") - .HasColumnType("integer"); - - b.Property("Scope") - .HasColumnType("integer"); - - b.Property("Secret") - .HasMaxLength(200) - .HasColumnType("character varying(200)"); - - b.Property("Url") - .IsRequired() - .HasMaxLength(500) - .HasColumnType("character varying(500)"); - - b.HasKey("Id"); - - b.HasIndex("EnvironmentId"); - - b.ToTable("Webhooks"); - }); - - modelBuilder.Entity("MicCheck.Api.Webhooks.WebhookDeliveryLog", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("AttemptNumber") - .HasColumnType("integer"); - - b.Property("AttemptedAt") - .HasColumnType("timestamp with time zone"); - - b.Property("Duration") - .HasColumnType("interval"); - - b.Property("ErrorMessage") - .HasColumnType("text"); - - b.Property("EventType") - .IsRequired() - .HasMaxLength(100) - .HasColumnType("character varying(100)"); - - b.Property("PayloadJson") - .IsRequired() - .HasColumnType("text"); - - b.Property("ResponseBody") - .HasColumnType("text"); - - b.Property("ResponseStatusCode") - .HasColumnType("integer"); - - b.Property("Success") - .HasColumnType("boolean"); - - b.Property("WebhookId") - .HasColumnType("integer"); - - b.HasKey("Id"); - - b.HasIndex("WebhookId"); - - b.ToTable("WebhookDeliveryLogs"); - }); - - modelBuilder.Entity("MicCheck.Api.Common.Security.ApiKeys.ApiKey", b => - { - b.HasOne("MicCheck.Api.Organizations.Organization", null) - .WithMany("ApiKeys") - .HasForeignKey("OrganizationId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("MicCheck.Api.Environments.Environment", b => - { - b.HasOne("MicCheck.Api.Projects.Project", null) - .WithMany("Environments") - .HasForeignKey("ProjectId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("MicCheck.Api.Features.Feature", b => - { - b.HasOne("MicCheck.Api.Projects.Project", null) - .WithMany("Features") - .HasForeignKey("ProjectId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("MicCheck.Api.Features.FeatureState", b => - { - b.HasOne("MicCheck.Api.Environments.Environment", null) - .WithMany("FeatureStates") - .HasForeignKey("EnvironmentId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MicCheck.Api.Features.Feature", null) - .WithMany("FeatureStates") - .HasForeignKey("FeatureId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MicCheck.Api.Features.FeatureSegment", null) - .WithOne("FeatureState") - .HasForeignKey("MicCheck.Api.Features.FeatureState", "FeatureSegmentId") - .OnDelete(DeleteBehavior.SetNull); - - b.HasOne("MicCheck.Api.Identities.Identity", null) - .WithMany("FeatureStateOverrides") - .HasForeignKey("IdentityId") - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity("MicCheck.Api.Features.Tag", b => - { - b.HasOne("MicCheck.Api.Features.Feature", null) - .WithMany("Tags") - .HasForeignKey("ProjectId") - .OnDelete(DeleteBehavior.NoAction) - .IsRequired(); - }); - - modelBuilder.Entity("MicCheck.Api.Identities.IdentityTrait", b => - { - b.HasOne("MicCheck.Api.Identities.Identity", null) - .WithMany("Traits") - .HasForeignKey("IdentityId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("MicCheck.Api.Organizations.OrganizationUser", b => - { - b.HasOne("MicCheck.Api.Organizations.Organization", null) - .WithMany("Members") - .HasForeignKey("OrganizationId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MicCheck.Api.Users.User", null) - .WithMany("Organizations") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("MicCheck.Api.Projects.Project", b => - { - b.HasOne("MicCheck.Api.Organizations.Organization", null) - .WithMany("Projects") - .HasForeignKey("OrganizationId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("MicCheck.Api.Segments.Segment", b => - { - b.HasOne("MicCheck.Api.Projects.Project", null) - .WithMany("Segments") - .HasForeignKey("ProjectId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("MicCheck.Api.Segments.SegmentCondition", b => - { - b.HasOne("MicCheck.Api.Segments.SegmentRule", null) - .WithMany("Conditions") - .HasForeignKey("RuleId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("MicCheck.Api.Segments.SegmentRule", b => - { - b.HasOne("MicCheck.Api.Segments.SegmentRule", null) - .WithMany("ChildRules") - .HasForeignKey("ParentRuleId") - .OnDelete(DeleteBehavior.NoAction); - - b.HasOne("MicCheck.Api.Segments.Segment", null) - .WithMany("Rules") - .HasForeignKey("SegmentId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("MicCheck.Api.Users.RefreshToken", b => - { - b.HasOne("MicCheck.Api.Users.User", "User") - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MicCheck.Api.Environments.Environment", b => - { - b.Navigation("FeatureStates"); - }); - - modelBuilder.Entity("MicCheck.Api.Features.Feature", b => - { - b.Navigation("FeatureStates"); - - b.Navigation("Tags"); - }); - - modelBuilder.Entity("MicCheck.Api.Features.FeatureSegment", b => - { - b.Navigation("FeatureState"); - }); - - modelBuilder.Entity("MicCheck.Api.Identities.Identity", b => - { - b.Navigation("FeatureStateOverrides"); - - b.Navigation("Traits"); - }); - - modelBuilder.Entity("MicCheck.Api.Organizations.Organization", b => - { - b.Navigation("ApiKeys"); - - b.Navigation("Members"); - - b.Navigation("Projects"); - }); - - modelBuilder.Entity("MicCheck.Api.Projects.Project", b => - { - b.Navigation("Environments"); - - b.Navigation("Features"); - - b.Navigation("Segments"); - }); - - modelBuilder.Entity("MicCheck.Api.Segments.Segment", b => - { - b.Navigation("Rules"); - }); - - modelBuilder.Entity("MicCheck.Api.Segments.SegmentRule", b => - { - b.Navigation("ChildRules"); - - b.Navigation("Conditions"); - }); - - modelBuilder.Entity("MicCheck.Api.Users.User", b => - { - b.Navigation("Organizations"); - }); -#pragma warning restore 612, 618 - } - } -} +// +using System; +using MicCheck.Api.Data; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace MicCheck.Api.Migrations +{ + [DbContext(typeof(MicCheckDbContext))] + [Migration("20260410175950_AddWebhookDeliveryAttemptNumber")] + partial class AddWebhookDeliveryAttemptNumber + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "10.0.5") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("MicCheck.Api.Common.Security.ApiKeys.ApiKey", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("ExpiresAt") + .HasColumnType("timestamp with time zone"); + + b.Property("IsActive") + .HasColumnType("boolean"); + + b.Property("Key") + .IsRequired() + .HasMaxLength(512) + .HasColumnType("character varying(512)"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("OrganizationId") + .HasColumnType("integer"); + + b.Property("Prefix") + .IsRequired() + .HasMaxLength(8) + .HasColumnType("character varying(8)"); + + b.HasKey("Id"); + + b.HasIndex("Key") + .IsUnique(); + + b.HasIndex("OrganizationId"); + + b.ToTable("ApiKeys"); + }); + + modelBuilder.Entity("MicCheck.Api.Audit.AuditLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Action") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("character varying(50)"); + + b.Property("ActorUserId") + .HasColumnType("integer"); + + b.Property("Changes") + .HasColumnType("text"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("EnvironmentId") + .HasColumnType("integer"); + + b.Property("OrganizationId") + .HasColumnType("integer"); + + b.Property("ProjectId") + .HasColumnType("integer"); + + b.Property("ResourceId") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("ResourceType") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.HasKey("Id"); + + b.HasIndex("OrganizationId", "CreatedAt"); + + b.ToTable("AuditLogs"); + }); + + modelBuilder.Entity("MicCheck.Api.Common.Security.Authorization.UserProjectPermission", b => + { + b.Property("UserId") + .HasColumnType("integer"); + + b.Property("ProjectId") + .HasColumnType("integer"); + + b.Property("IsAdmin") + .HasColumnType("boolean"); + + b.Property("Permissions") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("UserId", "ProjectId"); + + b.ToTable("UserProjectPermissions"); + }); + + modelBuilder.Entity("MicCheck.Api.Environments.Environment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ApiKey") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("ProjectId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("ApiKey") + .IsUnique(); + + b.HasIndex("ProjectId"); + + b.ToTable("Environments"); + }); + + modelBuilder.Entity("MicCheck.Api.Features.Feature", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("DefaultEnabled") + .HasColumnType("boolean"); + + b.Property("Description") + .HasMaxLength(2000) + .HasColumnType("character varying(2000)"); + + b.Property("InitialValue") + .HasMaxLength(20000) + .HasColumnType("character varying(20000)"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(150) + .HasColumnType("character varying(150)"); + + b.Property("ProjectId") + .HasColumnType("integer"); + + b.Property("Type") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("ProjectId", "Name") + .IsUnique(); + + b.ToTable("Features"); + }); + + modelBuilder.Entity("MicCheck.Api.Features.FeatureSegment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("EnvironmentId") + .HasColumnType("integer"); + + b.Property("FeatureId") + .HasColumnType("integer"); + + b.Property("Priority") + .HasColumnType("integer"); + + b.Property("SegmentId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.ToTable("FeatureSegments"); + }); + + modelBuilder.Entity("MicCheck.Api.Features.FeatureState", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Enabled") + .HasColumnType("boolean"); + + b.Property("EnvironmentId") + .HasColumnType("integer"); + + b.Property("FeatureId") + .HasColumnType("integer"); + + b.Property("FeatureSegmentId") + .HasColumnType("integer"); + + b.Property("IdentityId") + .HasColumnType("integer"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Value") + .HasMaxLength(20000) + .HasColumnType("character varying(20000)"); + + b.Property("Version") + .IsConcurrencyToken() + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("EnvironmentId"); + + b.HasIndex("FeatureSegmentId") + .IsUnique(); + + b.HasIndex("IdentityId"); + + b.HasIndex("FeatureId", "EnvironmentId", "IdentityId") + .IsUnique(); + + b.ToTable("FeatureStates"); + }); + + modelBuilder.Entity("MicCheck.Api.Features.Tag", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Color") + .IsRequired() + .HasMaxLength(20) + .HasColumnType("character varying(20)"); + + b.Property("Label") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("ProjectId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("ProjectId"); + + b.ToTable("Tags"); + }); + + modelBuilder.Entity("MicCheck.Api.Identities.Identity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("EnvironmentId") + .HasColumnType("integer"); + + b.Property("Identifier") + .IsRequired() + .HasMaxLength(2000) + .HasColumnType("character varying(2000)"); + + b.HasKey("Id"); + + b.HasIndex("EnvironmentId", "Identifier") + .IsUnique(); + + b.ToTable("Identities"); + }); + + modelBuilder.Entity("MicCheck.Api.Identities.IdentityTrait", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("IdentityId") + .HasColumnType("integer"); + + b.Property("Key") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("Value") + .IsRequired() + .HasMaxLength(2000) + .HasColumnType("character varying(2000)"); + + b.Property("ValueType") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("IdentityId", "Key") + .IsUnique(); + + b.ToTable("IdentityTraits"); + }); + + modelBuilder.Entity("MicCheck.Api.Organizations.Organization", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.HasKey("Id"); + + b.ToTable("Organizations"); + }); + + modelBuilder.Entity("MicCheck.Api.Organizations.OrganizationUser", b => + { + b.Property("OrganizationId") + .HasColumnType("integer"); + + b.Property("UserId") + .HasColumnType("integer"); + + b.Property("Role") + .HasColumnType("integer"); + + b.HasKey("OrganizationId", "UserId"); + + b.HasIndex("UserId"); + + b.ToTable("OrganizationUsers"); + }); + + modelBuilder.Entity("MicCheck.Api.Projects.Project", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("HideDisabledFlags") + .HasColumnType("boolean"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("OrganizationId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("OrganizationId"); + + b.ToTable("Projects"); + }); + + modelBuilder.Entity("MicCheck.Api.Segments.Segment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("ProjectId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("ProjectId"); + + b.ToTable("Segments"); + }); + + modelBuilder.Entity("MicCheck.Api.Segments.SegmentCondition", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Operator") + .HasColumnType("integer"); + + b.Property("Property") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("RuleId") + .HasColumnType("integer"); + + b.Property("Value") + .IsRequired() + .HasMaxLength(1000) + .HasColumnType("character varying(1000)"); + + b.HasKey("Id"); + + b.HasIndex("RuleId"); + + b.ToTable("SegmentConditions"); + }); + + modelBuilder.Entity("MicCheck.Api.Segments.SegmentRule", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ParentRuleId") + .HasColumnType("integer"); + + b.Property("SegmentId") + .HasColumnType("integer"); + + b.Property("Type") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("ParentRuleId"); + + b.HasIndex("SegmentId"); + + b.ToTable("SegmentRules"); + }); + + modelBuilder.Entity("MicCheck.Api.Users.RefreshToken", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("ExpiresAt") + .HasColumnType("timestamp with time zone"); + + b.Property("IsRevoked") + .HasColumnType("boolean"); + + b.Property("Token") + .IsRequired() + .HasMaxLength(512) + .HasColumnType("character varying(512)"); + + b.Property("UserId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("Token") + .IsUnique(); + + b.HasIndex("UserId"); + + b.ToTable("RefreshTokens"); + }); + + modelBuilder.Entity("MicCheck.Api.Users.User", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Email") + .IsRequired() + .HasMaxLength(500) + .HasColumnType("character varying(500)"); + + b.Property("FirstName") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("IsActive") + .HasColumnType("boolean"); + + b.Property("IsTwoFactorEnabled") + .HasColumnType("boolean"); + + b.Property("LastLoginAt") + .HasColumnType("timestamp with time zone"); + + b.Property("LastName") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("PasswordHash") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("Email") + .IsUnique(); + + b.ToTable("Users"); + }); + + modelBuilder.Entity("MicCheck.Api.Webhooks.Webhook", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Enabled") + .HasColumnType("boolean"); + + b.Property("EnvironmentId") + .HasColumnType("integer"); + + b.Property("OrganizationId") + .HasColumnType("integer"); + + b.Property("Scope") + .HasColumnType("integer"); + + b.Property("Secret") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("Url") + .IsRequired() + .HasMaxLength(500) + .HasColumnType("character varying(500)"); + + b.HasKey("Id"); + + b.HasIndex("EnvironmentId"); + + b.ToTable("Webhooks"); + }); + + modelBuilder.Entity("MicCheck.Api.Webhooks.WebhookDeliveryLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AttemptNumber") + .HasColumnType("integer"); + + b.Property("AttemptedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Duration") + .HasColumnType("interval"); + + b.Property("ErrorMessage") + .HasColumnType("text"); + + b.Property("EventType") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("PayloadJson") + .IsRequired() + .HasColumnType("text"); + + b.Property("ResponseBody") + .HasColumnType("text"); + + b.Property("ResponseStatusCode") + .HasColumnType("integer"); + + b.Property("Success") + .HasColumnType("boolean"); + + b.Property("WebhookId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("WebhookId"); + + b.ToTable("WebhookDeliveryLogs"); + }); + + modelBuilder.Entity("MicCheck.Api.Common.Security.ApiKeys.ApiKey", b => + { + b.HasOne("MicCheck.Api.Organizations.Organization", null) + .WithMany("ApiKeys") + .HasForeignKey("OrganizationId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("MicCheck.Api.Environments.Environment", b => + { + b.HasOne("MicCheck.Api.Projects.Project", null) + .WithMany("Environments") + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("MicCheck.Api.Features.Feature", b => + { + b.HasOne("MicCheck.Api.Projects.Project", null) + .WithMany("Features") + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("MicCheck.Api.Features.FeatureState", b => + { + b.HasOne("MicCheck.Api.Environments.Environment", null) + .WithMany("FeatureStates") + .HasForeignKey("EnvironmentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("MicCheck.Api.Features.Feature", null) + .WithMany("FeatureStates") + .HasForeignKey("FeatureId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("MicCheck.Api.Features.FeatureSegment", null) + .WithOne("FeatureState") + .HasForeignKey("MicCheck.Api.Features.FeatureState", "FeatureSegmentId") + .OnDelete(DeleteBehavior.SetNull); + + b.HasOne("MicCheck.Api.Identities.Identity", null) + .WithMany("FeatureStateOverrides") + .HasForeignKey("IdentityId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("MicCheck.Api.Features.Tag", b => + { + b.HasOne("MicCheck.Api.Features.Feature", null) + .WithMany("Tags") + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.NoAction) + .IsRequired(); + }); + + modelBuilder.Entity("MicCheck.Api.Identities.IdentityTrait", b => + { + b.HasOne("MicCheck.Api.Identities.Identity", null) + .WithMany("Traits") + .HasForeignKey("IdentityId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("MicCheck.Api.Organizations.OrganizationUser", b => + { + b.HasOne("MicCheck.Api.Organizations.Organization", null) + .WithMany("Members") + .HasForeignKey("OrganizationId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("MicCheck.Api.Users.User", null) + .WithMany("Organizations") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("MicCheck.Api.Projects.Project", b => + { + b.HasOne("MicCheck.Api.Organizations.Organization", null) + .WithMany("Projects") + .HasForeignKey("OrganizationId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("MicCheck.Api.Segments.Segment", b => + { + b.HasOne("MicCheck.Api.Projects.Project", null) + .WithMany("Segments") + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("MicCheck.Api.Segments.SegmentCondition", b => + { + b.HasOne("MicCheck.Api.Segments.SegmentRule", null) + .WithMany("Conditions") + .HasForeignKey("RuleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("MicCheck.Api.Segments.SegmentRule", b => + { + b.HasOne("MicCheck.Api.Segments.SegmentRule", null) + .WithMany("ChildRules") + .HasForeignKey("ParentRuleId") + .OnDelete(DeleteBehavior.NoAction); + + b.HasOne("MicCheck.Api.Segments.Segment", null) + .WithMany("Rules") + .HasForeignKey("SegmentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("MicCheck.Api.Users.RefreshToken", b => + { + b.HasOne("MicCheck.Api.Users.User", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("MicCheck.Api.Environments.Environment", b => + { + b.Navigation("FeatureStates"); + }); + + modelBuilder.Entity("MicCheck.Api.Features.Feature", b => + { + b.Navigation("FeatureStates"); + + b.Navigation("Tags"); + }); + + modelBuilder.Entity("MicCheck.Api.Features.FeatureSegment", b => + { + b.Navigation("FeatureState"); + }); + + modelBuilder.Entity("MicCheck.Api.Identities.Identity", b => + { + b.Navigation("FeatureStateOverrides"); + + b.Navigation("Traits"); + }); + + modelBuilder.Entity("MicCheck.Api.Organizations.Organization", b => + { + b.Navigation("ApiKeys"); + + b.Navigation("Members"); + + b.Navigation("Projects"); + }); + + modelBuilder.Entity("MicCheck.Api.Projects.Project", b => + { + b.Navigation("Environments"); + + b.Navigation("Features"); + + b.Navigation("Segments"); + }); + + modelBuilder.Entity("MicCheck.Api.Segments.Segment", b => + { + b.Navigation("Rules"); + }); + + modelBuilder.Entity("MicCheck.Api.Segments.SegmentRule", b => + { + b.Navigation("ChildRules"); + + b.Navigation("Conditions"); + }); + + modelBuilder.Entity("MicCheck.Api.Users.User", b => + { + b.Navigation("Organizations"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/src/api/MicCheck.Api/Migrations/20260410175950_AddWebhookDeliveryAttemptNumber.cs b/src/api/MicCheck.Api/Migrations/20260410175950_AddWebhookDeliveryAttemptNumber.cs old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/Migrations/20260414203426_FixTagRelationships.Designer.cs b/src/api/MicCheck.Api/Migrations/20260414203426_FixTagRelationships.Designer.cs old mode 100644 new mode 100755 index 9b44e2e..7a5f6d8 --- a/src/api/MicCheck.Api/Migrations/20260414203426_FixTagRelationships.Designer.cs +++ b/src/api/MicCheck.Api/Migrations/20260414203426_FixTagRelationships.Designer.cs @@ -1,926 +1,926 @@ -// -using System; -using MicCheck.Api.Data; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; - -#nullable disable - -namespace MicCheck.Api.Migrations -{ - [DbContext(typeof(MicCheckDbContext))] - [Migration("20260414203426_FixTagRelationships")] - partial class FixTagRelationships - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "10.0.5") - .HasAnnotation("Relational:MaxIdentifierLength", 63); - - NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); - - modelBuilder.Entity("FeatureTags", b => - { - b.Property("FeatureId") - .HasColumnType("integer"); - - b.Property("TagsId") - .HasColumnType("integer"); - - b.HasKey("FeatureId", "TagsId"); - - b.HasIndex("TagsId"); - - b.ToTable("FeatureTags"); - }); - - modelBuilder.Entity("MicCheck.Api.Common.Security.ApiKeys.ApiKey", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CreatedAt") - .HasColumnType("timestamp with time zone"); - - b.Property("ExpiresAt") - .HasColumnType("timestamp with time zone"); - - b.Property("IsActive") - .HasColumnType("boolean"); - - b.Property("Key") - .IsRequired() - .HasMaxLength(512) - .HasColumnType("character varying(512)"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(200) - .HasColumnType("character varying(200)"); - - b.Property("OrganizationId") - .HasColumnType("integer"); - - b.Property("Prefix") - .IsRequired() - .HasMaxLength(8) - .HasColumnType("character varying(8)"); - - b.HasKey("Id"); - - b.HasIndex("Key") - .IsUnique(); - - b.HasIndex("OrganizationId"); - - b.ToTable("ApiKeys"); - }); - - modelBuilder.Entity("MicCheck.Api.Audit.AuditLog", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("Action") - .IsRequired() - .HasMaxLength(50) - .HasColumnType("character varying(50)"); - - b.Property("ActorUserId") - .HasColumnType("integer"); - - b.Property("Changes") - .HasColumnType("text"); - - b.Property("CreatedAt") - .HasColumnType("timestamp with time zone"); - - b.Property("EnvironmentId") - .HasColumnType("integer"); - - b.Property("OrganizationId") - .HasColumnType("integer"); - - b.Property("ProjectId") - .HasColumnType("integer"); - - b.Property("ResourceId") - .IsRequired() - .HasMaxLength(100) - .HasColumnType("character varying(100)"); - - b.Property("ResourceType") - .IsRequired() - .HasMaxLength(100) - .HasColumnType("character varying(100)"); - - b.HasKey("Id"); - - b.HasIndex("OrganizationId", "CreatedAt"); - - b.ToTable("AuditLogs"); - }); - - modelBuilder.Entity("MicCheck.Api.Common.Security.Authorization.UserProjectPermission", b => - { - b.Property("UserId") - .HasColumnType("integer"); - - b.Property("ProjectId") - .HasColumnType("integer"); - - b.Property("IsAdmin") - .HasColumnType("boolean"); - - b.Property("Permissions") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("UserId", "ProjectId"); - - b.ToTable("UserProjectPermissions"); - }); - - modelBuilder.Entity("MicCheck.Api.Environments.Environment", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("ApiKey") - .IsRequired() - .HasMaxLength(100) - .HasColumnType("character varying(100)"); - - b.Property("CreatedAt") - .HasColumnType("timestamp with time zone"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(200) - .HasColumnType("character varying(200)"); - - b.Property("ProjectId") - .HasColumnType("integer"); - - b.HasKey("Id"); - - b.HasIndex("ApiKey") - .IsUnique(); - - b.HasIndex("ProjectId"); - - b.ToTable("Environments"); - }); - - modelBuilder.Entity("MicCheck.Api.Features.Feature", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CreatedAt") - .HasColumnType("timestamp with time zone"); - - b.Property("DefaultEnabled") - .HasColumnType("boolean"); - - b.Property("Description") - .HasMaxLength(2000) - .HasColumnType("character varying(2000)"); - - b.Property("InitialValue") - .HasMaxLength(20000) - .HasColumnType("character varying(20000)"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(150) - .HasColumnType("character varying(150)"); - - b.Property("ProjectId") - .HasColumnType("integer"); - - b.Property("Type") - .HasColumnType("integer"); - - b.HasKey("Id"); - - b.HasIndex("ProjectId", "Name") - .IsUnique(); - - b.ToTable("Features"); - }); - - modelBuilder.Entity("MicCheck.Api.Features.FeatureSegment", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("EnvironmentId") - .HasColumnType("integer"); - - b.Property("FeatureId") - .HasColumnType("integer"); - - b.Property("Priority") - .HasColumnType("integer"); - - b.Property("SegmentId") - .HasColumnType("integer"); - - b.HasKey("Id"); - - b.ToTable("FeatureSegments"); - }); - - modelBuilder.Entity("MicCheck.Api.Features.FeatureState", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CreatedAt") - .HasColumnType("timestamp with time zone"); - - b.Property("Enabled") - .HasColumnType("boolean"); - - b.Property("EnvironmentId") - .HasColumnType("integer"); - - b.Property("FeatureId") - .HasColumnType("integer"); - - b.Property("FeatureSegmentId") - .HasColumnType("integer"); - - b.Property("IdentityId") - .HasColumnType("integer"); - - b.Property("UpdatedAt") - .HasColumnType("timestamp with time zone"); - - b.Property("Value") - .HasMaxLength(20000) - .HasColumnType("character varying(20000)"); - - b.Property("Version") - .IsConcurrencyToken() - .HasColumnType("integer"); - - b.HasKey("Id"); - - b.HasIndex("EnvironmentId"); - - b.HasIndex("FeatureSegmentId") - .IsUnique(); - - b.HasIndex("IdentityId"); - - b.HasIndex("FeatureId", "EnvironmentId", "IdentityId") - .IsUnique(); - - b.ToTable("FeatureStates"); - }); - - modelBuilder.Entity("MicCheck.Api.Features.Tag", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("Color") - .IsRequired() - .HasMaxLength(20) - .HasColumnType("character varying(20)"); - - b.Property("Label") - .IsRequired() - .HasMaxLength(200) - .HasColumnType("character varying(200)"); - - b.Property("ProjectId") - .HasColumnType("integer"); - - b.HasKey("Id"); - - b.HasIndex("ProjectId"); - - b.ToTable("Tags"); - }); - - modelBuilder.Entity("MicCheck.Api.Identities.Identity", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CreatedAt") - .HasColumnType("timestamp with time zone"); - - b.Property("EnvironmentId") - .HasColumnType("integer"); - - b.Property("Identifier") - .IsRequired() - .HasMaxLength(2000) - .HasColumnType("character varying(2000)"); - - b.HasKey("Id"); - - b.HasIndex("EnvironmentId", "Identifier") - .IsUnique(); - - b.ToTable("Identities"); - }); - - modelBuilder.Entity("MicCheck.Api.Identities.IdentityTrait", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("IdentityId") - .HasColumnType("integer"); - - b.Property("Key") - .IsRequired() - .HasMaxLength(200) - .HasColumnType("character varying(200)"); - - b.Property("Value") - .IsRequired() - .HasMaxLength(2000) - .HasColumnType("character varying(2000)"); - - b.Property("ValueType") - .HasColumnType("integer"); - - b.HasKey("Id"); - - b.HasIndex("IdentityId", "Key") - .IsUnique(); - - b.ToTable("IdentityTraits"); - }); - - modelBuilder.Entity("MicCheck.Api.Organizations.Organization", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CreatedAt") - .HasColumnType("timestamp with time zone"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(200) - .HasColumnType("character varying(200)"); - - b.HasKey("Id"); - - b.ToTable("Organizations"); - }); - - modelBuilder.Entity("MicCheck.Api.Organizations.OrganizationUser", b => - { - b.Property("OrganizationId") - .HasColumnType("integer"); - - b.Property("UserId") - .HasColumnType("integer"); - - b.Property("Role") - .HasColumnType("integer"); - - b.HasKey("OrganizationId", "UserId"); - - b.HasIndex("UserId"); - - b.ToTable("OrganizationUsers"); - }); - - modelBuilder.Entity("MicCheck.Api.Projects.Project", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CreatedAt") - .HasColumnType("timestamp with time zone"); - - b.Property("HideDisabledFlags") - .HasColumnType("boolean"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(200) - .HasColumnType("character varying(200)"); - - b.Property("OrganizationId") - .HasColumnType("integer"); - - b.HasKey("Id"); - - b.HasIndex("OrganizationId"); - - b.ToTable("Projects"); - }); - - modelBuilder.Entity("MicCheck.Api.Segments.Segment", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CreatedAt") - .HasColumnType("timestamp with time zone"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(200) - .HasColumnType("character varying(200)"); - - b.Property("ProjectId") - .HasColumnType("integer"); - - b.HasKey("Id"); - - b.HasIndex("ProjectId"); - - b.ToTable("Segments"); - }); - - modelBuilder.Entity("MicCheck.Api.Segments.SegmentCondition", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("Operator") - .HasColumnType("integer"); - - b.Property("Property") - .IsRequired() - .HasMaxLength(200) - .HasColumnType("character varying(200)"); - - b.Property("RuleId") - .HasColumnType("integer"); - - b.Property("Value") - .IsRequired() - .HasMaxLength(1000) - .HasColumnType("character varying(1000)"); - - b.HasKey("Id"); - - b.HasIndex("RuleId"); - - b.ToTable("SegmentConditions"); - }); - - modelBuilder.Entity("MicCheck.Api.Segments.SegmentRule", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("ParentRuleId") - .HasColumnType("integer"); - - b.Property("SegmentId") - .HasColumnType("integer"); - - b.Property("Type") - .HasColumnType("integer"); - - b.HasKey("Id"); - - b.HasIndex("ParentRuleId"); - - b.HasIndex("SegmentId"); - - b.ToTable("SegmentRules"); - }); - - modelBuilder.Entity("MicCheck.Api.Users.RefreshToken", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CreatedAt") - .HasColumnType("timestamp with time zone"); - - b.Property("ExpiresAt") - .HasColumnType("timestamp with time zone"); - - b.Property("IsRevoked") - .HasColumnType("boolean"); - - b.Property("Token") - .IsRequired() - .HasMaxLength(512) - .HasColumnType("character varying(512)"); - - b.Property("UserId") - .HasColumnType("integer"); - - b.HasKey("Id"); - - b.HasIndex("Token") - .IsUnique(); - - b.HasIndex("UserId"); - - b.ToTable("RefreshTokens"); - }); - - modelBuilder.Entity("MicCheck.Api.Users.User", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CreatedAt") - .HasColumnType("timestamp with time zone"); - - b.Property("Email") - .IsRequired() - .HasMaxLength(500) - .HasColumnType("character varying(500)"); - - b.Property("FirstName") - .IsRequired() - .HasMaxLength(200) - .HasColumnType("character varying(200)"); - - b.Property("IsActive") - .HasColumnType("boolean"); - - b.Property("IsTwoFactorEnabled") - .HasColumnType("boolean"); - - b.Property("LastLoginAt") - .HasColumnType("timestamp with time zone"); - - b.Property("LastName") - .IsRequired() - .HasMaxLength(200) - .HasColumnType("character varying(200)"); - - b.Property("PasswordHash") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("Id"); - - b.HasIndex("Email") - .IsUnique(); - - b.ToTable("Users"); - }); - - modelBuilder.Entity("MicCheck.Api.Webhooks.Webhook", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CreatedAt") - .HasColumnType("timestamp with time zone"); - - b.Property("Enabled") - .HasColumnType("boolean"); - - b.Property("EnvironmentId") - .HasColumnType("integer"); - - b.Property("OrganizationId") - .HasColumnType("integer"); - - b.Property("Scope") - .HasColumnType("integer"); - - b.Property("Secret") - .HasMaxLength(200) - .HasColumnType("character varying(200)"); - - b.Property("Url") - .IsRequired() - .HasMaxLength(500) - .HasColumnType("character varying(500)"); - - b.HasKey("Id"); - - b.HasIndex("EnvironmentId"); - - b.ToTable("Webhooks"); - }); - - modelBuilder.Entity("MicCheck.Api.Webhooks.WebhookDeliveryLog", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("AttemptNumber") - .HasColumnType("integer"); - - b.Property("AttemptedAt") - .HasColumnType("timestamp with time zone"); - - b.Property("Duration") - .HasColumnType("interval"); - - b.Property("ErrorMessage") - .HasColumnType("text"); - - b.Property("EventType") - .IsRequired() - .HasMaxLength(100) - .HasColumnType("character varying(100)"); - - b.Property("PayloadJson") - .IsRequired() - .HasColumnType("text"); - - b.Property("ResponseBody") - .HasColumnType("text"); - - b.Property("ResponseStatusCode") - .HasColumnType("integer"); - - b.Property("Success") - .HasColumnType("boolean"); - - b.Property("WebhookId") - .HasColumnType("integer"); - - b.HasKey("Id"); - - b.HasIndex("WebhookId"); - - b.ToTable("WebhookDeliveryLogs"); - }); - - modelBuilder.Entity("FeatureTags", b => - { - b.HasOne("MicCheck.Api.Features.Feature", null) - .WithMany() - .HasForeignKey("FeatureId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MicCheck.Api.Features.Tag", null) - .WithMany() - .HasForeignKey("TagsId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("MicCheck.Api.Common.Security.ApiKeys.ApiKey", b => - { - b.HasOne("MicCheck.Api.Organizations.Organization", null) - .WithMany("ApiKeys") - .HasForeignKey("OrganizationId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("MicCheck.Api.Environments.Environment", b => - { - b.HasOne("MicCheck.Api.Projects.Project", null) - .WithMany("Environments") - .HasForeignKey("ProjectId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("MicCheck.Api.Features.Feature", b => - { - b.HasOne("MicCheck.Api.Projects.Project", null) - .WithMany("Features") - .HasForeignKey("ProjectId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("MicCheck.Api.Features.FeatureState", b => - { - b.HasOne("MicCheck.Api.Environments.Environment", null) - .WithMany("FeatureStates") - .HasForeignKey("EnvironmentId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MicCheck.Api.Features.Feature", null) - .WithMany("FeatureStates") - .HasForeignKey("FeatureId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MicCheck.Api.Features.FeatureSegment", null) - .WithOne("FeatureState") - .HasForeignKey("MicCheck.Api.Features.FeatureState", "FeatureSegmentId") - .OnDelete(DeleteBehavior.SetNull); - - b.HasOne("MicCheck.Api.Identities.Identity", null) - .WithMany("FeatureStateOverrides") - .HasForeignKey("IdentityId") - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity("MicCheck.Api.Features.Tag", b => - { - b.HasOne("MicCheck.Api.Projects.Project", null) - .WithMany() - .HasForeignKey("ProjectId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("MicCheck.Api.Identities.IdentityTrait", b => - { - b.HasOne("MicCheck.Api.Identities.Identity", null) - .WithMany("Traits") - .HasForeignKey("IdentityId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("MicCheck.Api.Organizations.OrganizationUser", b => - { - b.HasOne("MicCheck.Api.Organizations.Organization", null) - .WithMany("Members") - .HasForeignKey("OrganizationId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MicCheck.Api.Users.User", null) - .WithMany("Organizations") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("MicCheck.Api.Projects.Project", b => - { - b.HasOne("MicCheck.Api.Organizations.Organization", null) - .WithMany("Projects") - .HasForeignKey("OrganizationId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("MicCheck.Api.Segments.Segment", b => - { - b.HasOne("MicCheck.Api.Projects.Project", null) - .WithMany("Segments") - .HasForeignKey("ProjectId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("MicCheck.Api.Segments.SegmentCondition", b => - { - b.HasOne("MicCheck.Api.Segments.SegmentRule", null) - .WithMany("Conditions") - .HasForeignKey("RuleId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("MicCheck.Api.Segments.SegmentRule", b => - { - b.HasOne("MicCheck.Api.Segments.SegmentRule", null) - .WithMany("ChildRules") - .HasForeignKey("ParentRuleId") - .OnDelete(DeleteBehavior.NoAction); - - b.HasOne("MicCheck.Api.Segments.Segment", null) - .WithMany("Rules") - .HasForeignKey("SegmentId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("MicCheck.Api.Users.RefreshToken", b => - { - b.HasOne("MicCheck.Api.Users.User", "User") - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MicCheck.Api.Environments.Environment", b => - { - b.Navigation("FeatureStates"); - }); - - modelBuilder.Entity("MicCheck.Api.Features.Feature", b => - { - b.Navigation("FeatureStates"); - }); - - modelBuilder.Entity("MicCheck.Api.Features.FeatureSegment", b => - { - b.Navigation("FeatureState"); - }); - - modelBuilder.Entity("MicCheck.Api.Identities.Identity", b => - { - b.Navigation("FeatureStateOverrides"); - - b.Navigation("Traits"); - }); - - modelBuilder.Entity("MicCheck.Api.Organizations.Organization", b => - { - b.Navigation("ApiKeys"); - - b.Navigation("Members"); - - b.Navigation("Projects"); - }); - - modelBuilder.Entity("MicCheck.Api.Projects.Project", b => - { - b.Navigation("Environments"); - - b.Navigation("Features"); - - b.Navigation("Segments"); - }); - - modelBuilder.Entity("MicCheck.Api.Segments.Segment", b => - { - b.Navigation("Rules"); - }); - - modelBuilder.Entity("MicCheck.Api.Segments.SegmentRule", b => - { - b.Navigation("ChildRules"); - - b.Navigation("Conditions"); - }); - - modelBuilder.Entity("MicCheck.Api.Users.User", b => - { - b.Navigation("Organizations"); - }); -#pragma warning restore 612, 618 - } - } -} +// +using System; +using MicCheck.Api.Data; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace MicCheck.Api.Migrations +{ + [DbContext(typeof(MicCheckDbContext))] + [Migration("20260414203426_FixTagRelationships")] + partial class FixTagRelationships + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "10.0.5") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("FeatureTags", b => + { + b.Property("FeatureId") + .HasColumnType("integer"); + + b.Property("TagsId") + .HasColumnType("integer"); + + b.HasKey("FeatureId", "TagsId"); + + b.HasIndex("TagsId"); + + b.ToTable("FeatureTags"); + }); + + modelBuilder.Entity("MicCheck.Api.Common.Security.ApiKeys.ApiKey", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("ExpiresAt") + .HasColumnType("timestamp with time zone"); + + b.Property("IsActive") + .HasColumnType("boolean"); + + b.Property("Key") + .IsRequired() + .HasMaxLength(512) + .HasColumnType("character varying(512)"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("OrganizationId") + .HasColumnType("integer"); + + b.Property("Prefix") + .IsRequired() + .HasMaxLength(8) + .HasColumnType("character varying(8)"); + + b.HasKey("Id"); + + b.HasIndex("Key") + .IsUnique(); + + b.HasIndex("OrganizationId"); + + b.ToTable("ApiKeys"); + }); + + modelBuilder.Entity("MicCheck.Api.Audit.AuditLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Action") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("character varying(50)"); + + b.Property("ActorUserId") + .HasColumnType("integer"); + + b.Property("Changes") + .HasColumnType("text"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("EnvironmentId") + .HasColumnType("integer"); + + b.Property("OrganizationId") + .HasColumnType("integer"); + + b.Property("ProjectId") + .HasColumnType("integer"); + + b.Property("ResourceId") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("ResourceType") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.HasKey("Id"); + + b.HasIndex("OrganizationId", "CreatedAt"); + + b.ToTable("AuditLogs"); + }); + + modelBuilder.Entity("MicCheck.Api.Common.Security.Authorization.UserProjectPermission", b => + { + b.Property("UserId") + .HasColumnType("integer"); + + b.Property("ProjectId") + .HasColumnType("integer"); + + b.Property("IsAdmin") + .HasColumnType("boolean"); + + b.Property("Permissions") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("UserId", "ProjectId"); + + b.ToTable("UserProjectPermissions"); + }); + + modelBuilder.Entity("MicCheck.Api.Environments.Environment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ApiKey") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("ProjectId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("ApiKey") + .IsUnique(); + + b.HasIndex("ProjectId"); + + b.ToTable("Environments"); + }); + + modelBuilder.Entity("MicCheck.Api.Features.Feature", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("DefaultEnabled") + .HasColumnType("boolean"); + + b.Property("Description") + .HasMaxLength(2000) + .HasColumnType("character varying(2000)"); + + b.Property("InitialValue") + .HasMaxLength(20000) + .HasColumnType("character varying(20000)"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(150) + .HasColumnType("character varying(150)"); + + b.Property("ProjectId") + .HasColumnType("integer"); + + b.Property("Type") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("ProjectId", "Name") + .IsUnique(); + + b.ToTable("Features"); + }); + + modelBuilder.Entity("MicCheck.Api.Features.FeatureSegment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("EnvironmentId") + .HasColumnType("integer"); + + b.Property("FeatureId") + .HasColumnType("integer"); + + b.Property("Priority") + .HasColumnType("integer"); + + b.Property("SegmentId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.ToTable("FeatureSegments"); + }); + + modelBuilder.Entity("MicCheck.Api.Features.FeatureState", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Enabled") + .HasColumnType("boolean"); + + b.Property("EnvironmentId") + .HasColumnType("integer"); + + b.Property("FeatureId") + .HasColumnType("integer"); + + b.Property("FeatureSegmentId") + .HasColumnType("integer"); + + b.Property("IdentityId") + .HasColumnType("integer"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Value") + .HasMaxLength(20000) + .HasColumnType("character varying(20000)"); + + b.Property("Version") + .IsConcurrencyToken() + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("EnvironmentId"); + + b.HasIndex("FeatureSegmentId") + .IsUnique(); + + b.HasIndex("IdentityId"); + + b.HasIndex("FeatureId", "EnvironmentId", "IdentityId") + .IsUnique(); + + b.ToTable("FeatureStates"); + }); + + modelBuilder.Entity("MicCheck.Api.Features.Tag", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Color") + .IsRequired() + .HasMaxLength(20) + .HasColumnType("character varying(20)"); + + b.Property("Label") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("ProjectId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("ProjectId"); + + b.ToTable("Tags"); + }); + + modelBuilder.Entity("MicCheck.Api.Identities.Identity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("EnvironmentId") + .HasColumnType("integer"); + + b.Property("Identifier") + .IsRequired() + .HasMaxLength(2000) + .HasColumnType("character varying(2000)"); + + b.HasKey("Id"); + + b.HasIndex("EnvironmentId", "Identifier") + .IsUnique(); + + b.ToTable("Identities"); + }); + + modelBuilder.Entity("MicCheck.Api.Identities.IdentityTrait", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("IdentityId") + .HasColumnType("integer"); + + b.Property("Key") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("Value") + .IsRequired() + .HasMaxLength(2000) + .HasColumnType("character varying(2000)"); + + b.Property("ValueType") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("IdentityId", "Key") + .IsUnique(); + + b.ToTable("IdentityTraits"); + }); + + modelBuilder.Entity("MicCheck.Api.Organizations.Organization", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.HasKey("Id"); + + b.ToTable("Organizations"); + }); + + modelBuilder.Entity("MicCheck.Api.Organizations.OrganizationUser", b => + { + b.Property("OrganizationId") + .HasColumnType("integer"); + + b.Property("UserId") + .HasColumnType("integer"); + + b.Property("Role") + .HasColumnType("integer"); + + b.HasKey("OrganizationId", "UserId"); + + b.HasIndex("UserId"); + + b.ToTable("OrganizationUsers"); + }); + + modelBuilder.Entity("MicCheck.Api.Projects.Project", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("HideDisabledFlags") + .HasColumnType("boolean"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("OrganizationId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("OrganizationId"); + + b.ToTable("Projects"); + }); + + modelBuilder.Entity("MicCheck.Api.Segments.Segment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("ProjectId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("ProjectId"); + + b.ToTable("Segments"); + }); + + modelBuilder.Entity("MicCheck.Api.Segments.SegmentCondition", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Operator") + .HasColumnType("integer"); + + b.Property("Property") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("RuleId") + .HasColumnType("integer"); + + b.Property("Value") + .IsRequired() + .HasMaxLength(1000) + .HasColumnType("character varying(1000)"); + + b.HasKey("Id"); + + b.HasIndex("RuleId"); + + b.ToTable("SegmentConditions"); + }); + + modelBuilder.Entity("MicCheck.Api.Segments.SegmentRule", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ParentRuleId") + .HasColumnType("integer"); + + b.Property("SegmentId") + .HasColumnType("integer"); + + b.Property("Type") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("ParentRuleId"); + + b.HasIndex("SegmentId"); + + b.ToTable("SegmentRules"); + }); + + modelBuilder.Entity("MicCheck.Api.Users.RefreshToken", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("ExpiresAt") + .HasColumnType("timestamp with time zone"); + + b.Property("IsRevoked") + .HasColumnType("boolean"); + + b.Property("Token") + .IsRequired() + .HasMaxLength(512) + .HasColumnType("character varying(512)"); + + b.Property("UserId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("Token") + .IsUnique(); + + b.HasIndex("UserId"); + + b.ToTable("RefreshTokens"); + }); + + modelBuilder.Entity("MicCheck.Api.Users.User", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Email") + .IsRequired() + .HasMaxLength(500) + .HasColumnType("character varying(500)"); + + b.Property("FirstName") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("IsActive") + .HasColumnType("boolean"); + + b.Property("IsTwoFactorEnabled") + .HasColumnType("boolean"); + + b.Property("LastLoginAt") + .HasColumnType("timestamp with time zone"); + + b.Property("LastName") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("PasswordHash") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("Email") + .IsUnique(); + + b.ToTable("Users"); + }); + + modelBuilder.Entity("MicCheck.Api.Webhooks.Webhook", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Enabled") + .HasColumnType("boolean"); + + b.Property("EnvironmentId") + .HasColumnType("integer"); + + b.Property("OrganizationId") + .HasColumnType("integer"); + + b.Property("Scope") + .HasColumnType("integer"); + + b.Property("Secret") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("Url") + .IsRequired() + .HasMaxLength(500) + .HasColumnType("character varying(500)"); + + b.HasKey("Id"); + + b.HasIndex("EnvironmentId"); + + b.ToTable("Webhooks"); + }); + + modelBuilder.Entity("MicCheck.Api.Webhooks.WebhookDeliveryLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AttemptNumber") + .HasColumnType("integer"); + + b.Property("AttemptedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Duration") + .HasColumnType("interval"); + + b.Property("ErrorMessage") + .HasColumnType("text"); + + b.Property("EventType") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("PayloadJson") + .IsRequired() + .HasColumnType("text"); + + b.Property("ResponseBody") + .HasColumnType("text"); + + b.Property("ResponseStatusCode") + .HasColumnType("integer"); + + b.Property("Success") + .HasColumnType("boolean"); + + b.Property("WebhookId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("WebhookId"); + + b.ToTable("WebhookDeliveryLogs"); + }); + + modelBuilder.Entity("FeatureTags", b => + { + b.HasOne("MicCheck.Api.Features.Feature", null) + .WithMany() + .HasForeignKey("FeatureId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("MicCheck.Api.Features.Tag", null) + .WithMany() + .HasForeignKey("TagsId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("MicCheck.Api.Common.Security.ApiKeys.ApiKey", b => + { + b.HasOne("MicCheck.Api.Organizations.Organization", null) + .WithMany("ApiKeys") + .HasForeignKey("OrganizationId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("MicCheck.Api.Environments.Environment", b => + { + b.HasOne("MicCheck.Api.Projects.Project", null) + .WithMany("Environments") + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("MicCheck.Api.Features.Feature", b => + { + b.HasOne("MicCheck.Api.Projects.Project", null) + .WithMany("Features") + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("MicCheck.Api.Features.FeatureState", b => + { + b.HasOne("MicCheck.Api.Environments.Environment", null) + .WithMany("FeatureStates") + .HasForeignKey("EnvironmentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("MicCheck.Api.Features.Feature", null) + .WithMany("FeatureStates") + .HasForeignKey("FeatureId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("MicCheck.Api.Features.FeatureSegment", null) + .WithOne("FeatureState") + .HasForeignKey("MicCheck.Api.Features.FeatureState", "FeatureSegmentId") + .OnDelete(DeleteBehavior.SetNull); + + b.HasOne("MicCheck.Api.Identities.Identity", null) + .WithMany("FeatureStateOverrides") + .HasForeignKey("IdentityId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("MicCheck.Api.Features.Tag", b => + { + b.HasOne("MicCheck.Api.Projects.Project", null) + .WithMany() + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("MicCheck.Api.Identities.IdentityTrait", b => + { + b.HasOne("MicCheck.Api.Identities.Identity", null) + .WithMany("Traits") + .HasForeignKey("IdentityId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("MicCheck.Api.Organizations.OrganizationUser", b => + { + b.HasOne("MicCheck.Api.Organizations.Organization", null) + .WithMany("Members") + .HasForeignKey("OrganizationId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("MicCheck.Api.Users.User", null) + .WithMany("Organizations") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("MicCheck.Api.Projects.Project", b => + { + b.HasOne("MicCheck.Api.Organizations.Organization", null) + .WithMany("Projects") + .HasForeignKey("OrganizationId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("MicCheck.Api.Segments.Segment", b => + { + b.HasOne("MicCheck.Api.Projects.Project", null) + .WithMany("Segments") + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("MicCheck.Api.Segments.SegmentCondition", b => + { + b.HasOne("MicCheck.Api.Segments.SegmentRule", null) + .WithMany("Conditions") + .HasForeignKey("RuleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("MicCheck.Api.Segments.SegmentRule", b => + { + b.HasOne("MicCheck.Api.Segments.SegmentRule", null) + .WithMany("ChildRules") + .HasForeignKey("ParentRuleId") + .OnDelete(DeleteBehavior.NoAction); + + b.HasOne("MicCheck.Api.Segments.Segment", null) + .WithMany("Rules") + .HasForeignKey("SegmentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("MicCheck.Api.Users.RefreshToken", b => + { + b.HasOne("MicCheck.Api.Users.User", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("MicCheck.Api.Environments.Environment", b => + { + b.Navigation("FeatureStates"); + }); + + modelBuilder.Entity("MicCheck.Api.Features.Feature", b => + { + b.Navigation("FeatureStates"); + }); + + modelBuilder.Entity("MicCheck.Api.Features.FeatureSegment", b => + { + b.Navigation("FeatureState"); + }); + + modelBuilder.Entity("MicCheck.Api.Identities.Identity", b => + { + b.Navigation("FeatureStateOverrides"); + + b.Navigation("Traits"); + }); + + modelBuilder.Entity("MicCheck.Api.Organizations.Organization", b => + { + b.Navigation("ApiKeys"); + + b.Navigation("Members"); + + b.Navigation("Projects"); + }); + + modelBuilder.Entity("MicCheck.Api.Projects.Project", b => + { + b.Navigation("Environments"); + + b.Navigation("Features"); + + b.Navigation("Segments"); + }); + + modelBuilder.Entity("MicCheck.Api.Segments.Segment", b => + { + b.Navigation("Rules"); + }); + + modelBuilder.Entity("MicCheck.Api.Segments.SegmentRule", b => + { + b.Navigation("ChildRules"); + + b.Navigation("Conditions"); + }); + + modelBuilder.Entity("MicCheck.Api.Users.User", b => + { + b.Navigation("Organizations"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/src/api/MicCheck.Api/Migrations/20260414203426_FixTagRelationships.cs b/src/api/MicCheck.Api/Migrations/20260414203426_FixTagRelationships.cs old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/Migrations/20260416184635_AddOrganizationUserNavigation.Designer.cs b/src/api/MicCheck.Api/Migrations/20260416184635_AddOrganizationUserNavigation.Designer.cs old mode 100644 new mode 100755 index 800c606..b7d4c48 --- a/src/api/MicCheck.Api/Migrations/20260416184635_AddOrganizationUserNavigation.Designer.cs +++ b/src/api/MicCheck.Api/Migrations/20260416184635_AddOrganizationUserNavigation.Designer.cs @@ -1,928 +1,928 @@ -// -using System; -using MicCheck.Api.Data; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; - -#nullable disable - -namespace MicCheck.Api.Migrations -{ - [DbContext(typeof(MicCheckDbContext))] - [Migration("20260416184635_AddOrganizationUserNavigation")] - partial class AddOrganizationUserNavigation - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "10.0.5") - .HasAnnotation("Relational:MaxIdentifierLength", 63); - - NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); - - modelBuilder.Entity("FeatureTags", b => - { - b.Property("FeatureId") - .HasColumnType("integer"); - - b.Property("TagsId") - .HasColumnType("integer"); - - b.HasKey("FeatureId", "TagsId"); - - b.HasIndex("TagsId"); - - b.ToTable("FeatureTags"); - }); - - modelBuilder.Entity("MicCheck.Api.Common.Security.ApiKeys.ApiKey", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CreatedAt") - .HasColumnType("timestamp with time zone"); - - b.Property("ExpiresAt") - .HasColumnType("timestamp with time zone"); - - b.Property("IsActive") - .HasColumnType("boolean"); - - b.Property("Key") - .IsRequired() - .HasMaxLength(512) - .HasColumnType("character varying(512)"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(200) - .HasColumnType("character varying(200)"); - - b.Property("OrganizationId") - .HasColumnType("integer"); - - b.Property("Prefix") - .IsRequired() - .HasMaxLength(8) - .HasColumnType("character varying(8)"); - - b.HasKey("Id"); - - b.HasIndex("Key") - .IsUnique(); - - b.HasIndex("OrganizationId"); - - b.ToTable("ApiKeys"); - }); - - modelBuilder.Entity("MicCheck.Api.Audit.AuditLog", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("Action") - .IsRequired() - .HasMaxLength(50) - .HasColumnType("character varying(50)"); - - b.Property("ActorUserId") - .HasColumnType("integer"); - - b.Property("Changes") - .HasColumnType("text"); - - b.Property("CreatedAt") - .HasColumnType("timestamp with time zone"); - - b.Property("EnvironmentId") - .HasColumnType("integer"); - - b.Property("OrganizationId") - .HasColumnType("integer"); - - b.Property("ProjectId") - .HasColumnType("integer"); - - b.Property("ResourceId") - .IsRequired() - .HasMaxLength(100) - .HasColumnType("character varying(100)"); - - b.Property("ResourceType") - .IsRequired() - .HasMaxLength(100) - .HasColumnType("character varying(100)"); - - b.HasKey("Id"); - - b.HasIndex("OrganizationId", "CreatedAt"); - - b.ToTable("AuditLogs"); - }); - - modelBuilder.Entity("MicCheck.Api.Common.Security.Authorization.UserProjectPermission", b => - { - b.Property("UserId") - .HasColumnType("integer"); - - b.Property("ProjectId") - .HasColumnType("integer"); - - b.Property("IsAdmin") - .HasColumnType("boolean"); - - b.Property("Permissions") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("UserId", "ProjectId"); - - b.ToTable("UserProjectPermissions"); - }); - - modelBuilder.Entity("MicCheck.Api.Environments.Environment", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("ApiKey") - .IsRequired() - .HasMaxLength(100) - .HasColumnType("character varying(100)"); - - b.Property("CreatedAt") - .HasColumnType("timestamp with time zone"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(200) - .HasColumnType("character varying(200)"); - - b.Property("ProjectId") - .HasColumnType("integer"); - - b.HasKey("Id"); - - b.HasIndex("ApiKey") - .IsUnique(); - - b.HasIndex("ProjectId"); - - b.ToTable("Environments"); - }); - - modelBuilder.Entity("MicCheck.Api.Features.Feature", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CreatedAt") - .HasColumnType("timestamp with time zone"); - - b.Property("DefaultEnabled") - .HasColumnType("boolean"); - - b.Property("Description") - .HasMaxLength(2000) - .HasColumnType("character varying(2000)"); - - b.Property("InitialValue") - .HasMaxLength(20000) - .HasColumnType("character varying(20000)"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(150) - .HasColumnType("character varying(150)"); - - b.Property("ProjectId") - .HasColumnType("integer"); - - b.Property("Type") - .HasColumnType("integer"); - - b.HasKey("Id"); - - b.HasIndex("ProjectId", "Name") - .IsUnique(); - - b.ToTable("Features"); - }); - - modelBuilder.Entity("MicCheck.Api.Features.FeatureSegment", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("EnvironmentId") - .HasColumnType("integer"); - - b.Property("FeatureId") - .HasColumnType("integer"); - - b.Property("Priority") - .HasColumnType("integer"); - - b.Property("SegmentId") - .HasColumnType("integer"); - - b.HasKey("Id"); - - b.ToTable("FeatureSegments"); - }); - - modelBuilder.Entity("MicCheck.Api.Features.FeatureState", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CreatedAt") - .HasColumnType("timestamp with time zone"); - - b.Property("Enabled") - .HasColumnType("boolean"); - - b.Property("EnvironmentId") - .HasColumnType("integer"); - - b.Property("FeatureId") - .HasColumnType("integer"); - - b.Property("FeatureSegmentId") - .HasColumnType("integer"); - - b.Property("IdentityId") - .HasColumnType("integer"); - - b.Property("UpdatedAt") - .HasColumnType("timestamp with time zone"); - - b.Property("Value") - .HasMaxLength(20000) - .HasColumnType("character varying(20000)"); - - b.Property("Version") - .IsConcurrencyToken() - .HasColumnType("integer"); - - b.HasKey("Id"); - - b.HasIndex("EnvironmentId"); - - b.HasIndex("FeatureSegmentId") - .IsUnique(); - - b.HasIndex("IdentityId"); - - b.HasIndex("FeatureId", "EnvironmentId", "IdentityId") - .IsUnique(); - - b.ToTable("FeatureStates"); - }); - - modelBuilder.Entity("MicCheck.Api.Features.Tag", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("Color") - .IsRequired() - .HasMaxLength(20) - .HasColumnType("character varying(20)"); - - b.Property("Label") - .IsRequired() - .HasMaxLength(200) - .HasColumnType("character varying(200)"); - - b.Property("ProjectId") - .HasColumnType("integer"); - - b.HasKey("Id"); - - b.HasIndex("ProjectId"); - - b.ToTable("Tags"); - }); - - modelBuilder.Entity("MicCheck.Api.Identities.Identity", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CreatedAt") - .HasColumnType("timestamp with time zone"); - - b.Property("EnvironmentId") - .HasColumnType("integer"); - - b.Property("Identifier") - .IsRequired() - .HasMaxLength(2000) - .HasColumnType("character varying(2000)"); - - b.HasKey("Id"); - - b.HasIndex("EnvironmentId", "Identifier") - .IsUnique(); - - b.ToTable("Identities"); - }); - - modelBuilder.Entity("MicCheck.Api.Identities.IdentityTrait", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("IdentityId") - .HasColumnType("integer"); - - b.Property("Key") - .IsRequired() - .HasMaxLength(200) - .HasColumnType("character varying(200)"); - - b.Property("Value") - .IsRequired() - .HasMaxLength(2000) - .HasColumnType("character varying(2000)"); - - b.Property("ValueType") - .HasColumnType("integer"); - - b.HasKey("Id"); - - b.HasIndex("IdentityId", "Key") - .IsUnique(); - - b.ToTable("IdentityTraits"); - }); - - modelBuilder.Entity("MicCheck.Api.Organizations.Organization", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CreatedAt") - .HasColumnType("timestamp with time zone"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(200) - .HasColumnType("character varying(200)"); - - b.HasKey("Id"); - - b.ToTable("Organizations"); - }); - - modelBuilder.Entity("MicCheck.Api.Organizations.OrganizationUser", b => - { - b.Property("OrganizationId") - .HasColumnType("integer"); - - b.Property("UserId") - .HasColumnType("integer"); - - b.Property("Role") - .HasColumnType("integer"); - - b.HasKey("OrganizationId", "UserId"); - - b.HasIndex("UserId"); - - b.ToTable("OrganizationUsers"); - }); - - modelBuilder.Entity("MicCheck.Api.Projects.Project", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CreatedAt") - .HasColumnType("timestamp with time zone"); - - b.Property("HideDisabledFlags") - .HasColumnType("boolean"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(200) - .HasColumnType("character varying(200)"); - - b.Property("OrganizationId") - .HasColumnType("integer"); - - b.HasKey("Id"); - - b.HasIndex("OrganizationId"); - - b.ToTable("Projects"); - }); - - modelBuilder.Entity("MicCheck.Api.Segments.Segment", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CreatedAt") - .HasColumnType("timestamp with time zone"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(200) - .HasColumnType("character varying(200)"); - - b.Property("ProjectId") - .HasColumnType("integer"); - - b.HasKey("Id"); - - b.HasIndex("ProjectId"); - - b.ToTable("Segments"); - }); - - modelBuilder.Entity("MicCheck.Api.Segments.SegmentCondition", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("Operator") - .HasColumnType("integer"); - - b.Property("Property") - .IsRequired() - .HasMaxLength(200) - .HasColumnType("character varying(200)"); - - b.Property("RuleId") - .HasColumnType("integer"); - - b.Property("Value") - .IsRequired() - .HasMaxLength(1000) - .HasColumnType("character varying(1000)"); - - b.HasKey("Id"); - - b.HasIndex("RuleId"); - - b.ToTable("SegmentConditions"); - }); - - modelBuilder.Entity("MicCheck.Api.Segments.SegmentRule", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("ParentRuleId") - .HasColumnType("integer"); - - b.Property("SegmentId") - .HasColumnType("integer"); - - b.Property("Type") - .HasColumnType("integer"); - - b.HasKey("Id"); - - b.HasIndex("ParentRuleId"); - - b.HasIndex("SegmentId"); - - b.ToTable("SegmentRules"); - }); - - modelBuilder.Entity("MicCheck.Api.Users.RefreshToken", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CreatedAt") - .HasColumnType("timestamp with time zone"); - - b.Property("ExpiresAt") - .HasColumnType("timestamp with time zone"); - - b.Property("IsRevoked") - .HasColumnType("boolean"); - - b.Property("Token") - .IsRequired() - .HasMaxLength(512) - .HasColumnType("character varying(512)"); - - b.Property("UserId") - .HasColumnType("integer"); - - b.HasKey("Id"); - - b.HasIndex("Token") - .IsUnique(); - - b.HasIndex("UserId"); - - b.ToTable("RefreshTokens"); - }); - - modelBuilder.Entity("MicCheck.Api.Users.User", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CreatedAt") - .HasColumnType("timestamp with time zone"); - - b.Property("Email") - .IsRequired() - .HasMaxLength(500) - .HasColumnType("character varying(500)"); - - b.Property("FirstName") - .IsRequired() - .HasMaxLength(200) - .HasColumnType("character varying(200)"); - - b.Property("IsActive") - .HasColumnType("boolean"); - - b.Property("IsTwoFactorEnabled") - .HasColumnType("boolean"); - - b.Property("LastLoginAt") - .HasColumnType("timestamp with time zone"); - - b.Property("LastName") - .IsRequired() - .HasMaxLength(200) - .HasColumnType("character varying(200)"); - - b.Property("PasswordHash") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("Id"); - - b.HasIndex("Email") - .IsUnique(); - - b.ToTable("Users"); - }); - - modelBuilder.Entity("MicCheck.Api.Webhooks.Webhook", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CreatedAt") - .HasColumnType("timestamp with time zone"); - - b.Property("Enabled") - .HasColumnType("boolean"); - - b.Property("EnvironmentId") - .HasColumnType("integer"); - - b.Property("OrganizationId") - .HasColumnType("integer"); - - b.Property("Scope") - .HasColumnType("integer"); - - b.Property("Secret") - .HasMaxLength(200) - .HasColumnType("character varying(200)"); - - b.Property("Url") - .IsRequired() - .HasMaxLength(500) - .HasColumnType("character varying(500)"); - - b.HasKey("Id"); - - b.HasIndex("EnvironmentId"); - - b.ToTable("Webhooks"); - }); - - modelBuilder.Entity("MicCheck.Api.Webhooks.WebhookDeliveryLog", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("AttemptNumber") - .HasColumnType("integer"); - - b.Property("AttemptedAt") - .HasColumnType("timestamp with time zone"); - - b.Property("Duration") - .HasColumnType("interval"); - - b.Property("ErrorMessage") - .HasColumnType("text"); - - b.Property("EventType") - .IsRequired() - .HasMaxLength(100) - .HasColumnType("character varying(100)"); - - b.Property("PayloadJson") - .IsRequired() - .HasColumnType("text"); - - b.Property("ResponseBody") - .HasColumnType("text"); - - b.Property("ResponseStatusCode") - .HasColumnType("integer"); - - b.Property("Success") - .HasColumnType("boolean"); - - b.Property("WebhookId") - .HasColumnType("integer"); - - b.HasKey("Id"); - - b.HasIndex("WebhookId"); - - b.ToTable("WebhookDeliveryLogs"); - }); - - modelBuilder.Entity("FeatureTags", b => - { - b.HasOne("MicCheck.Api.Features.Feature", null) - .WithMany() - .HasForeignKey("FeatureId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MicCheck.Api.Features.Tag", null) - .WithMany() - .HasForeignKey("TagsId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("MicCheck.Api.Common.Security.ApiKeys.ApiKey", b => - { - b.HasOne("MicCheck.Api.Organizations.Organization", null) - .WithMany("ApiKeys") - .HasForeignKey("OrganizationId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("MicCheck.Api.Environments.Environment", b => - { - b.HasOne("MicCheck.Api.Projects.Project", null) - .WithMany("Environments") - .HasForeignKey("ProjectId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("MicCheck.Api.Features.Feature", b => - { - b.HasOne("MicCheck.Api.Projects.Project", null) - .WithMany("Features") - .HasForeignKey("ProjectId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("MicCheck.Api.Features.FeatureState", b => - { - b.HasOne("MicCheck.Api.Environments.Environment", null) - .WithMany("FeatureStates") - .HasForeignKey("EnvironmentId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MicCheck.Api.Features.Feature", null) - .WithMany("FeatureStates") - .HasForeignKey("FeatureId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MicCheck.Api.Features.FeatureSegment", null) - .WithOne("FeatureState") - .HasForeignKey("MicCheck.Api.Features.FeatureState", "FeatureSegmentId") - .OnDelete(DeleteBehavior.SetNull); - - b.HasOne("MicCheck.Api.Identities.Identity", null) - .WithMany("FeatureStateOverrides") - .HasForeignKey("IdentityId") - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity("MicCheck.Api.Features.Tag", b => - { - b.HasOne("MicCheck.Api.Projects.Project", null) - .WithMany() - .HasForeignKey("ProjectId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("MicCheck.Api.Identities.IdentityTrait", b => - { - b.HasOne("MicCheck.Api.Identities.Identity", null) - .WithMany("Traits") - .HasForeignKey("IdentityId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("MicCheck.Api.Organizations.OrganizationUser", b => - { - b.HasOne("MicCheck.Api.Organizations.Organization", null) - .WithMany("Members") - .HasForeignKey("OrganizationId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MicCheck.Api.Users.User", "User") - .WithMany("Organizations") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MicCheck.Api.Projects.Project", b => - { - b.HasOne("MicCheck.Api.Organizations.Organization", null) - .WithMany("Projects") - .HasForeignKey("OrganizationId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("MicCheck.Api.Segments.Segment", b => - { - b.HasOne("MicCheck.Api.Projects.Project", null) - .WithMany("Segments") - .HasForeignKey("ProjectId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("MicCheck.Api.Segments.SegmentCondition", b => - { - b.HasOne("MicCheck.Api.Segments.SegmentRule", null) - .WithMany("Conditions") - .HasForeignKey("RuleId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("MicCheck.Api.Segments.SegmentRule", b => - { - b.HasOne("MicCheck.Api.Segments.SegmentRule", null) - .WithMany("ChildRules") - .HasForeignKey("ParentRuleId") - .OnDelete(DeleteBehavior.NoAction); - - b.HasOne("MicCheck.Api.Segments.Segment", null) - .WithMany("Rules") - .HasForeignKey("SegmentId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("MicCheck.Api.Users.RefreshToken", b => - { - b.HasOne("MicCheck.Api.Users.User", "User") - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MicCheck.Api.Environments.Environment", b => - { - b.Navigation("FeatureStates"); - }); - - modelBuilder.Entity("MicCheck.Api.Features.Feature", b => - { - b.Navigation("FeatureStates"); - }); - - modelBuilder.Entity("MicCheck.Api.Features.FeatureSegment", b => - { - b.Navigation("FeatureState"); - }); - - modelBuilder.Entity("MicCheck.Api.Identities.Identity", b => - { - b.Navigation("FeatureStateOverrides"); - - b.Navigation("Traits"); - }); - - modelBuilder.Entity("MicCheck.Api.Organizations.Organization", b => - { - b.Navigation("ApiKeys"); - - b.Navigation("Members"); - - b.Navigation("Projects"); - }); - - modelBuilder.Entity("MicCheck.Api.Projects.Project", b => - { - b.Navigation("Environments"); - - b.Navigation("Features"); - - b.Navigation("Segments"); - }); - - modelBuilder.Entity("MicCheck.Api.Segments.Segment", b => - { - b.Navigation("Rules"); - }); - - modelBuilder.Entity("MicCheck.Api.Segments.SegmentRule", b => - { - b.Navigation("ChildRules"); - - b.Navigation("Conditions"); - }); - - modelBuilder.Entity("MicCheck.Api.Users.User", b => - { - b.Navigation("Organizations"); - }); -#pragma warning restore 612, 618 - } - } -} +// +using System; +using MicCheck.Api.Data; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace MicCheck.Api.Migrations +{ + [DbContext(typeof(MicCheckDbContext))] + [Migration("20260416184635_AddOrganizationUserNavigation")] + partial class AddOrganizationUserNavigation + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "10.0.5") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("FeatureTags", b => + { + b.Property("FeatureId") + .HasColumnType("integer"); + + b.Property("TagsId") + .HasColumnType("integer"); + + b.HasKey("FeatureId", "TagsId"); + + b.HasIndex("TagsId"); + + b.ToTable("FeatureTags"); + }); + + modelBuilder.Entity("MicCheck.Api.Common.Security.ApiKeys.ApiKey", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("ExpiresAt") + .HasColumnType("timestamp with time zone"); + + b.Property("IsActive") + .HasColumnType("boolean"); + + b.Property("Key") + .IsRequired() + .HasMaxLength(512) + .HasColumnType("character varying(512)"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("OrganizationId") + .HasColumnType("integer"); + + b.Property("Prefix") + .IsRequired() + .HasMaxLength(8) + .HasColumnType("character varying(8)"); + + b.HasKey("Id"); + + b.HasIndex("Key") + .IsUnique(); + + b.HasIndex("OrganizationId"); + + b.ToTable("ApiKeys"); + }); + + modelBuilder.Entity("MicCheck.Api.Audit.AuditLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Action") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("character varying(50)"); + + b.Property("ActorUserId") + .HasColumnType("integer"); + + b.Property("Changes") + .HasColumnType("text"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("EnvironmentId") + .HasColumnType("integer"); + + b.Property("OrganizationId") + .HasColumnType("integer"); + + b.Property("ProjectId") + .HasColumnType("integer"); + + b.Property("ResourceId") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("ResourceType") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.HasKey("Id"); + + b.HasIndex("OrganizationId", "CreatedAt"); + + b.ToTable("AuditLogs"); + }); + + modelBuilder.Entity("MicCheck.Api.Common.Security.Authorization.UserProjectPermission", b => + { + b.Property("UserId") + .HasColumnType("integer"); + + b.Property("ProjectId") + .HasColumnType("integer"); + + b.Property("IsAdmin") + .HasColumnType("boolean"); + + b.Property("Permissions") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("UserId", "ProjectId"); + + b.ToTable("UserProjectPermissions"); + }); + + modelBuilder.Entity("MicCheck.Api.Environments.Environment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ApiKey") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("ProjectId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("ApiKey") + .IsUnique(); + + b.HasIndex("ProjectId"); + + b.ToTable("Environments"); + }); + + modelBuilder.Entity("MicCheck.Api.Features.Feature", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("DefaultEnabled") + .HasColumnType("boolean"); + + b.Property("Description") + .HasMaxLength(2000) + .HasColumnType("character varying(2000)"); + + b.Property("InitialValue") + .HasMaxLength(20000) + .HasColumnType("character varying(20000)"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(150) + .HasColumnType("character varying(150)"); + + b.Property("ProjectId") + .HasColumnType("integer"); + + b.Property("Type") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("ProjectId", "Name") + .IsUnique(); + + b.ToTable("Features"); + }); + + modelBuilder.Entity("MicCheck.Api.Features.FeatureSegment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("EnvironmentId") + .HasColumnType("integer"); + + b.Property("FeatureId") + .HasColumnType("integer"); + + b.Property("Priority") + .HasColumnType("integer"); + + b.Property("SegmentId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.ToTable("FeatureSegments"); + }); + + modelBuilder.Entity("MicCheck.Api.Features.FeatureState", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Enabled") + .HasColumnType("boolean"); + + b.Property("EnvironmentId") + .HasColumnType("integer"); + + b.Property("FeatureId") + .HasColumnType("integer"); + + b.Property("FeatureSegmentId") + .HasColumnType("integer"); + + b.Property("IdentityId") + .HasColumnType("integer"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Value") + .HasMaxLength(20000) + .HasColumnType("character varying(20000)"); + + b.Property("Version") + .IsConcurrencyToken() + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("EnvironmentId"); + + b.HasIndex("FeatureSegmentId") + .IsUnique(); + + b.HasIndex("IdentityId"); + + b.HasIndex("FeatureId", "EnvironmentId", "IdentityId") + .IsUnique(); + + b.ToTable("FeatureStates"); + }); + + modelBuilder.Entity("MicCheck.Api.Features.Tag", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Color") + .IsRequired() + .HasMaxLength(20) + .HasColumnType("character varying(20)"); + + b.Property("Label") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("ProjectId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("ProjectId"); + + b.ToTable("Tags"); + }); + + modelBuilder.Entity("MicCheck.Api.Identities.Identity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("EnvironmentId") + .HasColumnType("integer"); + + b.Property("Identifier") + .IsRequired() + .HasMaxLength(2000) + .HasColumnType("character varying(2000)"); + + b.HasKey("Id"); + + b.HasIndex("EnvironmentId", "Identifier") + .IsUnique(); + + b.ToTable("Identities"); + }); + + modelBuilder.Entity("MicCheck.Api.Identities.IdentityTrait", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("IdentityId") + .HasColumnType("integer"); + + b.Property("Key") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("Value") + .IsRequired() + .HasMaxLength(2000) + .HasColumnType("character varying(2000)"); + + b.Property("ValueType") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("IdentityId", "Key") + .IsUnique(); + + b.ToTable("IdentityTraits"); + }); + + modelBuilder.Entity("MicCheck.Api.Organizations.Organization", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.HasKey("Id"); + + b.ToTable("Organizations"); + }); + + modelBuilder.Entity("MicCheck.Api.Organizations.OrganizationUser", b => + { + b.Property("OrganizationId") + .HasColumnType("integer"); + + b.Property("UserId") + .HasColumnType("integer"); + + b.Property("Role") + .HasColumnType("integer"); + + b.HasKey("OrganizationId", "UserId"); + + b.HasIndex("UserId"); + + b.ToTable("OrganizationUsers"); + }); + + modelBuilder.Entity("MicCheck.Api.Projects.Project", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("HideDisabledFlags") + .HasColumnType("boolean"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("OrganizationId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("OrganizationId"); + + b.ToTable("Projects"); + }); + + modelBuilder.Entity("MicCheck.Api.Segments.Segment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("ProjectId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("ProjectId"); + + b.ToTable("Segments"); + }); + + modelBuilder.Entity("MicCheck.Api.Segments.SegmentCondition", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Operator") + .HasColumnType("integer"); + + b.Property("Property") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("RuleId") + .HasColumnType("integer"); + + b.Property("Value") + .IsRequired() + .HasMaxLength(1000) + .HasColumnType("character varying(1000)"); + + b.HasKey("Id"); + + b.HasIndex("RuleId"); + + b.ToTable("SegmentConditions"); + }); + + modelBuilder.Entity("MicCheck.Api.Segments.SegmentRule", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ParentRuleId") + .HasColumnType("integer"); + + b.Property("SegmentId") + .HasColumnType("integer"); + + b.Property("Type") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("ParentRuleId"); + + b.HasIndex("SegmentId"); + + b.ToTable("SegmentRules"); + }); + + modelBuilder.Entity("MicCheck.Api.Users.RefreshToken", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("ExpiresAt") + .HasColumnType("timestamp with time zone"); + + b.Property("IsRevoked") + .HasColumnType("boolean"); + + b.Property("Token") + .IsRequired() + .HasMaxLength(512) + .HasColumnType("character varying(512)"); + + b.Property("UserId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("Token") + .IsUnique(); + + b.HasIndex("UserId"); + + b.ToTable("RefreshTokens"); + }); + + modelBuilder.Entity("MicCheck.Api.Users.User", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Email") + .IsRequired() + .HasMaxLength(500) + .HasColumnType("character varying(500)"); + + b.Property("FirstName") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("IsActive") + .HasColumnType("boolean"); + + b.Property("IsTwoFactorEnabled") + .HasColumnType("boolean"); + + b.Property("LastLoginAt") + .HasColumnType("timestamp with time zone"); + + b.Property("LastName") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("PasswordHash") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("Email") + .IsUnique(); + + b.ToTable("Users"); + }); + + modelBuilder.Entity("MicCheck.Api.Webhooks.Webhook", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Enabled") + .HasColumnType("boolean"); + + b.Property("EnvironmentId") + .HasColumnType("integer"); + + b.Property("OrganizationId") + .HasColumnType("integer"); + + b.Property("Scope") + .HasColumnType("integer"); + + b.Property("Secret") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("Url") + .IsRequired() + .HasMaxLength(500) + .HasColumnType("character varying(500)"); + + b.HasKey("Id"); + + b.HasIndex("EnvironmentId"); + + b.ToTable("Webhooks"); + }); + + modelBuilder.Entity("MicCheck.Api.Webhooks.WebhookDeliveryLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AttemptNumber") + .HasColumnType("integer"); + + b.Property("AttemptedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Duration") + .HasColumnType("interval"); + + b.Property("ErrorMessage") + .HasColumnType("text"); + + b.Property("EventType") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("PayloadJson") + .IsRequired() + .HasColumnType("text"); + + b.Property("ResponseBody") + .HasColumnType("text"); + + b.Property("ResponseStatusCode") + .HasColumnType("integer"); + + b.Property("Success") + .HasColumnType("boolean"); + + b.Property("WebhookId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("WebhookId"); + + b.ToTable("WebhookDeliveryLogs"); + }); + + modelBuilder.Entity("FeatureTags", b => + { + b.HasOne("MicCheck.Api.Features.Feature", null) + .WithMany() + .HasForeignKey("FeatureId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("MicCheck.Api.Features.Tag", null) + .WithMany() + .HasForeignKey("TagsId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("MicCheck.Api.Common.Security.ApiKeys.ApiKey", b => + { + b.HasOne("MicCheck.Api.Organizations.Organization", null) + .WithMany("ApiKeys") + .HasForeignKey("OrganizationId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("MicCheck.Api.Environments.Environment", b => + { + b.HasOne("MicCheck.Api.Projects.Project", null) + .WithMany("Environments") + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("MicCheck.Api.Features.Feature", b => + { + b.HasOne("MicCheck.Api.Projects.Project", null) + .WithMany("Features") + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("MicCheck.Api.Features.FeatureState", b => + { + b.HasOne("MicCheck.Api.Environments.Environment", null) + .WithMany("FeatureStates") + .HasForeignKey("EnvironmentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("MicCheck.Api.Features.Feature", null) + .WithMany("FeatureStates") + .HasForeignKey("FeatureId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("MicCheck.Api.Features.FeatureSegment", null) + .WithOne("FeatureState") + .HasForeignKey("MicCheck.Api.Features.FeatureState", "FeatureSegmentId") + .OnDelete(DeleteBehavior.SetNull); + + b.HasOne("MicCheck.Api.Identities.Identity", null) + .WithMany("FeatureStateOverrides") + .HasForeignKey("IdentityId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("MicCheck.Api.Features.Tag", b => + { + b.HasOne("MicCheck.Api.Projects.Project", null) + .WithMany() + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("MicCheck.Api.Identities.IdentityTrait", b => + { + b.HasOne("MicCheck.Api.Identities.Identity", null) + .WithMany("Traits") + .HasForeignKey("IdentityId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("MicCheck.Api.Organizations.OrganizationUser", b => + { + b.HasOne("MicCheck.Api.Organizations.Organization", null) + .WithMany("Members") + .HasForeignKey("OrganizationId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("MicCheck.Api.Users.User", "User") + .WithMany("Organizations") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("MicCheck.Api.Projects.Project", b => + { + b.HasOne("MicCheck.Api.Organizations.Organization", null) + .WithMany("Projects") + .HasForeignKey("OrganizationId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("MicCheck.Api.Segments.Segment", b => + { + b.HasOne("MicCheck.Api.Projects.Project", null) + .WithMany("Segments") + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("MicCheck.Api.Segments.SegmentCondition", b => + { + b.HasOne("MicCheck.Api.Segments.SegmentRule", null) + .WithMany("Conditions") + .HasForeignKey("RuleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("MicCheck.Api.Segments.SegmentRule", b => + { + b.HasOne("MicCheck.Api.Segments.SegmentRule", null) + .WithMany("ChildRules") + .HasForeignKey("ParentRuleId") + .OnDelete(DeleteBehavior.NoAction); + + b.HasOne("MicCheck.Api.Segments.Segment", null) + .WithMany("Rules") + .HasForeignKey("SegmentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("MicCheck.Api.Users.RefreshToken", b => + { + b.HasOne("MicCheck.Api.Users.User", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("MicCheck.Api.Environments.Environment", b => + { + b.Navigation("FeatureStates"); + }); + + modelBuilder.Entity("MicCheck.Api.Features.Feature", b => + { + b.Navigation("FeatureStates"); + }); + + modelBuilder.Entity("MicCheck.Api.Features.FeatureSegment", b => + { + b.Navigation("FeatureState"); + }); + + modelBuilder.Entity("MicCheck.Api.Identities.Identity", b => + { + b.Navigation("FeatureStateOverrides"); + + b.Navigation("Traits"); + }); + + modelBuilder.Entity("MicCheck.Api.Organizations.Organization", b => + { + b.Navigation("ApiKeys"); + + b.Navigation("Members"); + + b.Navigation("Projects"); + }); + + modelBuilder.Entity("MicCheck.Api.Projects.Project", b => + { + b.Navigation("Environments"); + + b.Navigation("Features"); + + b.Navigation("Segments"); + }); + + modelBuilder.Entity("MicCheck.Api.Segments.Segment", b => + { + b.Navigation("Rules"); + }); + + modelBuilder.Entity("MicCheck.Api.Segments.SegmentRule", b => + { + b.Navigation("ChildRules"); + + b.Navigation("Conditions"); + }); + + modelBuilder.Entity("MicCheck.Api.Users.User", b => + { + b.Navigation("Organizations"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/src/api/MicCheck.Api/Migrations/20260416184635_AddOrganizationUserNavigation.cs b/src/api/MicCheck.Api/Migrations/20260416184635_AddOrganizationUserNavigation.cs old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/Migrations/20260417015326_AddOrganizationInviteToken.Designer.cs b/src/api/MicCheck.Api/Migrations/20260417015326_AddOrganizationInviteToken.Designer.cs old mode 100644 new mode 100755 index e00d195..60778c9 --- a/src/api/MicCheck.Api/Migrations/20260417015326_AddOrganizationInviteToken.Designer.cs +++ b/src/api/MicCheck.Api/Migrations/20260417015326_AddOrganizationInviteToken.Designer.cs @@ -1,936 +1,936 @@ -// -using System; -using MicCheck.Api.Data; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; - -#nullable disable - -namespace MicCheck.Api.Migrations -{ - [DbContext(typeof(MicCheckDbContext))] - [Migration("20260417015326_AddOrganizationInviteToken")] - partial class AddOrganizationInviteToken - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "10.0.5") - .HasAnnotation("Relational:MaxIdentifierLength", 63); - - NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); - - modelBuilder.Entity("FeatureTags", b => - { - b.Property("FeatureId") - .HasColumnType("integer"); - - b.Property("TagsId") - .HasColumnType("integer"); - - b.HasKey("FeatureId", "TagsId"); - - b.HasIndex("TagsId"); - - b.ToTable("FeatureTags"); - }); - - modelBuilder.Entity("MicCheck.Api.Common.Security.ApiKeys.ApiKey", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CreatedAt") - .HasColumnType("timestamp with time zone"); - - b.Property("ExpiresAt") - .HasColumnType("timestamp with time zone"); - - b.Property("IsActive") - .HasColumnType("boolean"); - - b.Property("Key") - .IsRequired() - .HasMaxLength(512) - .HasColumnType("character varying(512)"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(200) - .HasColumnType("character varying(200)"); - - b.Property("OrganizationId") - .HasColumnType("integer"); - - b.Property("Prefix") - .IsRequired() - .HasMaxLength(8) - .HasColumnType("character varying(8)"); - - b.HasKey("Id"); - - b.HasIndex("Key") - .IsUnique(); - - b.HasIndex("OrganizationId"); - - b.ToTable("ApiKeys"); - }); - - modelBuilder.Entity("MicCheck.Api.Audit.AuditLog", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("Action") - .IsRequired() - .HasMaxLength(50) - .HasColumnType("character varying(50)"); - - b.Property("ActorUserId") - .HasColumnType("integer"); - - b.Property("Changes") - .HasColumnType("text"); - - b.Property("CreatedAt") - .HasColumnType("timestamp with time zone"); - - b.Property("EnvironmentId") - .HasColumnType("integer"); - - b.Property("OrganizationId") - .HasColumnType("integer"); - - b.Property("ProjectId") - .HasColumnType("integer"); - - b.Property("ResourceId") - .IsRequired() - .HasMaxLength(100) - .HasColumnType("character varying(100)"); - - b.Property("ResourceType") - .IsRequired() - .HasMaxLength(100) - .HasColumnType("character varying(100)"); - - b.HasKey("Id"); - - b.HasIndex("OrganizationId", "CreatedAt"); - - b.ToTable("AuditLogs"); - }); - - modelBuilder.Entity("MicCheck.Api.Common.Security.Authorization.UserProjectPermission", b => - { - b.Property("UserId") - .HasColumnType("integer"); - - b.Property("ProjectId") - .HasColumnType("integer"); - - b.Property("IsAdmin") - .HasColumnType("boolean"); - - b.Property("Permissions") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("UserId", "ProjectId"); - - b.ToTable("UserProjectPermissions"); - }); - - modelBuilder.Entity("MicCheck.Api.Environments.Environment", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("ApiKey") - .IsRequired() - .HasMaxLength(100) - .HasColumnType("character varying(100)"); - - b.Property("CreatedAt") - .HasColumnType("timestamp with time zone"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(200) - .HasColumnType("character varying(200)"); - - b.Property("ProjectId") - .HasColumnType("integer"); - - b.HasKey("Id"); - - b.HasIndex("ApiKey") - .IsUnique(); - - b.HasIndex("ProjectId"); - - b.ToTable("Environments"); - }); - - modelBuilder.Entity("MicCheck.Api.Features.Feature", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CreatedAt") - .HasColumnType("timestamp with time zone"); - - b.Property("DefaultEnabled") - .HasColumnType("boolean"); - - b.Property("Description") - .HasMaxLength(2000) - .HasColumnType("character varying(2000)"); - - b.Property("InitialValue") - .HasMaxLength(20000) - .HasColumnType("character varying(20000)"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(150) - .HasColumnType("character varying(150)"); - - b.Property("ProjectId") - .HasColumnType("integer"); - - b.Property("Type") - .HasColumnType("integer"); - - b.HasKey("Id"); - - b.HasIndex("ProjectId", "Name") - .IsUnique(); - - b.ToTable("Features"); - }); - - modelBuilder.Entity("MicCheck.Api.Features.FeatureSegment", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("EnvironmentId") - .HasColumnType("integer"); - - b.Property("FeatureId") - .HasColumnType("integer"); - - b.Property("Priority") - .HasColumnType("integer"); - - b.Property("SegmentId") - .HasColumnType("integer"); - - b.HasKey("Id"); - - b.ToTable("FeatureSegments"); - }); - - modelBuilder.Entity("MicCheck.Api.Features.FeatureState", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CreatedAt") - .HasColumnType("timestamp with time zone"); - - b.Property("Enabled") - .HasColumnType("boolean"); - - b.Property("EnvironmentId") - .HasColumnType("integer"); - - b.Property("FeatureId") - .HasColumnType("integer"); - - b.Property("FeatureSegmentId") - .HasColumnType("integer"); - - b.Property("IdentityId") - .HasColumnType("integer"); - - b.Property("UpdatedAt") - .HasColumnType("timestamp with time zone"); - - b.Property("Value") - .HasMaxLength(20000) - .HasColumnType("character varying(20000)"); - - b.Property("Version") - .IsConcurrencyToken() - .HasColumnType("integer"); - - b.HasKey("Id"); - - b.HasIndex("EnvironmentId"); - - b.HasIndex("FeatureSegmentId") - .IsUnique(); - - b.HasIndex("IdentityId"); - - b.HasIndex("FeatureId", "EnvironmentId", "IdentityId") - .IsUnique(); - - b.ToTable("FeatureStates"); - }); - - modelBuilder.Entity("MicCheck.Api.Features.Tag", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("Color") - .IsRequired() - .HasMaxLength(20) - .HasColumnType("character varying(20)"); - - b.Property("Label") - .IsRequired() - .HasMaxLength(200) - .HasColumnType("character varying(200)"); - - b.Property("ProjectId") - .HasColumnType("integer"); - - b.HasKey("Id"); - - b.HasIndex("ProjectId"); - - b.ToTable("Tags"); - }); - - modelBuilder.Entity("MicCheck.Api.Identities.Identity", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CreatedAt") - .HasColumnType("timestamp with time zone"); - - b.Property("EnvironmentId") - .HasColumnType("integer"); - - b.Property("Identifier") - .IsRequired() - .HasMaxLength(2000) - .HasColumnType("character varying(2000)"); - - b.HasKey("Id"); - - b.HasIndex("EnvironmentId", "Identifier") - .IsUnique(); - - b.ToTable("Identities"); - }); - - modelBuilder.Entity("MicCheck.Api.Identities.IdentityTrait", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("IdentityId") - .HasColumnType("integer"); - - b.Property("Key") - .IsRequired() - .HasMaxLength(200) - .HasColumnType("character varying(200)"); - - b.Property("Value") - .IsRequired() - .HasMaxLength(2000) - .HasColumnType("character varying(2000)"); - - b.Property("ValueType") - .HasColumnType("integer"); - - b.HasKey("Id"); - - b.HasIndex("IdentityId", "Key") - .IsUnique(); - - b.ToTable("IdentityTraits"); - }); - - modelBuilder.Entity("MicCheck.Api.Organizations.Organization", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CreatedAt") - .HasColumnType("timestamp with time zone"); - - b.Property("InviteToken") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(200) - .HasColumnType("character varying(200)"); - - b.HasKey("Id"); - - b.HasIndex("InviteToken") - .IsUnique() - .HasFilter("\"InviteToken\" IS NOT NULL"); - - b.ToTable("Organizations"); - }); - - modelBuilder.Entity("MicCheck.Api.Organizations.OrganizationUser", b => - { - b.Property("OrganizationId") - .HasColumnType("integer"); - - b.Property("UserId") - .HasColumnType("integer"); - - b.Property("Role") - .HasColumnType("integer"); - - b.HasKey("OrganizationId", "UserId"); - - b.HasIndex("UserId"); - - b.ToTable("OrganizationUsers"); - }); - - modelBuilder.Entity("MicCheck.Api.Projects.Project", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CreatedAt") - .HasColumnType("timestamp with time zone"); - - b.Property("HideDisabledFlags") - .HasColumnType("boolean"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(200) - .HasColumnType("character varying(200)"); - - b.Property("OrganizationId") - .HasColumnType("integer"); - - b.HasKey("Id"); - - b.HasIndex("OrganizationId"); - - b.ToTable("Projects"); - }); - - modelBuilder.Entity("MicCheck.Api.Segments.Segment", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CreatedAt") - .HasColumnType("timestamp with time zone"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(200) - .HasColumnType("character varying(200)"); - - b.Property("ProjectId") - .HasColumnType("integer"); - - b.HasKey("Id"); - - b.HasIndex("ProjectId"); - - b.ToTable("Segments"); - }); - - modelBuilder.Entity("MicCheck.Api.Segments.SegmentCondition", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("Operator") - .HasColumnType("integer"); - - b.Property("Property") - .IsRequired() - .HasMaxLength(200) - .HasColumnType("character varying(200)"); - - b.Property("RuleId") - .HasColumnType("integer"); - - b.Property("Value") - .IsRequired() - .HasMaxLength(1000) - .HasColumnType("character varying(1000)"); - - b.HasKey("Id"); - - b.HasIndex("RuleId"); - - b.ToTable("SegmentConditions"); - }); - - modelBuilder.Entity("MicCheck.Api.Segments.SegmentRule", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("ParentRuleId") - .HasColumnType("integer"); - - b.Property("SegmentId") - .HasColumnType("integer"); - - b.Property("Type") - .HasColumnType("integer"); - - b.HasKey("Id"); - - b.HasIndex("ParentRuleId"); - - b.HasIndex("SegmentId"); - - b.ToTable("SegmentRules"); - }); - - modelBuilder.Entity("MicCheck.Api.Users.RefreshToken", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CreatedAt") - .HasColumnType("timestamp with time zone"); - - b.Property("ExpiresAt") - .HasColumnType("timestamp with time zone"); - - b.Property("IsRevoked") - .HasColumnType("boolean"); - - b.Property("Token") - .IsRequired() - .HasMaxLength(512) - .HasColumnType("character varying(512)"); - - b.Property("UserId") - .HasColumnType("integer"); - - b.HasKey("Id"); - - b.HasIndex("Token") - .IsUnique(); - - b.HasIndex("UserId"); - - b.ToTable("RefreshTokens"); - }); - - modelBuilder.Entity("MicCheck.Api.Users.User", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CreatedAt") - .HasColumnType("timestamp with time zone"); - - b.Property("Email") - .IsRequired() - .HasMaxLength(500) - .HasColumnType("character varying(500)"); - - b.Property("FirstName") - .IsRequired() - .HasMaxLength(200) - .HasColumnType("character varying(200)"); - - b.Property("IsActive") - .HasColumnType("boolean"); - - b.Property("IsTwoFactorEnabled") - .HasColumnType("boolean"); - - b.Property("LastLoginAt") - .HasColumnType("timestamp with time zone"); - - b.Property("LastName") - .IsRequired() - .HasMaxLength(200) - .HasColumnType("character varying(200)"); - - b.Property("PasswordHash") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("Id"); - - b.HasIndex("Email") - .IsUnique(); - - b.ToTable("Users"); - }); - - modelBuilder.Entity("MicCheck.Api.Webhooks.Webhook", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CreatedAt") - .HasColumnType("timestamp with time zone"); - - b.Property("Enabled") - .HasColumnType("boolean"); - - b.Property("EnvironmentId") - .HasColumnType("integer"); - - b.Property("OrganizationId") - .HasColumnType("integer"); - - b.Property("Scope") - .HasColumnType("integer"); - - b.Property("Secret") - .HasMaxLength(200) - .HasColumnType("character varying(200)"); - - b.Property("Url") - .IsRequired() - .HasMaxLength(500) - .HasColumnType("character varying(500)"); - - b.HasKey("Id"); - - b.HasIndex("EnvironmentId"); - - b.ToTable("Webhooks"); - }); - - modelBuilder.Entity("MicCheck.Api.Webhooks.WebhookDeliveryLog", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("AttemptNumber") - .HasColumnType("integer"); - - b.Property("AttemptedAt") - .HasColumnType("timestamp with time zone"); - - b.Property("Duration") - .HasColumnType("interval"); - - b.Property("ErrorMessage") - .HasColumnType("text"); - - b.Property("EventType") - .IsRequired() - .HasMaxLength(100) - .HasColumnType("character varying(100)"); - - b.Property("PayloadJson") - .IsRequired() - .HasColumnType("text"); - - b.Property("ResponseBody") - .HasColumnType("text"); - - b.Property("ResponseStatusCode") - .HasColumnType("integer"); - - b.Property("Success") - .HasColumnType("boolean"); - - b.Property("WebhookId") - .HasColumnType("integer"); - - b.HasKey("Id"); - - b.HasIndex("WebhookId"); - - b.ToTable("WebhookDeliveryLogs"); - }); - - modelBuilder.Entity("FeatureTags", b => - { - b.HasOne("MicCheck.Api.Features.Feature", null) - .WithMany() - .HasForeignKey("FeatureId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MicCheck.Api.Features.Tag", null) - .WithMany() - .HasForeignKey("TagsId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("MicCheck.Api.Common.Security.ApiKeys.ApiKey", b => - { - b.HasOne("MicCheck.Api.Organizations.Organization", null) - .WithMany("ApiKeys") - .HasForeignKey("OrganizationId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("MicCheck.Api.Environments.Environment", b => - { - b.HasOne("MicCheck.Api.Projects.Project", null) - .WithMany("Environments") - .HasForeignKey("ProjectId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("MicCheck.Api.Features.Feature", b => - { - b.HasOne("MicCheck.Api.Projects.Project", null) - .WithMany("Features") - .HasForeignKey("ProjectId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("MicCheck.Api.Features.FeatureState", b => - { - b.HasOne("MicCheck.Api.Environments.Environment", null) - .WithMany("FeatureStates") - .HasForeignKey("EnvironmentId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MicCheck.Api.Features.Feature", null) - .WithMany("FeatureStates") - .HasForeignKey("FeatureId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MicCheck.Api.Features.FeatureSegment", null) - .WithOne("FeatureState") - .HasForeignKey("MicCheck.Api.Features.FeatureState", "FeatureSegmentId") - .OnDelete(DeleteBehavior.SetNull); - - b.HasOne("MicCheck.Api.Identities.Identity", null) - .WithMany("FeatureStateOverrides") - .HasForeignKey("IdentityId") - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity("MicCheck.Api.Features.Tag", b => - { - b.HasOne("MicCheck.Api.Projects.Project", null) - .WithMany() - .HasForeignKey("ProjectId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("MicCheck.Api.Identities.IdentityTrait", b => - { - b.HasOne("MicCheck.Api.Identities.Identity", null) - .WithMany("Traits") - .HasForeignKey("IdentityId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("MicCheck.Api.Organizations.OrganizationUser", b => - { - b.HasOne("MicCheck.Api.Organizations.Organization", null) - .WithMany("Members") - .HasForeignKey("OrganizationId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MicCheck.Api.Users.User", "User") - .WithMany("Organizations") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MicCheck.Api.Projects.Project", b => - { - b.HasOne("MicCheck.Api.Organizations.Organization", null) - .WithMany("Projects") - .HasForeignKey("OrganizationId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("MicCheck.Api.Segments.Segment", b => - { - b.HasOne("MicCheck.Api.Projects.Project", null) - .WithMany("Segments") - .HasForeignKey("ProjectId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("MicCheck.Api.Segments.SegmentCondition", b => - { - b.HasOne("MicCheck.Api.Segments.SegmentRule", null) - .WithMany("Conditions") - .HasForeignKey("RuleId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("MicCheck.Api.Segments.SegmentRule", b => - { - b.HasOne("MicCheck.Api.Segments.SegmentRule", null) - .WithMany("ChildRules") - .HasForeignKey("ParentRuleId") - .OnDelete(DeleteBehavior.NoAction); - - b.HasOne("MicCheck.Api.Segments.Segment", null) - .WithMany("Rules") - .HasForeignKey("SegmentId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("MicCheck.Api.Users.RefreshToken", b => - { - b.HasOne("MicCheck.Api.Users.User", "User") - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MicCheck.Api.Environments.Environment", b => - { - b.Navigation("FeatureStates"); - }); - - modelBuilder.Entity("MicCheck.Api.Features.Feature", b => - { - b.Navigation("FeatureStates"); - }); - - modelBuilder.Entity("MicCheck.Api.Features.FeatureSegment", b => - { - b.Navigation("FeatureState"); - }); - - modelBuilder.Entity("MicCheck.Api.Identities.Identity", b => - { - b.Navigation("FeatureStateOverrides"); - - b.Navigation("Traits"); - }); - - modelBuilder.Entity("MicCheck.Api.Organizations.Organization", b => - { - b.Navigation("ApiKeys"); - - b.Navigation("Members"); - - b.Navigation("Projects"); - }); - - modelBuilder.Entity("MicCheck.Api.Projects.Project", b => - { - b.Navigation("Environments"); - - b.Navigation("Features"); - - b.Navigation("Segments"); - }); - - modelBuilder.Entity("MicCheck.Api.Segments.Segment", b => - { - b.Navigation("Rules"); - }); - - modelBuilder.Entity("MicCheck.Api.Segments.SegmentRule", b => - { - b.Navigation("ChildRules"); - - b.Navigation("Conditions"); - }); - - modelBuilder.Entity("MicCheck.Api.Users.User", b => - { - b.Navigation("Organizations"); - }); -#pragma warning restore 612, 618 - } - } -} +// +using System; +using MicCheck.Api.Data; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace MicCheck.Api.Migrations +{ + [DbContext(typeof(MicCheckDbContext))] + [Migration("20260417015326_AddOrganizationInviteToken")] + partial class AddOrganizationInviteToken + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "10.0.5") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("FeatureTags", b => + { + b.Property("FeatureId") + .HasColumnType("integer"); + + b.Property("TagsId") + .HasColumnType("integer"); + + b.HasKey("FeatureId", "TagsId"); + + b.HasIndex("TagsId"); + + b.ToTable("FeatureTags"); + }); + + modelBuilder.Entity("MicCheck.Api.Common.Security.ApiKeys.ApiKey", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("ExpiresAt") + .HasColumnType("timestamp with time zone"); + + b.Property("IsActive") + .HasColumnType("boolean"); + + b.Property("Key") + .IsRequired() + .HasMaxLength(512) + .HasColumnType("character varying(512)"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("OrganizationId") + .HasColumnType("integer"); + + b.Property("Prefix") + .IsRequired() + .HasMaxLength(8) + .HasColumnType("character varying(8)"); + + b.HasKey("Id"); + + b.HasIndex("Key") + .IsUnique(); + + b.HasIndex("OrganizationId"); + + b.ToTable("ApiKeys"); + }); + + modelBuilder.Entity("MicCheck.Api.Audit.AuditLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Action") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("character varying(50)"); + + b.Property("ActorUserId") + .HasColumnType("integer"); + + b.Property("Changes") + .HasColumnType("text"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("EnvironmentId") + .HasColumnType("integer"); + + b.Property("OrganizationId") + .HasColumnType("integer"); + + b.Property("ProjectId") + .HasColumnType("integer"); + + b.Property("ResourceId") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("ResourceType") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.HasKey("Id"); + + b.HasIndex("OrganizationId", "CreatedAt"); + + b.ToTable("AuditLogs"); + }); + + modelBuilder.Entity("MicCheck.Api.Common.Security.Authorization.UserProjectPermission", b => + { + b.Property("UserId") + .HasColumnType("integer"); + + b.Property("ProjectId") + .HasColumnType("integer"); + + b.Property("IsAdmin") + .HasColumnType("boolean"); + + b.Property("Permissions") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("UserId", "ProjectId"); + + b.ToTable("UserProjectPermissions"); + }); + + modelBuilder.Entity("MicCheck.Api.Environments.Environment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ApiKey") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("ProjectId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("ApiKey") + .IsUnique(); + + b.HasIndex("ProjectId"); + + b.ToTable("Environments"); + }); + + modelBuilder.Entity("MicCheck.Api.Features.Feature", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("DefaultEnabled") + .HasColumnType("boolean"); + + b.Property("Description") + .HasMaxLength(2000) + .HasColumnType("character varying(2000)"); + + b.Property("InitialValue") + .HasMaxLength(20000) + .HasColumnType("character varying(20000)"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(150) + .HasColumnType("character varying(150)"); + + b.Property("ProjectId") + .HasColumnType("integer"); + + b.Property("Type") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("ProjectId", "Name") + .IsUnique(); + + b.ToTable("Features"); + }); + + modelBuilder.Entity("MicCheck.Api.Features.FeatureSegment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("EnvironmentId") + .HasColumnType("integer"); + + b.Property("FeatureId") + .HasColumnType("integer"); + + b.Property("Priority") + .HasColumnType("integer"); + + b.Property("SegmentId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.ToTable("FeatureSegments"); + }); + + modelBuilder.Entity("MicCheck.Api.Features.FeatureState", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Enabled") + .HasColumnType("boolean"); + + b.Property("EnvironmentId") + .HasColumnType("integer"); + + b.Property("FeatureId") + .HasColumnType("integer"); + + b.Property("FeatureSegmentId") + .HasColumnType("integer"); + + b.Property("IdentityId") + .HasColumnType("integer"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Value") + .HasMaxLength(20000) + .HasColumnType("character varying(20000)"); + + b.Property("Version") + .IsConcurrencyToken() + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("EnvironmentId"); + + b.HasIndex("FeatureSegmentId") + .IsUnique(); + + b.HasIndex("IdentityId"); + + b.HasIndex("FeatureId", "EnvironmentId", "IdentityId") + .IsUnique(); + + b.ToTable("FeatureStates"); + }); + + modelBuilder.Entity("MicCheck.Api.Features.Tag", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Color") + .IsRequired() + .HasMaxLength(20) + .HasColumnType("character varying(20)"); + + b.Property("Label") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("ProjectId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("ProjectId"); + + b.ToTable("Tags"); + }); + + modelBuilder.Entity("MicCheck.Api.Identities.Identity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("EnvironmentId") + .HasColumnType("integer"); + + b.Property("Identifier") + .IsRequired() + .HasMaxLength(2000) + .HasColumnType("character varying(2000)"); + + b.HasKey("Id"); + + b.HasIndex("EnvironmentId", "Identifier") + .IsUnique(); + + b.ToTable("Identities"); + }); + + modelBuilder.Entity("MicCheck.Api.Identities.IdentityTrait", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("IdentityId") + .HasColumnType("integer"); + + b.Property("Key") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("Value") + .IsRequired() + .HasMaxLength(2000) + .HasColumnType("character varying(2000)"); + + b.Property("ValueType") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("IdentityId", "Key") + .IsUnique(); + + b.ToTable("IdentityTraits"); + }); + + modelBuilder.Entity("MicCheck.Api.Organizations.Organization", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("InviteToken") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.HasKey("Id"); + + b.HasIndex("InviteToken") + .IsUnique() + .HasFilter("\"InviteToken\" IS NOT NULL"); + + b.ToTable("Organizations"); + }); + + modelBuilder.Entity("MicCheck.Api.Organizations.OrganizationUser", b => + { + b.Property("OrganizationId") + .HasColumnType("integer"); + + b.Property("UserId") + .HasColumnType("integer"); + + b.Property("Role") + .HasColumnType("integer"); + + b.HasKey("OrganizationId", "UserId"); + + b.HasIndex("UserId"); + + b.ToTable("OrganizationUsers"); + }); + + modelBuilder.Entity("MicCheck.Api.Projects.Project", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("HideDisabledFlags") + .HasColumnType("boolean"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("OrganizationId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("OrganizationId"); + + b.ToTable("Projects"); + }); + + modelBuilder.Entity("MicCheck.Api.Segments.Segment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("ProjectId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("ProjectId"); + + b.ToTable("Segments"); + }); + + modelBuilder.Entity("MicCheck.Api.Segments.SegmentCondition", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Operator") + .HasColumnType("integer"); + + b.Property("Property") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("RuleId") + .HasColumnType("integer"); + + b.Property("Value") + .IsRequired() + .HasMaxLength(1000) + .HasColumnType("character varying(1000)"); + + b.HasKey("Id"); + + b.HasIndex("RuleId"); + + b.ToTable("SegmentConditions"); + }); + + modelBuilder.Entity("MicCheck.Api.Segments.SegmentRule", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ParentRuleId") + .HasColumnType("integer"); + + b.Property("SegmentId") + .HasColumnType("integer"); + + b.Property("Type") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("ParentRuleId"); + + b.HasIndex("SegmentId"); + + b.ToTable("SegmentRules"); + }); + + modelBuilder.Entity("MicCheck.Api.Users.RefreshToken", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("ExpiresAt") + .HasColumnType("timestamp with time zone"); + + b.Property("IsRevoked") + .HasColumnType("boolean"); + + b.Property("Token") + .IsRequired() + .HasMaxLength(512) + .HasColumnType("character varying(512)"); + + b.Property("UserId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("Token") + .IsUnique(); + + b.HasIndex("UserId"); + + b.ToTable("RefreshTokens"); + }); + + modelBuilder.Entity("MicCheck.Api.Users.User", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Email") + .IsRequired() + .HasMaxLength(500) + .HasColumnType("character varying(500)"); + + b.Property("FirstName") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("IsActive") + .HasColumnType("boolean"); + + b.Property("IsTwoFactorEnabled") + .HasColumnType("boolean"); + + b.Property("LastLoginAt") + .HasColumnType("timestamp with time zone"); + + b.Property("LastName") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("PasswordHash") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("Email") + .IsUnique(); + + b.ToTable("Users"); + }); + + modelBuilder.Entity("MicCheck.Api.Webhooks.Webhook", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Enabled") + .HasColumnType("boolean"); + + b.Property("EnvironmentId") + .HasColumnType("integer"); + + b.Property("OrganizationId") + .HasColumnType("integer"); + + b.Property("Scope") + .HasColumnType("integer"); + + b.Property("Secret") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("Url") + .IsRequired() + .HasMaxLength(500) + .HasColumnType("character varying(500)"); + + b.HasKey("Id"); + + b.HasIndex("EnvironmentId"); + + b.ToTable("Webhooks"); + }); + + modelBuilder.Entity("MicCheck.Api.Webhooks.WebhookDeliveryLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AttemptNumber") + .HasColumnType("integer"); + + b.Property("AttemptedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Duration") + .HasColumnType("interval"); + + b.Property("ErrorMessage") + .HasColumnType("text"); + + b.Property("EventType") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("PayloadJson") + .IsRequired() + .HasColumnType("text"); + + b.Property("ResponseBody") + .HasColumnType("text"); + + b.Property("ResponseStatusCode") + .HasColumnType("integer"); + + b.Property("Success") + .HasColumnType("boolean"); + + b.Property("WebhookId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("WebhookId"); + + b.ToTable("WebhookDeliveryLogs"); + }); + + modelBuilder.Entity("FeatureTags", b => + { + b.HasOne("MicCheck.Api.Features.Feature", null) + .WithMany() + .HasForeignKey("FeatureId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("MicCheck.Api.Features.Tag", null) + .WithMany() + .HasForeignKey("TagsId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("MicCheck.Api.Common.Security.ApiKeys.ApiKey", b => + { + b.HasOne("MicCheck.Api.Organizations.Organization", null) + .WithMany("ApiKeys") + .HasForeignKey("OrganizationId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("MicCheck.Api.Environments.Environment", b => + { + b.HasOne("MicCheck.Api.Projects.Project", null) + .WithMany("Environments") + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("MicCheck.Api.Features.Feature", b => + { + b.HasOne("MicCheck.Api.Projects.Project", null) + .WithMany("Features") + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("MicCheck.Api.Features.FeatureState", b => + { + b.HasOne("MicCheck.Api.Environments.Environment", null) + .WithMany("FeatureStates") + .HasForeignKey("EnvironmentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("MicCheck.Api.Features.Feature", null) + .WithMany("FeatureStates") + .HasForeignKey("FeatureId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("MicCheck.Api.Features.FeatureSegment", null) + .WithOne("FeatureState") + .HasForeignKey("MicCheck.Api.Features.FeatureState", "FeatureSegmentId") + .OnDelete(DeleteBehavior.SetNull); + + b.HasOne("MicCheck.Api.Identities.Identity", null) + .WithMany("FeatureStateOverrides") + .HasForeignKey("IdentityId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("MicCheck.Api.Features.Tag", b => + { + b.HasOne("MicCheck.Api.Projects.Project", null) + .WithMany() + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("MicCheck.Api.Identities.IdentityTrait", b => + { + b.HasOne("MicCheck.Api.Identities.Identity", null) + .WithMany("Traits") + .HasForeignKey("IdentityId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("MicCheck.Api.Organizations.OrganizationUser", b => + { + b.HasOne("MicCheck.Api.Organizations.Organization", null) + .WithMany("Members") + .HasForeignKey("OrganizationId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("MicCheck.Api.Users.User", "User") + .WithMany("Organizations") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("MicCheck.Api.Projects.Project", b => + { + b.HasOne("MicCheck.Api.Organizations.Organization", null) + .WithMany("Projects") + .HasForeignKey("OrganizationId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("MicCheck.Api.Segments.Segment", b => + { + b.HasOne("MicCheck.Api.Projects.Project", null) + .WithMany("Segments") + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("MicCheck.Api.Segments.SegmentCondition", b => + { + b.HasOne("MicCheck.Api.Segments.SegmentRule", null) + .WithMany("Conditions") + .HasForeignKey("RuleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("MicCheck.Api.Segments.SegmentRule", b => + { + b.HasOne("MicCheck.Api.Segments.SegmentRule", null) + .WithMany("ChildRules") + .HasForeignKey("ParentRuleId") + .OnDelete(DeleteBehavior.NoAction); + + b.HasOne("MicCheck.Api.Segments.Segment", null) + .WithMany("Rules") + .HasForeignKey("SegmentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("MicCheck.Api.Users.RefreshToken", b => + { + b.HasOne("MicCheck.Api.Users.User", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("MicCheck.Api.Environments.Environment", b => + { + b.Navigation("FeatureStates"); + }); + + modelBuilder.Entity("MicCheck.Api.Features.Feature", b => + { + b.Navigation("FeatureStates"); + }); + + modelBuilder.Entity("MicCheck.Api.Features.FeatureSegment", b => + { + b.Navigation("FeatureState"); + }); + + modelBuilder.Entity("MicCheck.Api.Identities.Identity", b => + { + b.Navigation("FeatureStateOverrides"); + + b.Navigation("Traits"); + }); + + modelBuilder.Entity("MicCheck.Api.Organizations.Organization", b => + { + b.Navigation("ApiKeys"); + + b.Navigation("Members"); + + b.Navigation("Projects"); + }); + + modelBuilder.Entity("MicCheck.Api.Projects.Project", b => + { + b.Navigation("Environments"); + + b.Navigation("Features"); + + b.Navigation("Segments"); + }); + + modelBuilder.Entity("MicCheck.Api.Segments.Segment", b => + { + b.Navigation("Rules"); + }); + + modelBuilder.Entity("MicCheck.Api.Segments.SegmentRule", b => + { + b.Navigation("ChildRules"); + + b.Navigation("Conditions"); + }); + + modelBuilder.Entity("MicCheck.Api.Users.User", b => + { + b.Navigation("Organizations"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/src/api/MicCheck.Api/Migrations/20260417015326_AddOrganizationInviteToken.cs b/src/api/MicCheck.Api/Migrations/20260417015326_AddOrganizationInviteToken.cs old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/Migrations/MicCheckDbContextModelSnapshot.cs b/src/api/MicCheck.Api/Migrations/MicCheckDbContextModelSnapshot.cs old mode 100644 new mode 100755 index 008514d..43c19b5 --- a/src/api/MicCheck.Api/Migrations/MicCheckDbContextModelSnapshot.cs +++ b/src/api/MicCheck.Api/Migrations/MicCheckDbContextModelSnapshot.cs @@ -1,933 +1,933 @@ -// -using System; -using MicCheck.Api.Data; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; - -#nullable disable - -namespace MicCheck.Api.Migrations -{ - [DbContext(typeof(MicCheckDbContext))] - partial class MicCheckDbContextModelSnapshot : ModelSnapshot - { - protected override void BuildModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "10.0.5") - .HasAnnotation("Relational:MaxIdentifierLength", 63); - - NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); - - modelBuilder.Entity("FeatureTags", b => - { - b.Property("FeatureId") - .HasColumnType("integer"); - - b.Property("TagsId") - .HasColumnType("integer"); - - b.HasKey("FeatureId", "TagsId"); - - b.HasIndex("TagsId"); - - b.ToTable("FeatureTags"); - }); - - modelBuilder.Entity("MicCheck.Api.Common.Security.ApiKeys.ApiKey", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CreatedAt") - .HasColumnType("timestamp with time zone"); - - b.Property("ExpiresAt") - .HasColumnType("timestamp with time zone"); - - b.Property("IsActive") - .HasColumnType("boolean"); - - b.Property("Key") - .IsRequired() - .HasMaxLength(512) - .HasColumnType("character varying(512)"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(200) - .HasColumnType("character varying(200)"); - - b.Property("OrganizationId") - .HasColumnType("integer"); - - b.Property("Prefix") - .IsRequired() - .HasMaxLength(8) - .HasColumnType("character varying(8)"); - - b.HasKey("Id"); - - b.HasIndex("Key") - .IsUnique(); - - b.HasIndex("OrganizationId"); - - b.ToTable("ApiKeys"); - }); - - modelBuilder.Entity("MicCheck.Api.Audit.AuditLog", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("Action") - .IsRequired() - .HasMaxLength(50) - .HasColumnType("character varying(50)"); - - b.Property("ActorUserId") - .HasColumnType("integer"); - - b.Property("Changes") - .HasColumnType("text"); - - b.Property("CreatedAt") - .HasColumnType("timestamp with time zone"); - - b.Property("EnvironmentId") - .HasColumnType("integer"); - - b.Property("OrganizationId") - .HasColumnType("integer"); - - b.Property("ProjectId") - .HasColumnType("integer"); - - b.Property("ResourceId") - .IsRequired() - .HasMaxLength(100) - .HasColumnType("character varying(100)"); - - b.Property("ResourceType") - .IsRequired() - .HasMaxLength(100) - .HasColumnType("character varying(100)"); - - b.HasKey("Id"); - - b.HasIndex("OrganizationId", "CreatedAt"); - - b.ToTable("AuditLogs"); - }); - - modelBuilder.Entity("MicCheck.Api.Common.Security.Authorization.UserProjectPermission", b => - { - b.Property("UserId") - .HasColumnType("integer"); - - b.Property("ProjectId") - .HasColumnType("integer"); - - b.Property("IsAdmin") - .HasColumnType("boolean"); - - b.Property("Permissions") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("UserId", "ProjectId"); - - b.ToTable("UserProjectPermissions"); - }); - - modelBuilder.Entity("MicCheck.Api.Environments.Environment", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("ApiKey") - .IsRequired() - .HasMaxLength(100) - .HasColumnType("character varying(100)"); - - b.Property("CreatedAt") - .HasColumnType("timestamp with time zone"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(200) - .HasColumnType("character varying(200)"); - - b.Property("ProjectId") - .HasColumnType("integer"); - - b.HasKey("Id"); - - b.HasIndex("ApiKey") - .IsUnique(); - - b.HasIndex("ProjectId"); - - b.ToTable("Environments"); - }); - - modelBuilder.Entity("MicCheck.Api.Features.Feature", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CreatedAt") - .HasColumnType("timestamp with time zone"); - - b.Property("DefaultEnabled") - .HasColumnType("boolean"); - - b.Property("Description") - .HasMaxLength(2000) - .HasColumnType("character varying(2000)"); - - b.Property("InitialValue") - .HasMaxLength(20000) - .HasColumnType("character varying(20000)"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(150) - .HasColumnType("character varying(150)"); - - b.Property("ProjectId") - .HasColumnType("integer"); - - b.Property("Type") - .HasColumnType("integer"); - - b.HasKey("Id"); - - b.HasIndex("ProjectId", "Name") - .IsUnique(); - - b.ToTable("Features"); - }); - - modelBuilder.Entity("MicCheck.Api.Features.FeatureSegment", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("EnvironmentId") - .HasColumnType("integer"); - - b.Property("FeatureId") - .HasColumnType("integer"); - - b.Property("Priority") - .HasColumnType("integer"); - - b.Property("SegmentId") - .HasColumnType("integer"); - - b.HasKey("Id"); - - b.ToTable("FeatureSegments"); - }); - - modelBuilder.Entity("MicCheck.Api.Features.FeatureState", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CreatedAt") - .HasColumnType("timestamp with time zone"); - - b.Property("Enabled") - .HasColumnType("boolean"); - - b.Property("EnvironmentId") - .HasColumnType("integer"); - - b.Property("FeatureId") - .HasColumnType("integer"); - - b.Property("FeatureSegmentId") - .HasColumnType("integer"); - - b.Property("IdentityId") - .HasColumnType("integer"); - - b.Property("UpdatedAt") - .HasColumnType("timestamp with time zone"); - - b.Property("Value") - .HasMaxLength(20000) - .HasColumnType("character varying(20000)"); - - b.Property("Version") - .IsConcurrencyToken() - .HasColumnType("integer"); - - b.HasKey("Id"); - - b.HasIndex("EnvironmentId"); - - b.HasIndex("FeatureSegmentId") - .IsUnique(); - - b.HasIndex("IdentityId"); - - b.HasIndex("FeatureId", "EnvironmentId", "IdentityId") - .IsUnique(); - - b.ToTable("FeatureStates"); - }); - - modelBuilder.Entity("MicCheck.Api.Features.Tag", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("Color") - .IsRequired() - .HasMaxLength(20) - .HasColumnType("character varying(20)"); - - b.Property("Label") - .IsRequired() - .HasMaxLength(200) - .HasColumnType("character varying(200)"); - - b.Property("ProjectId") - .HasColumnType("integer"); - - b.HasKey("Id"); - - b.HasIndex("ProjectId"); - - b.ToTable("Tags"); - }); - - modelBuilder.Entity("MicCheck.Api.Identities.Identity", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CreatedAt") - .HasColumnType("timestamp with time zone"); - - b.Property("EnvironmentId") - .HasColumnType("integer"); - - b.Property("Identifier") - .IsRequired() - .HasMaxLength(2000) - .HasColumnType("character varying(2000)"); - - b.HasKey("Id"); - - b.HasIndex("EnvironmentId", "Identifier") - .IsUnique(); - - b.ToTable("Identities"); - }); - - modelBuilder.Entity("MicCheck.Api.Identities.IdentityTrait", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("IdentityId") - .HasColumnType("integer"); - - b.Property("Key") - .IsRequired() - .HasMaxLength(200) - .HasColumnType("character varying(200)"); - - b.Property("Value") - .IsRequired() - .HasMaxLength(2000) - .HasColumnType("character varying(2000)"); - - b.Property("ValueType") - .HasColumnType("integer"); - - b.HasKey("Id"); - - b.HasIndex("IdentityId", "Key") - .IsUnique(); - - b.ToTable("IdentityTraits"); - }); - - modelBuilder.Entity("MicCheck.Api.Organizations.Organization", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CreatedAt") - .HasColumnType("timestamp with time zone"); - - b.Property("InviteToken") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(200) - .HasColumnType("character varying(200)"); - - b.HasKey("Id"); - - b.HasIndex("InviteToken") - .IsUnique() - .HasFilter("\"InviteToken\" IS NOT NULL"); - - b.ToTable("Organizations"); - }); - - modelBuilder.Entity("MicCheck.Api.Organizations.OrganizationUser", b => - { - b.Property("OrganizationId") - .HasColumnType("integer"); - - b.Property("UserId") - .HasColumnType("integer"); - - b.Property("Role") - .HasColumnType("integer"); - - b.HasKey("OrganizationId", "UserId"); - - b.HasIndex("UserId"); - - b.ToTable("OrganizationUsers"); - }); - - modelBuilder.Entity("MicCheck.Api.Projects.Project", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CreatedAt") - .HasColumnType("timestamp with time zone"); - - b.Property("HideDisabledFlags") - .HasColumnType("boolean"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(200) - .HasColumnType("character varying(200)"); - - b.Property("OrganizationId") - .HasColumnType("integer"); - - b.HasKey("Id"); - - b.HasIndex("OrganizationId"); - - b.ToTable("Projects"); - }); - - modelBuilder.Entity("MicCheck.Api.Segments.Segment", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CreatedAt") - .HasColumnType("timestamp with time zone"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(200) - .HasColumnType("character varying(200)"); - - b.Property("ProjectId") - .HasColumnType("integer"); - - b.HasKey("Id"); - - b.HasIndex("ProjectId"); - - b.ToTable("Segments"); - }); - - modelBuilder.Entity("MicCheck.Api.Segments.SegmentCondition", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("Operator") - .HasColumnType("integer"); - - b.Property("Property") - .IsRequired() - .HasMaxLength(200) - .HasColumnType("character varying(200)"); - - b.Property("RuleId") - .HasColumnType("integer"); - - b.Property("Value") - .IsRequired() - .HasMaxLength(1000) - .HasColumnType("character varying(1000)"); - - b.HasKey("Id"); - - b.HasIndex("RuleId"); - - b.ToTable("SegmentConditions"); - }); - - modelBuilder.Entity("MicCheck.Api.Segments.SegmentRule", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("ParentRuleId") - .HasColumnType("integer"); - - b.Property("SegmentId") - .HasColumnType("integer"); - - b.Property("Type") - .HasColumnType("integer"); - - b.HasKey("Id"); - - b.HasIndex("ParentRuleId"); - - b.HasIndex("SegmentId"); - - b.ToTable("SegmentRules"); - }); - - modelBuilder.Entity("MicCheck.Api.Users.RefreshToken", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CreatedAt") - .HasColumnType("timestamp with time zone"); - - b.Property("ExpiresAt") - .HasColumnType("timestamp with time zone"); - - b.Property("IsRevoked") - .HasColumnType("boolean"); - - b.Property("Token") - .IsRequired() - .HasMaxLength(512) - .HasColumnType("character varying(512)"); - - b.Property("UserId") - .HasColumnType("integer"); - - b.HasKey("Id"); - - b.HasIndex("Token") - .IsUnique(); - - b.HasIndex("UserId"); - - b.ToTable("RefreshTokens"); - }); - - modelBuilder.Entity("MicCheck.Api.Users.User", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CreatedAt") - .HasColumnType("timestamp with time zone"); - - b.Property("Email") - .IsRequired() - .HasMaxLength(500) - .HasColumnType("character varying(500)"); - - b.Property("FirstName") - .IsRequired() - .HasMaxLength(200) - .HasColumnType("character varying(200)"); - - b.Property("IsActive") - .HasColumnType("boolean"); - - b.Property("IsTwoFactorEnabled") - .HasColumnType("boolean"); - - b.Property("LastLoginAt") - .HasColumnType("timestamp with time zone"); - - b.Property("LastName") - .IsRequired() - .HasMaxLength(200) - .HasColumnType("character varying(200)"); - - b.Property("PasswordHash") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("Id"); - - b.HasIndex("Email") - .IsUnique(); - - b.ToTable("Users"); - }); - - modelBuilder.Entity("MicCheck.Api.Webhooks.Webhook", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CreatedAt") - .HasColumnType("timestamp with time zone"); - - b.Property("Enabled") - .HasColumnType("boolean"); - - b.Property("EnvironmentId") - .HasColumnType("integer"); - - b.Property("OrganizationId") - .HasColumnType("integer"); - - b.Property("Scope") - .HasColumnType("integer"); - - b.Property("Secret") - .HasMaxLength(200) - .HasColumnType("character varying(200)"); - - b.Property("Url") - .IsRequired() - .HasMaxLength(500) - .HasColumnType("character varying(500)"); - - b.HasKey("Id"); - - b.HasIndex("EnvironmentId"); - - b.ToTable("Webhooks"); - }); - - modelBuilder.Entity("MicCheck.Api.Webhooks.WebhookDeliveryLog", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("AttemptNumber") - .HasColumnType("integer"); - - b.Property("AttemptedAt") - .HasColumnType("timestamp with time zone"); - - b.Property("Duration") - .HasColumnType("interval"); - - b.Property("ErrorMessage") - .HasColumnType("text"); - - b.Property("EventType") - .IsRequired() - .HasMaxLength(100) - .HasColumnType("character varying(100)"); - - b.Property("PayloadJson") - .IsRequired() - .HasColumnType("text"); - - b.Property("ResponseBody") - .HasColumnType("text"); - - b.Property("ResponseStatusCode") - .HasColumnType("integer"); - - b.Property("Success") - .HasColumnType("boolean"); - - b.Property("WebhookId") - .HasColumnType("integer"); - - b.HasKey("Id"); - - b.HasIndex("WebhookId"); - - b.ToTable("WebhookDeliveryLogs"); - }); - - modelBuilder.Entity("FeatureTags", b => - { - b.HasOne("MicCheck.Api.Features.Feature", null) - .WithMany() - .HasForeignKey("FeatureId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MicCheck.Api.Features.Tag", null) - .WithMany() - .HasForeignKey("TagsId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("MicCheck.Api.Common.Security.ApiKeys.ApiKey", b => - { - b.HasOne("MicCheck.Api.Organizations.Organization", null) - .WithMany("ApiKeys") - .HasForeignKey("OrganizationId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("MicCheck.Api.Environments.Environment", b => - { - b.HasOne("MicCheck.Api.Projects.Project", null) - .WithMany("Environments") - .HasForeignKey("ProjectId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("MicCheck.Api.Features.Feature", b => - { - b.HasOne("MicCheck.Api.Projects.Project", null) - .WithMany("Features") - .HasForeignKey("ProjectId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("MicCheck.Api.Features.FeatureState", b => - { - b.HasOne("MicCheck.Api.Environments.Environment", null) - .WithMany("FeatureStates") - .HasForeignKey("EnvironmentId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MicCheck.Api.Features.Feature", null) - .WithMany("FeatureStates") - .HasForeignKey("FeatureId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MicCheck.Api.Features.FeatureSegment", null) - .WithOne("FeatureState") - .HasForeignKey("MicCheck.Api.Features.FeatureState", "FeatureSegmentId") - .OnDelete(DeleteBehavior.SetNull); - - b.HasOne("MicCheck.Api.Identities.Identity", null) - .WithMany("FeatureStateOverrides") - .HasForeignKey("IdentityId") - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity("MicCheck.Api.Features.Tag", b => - { - b.HasOne("MicCheck.Api.Projects.Project", null) - .WithMany() - .HasForeignKey("ProjectId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("MicCheck.Api.Identities.IdentityTrait", b => - { - b.HasOne("MicCheck.Api.Identities.Identity", null) - .WithMany("Traits") - .HasForeignKey("IdentityId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("MicCheck.Api.Organizations.OrganizationUser", b => - { - b.HasOne("MicCheck.Api.Organizations.Organization", null) - .WithMany("Members") - .HasForeignKey("OrganizationId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MicCheck.Api.Users.User", "User") - .WithMany("Organizations") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MicCheck.Api.Projects.Project", b => - { - b.HasOne("MicCheck.Api.Organizations.Organization", null) - .WithMany("Projects") - .HasForeignKey("OrganizationId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("MicCheck.Api.Segments.Segment", b => - { - b.HasOne("MicCheck.Api.Projects.Project", null) - .WithMany("Segments") - .HasForeignKey("ProjectId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("MicCheck.Api.Segments.SegmentCondition", b => - { - b.HasOne("MicCheck.Api.Segments.SegmentRule", null) - .WithMany("Conditions") - .HasForeignKey("RuleId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("MicCheck.Api.Segments.SegmentRule", b => - { - b.HasOne("MicCheck.Api.Segments.SegmentRule", null) - .WithMany("ChildRules") - .HasForeignKey("ParentRuleId") - .OnDelete(DeleteBehavior.NoAction); - - b.HasOne("MicCheck.Api.Segments.Segment", null) - .WithMany("Rules") - .HasForeignKey("SegmentId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("MicCheck.Api.Users.RefreshToken", b => - { - b.HasOne("MicCheck.Api.Users.User", "User") - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - }); - - modelBuilder.Entity("MicCheck.Api.Environments.Environment", b => - { - b.Navigation("FeatureStates"); - }); - - modelBuilder.Entity("MicCheck.Api.Features.Feature", b => - { - b.Navigation("FeatureStates"); - }); - - modelBuilder.Entity("MicCheck.Api.Features.FeatureSegment", b => - { - b.Navigation("FeatureState"); - }); - - modelBuilder.Entity("MicCheck.Api.Identities.Identity", b => - { - b.Navigation("FeatureStateOverrides"); - - b.Navigation("Traits"); - }); - - modelBuilder.Entity("MicCheck.Api.Organizations.Organization", b => - { - b.Navigation("ApiKeys"); - - b.Navigation("Members"); - - b.Navigation("Projects"); - }); - - modelBuilder.Entity("MicCheck.Api.Projects.Project", b => - { - b.Navigation("Environments"); - - b.Navigation("Features"); - - b.Navigation("Segments"); - }); - - modelBuilder.Entity("MicCheck.Api.Segments.Segment", b => - { - b.Navigation("Rules"); - }); - - modelBuilder.Entity("MicCheck.Api.Segments.SegmentRule", b => - { - b.Navigation("ChildRules"); - - b.Navigation("Conditions"); - }); - - modelBuilder.Entity("MicCheck.Api.Users.User", b => - { - b.Navigation("Organizations"); - }); -#pragma warning restore 612, 618 - } - } -} +// +using System; +using MicCheck.Api.Data; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace MicCheck.Api.Migrations +{ + [DbContext(typeof(MicCheckDbContext))] + partial class MicCheckDbContextModelSnapshot : ModelSnapshot + { + protected override void BuildModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "10.0.5") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("FeatureTags", b => + { + b.Property("FeatureId") + .HasColumnType("integer"); + + b.Property("TagsId") + .HasColumnType("integer"); + + b.HasKey("FeatureId", "TagsId"); + + b.HasIndex("TagsId"); + + b.ToTable("FeatureTags"); + }); + + modelBuilder.Entity("MicCheck.Api.Common.Security.ApiKeys.ApiKey", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("ExpiresAt") + .HasColumnType("timestamp with time zone"); + + b.Property("IsActive") + .HasColumnType("boolean"); + + b.Property("Key") + .IsRequired() + .HasMaxLength(512) + .HasColumnType("character varying(512)"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("OrganizationId") + .HasColumnType("integer"); + + b.Property("Prefix") + .IsRequired() + .HasMaxLength(8) + .HasColumnType("character varying(8)"); + + b.HasKey("Id"); + + b.HasIndex("Key") + .IsUnique(); + + b.HasIndex("OrganizationId"); + + b.ToTable("ApiKeys"); + }); + + modelBuilder.Entity("MicCheck.Api.Audit.AuditLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Action") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("character varying(50)"); + + b.Property("ActorUserId") + .HasColumnType("integer"); + + b.Property("Changes") + .HasColumnType("text"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("EnvironmentId") + .HasColumnType("integer"); + + b.Property("OrganizationId") + .HasColumnType("integer"); + + b.Property("ProjectId") + .HasColumnType("integer"); + + b.Property("ResourceId") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("ResourceType") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.HasKey("Id"); + + b.HasIndex("OrganizationId", "CreatedAt"); + + b.ToTable("AuditLogs"); + }); + + modelBuilder.Entity("MicCheck.Api.Common.Security.Authorization.UserProjectPermission", b => + { + b.Property("UserId") + .HasColumnType("integer"); + + b.Property("ProjectId") + .HasColumnType("integer"); + + b.Property("IsAdmin") + .HasColumnType("boolean"); + + b.Property("Permissions") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("UserId", "ProjectId"); + + b.ToTable("UserProjectPermissions"); + }); + + modelBuilder.Entity("MicCheck.Api.Environments.Environment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ApiKey") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("ProjectId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("ApiKey") + .IsUnique(); + + b.HasIndex("ProjectId"); + + b.ToTable("Environments"); + }); + + modelBuilder.Entity("MicCheck.Api.Features.Feature", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("DefaultEnabled") + .HasColumnType("boolean"); + + b.Property("Description") + .HasMaxLength(2000) + .HasColumnType("character varying(2000)"); + + b.Property("InitialValue") + .HasMaxLength(20000) + .HasColumnType("character varying(20000)"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(150) + .HasColumnType("character varying(150)"); + + b.Property("ProjectId") + .HasColumnType("integer"); + + b.Property("Type") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("ProjectId", "Name") + .IsUnique(); + + b.ToTable("Features"); + }); + + modelBuilder.Entity("MicCheck.Api.Features.FeatureSegment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("EnvironmentId") + .HasColumnType("integer"); + + b.Property("FeatureId") + .HasColumnType("integer"); + + b.Property("Priority") + .HasColumnType("integer"); + + b.Property("SegmentId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.ToTable("FeatureSegments"); + }); + + modelBuilder.Entity("MicCheck.Api.Features.FeatureState", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Enabled") + .HasColumnType("boolean"); + + b.Property("EnvironmentId") + .HasColumnType("integer"); + + b.Property("FeatureId") + .HasColumnType("integer"); + + b.Property("FeatureSegmentId") + .HasColumnType("integer"); + + b.Property("IdentityId") + .HasColumnType("integer"); + + b.Property("UpdatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Value") + .HasMaxLength(20000) + .HasColumnType("character varying(20000)"); + + b.Property("Version") + .IsConcurrencyToken() + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("EnvironmentId"); + + b.HasIndex("FeatureSegmentId") + .IsUnique(); + + b.HasIndex("IdentityId"); + + b.HasIndex("FeatureId", "EnvironmentId", "IdentityId") + .IsUnique(); + + b.ToTable("FeatureStates"); + }); + + modelBuilder.Entity("MicCheck.Api.Features.Tag", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Color") + .IsRequired() + .HasMaxLength(20) + .HasColumnType("character varying(20)"); + + b.Property("Label") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("ProjectId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("ProjectId"); + + b.ToTable("Tags"); + }); + + modelBuilder.Entity("MicCheck.Api.Identities.Identity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("EnvironmentId") + .HasColumnType("integer"); + + b.Property("Identifier") + .IsRequired() + .HasMaxLength(2000) + .HasColumnType("character varying(2000)"); + + b.HasKey("Id"); + + b.HasIndex("EnvironmentId", "Identifier") + .IsUnique(); + + b.ToTable("Identities"); + }); + + modelBuilder.Entity("MicCheck.Api.Identities.IdentityTrait", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("IdentityId") + .HasColumnType("integer"); + + b.Property("Key") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("Value") + .IsRequired() + .HasMaxLength(2000) + .HasColumnType("character varying(2000)"); + + b.Property("ValueType") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("IdentityId", "Key") + .IsUnique(); + + b.ToTable("IdentityTraits"); + }); + + modelBuilder.Entity("MicCheck.Api.Organizations.Organization", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("InviteToken") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.HasKey("Id"); + + b.HasIndex("InviteToken") + .IsUnique() + .HasFilter("\"InviteToken\" IS NOT NULL"); + + b.ToTable("Organizations"); + }); + + modelBuilder.Entity("MicCheck.Api.Organizations.OrganizationUser", b => + { + b.Property("OrganizationId") + .HasColumnType("integer"); + + b.Property("UserId") + .HasColumnType("integer"); + + b.Property("Role") + .HasColumnType("integer"); + + b.HasKey("OrganizationId", "UserId"); + + b.HasIndex("UserId"); + + b.ToTable("OrganizationUsers"); + }); + + modelBuilder.Entity("MicCheck.Api.Projects.Project", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("HideDisabledFlags") + .HasColumnType("boolean"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("OrganizationId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("OrganizationId"); + + b.ToTable("Projects"); + }); + + modelBuilder.Entity("MicCheck.Api.Segments.Segment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("ProjectId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("ProjectId"); + + b.ToTable("Segments"); + }); + + modelBuilder.Entity("MicCheck.Api.Segments.SegmentCondition", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Operator") + .HasColumnType("integer"); + + b.Property("Property") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("RuleId") + .HasColumnType("integer"); + + b.Property("Value") + .IsRequired() + .HasMaxLength(1000) + .HasColumnType("character varying(1000)"); + + b.HasKey("Id"); + + b.HasIndex("RuleId"); + + b.ToTable("SegmentConditions"); + }); + + modelBuilder.Entity("MicCheck.Api.Segments.SegmentRule", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ParentRuleId") + .HasColumnType("integer"); + + b.Property("SegmentId") + .HasColumnType("integer"); + + b.Property("Type") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("ParentRuleId"); + + b.HasIndex("SegmentId"); + + b.ToTable("SegmentRules"); + }); + + modelBuilder.Entity("MicCheck.Api.Users.RefreshToken", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("ExpiresAt") + .HasColumnType("timestamp with time zone"); + + b.Property("IsRevoked") + .HasColumnType("boolean"); + + b.Property("Token") + .IsRequired() + .HasMaxLength(512) + .HasColumnType("character varying(512)"); + + b.Property("UserId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("Token") + .IsUnique(); + + b.HasIndex("UserId"); + + b.ToTable("RefreshTokens"); + }); + + modelBuilder.Entity("MicCheck.Api.Users.User", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Email") + .IsRequired() + .HasMaxLength(500) + .HasColumnType("character varying(500)"); + + b.Property("FirstName") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("IsActive") + .HasColumnType("boolean"); + + b.Property("IsTwoFactorEnabled") + .HasColumnType("boolean"); + + b.Property("LastLoginAt") + .HasColumnType("timestamp with time zone"); + + b.Property("LastName") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("PasswordHash") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("Email") + .IsUnique(); + + b.ToTable("Users"); + }); + + modelBuilder.Entity("MicCheck.Api.Webhooks.Webhook", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Enabled") + .HasColumnType("boolean"); + + b.Property("EnvironmentId") + .HasColumnType("integer"); + + b.Property("OrganizationId") + .HasColumnType("integer"); + + b.Property("Scope") + .HasColumnType("integer"); + + b.Property("Secret") + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.Property("Url") + .IsRequired() + .HasMaxLength(500) + .HasColumnType("character varying(500)"); + + b.HasKey("Id"); + + b.HasIndex("EnvironmentId"); + + b.ToTable("Webhooks"); + }); + + modelBuilder.Entity("MicCheck.Api.Webhooks.WebhookDeliveryLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AttemptNumber") + .HasColumnType("integer"); + + b.Property("AttemptedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Duration") + .HasColumnType("interval"); + + b.Property("ErrorMessage") + .HasColumnType("text"); + + b.Property("EventType") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("PayloadJson") + .IsRequired() + .HasColumnType("text"); + + b.Property("ResponseBody") + .HasColumnType("text"); + + b.Property("ResponseStatusCode") + .HasColumnType("integer"); + + b.Property("Success") + .HasColumnType("boolean"); + + b.Property("WebhookId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("WebhookId"); + + b.ToTable("WebhookDeliveryLogs"); + }); + + modelBuilder.Entity("FeatureTags", b => + { + b.HasOne("MicCheck.Api.Features.Feature", null) + .WithMany() + .HasForeignKey("FeatureId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("MicCheck.Api.Features.Tag", null) + .WithMany() + .HasForeignKey("TagsId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("MicCheck.Api.Common.Security.ApiKeys.ApiKey", b => + { + b.HasOne("MicCheck.Api.Organizations.Organization", null) + .WithMany("ApiKeys") + .HasForeignKey("OrganizationId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("MicCheck.Api.Environments.Environment", b => + { + b.HasOne("MicCheck.Api.Projects.Project", null) + .WithMany("Environments") + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("MicCheck.Api.Features.Feature", b => + { + b.HasOne("MicCheck.Api.Projects.Project", null) + .WithMany("Features") + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("MicCheck.Api.Features.FeatureState", b => + { + b.HasOne("MicCheck.Api.Environments.Environment", null) + .WithMany("FeatureStates") + .HasForeignKey("EnvironmentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("MicCheck.Api.Features.Feature", null) + .WithMany("FeatureStates") + .HasForeignKey("FeatureId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("MicCheck.Api.Features.FeatureSegment", null) + .WithOne("FeatureState") + .HasForeignKey("MicCheck.Api.Features.FeatureState", "FeatureSegmentId") + .OnDelete(DeleteBehavior.SetNull); + + b.HasOne("MicCheck.Api.Identities.Identity", null) + .WithMany("FeatureStateOverrides") + .HasForeignKey("IdentityId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("MicCheck.Api.Features.Tag", b => + { + b.HasOne("MicCheck.Api.Projects.Project", null) + .WithMany() + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("MicCheck.Api.Identities.IdentityTrait", b => + { + b.HasOne("MicCheck.Api.Identities.Identity", null) + .WithMany("Traits") + .HasForeignKey("IdentityId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("MicCheck.Api.Organizations.OrganizationUser", b => + { + b.HasOne("MicCheck.Api.Organizations.Organization", null) + .WithMany("Members") + .HasForeignKey("OrganizationId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("MicCheck.Api.Users.User", "User") + .WithMany("Organizations") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("MicCheck.Api.Projects.Project", b => + { + b.HasOne("MicCheck.Api.Organizations.Organization", null) + .WithMany("Projects") + .HasForeignKey("OrganizationId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("MicCheck.Api.Segments.Segment", b => + { + b.HasOne("MicCheck.Api.Projects.Project", null) + .WithMany("Segments") + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("MicCheck.Api.Segments.SegmentCondition", b => + { + b.HasOne("MicCheck.Api.Segments.SegmentRule", null) + .WithMany("Conditions") + .HasForeignKey("RuleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("MicCheck.Api.Segments.SegmentRule", b => + { + b.HasOne("MicCheck.Api.Segments.SegmentRule", null) + .WithMany("ChildRules") + .HasForeignKey("ParentRuleId") + .OnDelete(DeleteBehavior.NoAction); + + b.HasOne("MicCheck.Api.Segments.Segment", null) + .WithMany("Rules") + .HasForeignKey("SegmentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("MicCheck.Api.Users.RefreshToken", b => + { + b.HasOne("MicCheck.Api.Users.User", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("MicCheck.Api.Environments.Environment", b => + { + b.Navigation("FeatureStates"); + }); + + modelBuilder.Entity("MicCheck.Api.Features.Feature", b => + { + b.Navigation("FeatureStates"); + }); + + modelBuilder.Entity("MicCheck.Api.Features.FeatureSegment", b => + { + b.Navigation("FeatureState"); + }); + + modelBuilder.Entity("MicCheck.Api.Identities.Identity", b => + { + b.Navigation("FeatureStateOverrides"); + + b.Navigation("Traits"); + }); + + modelBuilder.Entity("MicCheck.Api.Organizations.Organization", b => + { + b.Navigation("ApiKeys"); + + b.Navigation("Members"); + + b.Navigation("Projects"); + }); + + modelBuilder.Entity("MicCheck.Api.Projects.Project", b => + { + b.Navigation("Environments"); + + b.Navigation("Features"); + + b.Navigation("Segments"); + }); + + modelBuilder.Entity("MicCheck.Api.Segments.Segment", b => + { + b.Navigation("Rules"); + }); + + modelBuilder.Entity("MicCheck.Api.Segments.SegmentRule", b => + { + b.Navigation("ChildRules"); + + b.Navigation("Conditions"); + }); + + modelBuilder.Entity("MicCheck.Api.Users.User", b => + { + b.Navigation("Organizations"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/src/api/MicCheck.Api/Organizations/.gitkeep b/src/api/MicCheck.Api/Organizations/.gitkeep new file mode 100755 index 0000000..e69de29 diff --git a/src/api/MicCheck.Api/Organizations/CreateOrganizationRequest.cs b/src/api/MicCheck.Api/Organizations/CreateOrganizationRequest.cs old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/Organizations/InviteTokenResponse.cs b/src/api/MicCheck.Api/Organizations/InviteTokenResponse.cs old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/Organizations/InviteUserRequest.cs b/src/api/MicCheck.Api/Organizations/InviteUserRequest.cs old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/Organizations/InviteUsersByEmailRequest.cs b/src/api/MicCheck.Api/Organizations/InviteUsersByEmailRequest.cs old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/Organizations/Organization.cs b/src/api/MicCheck.Api/Organizations/Organization.cs old mode 100644 new mode 100755 index a2effce..27bf04e --- a/src/api/MicCheck.Api/Organizations/Organization.cs +++ b/src/api/MicCheck.Api/Organizations/Organization.cs @@ -1,15 +1,15 @@ -using MicCheck.Api.Common.Security.ApiKeys; -using MicCheck.Api.Projects; - -namespace MicCheck.Api.Organizations; - -public class Organization -{ - public int Id { get; init; } - public required string Name { get; set; } - public DateTimeOffset CreatedAt { get; init; } - public ICollection Projects { get; init; } = []; - public ICollection Members { get; init; } = []; - public ICollection ApiKeys { get; init; } = []; - public string? InviteToken { get; set; } -} +using MicCheck.Api.Common.Security.ApiKeys; +using MicCheck.Api.Projects; + +namespace MicCheck.Api.Organizations; + +public class Organization +{ + public int Id { get; init; } + public required string Name { get; set; } + public DateTimeOffset CreatedAt { get; init; } + public ICollection Projects { get; init; } = []; + public ICollection Members { get; init; } = []; + public ICollection ApiKeys { get; init; } = []; + public string? InviteToken { get; set; } +} diff --git a/src/api/MicCheck.Api/Organizations/OrganizationResponse.cs b/src/api/MicCheck.Api/Organizations/OrganizationResponse.cs old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/Organizations/OrganizationService.cs b/src/api/MicCheck.Api/Organizations/OrganizationService.cs old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/Organizations/OrganizationUser.cs b/src/api/MicCheck.Api/Organizations/OrganizationUser.cs old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/Organizations/OrganizationsController.cs b/src/api/MicCheck.Api/Organizations/OrganizationsController.cs old mode 100644 new mode 100755 index 04e6044..57d4216 --- a/src/api/MicCheck.Api/Organizations/OrganizationsController.cs +++ b/src/api/MicCheck.Api/Organizations/OrganizationsController.cs @@ -1,203 +1,203 @@ -using MicCheck.Api.Common.Security.Authorization; -using MicCheck.Api.Common; -using MicCheck.Api.Webhooks; -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Mvc; -using Microsoft.AspNetCore.RateLimiting; - -namespace MicCheck.Api.Organizations; - -[ApiController] -[Route("api/v1/organisations")] -[Authorize(Policy = AuthorizationPolicies.AdminApiAccess)] -[EnableRateLimiting("AdminApi")] -public class OrganizationsController(OrganizationService organizationService, WebhookService webhookService) : ControllerBase -{ - [HttpGet] - public async Task>> List( - [FromQuery] int page = 1, [FromQuery] int pageSize = 20, CancellationToken ct = default) - { - pageSize = Math.Clamp(pageSize, 1, 100); - var userId = GetCurrentUserId(); - if (userId is null) return Unauthorized(); - - var all = await organizationService.ListForUserAsync(userId.Value, ct); - var paged = all.Skip((page - 1) * pageSize).Take(pageSize).Select(OrganizationResponse.From).ToList(); - - return Ok(new PaginatedResponse(all.Count, null, null, paged)); - } - - [HttpPost] - public async Task> Create( - CreateOrganizationRequest request, CancellationToken ct) - { - var userId = GetCurrentUserId(); - if (userId is null) return Unauthorized(); - - var org = await organizationService.CreateAsync(request.Name, userId.Value, ct); - return CreatedAtAction(nameof(GetById), new { id = org.Id }, OrganizationResponse.From(org)); - } - - [HttpGet("{id}")] - public async Task> GetById(int id, CancellationToken ct) - { - var org = await organizationService.FindByIdAsync(id, ct); - if (org is null) return NotFound(); - return Ok(OrganizationResponse.From(org)); - } - - [HttpPut("{id}")] - public async Task> Update( - int id, UpdateOrganizationRequest request, CancellationToken ct) - { - var org = await organizationService.FindByIdAsync(id, ct); - if (org is null) return NotFound(); - - var updated = await organizationService.UpdateAsync(id, request.Name, ct); - return Ok(OrganizationResponse.From(updated)); - } - - [HttpDelete("{id}")] - public async Task Delete(int id, CancellationToken ct) - { - var org = await organizationService.FindByIdAsync(id, ct); - if (org is null) return NotFound(); - - await organizationService.DeleteAsync(id, ct); - return NoContent(); - } - - [HttpGet("{id}/users")] - public async Task>> ListUsers( - int id, CancellationToken ct) - { - var org = await organizationService.FindByIdAsync(id, ct); - if (org is null) return NotFound(); - - var members = await organizationService.ListMembersAsync(id, ct); - return Ok(members.Select(OrganizationMemberResponse.From).ToList()); - } - - [HttpPost("{id}/users/invite")] - public async Task InviteUser(int id, InviteUserRequest request, CancellationToken ct) - { - var org = await organizationService.FindByIdAsync(id, ct); - if (org is null) return NotFound(); - - var role = Enum.Parse(request.Role, ignoreCase: true); - await organizationService.InviteUserAsync(id, request.UserId, role, ct); - return Ok(); - } - - [HttpPost("{id}/users/invite-by-email")] - public async Task>> InviteUsersByEmail( - int id, InviteUsersByEmailRequest request, CancellationToken ct) - { - var org = await organizationService.FindByIdAsync(id, ct); - if (org is null) return NotFound(); - - var results = await organizationService.InviteUsersByEmailAsync(id, request.Invites, ct); - return Ok(results); - } - - [HttpGet("{id}/invite-link")] - public async Task> GetInviteLink(int id, CancellationToken ct) - { - var org = await organizationService.FindByIdAsync(id, ct); - if (org is null) return NotFound(); - - var token = await organizationService.GetOrCreateInviteTokenAsync(id, ct); - return Ok(new InviteTokenResponse(token)); - } - - [HttpPost("{id}/invite-link/regenerate")] - public async Task> RegenerateInviteLink(int id, CancellationToken ct) - { - var org = await organizationService.FindByIdAsync(id, ct); - if (org is null) return NotFound(); - - var token = await organizationService.RegenerateInviteTokenAsync(id, ct); - return Ok(new InviteTokenResponse(token)); - } - - [HttpPost("invite/{token}/accept")] - public async Task AcceptInvite(string token, CancellationToken ct) - { - var userId = GetCurrentUserId(); - if (userId is null) return Unauthorized(); - - try - { - await organizationService.AcceptInviteAsync(token, userId.Value, ct); - return Ok(); - } - catch (KeyNotFoundException) - { - return NotFound("Invalid or expired invite link."); - } - } - - [HttpDelete("{id}/users/{userId}")] - public async Task RemoveUser(int id, int userId, CancellationToken ct) - { - var org = await organizationService.FindByIdAsync(id, ct); - if (org is null) return NotFound(); - - await organizationService.RemoveMemberAsync(id, userId, ct); - return NoContent(); - } - - [HttpGet("{id}/webhooks")] - public async Task>> ListWebhooks(int id, CancellationToken ct) - { - var org = await organizationService.FindByIdAsync(id, ct); - if (org is null) return NotFound(); - - var webhooks = await webhookService.ListByOrganizationAsync(id, ct); - return Ok(webhooks.Select(WebhookResponse.From).ToList()); - } - - [HttpPost("{id}/webhooks")] - public async Task> CreateWebhook( - int id, CreateWebhookRequest request, CancellationToken ct) - { - var org = await organizationService.FindByIdAsync(id, ct); - if (org is null) return NotFound(); - - var webhook = await webhookService.CreateForOrganizationAsync(id, request.Url, request.Secret, request.Enabled, ct); - return CreatedAtAction(nameof(ListWebhooks), new { id }, WebhookResponse.From(webhook)); - } - - [HttpPut("{id}/webhooks/{webhookId}")] - public async Task> UpdateWebhook( - int id, int webhookId, CreateWebhookRequest request, CancellationToken ct) - { - var org = await organizationService.FindByIdAsync(id, ct); - if (org is null) return NotFound(); - - var webhook = await webhookService.FindByIdAsync(webhookId, ct); - if (webhook is null || webhook.OrganizationId != id) return NotFound(); - - var updated = await webhookService.UpdateAsync(webhookId, request.Url, request.Secret, request.Enabled, ct); - return Ok(WebhookResponse.From(updated)); - } - - [HttpDelete("{id}/webhooks/{webhookId}")] - public async Task DeleteWebhook(int id, int webhookId, CancellationToken ct) - { - var org = await organizationService.FindByIdAsync(id, ct); - if (org is null) return NotFound(); - - var webhook = await webhookService.FindByIdAsync(webhookId, ct); - if (webhook is null || webhook.OrganizationId != id) return NotFound(); - - await webhookService.DeleteAsync(webhookId, ct); - return NoContent(); - } - - private int? GetCurrentUserId() - { - var claim = User.FindFirst(System.Security.Claims.ClaimTypes.NameIdentifier)?.Value; - return int.TryParse(claim, out var id) ? id : null; - } -} +using MicCheck.Api.Common.Security.Authorization; +using MicCheck.Api.Common; +using MicCheck.Api.Webhooks; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.RateLimiting; + +namespace MicCheck.Api.Organizations; + +[ApiController] +[Route("api/v1/organisations")] +[Authorize(Policy = AuthorizationPolicies.AdminApiAccess)] +[EnableRateLimiting("AdminApi")] +public class OrganizationsController(OrganizationService organizationService, WebhookService webhookService) : ControllerBase +{ + [HttpGet] + public async Task>> List( + [FromQuery] int page = 1, [FromQuery] int pageSize = 20, CancellationToken ct = default) + { + pageSize = Math.Clamp(pageSize, 1, 100); + var userId = GetCurrentUserId(); + if (userId is null) return Unauthorized(); + + var all = await organizationService.ListForUserAsync(userId.Value, ct); + var paged = all.Skip((page - 1) * pageSize).Take(pageSize).Select(OrganizationResponse.From).ToList(); + + return Ok(new PaginatedResponse(all.Count, null, null, paged)); + } + + [HttpPost] + public async Task> Create( + CreateOrganizationRequest request, CancellationToken ct) + { + var userId = GetCurrentUserId(); + if (userId is null) return Unauthorized(); + + var org = await organizationService.CreateAsync(request.Name, userId.Value, ct); + return CreatedAtAction(nameof(GetById), new { id = org.Id }, OrganizationResponse.From(org)); + } + + [HttpGet("{id}")] + public async Task> GetById(int id, CancellationToken ct) + { + var org = await organizationService.FindByIdAsync(id, ct); + if (org is null) return NotFound(); + return Ok(OrganizationResponse.From(org)); + } + + [HttpPut("{id}")] + public async Task> Update( + int id, UpdateOrganizationRequest request, CancellationToken ct) + { + var org = await organizationService.FindByIdAsync(id, ct); + if (org is null) return NotFound(); + + var updated = await organizationService.UpdateAsync(id, request.Name, ct); + return Ok(OrganizationResponse.From(updated)); + } + + [HttpDelete("{id}")] + public async Task Delete(int id, CancellationToken ct) + { + var org = await organizationService.FindByIdAsync(id, ct); + if (org is null) return NotFound(); + + await organizationService.DeleteAsync(id, ct); + return NoContent(); + } + + [HttpGet("{id}/users")] + public async Task>> ListUsers( + int id, CancellationToken ct) + { + var org = await organizationService.FindByIdAsync(id, ct); + if (org is null) return NotFound(); + + var members = await organizationService.ListMembersAsync(id, ct); + return Ok(members.Select(OrganizationMemberResponse.From).ToList()); + } + + [HttpPost("{id}/users/invite")] + public async Task InviteUser(int id, InviteUserRequest request, CancellationToken ct) + { + var org = await organizationService.FindByIdAsync(id, ct); + if (org is null) return NotFound(); + + var role = Enum.Parse(request.Role, ignoreCase: true); + await organizationService.InviteUserAsync(id, request.UserId, role, ct); + return Ok(); + } + + [HttpPost("{id}/users/invite-by-email")] + public async Task>> InviteUsersByEmail( + int id, InviteUsersByEmailRequest request, CancellationToken ct) + { + var org = await organizationService.FindByIdAsync(id, ct); + if (org is null) return NotFound(); + + var results = await organizationService.InviteUsersByEmailAsync(id, request.Invites, ct); + return Ok(results); + } + + [HttpGet("{id}/invite-link")] + public async Task> GetInviteLink(int id, CancellationToken ct) + { + var org = await organizationService.FindByIdAsync(id, ct); + if (org is null) return NotFound(); + + var token = await organizationService.GetOrCreateInviteTokenAsync(id, ct); + return Ok(new InviteTokenResponse(token)); + } + + [HttpPost("{id}/invite-link/regenerate")] + public async Task> RegenerateInviteLink(int id, CancellationToken ct) + { + var org = await organizationService.FindByIdAsync(id, ct); + if (org is null) return NotFound(); + + var token = await organizationService.RegenerateInviteTokenAsync(id, ct); + return Ok(new InviteTokenResponse(token)); + } + + [HttpPost("invite/{token}/accept")] + public async Task AcceptInvite(string token, CancellationToken ct) + { + var userId = GetCurrentUserId(); + if (userId is null) return Unauthorized(); + + try + { + await organizationService.AcceptInviteAsync(token, userId.Value, ct); + return Ok(); + } + catch (KeyNotFoundException) + { + return NotFound("Invalid or expired invite link."); + } + } + + [HttpDelete("{id}/users/{userId}")] + public async Task RemoveUser(int id, int userId, CancellationToken ct) + { + var org = await organizationService.FindByIdAsync(id, ct); + if (org is null) return NotFound(); + + await organizationService.RemoveMemberAsync(id, userId, ct); + return NoContent(); + } + + [HttpGet("{id}/webhooks")] + public async Task>> ListWebhooks(int id, CancellationToken ct) + { + var org = await organizationService.FindByIdAsync(id, ct); + if (org is null) return NotFound(); + + var webhooks = await webhookService.ListByOrganizationAsync(id, ct); + return Ok(webhooks.Select(WebhookResponse.From).ToList()); + } + + [HttpPost("{id}/webhooks")] + public async Task> CreateWebhook( + int id, CreateWebhookRequest request, CancellationToken ct) + { + var org = await organizationService.FindByIdAsync(id, ct); + if (org is null) return NotFound(); + + var webhook = await webhookService.CreateForOrganizationAsync(id, request.Url, request.Secret, request.Enabled, ct); + return CreatedAtAction(nameof(ListWebhooks), new { id }, WebhookResponse.From(webhook)); + } + + [HttpPut("{id}/webhooks/{webhookId}")] + public async Task> UpdateWebhook( + int id, int webhookId, CreateWebhookRequest request, CancellationToken ct) + { + var org = await organizationService.FindByIdAsync(id, ct); + if (org is null) return NotFound(); + + var webhook = await webhookService.FindByIdAsync(webhookId, ct); + if (webhook is null || webhook.OrganizationId != id) return NotFound(); + + var updated = await webhookService.UpdateAsync(webhookId, request.Url, request.Secret, request.Enabled, ct); + return Ok(WebhookResponse.From(updated)); + } + + [HttpDelete("{id}/webhooks/{webhookId}")] + public async Task DeleteWebhook(int id, int webhookId, CancellationToken ct) + { + var org = await organizationService.FindByIdAsync(id, ct); + if (org is null) return NotFound(); + + var webhook = await webhookService.FindByIdAsync(webhookId, ct); + if (webhook is null || webhook.OrganizationId != id) return NotFound(); + + await webhookService.DeleteAsync(webhookId, ct); + return NoContent(); + } + + private int? GetCurrentUserId() + { + var claim = User.FindFirst(System.Security.Claims.ClaimTypes.NameIdentifier)?.Value; + return int.TryParse(claim, out var id) ? id : null; + } +} diff --git a/src/api/MicCheck.Api/Organizations/UpdateOrganizationRequest.cs b/src/api/MicCheck.Api/Organizations/UpdateOrganizationRequest.cs old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/Program.cs b/src/api/MicCheck.Api/Program.cs old mode 100644 new mode 100755 index b617388..2f3b95f --- a/src/api/MicCheck.Api/Program.cs +++ b/src/api/MicCheck.Api/Program.cs @@ -1,184 +1,184 @@ -using System.Text; -using System.Threading.RateLimiting; -using FluentValidation; -using FluentValidation.AspNetCore; -using MicCheck.Api.Common.Security.ApiKeys; -using MicCheck.Api.Audit; -using MicCheck.Api.Common.Security.Authentication; -using MicCheck.Api.Common.Security.Authorization; -using MicCheck.Api.Data; -using MicCheck.Api.Environments; -using MicCheck.Api.Features; -using MicCheck.Api.Identities; -using MicCheck.Api.Organizations; -using MicCheck.Api.Projects; -using MicCheck.Api.Segments; -using MicCheck.Api.Users; -using MicCheck.Api.Webhooks; -using Microsoft.AspNetCore.Authentication; -using Microsoft.AspNetCore.Authentication.JwtBearer; -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Identity; -using Microsoft.AspNetCore.Mvc; -using Microsoft.AspNetCore.RateLimiting; -using Microsoft.EntityFrameworkCore; -using Microsoft.IdentityModel.Tokens; -using Scalar.AspNetCore; -using Serilog; - -Log.Logger = new LoggerConfiguration() - .WriteTo.Console() - .CreateBootstrapLogger(); - -try -{ - var builder = WebApplication.CreateBuilder(args); - - builder.AddServiceDefaults(); - - builder.Host.UseSerilog((context, services, config) => - config.ReadFrom.Configuration(context.Configuration) - .ReadFrom.Services(services) - .WriteTo.Console()); - - builder.Services.AddOpenApi(); - builder.Services.AddControllers() - .AddJsonOptions(options => - options.JsonSerializerOptions.Converters.Add( - new System.Text.Json.Serialization.JsonStringEnumConverter())); - - builder.Services.AddAuthentication() - .AddScheme( - EnvironmentKeyAuthenticationHandler.SchemeName, _ => { }) - .AddScheme( - ApiKeyAuthenticationHandler.SchemeName, _ => { }) - .AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, options => - { - options.TokenValidationParameters = new TokenValidationParameters - { - ValidateIssuer = true, - ValidateAudience = true, - ValidateIssuerSigningKey = true, - ValidIssuer = builder.Configuration["Jwt:Issuer"], - ValidAudience = builder.Configuration["Jwt:Audience"], - IssuerSigningKey = new SymmetricSecurityKey( - Encoding.UTF8.GetBytes(builder.Configuration["Jwt:SecretKey"]!)) - }; - }); - - builder.Services.AddAuthorization(options => - { - options.AddPolicy(AuthorizationPolicies.FlagsApiAccess, policy => - policy.AddAuthenticationSchemes(EnvironmentKeyAuthenticationHandler.SchemeName) - .RequireClaim("EnvironmentId")); - - options.AddPolicy(AuthorizationPolicies.AdminApiAccess, policy => - policy.AddAuthenticationSchemes(ApiKeyAuthenticationHandler.SchemeName, JwtBearerDefaults.AuthenticationScheme) - .RequireAuthenticatedUser()); - - options.AddPolicy(AuthorizationPolicies.OrganizationAdmin, policy => - policy.AddAuthenticationSchemes(ApiKeyAuthenticationHandler.SchemeName, JwtBearerDefaults.AuthenticationScheme) - .RequireClaim("OrganizationRole", "Admin")); - }); - - builder.Services.AddHttpContextAccessor(); - - builder.Services.AddRateLimiter(options => - options.AddFixedWindowLimiter("AdminApi", limiter => - { - limiter.PermitLimit = 500; - limiter.Window = TimeSpan.FromMinutes(1); - limiter.QueueProcessingOrder = QueueProcessingOrder.OldestFirst; - limiter.QueueLimit = 0; - })); - - builder.Services.AddFluentValidationAutoValidation(); - builder.Services.AddValidatorsFromAssemblyContaining(); - - builder.Services.Configure(options => - { - options.InvalidModelStateResponseFactory = context => - { - var errors = context.ModelState - .Where(e => e.Value?.Errors.Count > 0) - .ToDictionary( - kvp => kvp.Key, - kvp => kvp.Value!.Errors.Select(e => e.ErrorMessage).ToArray()); - return new UnprocessableEntityObjectResult(new { errors }); - }; - }); - - builder.Services.AddMemoryCache(); - - builder.Services.AddScoped(); - builder.Services.AddScoped(); - builder.Services.AddScoped(); - builder.Services.AddScoped(); - builder.Services.AddScoped, PasswordHasher>(); - builder.Services.AddScoped(); - builder.Services.AddScoped(); - builder.Services.AddScoped(); - builder.Services.AddScoped(); - builder.Services.AddSingleton(); - builder.Services.AddSingleton(); - builder.Services.AddScoped(); - builder.Services.AddScoped(); - builder.Services.AddScoped(); - builder.Services.AddScoped(); - builder.Services.AddScoped(); - builder.Services.AddScoped(); - builder.Services.AddScoped(); - builder.Services.AddScoped(); - builder.Services.AddScoped(); - builder.Services.AddScoped(); - builder.Services.AddScoped(); - builder.Services.AddScoped(); - builder.Services.AddScoped(); - builder.Services.AddScoped(); - builder.Services.AddSingleton(); - builder.Services.AddHostedService(); - builder.Services.AddHostedService(); - builder.Services.AddHttpClient("Webhooks", client => - client.DefaultRequestHeaders.Add("User-Agent", "MicCheck-Webhook/1.0")); - - var connectionString = builder.Configuration.GetConnectionString("miccheck") - ?? (System.Environment.GetEnvironmentVariable("DATABASE_URL") is { } databaseUrl - ? DatabaseUrlParser.ToNpgsqlConnectionString(databaseUrl) - : builder.Configuration.GetConnectionString("DefaultConnection")!); - - builder.Services.AddDbContext(options => - options.UseNpgsql(connectionString)); - - var app = builder.Build(); - - await app.ApplyMigrationsAsync(); - - if (app.Environment.IsDevelopment()) - { - app.MapOpenApi(); - app.MapScalarApiReference(); - app.MapGet("/", () => Results.Redirect("/scalar/v1")).ExcludeFromDescription(); - - await app.SeedDevelopmentDataAsync(); - } - - app.UseSerilogRequestLogging(); - app.UseRateLimiter(); - app.UseAuthentication(); - app.UseAuthorization(); - - app.MapDefaultEndpoints(); - app.MapControllers(); - app.MapAuthEndpoints(); - app.MapApiKeyEndpoints(); - - app.Run(); -} -catch (Exception ex) -{ - Log.Fatal(ex, "Application terminated unexpectedly"); -} -finally -{ - Log.CloseAndFlush(); -} +using System.Text; +using System.Threading.RateLimiting; +using FluentValidation; +using FluentValidation.AspNetCore; +using MicCheck.Api.Common.Security.ApiKeys; +using MicCheck.Api.Audit; +using MicCheck.Api.Common.Security.Authentication; +using MicCheck.Api.Common.Security.Authorization; +using MicCheck.Api.Data; +using MicCheck.Api.Environments; +using MicCheck.Api.Features; +using MicCheck.Api.Identities; +using MicCheck.Api.Organizations; +using MicCheck.Api.Projects; +using MicCheck.Api.Segments; +using MicCheck.Api.Users; +using MicCheck.Api.Webhooks; +using Microsoft.AspNetCore.Authentication; +using Microsoft.AspNetCore.Authentication.JwtBearer; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Identity; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.RateLimiting; +using Microsoft.EntityFrameworkCore; +using Microsoft.IdentityModel.Tokens; +using Scalar.AspNetCore; +using Serilog; + +Log.Logger = new LoggerConfiguration() + .WriteTo.Console() + .CreateBootstrapLogger(); + +try +{ + var builder = WebApplication.CreateBuilder(args); + + builder.AddServiceDefaults(); + + builder.Host.UseSerilog((context, services, config) => + config.ReadFrom.Configuration(context.Configuration) + .ReadFrom.Services(services) + .WriteTo.Console()); + + builder.Services.AddOpenApi(); + builder.Services.AddControllers() + .AddJsonOptions(options => + options.JsonSerializerOptions.Converters.Add( + new System.Text.Json.Serialization.JsonStringEnumConverter())); + + builder.Services.AddAuthentication() + .AddScheme( + EnvironmentKeyAuthenticationHandler.SchemeName, _ => { }) + .AddScheme( + ApiKeyAuthenticationHandler.SchemeName, _ => { }) + .AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, options => + { + options.TokenValidationParameters = new TokenValidationParameters + { + ValidateIssuer = true, + ValidateAudience = true, + ValidateIssuerSigningKey = true, + ValidIssuer = builder.Configuration["Jwt:Issuer"], + ValidAudience = builder.Configuration["Jwt:Audience"], + IssuerSigningKey = new SymmetricSecurityKey( + Encoding.UTF8.GetBytes(builder.Configuration["Jwt:SecretKey"]!)) + }; + }); + + builder.Services.AddAuthorization(options => + { + options.AddPolicy(AuthorizationPolicies.FlagsApiAccess, policy => + policy.AddAuthenticationSchemes(EnvironmentKeyAuthenticationHandler.SchemeName) + .RequireClaim("EnvironmentId")); + + options.AddPolicy(AuthorizationPolicies.AdminApiAccess, policy => + policy.AddAuthenticationSchemes(ApiKeyAuthenticationHandler.SchemeName, JwtBearerDefaults.AuthenticationScheme) + .RequireAuthenticatedUser()); + + options.AddPolicy(AuthorizationPolicies.OrganizationAdmin, policy => + policy.AddAuthenticationSchemes(ApiKeyAuthenticationHandler.SchemeName, JwtBearerDefaults.AuthenticationScheme) + .RequireClaim("OrganizationRole", "Admin")); + }); + + builder.Services.AddHttpContextAccessor(); + + builder.Services.AddRateLimiter(options => + options.AddFixedWindowLimiter("AdminApi", limiter => + { + limiter.PermitLimit = 500; + limiter.Window = TimeSpan.FromMinutes(1); + limiter.QueueProcessingOrder = QueueProcessingOrder.OldestFirst; + limiter.QueueLimit = 0; + })); + + builder.Services.AddFluentValidationAutoValidation(); + builder.Services.AddValidatorsFromAssemblyContaining(); + + builder.Services.Configure(options => + { + options.InvalidModelStateResponseFactory = context => + { + var errors = context.ModelState + .Where(e => e.Value?.Errors.Count > 0) + .ToDictionary( + kvp => kvp.Key, + kvp => kvp.Value!.Errors.Select(e => e.ErrorMessage).ToArray()); + return new UnprocessableEntityObjectResult(new { errors }); + }; + }); + + builder.Services.AddMemoryCache(); + + builder.Services.AddScoped(); + builder.Services.AddScoped(); + builder.Services.AddScoped(); + builder.Services.AddScoped(); + builder.Services.AddScoped, PasswordHasher>(); + builder.Services.AddScoped(); + builder.Services.AddScoped(); + builder.Services.AddScoped(); + builder.Services.AddScoped(); + builder.Services.AddSingleton(); + builder.Services.AddSingleton(); + builder.Services.AddScoped(); + builder.Services.AddScoped(); + builder.Services.AddScoped(); + builder.Services.AddScoped(); + builder.Services.AddScoped(); + builder.Services.AddScoped(); + builder.Services.AddScoped(); + builder.Services.AddScoped(); + builder.Services.AddScoped(); + builder.Services.AddScoped(); + builder.Services.AddScoped(); + builder.Services.AddScoped(); + builder.Services.AddScoped(); + builder.Services.AddScoped(); + builder.Services.AddSingleton(); + builder.Services.AddHostedService(); + builder.Services.AddHostedService(); + builder.Services.AddHttpClient("Webhooks", client => + client.DefaultRequestHeaders.Add("User-Agent", "MicCheck-Webhook/1.0")); + + var connectionString = builder.Configuration.GetConnectionString("miccheck") + ?? (System.Environment.GetEnvironmentVariable("DATABASE_URL") is { } databaseUrl + ? DatabaseUrlParser.ToNpgsqlConnectionString(databaseUrl) + : builder.Configuration.GetConnectionString("DefaultConnection")!); + + builder.Services.AddDbContext(options => + options.UseNpgsql(connectionString)); + + var app = builder.Build(); + + await app.ApplyMigrationsAsync(); + + if (app.Environment.IsDevelopment()) + { + app.MapOpenApi(); + app.MapScalarApiReference(); + app.MapGet("/", () => Results.Redirect("/scalar/v1")).ExcludeFromDescription(); + + await app.SeedDevelopmentDataAsync(); + } + + app.UseSerilogRequestLogging(); + app.UseRateLimiter(); + app.UseAuthentication(); + app.UseAuthorization(); + + app.MapDefaultEndpoints(); + app.MapControllers(); + app.MapAuthEndpoints(); + app.MapApiKeyEndpoints(); + + app.Run(); +} +catch (Exception ex) +{ + Log.Fatal(ex, "Application terminated unexpectedly"); +} +finally +{ + Log.CloseAndFlush(); +} diff --git a/src/api/MicCheck.Api/Projects/.gitkeep b/src/api/MicCheck.Api/Projects/.gitkeep new file mode 100755 index 0000000..e69de29 diff --git a/src/api/MicCheck.Api/Projects/CreateProjectRequest.cs b/src/api/MicCheck.Api/Projects/CreateProjectRequest.cs old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/Projects/Project.cs b/src/api/MicCheck.Api/Projects/Project.cs old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/Projects/ProjectResponse.cs b/src/api/MicCheck.Api/Projects/ProjectResponse.cs old mode 100644 new mode 100755 index e6ca5ef..1fadd4f --- a/src/api/MicCheck.Api/Projects/ProjectResponse.cs +++ b/src/api/MicCheck.Api/Projects/ProjectResponse.cs @@ -1,27 +1,27 @@ -using MicCheck.Api.Common.Security.Authorization; - -namespace MicCheck.Api.Projects; - -public record ProjectResponse( - int Id, - string Name, - int OrganizationId, - bool HideDisabledFlags, - DateTimeOffset CreatedAt -) -{ - public static ProjectResponse From(Project project) => new( - project.Id, project.Name, project.OrganizationId, project.HideDisabledFlags, project.CreatedAt); -} - -public record UserPermissionResponse( - int UserId, - int ProjectId, - bool IsAdmin, - IReadOnlyList Permissions -) -{ - public static UserPermissionResponse From(UserProjectPermission p) => new( - p.UserId, p.ProjectId, p.IsAdmin, - p.Permissions.Select(x => x.ToString()).ToList()); -} +using MicCheck.Api.Common.Security.Authorization; + +namespace MicCheck.Api.Projects; + +public record ProjectResponse( + int Id, + string Name, + int OrganizationId, + bool HideDisabledFlags, + DateTimeOffset CreatedAt +) +{ + public static ProjectResponse From(Project project) => new( + project.Id, project.Name, project.OrganizationId, project.HideDisabledFlags, project.CreatedAt); +} + +public record UserPermissionResponse( + int UserId, + int ProjectId, + bool IsAdmin, + IReadOnlyList Permissions +) +{ + public static UserPermissionResponse From(UserProjectPermission p) => new( + p.UserId, p.ProjectId, p.IsAdmin, + p.Permissions.Select(x => x.ToString()).ToList()); +} diff --git a/src/api/MicCheck.Api/Projects/ProjectService.cs b/src/api/MicCheck.Api/Projects/ProjectService.cs old mode 100644 new mode 100755 index 7aac57a..66e6251 --- a/src/api/MicCheck.Api/Projects/ProjectService.cs +++ b/src/api/MicCheck.Api/Projects/ProjectService.cs @@ -1,105 +1,105 @@ -using MicCheck.Api.Audit; -using MicCheck.Api.Common.Security.Authorization; -using MicCheck.Api.Data; -using Microsoft.EntityFrameworkCore; - -namespace MicCheck.Api.Projects; - -public class ProjectService(MicCheckDbContext db, AuditService auditService) -{ - public async Task> ListByOrganizationAsync(int organizationId, CancellationToken ct = default) - { - return await db.Projects - .Where(p => p.OrganizationId == organizationId) - .ToListAsync(ct); - } - - public async Task FindByIdAsync(int id, CancellationToken ct = default) - { - return await db.Projects.FirstOrDefaultAsync(p => p.Id == id, ct); - } - - public async Task CreateAsync(int organizationId, string name, CancellationToken ct = default) - { - var project = new Project - { - Name = name, - OrganizationId = organizationId, - CreatedAt = DateTimeOffset.UtcNow - }; - db.Projects.Add(project); - await db.SaveChangesAsync(ct); - - await auditService.LogAsync("Project", project.Id.ToString(), "created", organizationId, project.Id, ct: ct); - - return project; - } - - public async Task UpdateAsync(int id, string name, bool hideDisabledFlags, CancellationToken ct = default) - { - var project = await db.Projects.FirstOrDefaultAsync(p => p.Id == id, ct) - ?? throw new KeyNotFoundException($"Project {id} not found."); - - project.Name = name; - project.HideDisabledFlags = hideDisabledFlags; - await db.SaveChangesAsync(ct); - - await auditService.LogAsync("Project", project.Id.ToString(), "updated", project.OrganizationId, project.Id, ct: ct); - - return project; - } - - public async Task DeleteAsync(int id, CancellationToken ct = default) - { - var project = await db.Projects.FirstOrDefaultAsync(p => p.Id == id, ct); - if (project is null) return; - - db.Projects.Remove(project); - await db.SaveChangesAsync(ct); - } - - public async Task> ListUserPermissionsAsync(int projectId, CancellationToken ct = default) - { - return await db.UserProjectPermissions - .Where(p => p.ProjectId == projectId) - .ToListAsync(ct); - } - - public async Task SetUserPermissionsAsync( - int projectId, int userId, bool isAdmin, List permissions, CancellationToken ct = default) - { - var existing = await db.UserProjectPermissions - .FirstOrDefaultAsync(p => p.ProjectId == projectId && p.UserId == userId, ct); - - if (existing is not null) - { - existing.IsAdmin = isAdmin; - existing.Permissions = permissions; - } - else - { - existing = new UserProjectPermission - { - ProjectId = projectId, - UserId = userId, - IsAdmin = isAdmin, - Permissions = permissions - }; - db.UserProjectPermissions.Add(existing); - } - - await db.SaveChangesAsync(ct); - return existing; - } - - public async Task RemoveUserPermissionsAsync(int projectId, int userId, CancellationToken ct = default) - { - var perm = await db.UserProjectPermissions - .FirstOrDefaultAsync(p => p.ProjectId == projectId && p.UserId == userId, ct); - - if (perm is null) return; - - db.UserProjectPermissions.Remove(perm); - await db.SaveChangesAsync(ct); - } -} +using MicCheck.Api.Audit; +using MicCheck.Api.Common.Security.Authorization; +using MicCheck.Api.Data; +using Microsoft.EntityFrameworkCore; + +namespace MicCheck.Api.Projects; + +public class ProjectService(MicCheckDbContext db, AuditService auditService) +{ + public async Task> ListByOrganizationAsync(int organizationId, CancellationToken ct = default) + { + return await db.Projects + .Where(p => p.OrganizationId == organizationId) + .ToListAsync(ct); + } + + public async Task FindByIdAsync(int id, CancellationToken ct = default) + { + return await db.Projects.FirstOrDefaultAsync(p => p.Id == id, ct); + } + + public async Task CreateAsync(int organizationId, string name, CancellationToken ct = default) + { + var project = new Project + { + Name = name, + OrganizationId = organizationId, + CreatedAt = DateTimeOffset.UtcNow + }; + db.Projects.Add(project); + await db.SaveChangesAsync(ct); + + await auditService.LogAsync("Project", project.Id.ToString(), "created", organizationId, project.Id, ct: ct); + + return project; + } + + public async Task UpdateAsync(int id, string name, bool hideDisabledFlags, CancellationToken ct = default) + { + var project = await db.Projects.FirstOrDefaultAsync(p => p.Id == id, ct) + ?? throw new KeyNotFoundException($"Project {id} not found."); + + project.Name = name; + project.HideDisabledFlags = hideDisabledFlags; + await db.SaveChangesAsync(ct); + + await auditService.LogAsync("Project", project.Id.ToString(), "updated", project.OrganizationId, project.Id, ct: ct); + + return project; + } + + public async Task DeleteAsync(int id, CancellationToken ct = default) + { + var project = await db.Projects.FirstOrDefaultAsync(p => p.Id == id, ct); + if (project is null) return; + + db.Projects.Remove(project); + await db.SaveChangesAsync(ct); + } + + public async Task> ListUserPermissionsAsync(int projectId, CancellationToken ct = default) + { + return await db.UserProjectPermissions + .Where(p => p.ProjectId == projectId) + .ToListAsync(ct); + } + + public async Task SetUserPermissionsAsync( + int projectId, int userId, bool isAdmin, List permissions, CancellationToken ct = default) + { + var existing = await db.UserProjectPermissions + .FirstOrDefaultAsync(p => p.ProjectId == projectId && p.UserId == userId, ct); + + if (existing is not null) + { + existing.IsAdmin = isAdmin; + existing.Permissions = permissions; + } + else + { + existing = new UserProjectPermission + { + ProjectId = projectId, + UserId = userId, + IsAdmin = isAdmin, + Permissions = permissions + }; + db.UserProjectPermissions.Add(existing); + } + + await db.SaveChangesAsync(ct); + return existing; + } + + public async Task RemoveUserPermissionsAsync(int projectId, int userId, CancellationToken ct = default) + { + var perm = await db.UserProjectPermissions + .FirstOrDefaultAsync(p => p.ProjectId == projectId && p.UserId == userId, ct); + + if (perm is null) return; + + db.UserProjectPermissions.Remove(perm); + await db.SaveChangesAsync(ct); + } +} diff --git a/src/api/MicCheck.Api/Projects/ProjectsController.cs b/src/api/MicCheck.Api/Projects/ProjectsController.cs old mode 100644 new mode 100755 index 2712f08..9497765 --- a/src/api/MicCheck.Api/Projects/ProjectsController.cs +++ b/src/api/MicCheck.Api/Projects/ProjectsController.cs @@ -1,113 +1,113 @@ -using MicCheck.Api.Common.Security.Authorization; -using MicCheck.Api.Common; -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Mvc; -using Microsoft.AspNetCore.RateLimiting; - -namespace MicCheck.Api.Projects; - -[ApiController] -[Route("api/v1/projects")] -[Authorize(Policy = AuthorizationPolicies.AdminApiAccess)] -[EnableRateLimiting("AdminApi")] -public class ProjectsController(ProjectService projectService) : ControllerBase -{ - [HttpGet] - public async Task>> List( - [FromQuery] int organizationId, - [FromQuery] int page = 1, - [FromQuery] int pageSize = 20, - CancellationToken ct = default) - { - pageSize = Math.Clamp(pageSize, 1, 100); - var all = await projectService.ListByOrganizationAsync(organizationId, ct); - var paged = all.Skip((page - 1) * pageSize).Take(pageSize).Select(ProjectResponse.From).ToList(); - return Ok(new PaginatedResponse(all.Count, null, null, paged)); - } - - [HttpPost] - public async Task> Create(CreateProjectRequest request, CancellationToken ct) - { - var project = await projectService.CreateAsync(request.OrganizationId, request.Name, ct); - return CreatedAtAction(nameof(GetById), new { id = project.Id }, ProjectResponse.From(project)); - } - - [HttpGet("{id}")] - public async Task> GetById(int id, CancellationToken ct) - { - var project = await projectService.FindByIdAsync(id, ct); - if (project is null) return NotFound(); - return Ok(ProjectResponse.From(project)); - } - - [HttpPut("{id}")] - public async Task> Update(int id, UpdateProjectRequest request, CancellationToken ct) - { - var project = await projectService.FindByIdAsync(id, ct); - if (project is null) return NotFound(); - - var updated = await projectService.UpdateAsync(id, request.Name, request.HideDisabledFlags, ct); - return Ok(ProjectResponse.From(updated)); - } - - [HttpDelete("{id}")] - public async Task Delete(int id, CancellationToken ct) - { - var project = await projectService.FindByIdAsync(id, ct); - if (project is null) return NotFound(); - - await projectService.DeleteAsync(id, ct); - return NoContent(); - } - - [HttpGet("{id}/user-permissions")] - public async Task>> ListUserPermissions( - int id, CancellationToken ct) - { - var project = await projectService.FindByIdAsync(id, ct); - if (project is null) return NotFound(); - - var perms = await projectService.ListUserPermissionsAsync(id, ct); - return Ok(perms.Select(UserPermissionResponse.From).ToList()); - } - - [HttpPost("{id}/user-permissions")] - public async Task> CreateUserPermissions( - int id, SetUserPermissionsRequest request, CancellationToken ct) - { - var project = await projectService.FindByIdAsync(id, ct); - if (project is null) return NotFound(); - - var permissions = request.Permissions - .Select(p => Enum.Parse(p, ignoreCase: true)) - .ToList(); - - var perm = await projectService.SetUserPermissionsAsync(id, request.UserId, request.IsAdmin, permissions, ct); - return Ok(UserPermissionResponse.From(perm)); - } - - [HttpPut("{id}/user-permissions/{userId}")] - public async Task> UpdateUserPermissions( - int id, int userId, SetUserPermissionsRequest request, CancellationToken ct) - { - var project = await projectService.FindByIdAsync(id, ct); - if (project is null) return NotFound(); - - var permissions = request.Permissions - .Select(p => Enum.Parse(p, ignoreCase: true)) - .ToList(); - - var perm = await projectService.SetUserPermissionsAsync(id, userId, request.IsAdmin, permissions, ct); - return Ok(UserPermissionResponse.From(perm)); - } - - [HttpDelete("{id}/user-permissions/{userId}")] - public async Task DeleteUserPermissions(int id, int userId, CancellationToken ct) - { - var project = await projectService.FindByIdAsync(id, ct); - if (project is null) return NotFound(); - - await projectService.RemoveUserPermissionsAsync(id, userId, ct); - return NoContent(); - } -} +using MicCheck.Api.Common.Security.Authorization; +using MicCheck.Api.Common; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.RateLimiting; + +namespace MicCheck.Api.Projects; + +[ApiController] +[Route("api/v1/projects")] +[Authorize(Policy = AuthorizationPolicies.AdminApiAccess)] +[EnableRateLimiting("AdminApi")] +public class ProjectsController(ProjectService projectService) : ControllerBase +{ + [HttpGet] + public async Task>> List( + [FromQuery] int organizationId, + [FromQuery] int page = 1, + [FromQuery] int pageSize = 20, + CancellationToken ct = default) + { + pageSize = Math.Clamp(pageSize, 1, 100); + var all = await projectService.ListByOrganizationAsync(organizationId, ct); + var paged = all.Skip((page - 1) * pageSize).Take(pageSize).Select(ProjectResponse.From).ToList(); + return Ok(new PaginatedResponse(all.Count, null, null, paged)); + } + + [HttpPost] + public async Task> Create(CreateProjectRequest request, CancellationToken ct) + { + var project = await projectService.CreateAsync(request.OrganizationId, request.Name, ct); + return CreatedAtAction(nameof(GetById), new { id = project.Id }, ProjectResponse.From(project)); + } + + [HttpGet("{id}")] + public async Task> GetById(int id, CancellationToken ct) + { + var project = await projectService.FindByIdAsync(id, ct); + if (project is null) return NotFound(); + return Ok(ProjectResponse.From(project)); + } + + [HttpPut("{id}")] + public async Task> Update(int id, UpdateProjectRequest request, CancellationToken ct) + { + var project = await projectService.FindByIdAsync(id, ct); + if (project is null) return NotFound(); + + var updated = await projectService.UpdateAsync(id, request.Name, request.HideDisabledFlags, ct); + return Ok(ProjectResponse.From(updated)); + } + + [HttpDelete("{id}")] + public async Task Delete(int id, CancellationToken ct) + { + var project = await projectService.FindByIdAsync(id, ct); + if (project is null) return NotFound(); + + await projectService.DeleteAsync(id, ct); + return NoContent(); + } + + [HttpGet("{id}/user-permissions")] + public async Task>> ListUserPermissions( + int id, CancellationToken ct) + { + var project = await projectService.FindByIdAsync(id, ct); + if (project is null) return NotFound(); + + var perms = await projectService.ListUserPermissionsAsync(id, ct); + return Ok(perms.Select(UserPermissionResponse.From).ToList()); + } + + [HttpPost("{id}/user-permissions")] + public async Task> CreateUserPermissions( + int id, SetUserPermissionsRequest request, CancellationToken ct) + { + var project = await projectService.FindByIdAsync(id, ct); + if (project is null) return NotFound(); + + var permissions = request.Permissions + .Select(p => Enum.Parse(p, ignoreCase: true)) + .ToList(); + + var perm = await projectService.SetUserPermissionsAsync(id, request.UserId, request.IsAdmin, permissions, ct); + return Ok(UserPermissionResponse.From(perm)); + } + + [HttpPut("{id}/user-permissions/{userId}")] + public async Task> UpdateUserPermissions( + int id, int userId, SetUserPermissionsRequest request, CancellationToken ct) + { + var project = await projectService.FindByIdAsync(id, ct); + if (project is null) return NotFound(); + + var permissions = request.Permissions + .Select(p => Enum.Parse(p, ignoreCase: true)) + .ToList(); + + var perm = await projectService.SetUserPermissionsAsync(id, userId, request.IsAdmin, permissions, ct); + return Ok(UserPermissionResponse.From(perm)); + } + + [HttpDelete("{id}/user-permissions/{userId}")] + public async Task DeleteUserPermissions(int id, int userId, CancellationToken ct) + { + var project = await projectService.FindByIdAsync(id, ct); + if (project is null) return NotFound(); + + await projectService.RemoveUserPermissionsAsync(id, userId, ct); + return NoContent(); + } +} diff --git a/src/api/MicCheck.Api/Projects/SetUserPermissionsRequest.cs b/src/api/MicCheck.Api/Projects/SetUserPermissionsRequest.cs old mode 100644 new mode 100755 index 4934eab..047d948 --- a/src/api/MicCheck.Api/Projects/SetUserPermissionsRequest.cs +++ b/src/api/MicCheck.Api/Projects/SetUserPermissionsRequest.cs @@ -1,17 +1,17 @@ -using FluentValidation; -using MicCheck.Api.Common.Security.Authorization; - -namespace MicCheck.Api.Projects; - -public record SetUserPermissionsRequest(int UserId, bool IsAdmin, List Permissions); - -public class SetUserPermissionsRequestValidator : AbstractValidator -{ - public SetUserPermissionsRequestValidator() - { - RuleFor(x => x.UserId).GreaterThan(0); - RuleForEach(x => x.Permissions) - .Must(p => Enum.TryParse(p, true, out _)) - .WithMessage("Invalid permission value."); - } -} +using FluentValidation; +using MicCheck.Api.Common.Security.Authorization; + +namespace MicCheck.Api.Projects; + +public record SetUserPermissionsRequest(int UserId, bool IsAdmin, List Permissions); + +public class SetUserPermissionsRequestValidator : AbstractValidator +{ + public SetUserPermissionsRequestValidator() + { + RuleFor(x => x.UserId).GreaterThan(0); + RuleForEach(x => x.Permissions) + .Must(p => Enum.TryParse(p, true, out _)) + .WithMessage("Invalid permission value."); + } +} diff --git a/src/api/MicCheck.Api/Projects/UpdateProjectRequest.cs b/src/api/MicCheck.Api/Projects/UpdateProjectRequest.cs old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/Properties/launchSettings.json b/src/api/MicCheck.Api/Properties/launchSettings.json old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/Segments/CreateSegmentRequest.cs b/src/api/MicCheck.Api/Segments/CreateSegmentRequest.cs old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/Segments/Segment.cs b/src/api/MicCheck.Api/Segments/Segment.cs old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/Segments/SegmentCondition.cs b/src/api/MicCheck.Api/Segments/SegmentCondition.cs old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/Segments/SegmentEvaluator.cs b/src/api/MicCheck.Api/Segments/SegmentEvaluator.cs old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/Segments/SegmentResponse.cs b/src/api/MicCheck.Api/Segments/SegmentResponse.cs old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/Segments/SegmentRule.cs b/src/api/MicCheck.Api/Segments/SegmentRule.cs old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/Segments/SegmentService.cs b/src/api/MicCheck.Api/Segments/SegmentService.cs old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/Segments/SegmentSummaryResponse.cs b/src/api/MicCheck.Api/Segments/SegmentSummaryResponse.cs old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/Segments/SegmentsController.cs b/src/api/MicCheck.Api/Segments/SegmentsController.cs old mode 100644 new mode 100755 index 686da07..249ae12 --- a/src/api/MicCheck.Api/Segments/SegmentsController.cs +++ b/src/api/MicCheck.Api/Segments/SegmentsController.cs @@ -1,90 +1,90 @@ -using MicCheck.Api.Common.Security.Authorization; -using MicCheck.Api.Common; -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Mvc; -using Microsoft.AspNetCore.RateLimiting; - -namespace MicCheck.Api.Segments; - -[ApiController] -[Route("api/v1/projects/{projectId}/segments")] -[Authorize(Policy = AuthorizationPolicies.AdminApiAccess)] -[EnableRateLimiting("AdminApi")] -public class SegmentsController(SegmentService segmentService) : ControllerBase -{ - [HttpGet] - public async Task>> List( - int projectId, - [FromQuery] int page = 1, - [FromQuery] int pageSize = 20, - CancellationToken ct = default) - { - pageSize = Math.Clamp(pageSize, 1, 100); - var all = await segmentService.ListByProjectAsync(projectId, ct); - var paged = all.Skip((page - 1) * pageSize).Take(pageSize).Select(SegmentResponse.From).ToList(); - return Ok(new PaginatedResponse(all.Count, null, null, paged)); - } - - [HttpPost] - public async Task> Create( - int projectId, CreateSegmentRequest request, CancellationToken ct) - { - try - { - var rules = MapRules(request.Rules); - var segment = await segmentService.CreateAsync(projectId, request.Name, rules, ct); - return CreatedAtAction(nameof(GetById), new { projectId, id = segment.Id }, SegmentResponse.From(segment)); - } - catch (DomainException ex) - { - return BadRequest(new { error = ex.Message }); - } - } - - [HttpGet("{id}")] - public async Task> GetById(int projectId, int id, CancellationToken ct) - { - var segment = await segmentService.FindByIdAsync(id, ct); - if (segment is null || segment.ProjectId != projectId) return NotFound(); - return Ok(SegmentResponse.From(segment)); - } - - [HttpPut("{id}")] - public async Task> Update( - int projectId, int id, CreateSegmentRequest request, CancellationToken ct) - { - var segment = await segmentService.FindByIdAsync(id, ct); - if (segment is null || segment.ProjectId != projectId) return NotFound(); - - try - { - var rules = MapRules(request.Rules); - var updated = await segmentService.UpdateAsync(id, request.Name, rules, ct); - return Ok(SegmentResponse.From(updated)); - } - catch (DomainException ex) - { - return BadRequest(new { error = ex.Message }); - } - } - - [HttpDelete("{id}")] - public async Task Delete(int projectId, int id, CancellationToken ct) - { - var segment = await segmentService.FindByIdAsync(id, ct); - if (segment is null || segment.ProjectId != projectId) return NotFound(); - - await segmentService.DeleteAsync(id, ct); - return NoContent(); - } - - private static IReadOnlyList MapRules(IReadOnlyList rules) => - rules.Select(r => new SegmentRuleDefinition( - Enum.Parse(r.Type, ignoreCase: true), - r.Conditions.Select(c => new SegmentConditionDefinition( - c.Property, - Enum.Parse(c.Operator, ignoreCase: true), - c.Value)).ToList(), - r.ChildRules is not null ? MapRules(r.ChildRules) : null - )).ToList(); -} +using MicCheck.Api.Common.Security.Authorization; +using MicCheck.Api.Common; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.RateLimiting; + +namespace MicCheck.Api.Segments; + +[ApiController] +[Route("api/v1/projects/{projectId}/segments")] +[Authorize(Policy = AuthorizationPolicies.AdminApiAccess)] +[EnableRateLimiting("AdminApi")] +public class SegmentsController(SegmentService segmentService) : ControllerBase +{ + [HttpGet] + public async Task>> List( + int projectId, + [FromQuery] int page = 1, + [FromQuery] int pageSize = 20, + CancellationToken ct = default) + { + pageSize = Math.Clamp(pageSize, 1, 100); + var all = await segmentService.ListByProjectAsync(projectId, ct); + var paged = all.Skip((page - 1) * pageSize).Take(pageSize).Select(SegmentResponse.From).ToList(); + return Ok(new PaginatedResponse(all.Count, null, null, paged)); + } + + [HttpPost] + public async Task> Create( + int projectId, CreateSegmentRequest request, CancellationToken ct) + { + try + { + var rules = MapRules(request.Rules); + var segment = await segmentService.CreateAsync(projectId, request.Name, rules, ct); + return CreatedAtAction(nameof(GetById), new { projectId, id = segment.Id }, SegmentResponse.From(segment)); + } + catch (DomainException ex) + { + return BadRequest(new { error = ex.Message }); + } + } + + [HttpGet("{id}")] + public async Task> GetById(int projectId, int id, CancellationToken ct) + { + var segment = await segmentService.FindByIdAsync(id, ct); + if (segment is null || segment.ProjectId != projectId) return NotFound(); + return Ok(SegmentResponse.From(segment)); + } + + [HttpPut("{id}")] + public async Task> Update( + int projectId, int id, CreateSegmentRequest request, CancellationToken ct) + { + var segment = await segmentService.FindByIdAsync(id, ct); + if (segment is null || segment.ProjectId != projectId) return NotFound(); + + try + { + var rules = MapRules(request.Rules); + var updated = await segmentService.UpdateAsync(id, request.Name, rules, ct); + return Ok(SegmentResponse.From(updated)); + } + catch (DomainException ex) + { + return BadRequest(new { error = ex.Message }); + } + } + + [HttpDelete("{id}")] + public async Task Delete(int projectId, int id, CancellationToken ct) + { + var segment = await segmentService.FindByIdAsync(id, ct); + if (segment is null || segment.ProjectId != projectId) return NotFound(); + + await segmentService.DeleteAsync(id, ct); + return NoContent(); + } + + private static IReadOnlyList MapRules(IReadOnlyList rules) => + rules.Select(r => new SegmentRuleDefinition( + Enum.Parse(r.Type, ignoreCase: true), + r.Conditions.Select(c => new SegmentConditionDefinition( + c.Property, + Enum.Parse(c.Operator, ignoreCase: true), + c.Value)).ToList(), + r.ChildRules is not null ? MapRules(r.ChildRules) : null + )).ToList(); +} diff --git a/src/api/MicCheck.Api/Users/ChangePasswordRequest.cs b/src/api/MicCheck.Api/Users/ChangePasswordRequest.cs old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/Users/RefreshToken.cs b/src/api/MicCheck.Api/Users/RefreshToken.cs old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/Users/UpdateProfileRequest.cs b/src/api/MicCheck.Api/Users/UpdateProfileRequest.cs old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/Users/User.cs b/src/api/MicCheck.Api/Users/User.cs old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/Users/UserResponse.cs b/src/api/MicCheck.Api/Users/UserResponse.cs old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/Users/UserService.cs b/src/api/MicCheck.Api/Users/UserService.cs old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/Users/UsersController.cs b/src/api/MicCheck.Api/Users/UsersController.cs old mode 100644 new mode 100755 index 0d3ef50..83a1ca1 --- a/src/api/MicCheck.Api/Users/UsersController.cs +++ b/src/api/MicCheck.Api/Users/UsersController.cs @@ -1,67 +1,67 @@ -using MicCheck.Api.Common.Security.Authorization; -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Mvc; -using Microsoft.AspNetCore.RateLimiting; - -namespace MicCheck.Api.Users; - -[ApiController] -[Route("api/v1/users")] -[Authorize(Policy = AuthorizationPolicies.AdminApiAccess)] -[EnableRateLimiting("AdminApi")] -public class UsersController(UserService userService) : ControllerBase -{ - [HttpGet("{id:int}")] - public async Task> GetById(int id, CancellationToken ct) - { - var user = await userService.FindByIdAsync(id, ct); - return user is null ? NotFound() : Ok(UserResponse.From(user)); - } - - [HttpGet("me")] - public async Task> GetMe(CancellationToken ct) - { - var userId = GetCurrentUserId(); - if (userId is null) return Unauthorized(); - - var user = await userService.FindByIdAsync(userId.Value, ct); - return user is null ? NotFound() : Ok(UserResponse.From(user)); - } - - [HttpPut("me")] - public async Task> UpdateMe(UpdateProfileRequest request, CancellationToken ct) - { - var userId = GetCurrentUserId(); - if (userId is null) return Unauthorized(); - - if (string.IsNullOrWhiteSpace(request.FirstName) || - string.IsNullOrWhiteSpace(request.LastName) || - string.IsNullOrWhiteSpace(request.Email)) - return BadRequest("First name, last name, and email are required."); - - var (user, emailConflict) = await userService.UpdateProfileAsync( - userId.Value, request.FirstName.Trim(), request.LastName.Trim(), request.Email.Trim(), ct); - - if (emailConflict) return Conflict("Email is already in use."); - return user is null ? NotFound() : Ok(UserResponse.From(user)); - } - - [HttpPost("me/change-password")] - public async Task ChangePassword(ChangePasswordRequest request, CancellationToken ct) - { - var userId = GetCurrentUserId(); - if (userId is null) return Unauthorized(); - - if (string.IsNullOrWhiteSpace(request.CurrentPassword) || string.IsNullOrWhiteSpace(request.NewPassword)) - return BadRequest("Current and new passwords are required."); - - var success = await userService.ChangePasswordAsync(userId.Value, request.CurrentPassword, request.NewPassword, ct); - return success ? NoContent() : BadRequest("Current password is incorrect."); - } - - private int? GetCurrentUserId() - { - var claim = User.FindFirst(System.Security.Claims.ClaimTypes.NameIdentifier)?.Value; - return int.TryParse(claim, out var id) ? id : null; - } -} +using MicCheck.Api.Common.Security.Authorization; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.RateLimiting; + +namespace MicCheck.Api.Users; + +[ApiController] +[Route("api/v1/users")] +[Authorize(Policy = AuthorizationPolicies.AdminApiAccess)] +[EnableRateLimiting("AdminApi")] +public class UsersController(UserService userService) : ControllerBase +{ + [HttpGet("{id:int}")] + public async Task> GetById(int id, CancellationToken ct) + { + var user = await userService.FindByIdAsync(id, ct); + return user is null ? NotFound() : Ok(UserResponse.From(user)); + } + + [HttpGet("me")] + public async Task> GetMe(CancellationToken ct) + { + var userId = GetCurrentUserId(); + if (userId is null) return Unauthorized(); + + var user = await userService.FindByIdAsync(userId.Value, ct); + return user is null ? NotFound() : Ok(UserResponse.From(user)); + } + + [HttpPut("me")] + public async Task> UpdateMe(UpdateProfileRequest request, CancellationToken ct) + { + var userId = GetCurrentUserId(); + if (userId is null) return Unauthorized(); + + if (string.IsNullOrWhiteSpace(request.FirstName) || + string.IsNullOrWhiteSpace(request.LastName) || + string.IsNullOrWhiteSpace(request.Email)) + return BadRequest("First name, last name, and email are required."); + + var (user, emailConflict) = await userService.UpdateProfileAsync( + userId.Value, request.FirstName.Trim(), request.LastName.Trim(), request.Email.Trim(), ct); + + if (emailConflict) return Conflict("Email is already in use."); + return user is null ? NotFound() : Ok(UserResponse.From(user)); + } + + [HttpPost("me/change-password")] + public async Task ChangePassword(ChangePasswordRequest request, CancellationToken ct) + { + var userId = GetCurrentUserId(); + if (userId is null) return Unauthorized(); + + if (string.IsNullOrWhiteSpace(request.CurrentPassword) || string.IsNullOrWhiteSpace(request.NewPassword)) + return BadRequest("Current and new passwords are required."); + + var success = await userService.ChangePasswordAsync(userId.Value, request.CurrentPassword, request.NewPassword, ct); + return success ? NoContent() : BadRequest("Current password is incorrect."); + } + + private int? GetCurrentUserId() + { + var claim = User.FindFirst(System.Security.Claims.ClaimTypes.NameIdentifier)?.Value; + return int.TryParse(claim, out var id) ? id : null; + } +} diff --git a/src/api/MicCheck.Api/Webhooks/CreateWebhookRequest.cs b/src/api/MicCheck.Api/Webhooks/CreateWebhookRequest.cs old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/Webhooks/Webhook.cs b/src/api/MicCheck.Api/Webhooks/Webhook.cs old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/Webhooks/WebhookBackgroundService.cs b/src/api/MicCheck.Api/Webhooks/WebhookBackgroundService.cs old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/Webhooks/WebhookDeliveryLog.cs b/src/api/MicCheck.Api/Webhooks/WebhookDeliveryLog.cs old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/Webhooks/WebhookDeliveryLogResponse.cs b/src/api/MicCheck.Api/Webhooks/WebhookDeliveryLogResponse.cs old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/Webhooks/WebhookDispatcher.cs b/src/api/MicCheck.Api/Webhooks/WebhookDispatcher.cs old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/Webhooks/WebhookEvent.cs b/src/api/MicCheck.Api/Webhooks/WebhookEvent.cs old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/Webhooks/WebhookPayload.cs b/src/api/MicCheck.Api/Webhooks/WebhookPayload.cs old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/Webhooks/WebhookQueue.cs b/src/api/MicCheck.Api/Webhooks/WebhookQueue.cs old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/Webhooks/WebhookResponse.cs b/src/api/MicCheck.Api/Webhooks/WebhookResponse.cs old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/Webhooks/WebhookRetryBackgroundService.cs b/src/api/MicCheck.Api/Webhooks/WebhookRetryBackgroundService.cs old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/Webhooks/WebhookService.cs b/src/api/MicCheck.Api/Webhooks/WebhookService.cs old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/appsettings.Development.json b/src/api/MicCheck.Api/appsettings.Development.json old mode 100644 new mode 100755 diff --git a/src/api/MicCheck.Api/appsettings.json b/src/api/MicCheck.Api/appsettings.json old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/.github/ISSUE_TEMPLATE/bug.yml b/src/materio-vuetify-vuejs-admin-template-free/.github/ISSUE_TEMPLATE/bug.yml old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/.github/ISSUE_TEMPLATE/config.yml b/src/materio-vuetify-vuejs-admin-template-free/.github/ISSUE_TEMPLATE/config.yml old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/.github/ISSUE_TEMPLATE/feature-request.yml b/src/materio-vuetify-vuejs-admin-template-free/.github/ISSUE_TEMPLATE/feature-request.yml old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/.github/workflows/deploy-demos.yml b/src/materio-vuetify-vuejs-admin-template-free/.github/workflows/deploy-demos.yml old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/.github/workflows/handle-new-issue-comment.yml b/src/materio-vuetify-vuejs-admin-template-free/.github/workflows/handle-new-issue-comment.yml old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/.github/workflows/handle-new-issue.yml b/src/materio-vuetify-vuejs-admin-template-free/.github/workflows/handle-new-issue.yml old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/.github/workflows/issue-staler.yml b/src/materio-vuetify-vuejs-admin-template-free/.github/workflows/issue-staler.yml old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/.gitignore b/src/materio-vuetify-vuejs-admin-template-free/.gitignore old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/CHANGELOG.md b/src/materio-vuetify-vuejs-admin-template-free/CHANGELOG.md old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/LICENSE b/src/materio-vuetify-vuejs-admin-template-free/LICENSE old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/README.md b/src/materio-vuetify-vuejs-admin-template-free/README.md old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/documentation.html b/src/materio-vuetify-vuejs-admin-template-free/documentation.html old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/.editorconfig b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/.editorconfig old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/.eslintrc-auto-import.json b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/.eslintrc-auto-import.json old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/.eslintrc.cjs b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/.eslintrc.cjs old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/.gitattributes b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/.gitattributes old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/.gitignore b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/.gitignore old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/.npmrc b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/.npmrc old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/.nvmrc b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/.nvmrc old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/.prettierignore b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/.prettierignore old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/.prettierrc.json b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/.prettierrc.json old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/.stylelintrc.json b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/.stylelintrc.json old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/.vscode/anchor-comments.code-snippets b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/.vscode/anchor-comments.code-snippets old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/.vscode/extensions.json b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/.vscode/extensions.json old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/.vscode/settings.json b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/.vscode/settings.json old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/.vscode/vue-ts.code-snippets b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/.vscode/vue-ts.code-snippets old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/.vscode/vue.code-snippets b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/.vscode/vue.code-snippets old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/.vscode/vuetify.code-snippets b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/.vscode/vuetify.code-snippets old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/README.md b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/README.md old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/auto-imports.d.ts b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/auto-imports.d.ts old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/components.d.ts b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/components.d.ts old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/index.html b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/index.html old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/jsconfig.json b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/jsconfig.json old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/package.json b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/package.json old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/pnpm-lock.yaml b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/pnpm-lock.yaml old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/public/favicon.ico b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/public/favicon.ico old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/public/images/avatars/avatar-1.png b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/public/images/avatars/avatar-1.png old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/public/loader.css b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/public/loader.css old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/public/logo.png b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/public/logo.png old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/components/MoreBtn.vue b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/components/MoreBtn.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/components/ThemeSwitcher.vue b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/components/ThemeSwitcher.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/components/cards/CardStatisticsHorizontal.vue b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/components/cards/CardStatisticsHorizontal.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/components/cards/CardStatisticsVertical.vue b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/components/cards/CardStatisticsVertical.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/components/cards/CardStatisticsWithImages.vue b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/components/cards/CardStatisticsWithImages.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/base/_components.scss b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/base/_components.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/base/_dark.scss b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/base/_dark.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/base/_default-layout-w-vertical-nav.scss b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/base/_default-layout-w-vertical-nav.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/base/_default-layout.scss b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/base/_default-layout.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/base/_index.scss b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/base/_index.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/base/_layouts.scss b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/base/_layouts.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/base/_misc.scss b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/base/_misc.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/base/_mixins.scss b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/base/_mixins.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/base/_utilities.scss b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/base/_utilities.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/base/_utils.scss b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/base/_utils.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/base/_variables.scss b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/base/_variables.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/base/_vertical-nav.scss b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/base/_vertical-nav.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/base/libs/_perfect-scrollbar.scss b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/base/libs/_perfect-scrollbar.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/base/libs/vuetify/_index.scss b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/base/libs/vuetify/_index.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/base/libs/vuetify/_overrides.scss b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/base/libs/vuetify/_overrides.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/base/libs/vuetify/_variables.scss b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/base/libs/vuetify/_variables.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/base/placeholders/_default-layout-vertical-nav.scss b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/base/placeholders/_default-layout-vertical-nav.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/base/placeholders/_default-layout.scss b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/base/placeholders/_default-layout.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/base/placeholders/_index.scss b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/base/placeholders/_index.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/base/placeholders/_misc.scss b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/base/placeholders/_misc.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/base/placeholders/_nav.scss b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/base/placeholders/_nav.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/base/placeholders/_vertical-nav.scss b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/base/placeholders/_vertical-nav.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/template/_default-layout-w-vertical-nav.scss b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/template/_default-layout-w-vertical-nav.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/template/_mixins.scss b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/template/_mixins.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/template/_utilities.scss b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/template/_utilities.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/template/_utils.scss b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/template/_utils.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/template/_variables.scss b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/template/_variables.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/template/_vertical-nav.scss b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/template/_vertical-nav.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/template/index.scss b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/template/index.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/template/libs/apex-chart.scss b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/template/libs/apex-chart.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/template/libs/vuetify/_overrides.scss b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/template/libs/vuetify/_overrides.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/template/libs/vuetify/_variables.scss b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/template/libs/vuetify/_variables.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/template/libs/vuetify/components/_alert.scss b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/template/libs/vuetify/components/_alert.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/template/libs/vuetify/components/_avatar.scss b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/template/libs/vuetify/components/_avatar.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/template/libs/vuetify/components/_badge.scss b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/template/libs/vuetify/components/_badge.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/template/libs/vuetify/components/_button.scss b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/template/libs/vuetify/components/_button.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/template/libs/vuetify/components/_cards.scss b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/template/libs/vuetify/components/_cards.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/template/libs/vuetify/components/_checkbox.scss b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/template/libs/vuetify/components/_checkbox.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/template/libs/vuetify/components/_chip.scss b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/template/libs/vuetify/components/_chip.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/template/libs/vuetify/components/_dialog.scss b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/template/libs/vuetify/components/_dialog.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/template/libs/vuetify/components/_expansion-panels.scss b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/template/libs/vuetify/components/_expansion-panels.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/template/libs/vuetify/components/_field.scss b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/template/libs/vuetify/components/_field.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/template/libs/vuetify/components/_list.scss b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/template/libs/vuetify/components/_list.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/template/libs/vuetify/components/_menu.scss b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/template/libs/vuetify/components/_menu.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/template/libs/vuetify/components/_otp-input.scss b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/template/libs/vuetify/components/_otp-input.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/template/libs/vuetify/components/_pagination.scss b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/template/libs/vuetify/components/_pagination.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/template/libs/vuetify/components/_progress.scss b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/template/libs/vuetify/components/_progress.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/template/libs/vuetify/components/_radio.scss b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/template/libs/vuetify/components/_radio.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/template/libs/vuetify/components/_rating.scss b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/template/libs/vuetify/components/_rating.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/template/libs/vuetify/components/_slider.scss b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/template/libs/vuetify/components/_slider.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/template/libs/vuetify/components/_snackbar.scss b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/template/libs/vuetify/components/_snackbar.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/template/libs/vuetify/components/_switch.scss b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/template/libs/vuetify/components/_switch.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/template/libs/vuetify/components/_table.scss b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/template/libs/vuetify/components/_table.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/template/libs/vuetify/components/_tabs.scss b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/template/libs/vuetify/components/_tabs.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/template/libs/vuetify/components/_textarea.scss b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/template/libs/vuetify/components/_textarea.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/template/libs/vuetify/components/_timeline.scss b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/template/libs/vuetify/components/_timeline.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/template/libs/vuetify/components/_tooltip.scss b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/template/libs/vuetify/components/_tooltip.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/template/libs/vuetify/components/index.scss b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/template/libs/vuetify/components/index.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/template/libs/vuetify/index.scss b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/template/libs/vuetify/index.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/template/pages/misc.scss b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/template/pages/misc.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/template/pages/page-auth.scss b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/template/pages/page-auth.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/template/placeholders/_default-layout-vertical-nav.scss b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/template/placeholders/_default-layout-vertical-nav.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/template/placeholders/_index.scss b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/template/placeholders/_index.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/template/placeholders/_misc.scss b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/template/placeholders/_misc.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/template/placeholders/_nav.scss b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/template/placeholders/_nav.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/template/placeholders/_vertical-nav.scss b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/scss/template/placeholders/_vertical-nav.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/utils/colorConverter.js b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/utils/colorConverter.js old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/utils/formatters.js b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/utils/formatters.js old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/utils/helpers.js b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/utils/helpers.js old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/utils/plugins.js b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@core/utils/plugins.js old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@layouts/components.js b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@layouts/components.js old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@layouts/components/TransitionExpand.vue b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@layouts/components/TransitionExpand.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@layouts/components/VerticalNav.vue b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@layouts/components/VerticalNav.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@layouts/components/VerticalNavGroup.vue b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@layouts/components/VerticalNavGroup.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@layouts/components/VerticalNavLayout.vue b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@layouts/components/VerticalNavLayout.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@layouts/components/VerticalNavLink.vue b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@layouts/components/VerticalNavLink.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@layouts/components/VerticalNavSectionTitle.vue b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@layouts/components/VerticalNavSectionTitle.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@layouts/enums.js b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@layouts/enums.js old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@layouts/index.js b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@layouts/index.js old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@layouts/styles/_classes.scss b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@layouts/styles/_classes.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@layouts/styles/_default-layout.scss b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@layouts/styles/_default-layout.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@layouts/styles/_global.scss b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@layouts/styles/_global.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@layouts/styles/_mixins.scss b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@layouts/styles/_mixins.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@layouts/styles/_placeholders.scss b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@layouts/styles/_placeholders.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@layouts/styles/_rtl.scss b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@layouts/styles/_rtl.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@layouts/styles/_variables.scss b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@layouts/styles/_variables.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@layouts/styles/index.scss b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@layouts/styles/index.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@layouts/types.js b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@layouts/types.js old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@layouts/utils.js b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/@layouts/utils.js old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/App.vue b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/App.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/assets/images/avatars/avatar-1.png b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/assets/images/avatars/avatar-1.png old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/assets/images/avatars/avatar-10.png b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/assets/images/avatars/avatar-10.png old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/assets/images/avatars/avatar-11.png b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/assets/images/avatars/avatar-11.png old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/assets/images/avatars/avatar-12.png b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/assets/images/avatars/avatar-12.png old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/assets/images/avatars/avatar-13.png b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/assets/images/avatars/avatar-13.png old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/assets/images/avatars/avatar-14.png b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/assets/images/avatars/avatar-14.png old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/assets/images/avatars/avatar-15.png b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/assets/images/avatars/avatar-15.png old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/assets/images/avatars/avatar-2.png b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/assets/images/avatars/avatar-2.png old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/assets/images/avatars/avatar-3.png b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/assets/images/avatars/avatar-3.png old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/assets/images/avatars/avatar-4.png b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/assets/images/avatars/avatar-4.png old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/assets/images/avatars/avatar-5.png b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/assets/images/avatars/avatar-5.png old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/assets/images/avatars/avatar-6.png b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/assets/images/avatars/avatar-6.png old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/assets/images/avatars/avatar-7.png b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/assets/images/avatars/avatar-7.png old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/assets/images/avatars/avatar-8.png b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/assets/images/avatars/avatar-8.png old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/assets/images/avatars/avatar-9.png b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/assets/images/avatars/avatar-9.png old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/assets/images/eCommerce/2.png b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/assets/images/eCommerce/2.png old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/assets/images/logo.svg b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/assets/images/logo.svg old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/assets/images/logos/american-bank.png b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/assets/images/logos/american-bank.png old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/assets/images/logos/aviato.png b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/assets/images/logos/aviato.png old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/assets/images/logos/aws.png b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/assets/images/logos/aws.png old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/assets/images/logos/bitbank.png b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/assets/images/logos/bitbank.png old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/assets/images/logos/chrome.png b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/assets/images/logos/chrome.png old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/assets/images/logos/citi-bank.png b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/assets/images/logos/citi-bank.png old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/assets/images/logos/digital-ocean.png b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/assets/images/logos/digital-ocean.png old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/assets/images/logos/github.png b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/assets/images/logos/github.png old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/assets/images/logos/google.png b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/assets/images/logos/google.png old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/assets/images/logos/gumroad.png b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/assets/images/logos/gumroad.png old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/assets/images/logos/mastercard-label.png b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/assets/images/logos/mastercard-label.png old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/assets/images/logos/slack.png b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/assets/images/logos/slack.png old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/assets/images/logos/stripe.png b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/assets/images/logos/stripe.png old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/assets/images/logos/zipcar.png b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/assets/images/logos/zipcar.png old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/assets/images/misc/trophy.png b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/assets/images/misc/trophy.png old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/assets/images/pages/1.png b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/assets/images/pages/1.png old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/assets/images/pages/2.png b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/assets/images/pages/2.png old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/assets/images/pages/3.png b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/assets/images/pages/3.png old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/assets/images/pages/404.png b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/assets/images/pages/404.png old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/assets/images/pages/5.jpg b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/assets/images/pages/5.jpg old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/assets/images/pages/6.jpg b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/assets/images/pages/6.jpg old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/assets/images/pages/auth-v1-mask-dark.png b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/assets/images/pages/auth-v1-mask-dark.png old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/assets/images/pages/auth-v1-mask-light.png b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/assets/images/pages/auth-v1-mask-light.png old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/assets/images/pages/auth-v1-tree-2.png b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/assets/images/pages/auth-v1-tree-2.png old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/assets/images/pages/auth-v1-tree.png b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/assets/images/pages/auth-v1-tree.png old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/assets/images/pages/misc-mask-dark.png b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/assets/images/pages/misc-mask-dark.png old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/assets/images/pages/misc-mask-light.png b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/assets/images/pages/misc-mask-light.png old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/assets/images/pages/tree.png b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/assets/images/pages/tree.png old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/assets/images/svg/checkbox-checked.svg b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/assets/images/svg/checkbox-checked.svg old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/assets/images/svg/checkbox-indeterminate.svg b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/assets/images/svg/checkbox-indeterminate.svg old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/assets/images/svg/checkbox-unchecked.svg b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/assets/images/svg/checkbox-unchecked.svg old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/assets/images/svg/radio-checked.svg b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/assets/images/svg/radio-checked.svg old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/assets/images/svg/radio-unchecked.svg b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/assets/images/svg/radio-unchecked.svg old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/assets/styles/styles.scss b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/assets/styles/styles.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/assets/styles/variables/_template.scss b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/assets/styles/variables/_template.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/assets/styles/variables/_vuetify.scss b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/assets/styles/variables/_vuetify.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/components/ErrorHeader.vue b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/components/ErrorHeader.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/components/UpgradeToPro.vue b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/components/UpgradeToPro.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/layouts/blank.vue b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/layouts/blank.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/layouts/components/DefaultLayoutWithVerticalNav.vue b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/layouts/components/DefaultLayoutWithVerticalNav.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/layouts/components/Footer.vue b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/layouts/components/Footer.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/layouts/components/NavItems.vue b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/layouts/components/NavItems.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/layouts/components/NavbarThemeSwitcher.vue b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/layouts/components/NavbarThemeSwitcher.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/layouts/components/UserProfile.vue b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/layouts/components/UserProfile.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/layouts/default.vue b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/layouts/default.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/main.js b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/main.js old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/pages/[...error].vue b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/pages/[...error].vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/pages/account-settings.vue b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/pages/account-settings.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/pages/card-basic.vue b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/pages/card-basic.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/pages/cards.vue b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/pages/cards.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/pages/dashboard.vue b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/pages/dashboard.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/pages/form-layouts.vue b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/pages/form-layouts.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/pages/icons.vue b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/pages/icons.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/pages/login.vue b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/pages/login.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/pages/register.vue b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/pages/register.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/pages/tables.vue b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/pages/tables.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/pages/typography.vue b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/pages/typography.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/plugins/iconify/build-icons.js b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/plugins/iconify/build-icons.js old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/plugins/iconify/index.js b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/plugins/iconify/index.js old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/plugins/iconify/package.json b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/plugins/iconify/package.json old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/plugins/pinia.js b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/plugins/pinia.js old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/plugins/router/index.js b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/plugins/router/index.js old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/plugins/router/routes.js b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/plugins/router/routes.js old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/plugins/vuetify/defaults.js b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/plugins/vuetify/defaults.js old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/plugins/vuetify/icons.js b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/plugins/vuetify/icons.js old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/plugins/vuetify/index.js b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/plugins/vuetify/index.js old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/plugins/vuetify/theme.js b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/plugins/vuetify/theme.js old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/plugins/webfontloader.js b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/plugins/webfontloader.js old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/utils/paginationMeta.js b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/utils/paginationMeta.js old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/views/dashboard/AnalyticsAward.vue b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/views/dashboard/AnalyticsAward.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/views/dashboard/AnalyticsBarCharts.vue b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/views/dashboard/AnalyticsBarCharts.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/views/dashboard/AnalyticsDepositWithdraw.vue b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/views/dashboard/AnalyticsDepositWithdraw.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/views/dashboard/AnalyticsSalesByCountries.vue b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/views/dashboard/AnalyticsSalesByCountries.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/views/dashboard/AnalyticsTotalEarning.vue b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/views/dashboard/AnalyticsTotalEarning.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/views/dashboard/AnalyticsTotalProfitLineCharts.vue b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/views/dashboard/AnalyticsTotalProfitLineCharts.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/views/dashboard/AnalyticsTransactions.vue b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/views/dashboard/AnalyticsTransactions.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/views/dashboard/AnalyticsUserTable.vue b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/views/dashboard/AnalyticsUserTable.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/views/dashboard/AnalyticsWeeklyOverview.vue b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/views/dashboard/AnalyticsWeeklyOverview.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/views/pages/account-settings/AccountSettingsAccount.vue b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/views/pages/account-settings/AccountSettingsAccount.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/views/pages/account-settings/AccountSettingsNotification.vue b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/views/pages/account-settings/AccountSettingsNotification.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/views/pages/account-settings/AccountSettingsSecurity.vue b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/views/pages/account-settings/AccountSettingsSecurity.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/views/pages/authentication/AuthProvider.vue b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/views/pages/authentication/AuthProvider.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/views/pages/cards/card-basic/CardBasic.vue b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/views/pages/cards/card-basic/CardBasic.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/views/pages/cards/card-basic/CardNavigation.vue b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/views/pages/cards/card-basic/CardNavigation.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/views/pages/cards/card-basic/CardSolid.vue b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/views/pages/cards/card-basic/CardSolid.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/views/pages/form-layouts/DemoFormLayoutHorizontalForm.vue b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/views/pages/form-layouts/DemoFormLayoutHorizontalForm.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/views/pages/form-layouts/DemoFormLayoutHorizontalFormWithIcons.vue b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/views/pages/form-layouts/DemoFormLayoutHorizontalFormWithIcons.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/views/pages/form-layouts/DemoFormLayoutMultipleColumn.vue b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/views/pages/form-layouts/DemoFormLayoutMultipleColumn.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/views/pages/form-layouts/DemoFormLayoutVerticalForm.vue b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/views/pages/form-layouts/DemoFormLayoutVerticalForm.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/views/pages/form-layouts/DemoFormLayoutVerticalFormWithIcons.vue b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/views/pages/form-layouts/DemoFormLayoutVerticalFormWithIcons.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/views/pages/tables/DemoSimpleTableBasics.vue b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/views/pages/tables/DemoSimpleTableBasics.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/views/pages/tables/DemoSimpleTableDensity.vue b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/views/pages/tables/DemoSimpleTableDensity.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/views/pages/tables/DemoSimpleTableFixedHeader.vue b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/views/pages/tables/DemoSimpleTableFixedHeader.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/views/pages/tables/DemoSimpleTableHeight.vue b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/views/pages/tables/DemoSimpleTableHeight.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/views/pages/tables/DemoSimpleTableTheme.vue b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/views/pages/tables/DemoSimpleTableTheme.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/views/user-interface/form-layouts/DemoFormLayoutHorizontalForm.vue b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/views/user-interface/form-layouts/DemoFormLayoutHorizontalForm.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/views/user-interface/form-layouts/DemoFormLayoutHorizontalFormWithIcons.vue b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/views/user-interface/form-layouts/DemoFormLayoutHorizontalFormWithIcons.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/views/user-interface/form-layouts/DemoFormLayoutMultipleColumn.vue b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/views/user-interface/form-layouts/DemoFormLayoutMultipleColumn.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/views/user-interface/form-layouts/DemoFormLayoutVerticalForm.vue b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/views/user-interface/form-layouts/DemoFormLayoutVerticalForm.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/views/user-interface/form-layouts/DemoFormLayoutVerticalFormWithIcons.vue b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/views/user-interface/form-layouts/DemoFormLayoutVerticalFormWithIcons.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/views/user-interface/tables/TableBasic.vue b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/views/user-interface/tables/TableBasic.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/views/user-interface/tables/TableDark.vue b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/views/user-interface/tables/TableDark.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/views/user-interface/tables/TableDensity.vue b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/views/user-interface/tables/TableDensity.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/views/user-interface/tables/TableFixedHeader.vue b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/views/user-interface/tables/TableFixedHeader.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/views/user-interface/tables/TableHeight.vue b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/views/user-interface/tables/TableHeight.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/views/user-interface/typography/TypographyHeadlines.vue b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/views/user-interface/typography/TypographyHeadlines.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/views/user-interface/typography/TypographyTexts.vue b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/src/views/user-interface/typography/TypographyTexts.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/javascript-version/vite.config.js b/src/materio-vuetify-vuejs-admin-template-free/javascript-version/vite.config.js old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/package.json b/src/materio-vuetify-vuejs-admin-template-free/package.json old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/pnpm-lock.yaml b/src/materio-vuetify-vuejs-admin-template-free/pnpm-lock.yaml old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/.editorconfig b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/.editorconfig old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/.eslintrc.cjs b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/.eslintrc.cjs old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/.gitattributes b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/.gitattributes old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/.gitignore b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/.gitignore old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/.npmrc b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/.npmrc old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/.nvmrc b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/.nvmrc old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/.prettierignore b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/.prettierignore old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/.prettierrc.json b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/.prettierrc.json old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/.stylelintrc.json b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/.stylelintrc.json old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/.vscode/anchor-comments.code-snippets b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/.vscode/anchor-comments.code-snippets old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/.vscode/extensions.json b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/.vscode/extensions.json old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/.vscode/settings.json b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/.vscode/settings.json old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/.vscode/vue-ts.code-snippets b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/.vscode/vue-ts.code-snippets old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/.vscode/vue.code-snippets b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/.vscode/vue.code-snippets old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/.vscode/vuetify.code-snippets b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/.vscode/vuetify.code-snippets old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/README.md b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/README.md old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/auto-imports.d.ts b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/auto-imports.d.ts old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/components.d.ts b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/components.d.ts old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/env.d.ts b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/env.d.ts old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/index.html b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/index.html old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/package.json b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/package.json old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/pnpm-lock.yaml b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/pnpm-lock.yaml old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/public/favicon.ico b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/public/favicon.ico old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/public/images/avatars/avatar-1.png b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/public/images/avatars/avatar-1.png old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/public/loader.css b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/public/loader.css old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/public/logo.png b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/public/logo.png old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/shims.d.ts b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/shims.d.ts old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/components/MoreBtn.vue b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/components/MoreBtn.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/components/ThemeSwitcher.vue b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/components/ThemeSwitcher.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/components/cards/CardStatisticsHorizontal.vue b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/components/cards/CardStatisticsHorizontal.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/components/cards/CardStatisticsVertical.vue b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/components/cards/CardStatisticsVertical.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/components/cards/CardStatisticsWithImages.vue b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/components/cards/CardStatisticsWithImages.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/base/_components.scss b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/base/_components.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/base/_dark.scss b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/base/_dark.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/base/_default-layout-w-vertical-nav.scss b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/base/_default-layout-w-vertical-nav.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/base/_default-layout.scss b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/base/_default-layout.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/base/_index.scss b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/base/_index.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/base/_layouts.scss b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/base/_layouts.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/base/_misc.scss b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/base/_misc.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/base/_mixins.scss b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/base/_mixins.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/base/_utilities.scss b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/base/_utilities.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/base/_utils.scss b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/base/_utils.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/base/_variables.scss b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/base/_variables.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/base/_vertical-nav.scss b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/base/_vertical-nav.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/base/libs/_perfect-scrollbar.scss b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/base/libs/_perfect-scrollbar.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/base/libs/vuetify/_index.scss b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/base/libs/vuetify/_index.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/base/libs/vuetify/_overrides.scss b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/base/libs/vuetify/_overrides.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/base/libs/vuetify/_variables.scss b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/base/libs/vuetify/_variables.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/base/placeholders/_default-layout-vertical-nav.scss b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/base/placeholders/_default-layout-vertical-nav.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/base/placeholders/_default-layout.scss b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/base/placeholders/_default-layout.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/base/placeholders/_index.scss b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/base/placeholders/_index.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/base/placeholders/_misc.scss b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/base/placeholders/_misc.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/base/placeholders/_nav.scss b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/base/placeholders/_nav.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/base/placeholders/_vertical-nav.scss b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/base/placeholders/_vertical-nav.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/template/_default-layout-w-vertical-nav.scss b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/template/_default-layout-w-vertical-nav.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/template/_mixins.scss b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/template/_mixins.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/template/_utilities.scss b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/template/_utilities.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/template/_utils.scss b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/template/_utils.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/template/_variables.scss b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/template/_variables.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/template/_vertical-nav.scss b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/template/_vertical-nav.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/template/index.scss b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/template/index.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/template/libs/apex-chart.scss b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/template/libs/apex-chart.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/template/libs/vuetify/_overrides.scss b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/template/libs/vuetify/_overrides.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/template/libs/vuetify/_variables.scss b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/template/libs/vuetify/_variables.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/template/libs/vuetify/components/_alert.scss b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/template/libs/vuetify/components/_alert.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/template/libs/vuetify/components/_avatar.scss b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/template/libs/vuetify/components/_avatar.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/template/libs/vuetify/components/_badge.scss b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/template/libs/vuetify/components/_badge.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/template/libs/vuetify/components/_button.scss b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/template/libs/vuetify/components/_button.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/template/libs/vuetify/components/_cards.scss b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/template/libs/vuetify/components/_cards.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/template/libs/vuetify/components/_checkbox.scss b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/template/libs/vuetify/components/_checkbox.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/template/libs/vuetify/components/_chip.scss b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/template/libs/vuetify/components/_chip.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/template/libs/vuetify/components/_dialog.scss b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/template/libs/vuetify/components/_dialog.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/template/libs/vuetify/components/_expansion-panels.scss b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/template/libs/vuetify/components/_expansion-panels.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/template/libs/vuetify/components/_field.scss b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/template/libs/vuetify/components/_field.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/template/libs/vuetify/components/_list.scss b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/template/libs/vuetify/components/_list.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/template/libs/vuetify/components/_menu.scss b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/template/libs/vuetify/components/_menu.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/template/libs/vuetify/components/_otp-input.scss b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/template/libs/vuetify/components/_otp-input.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/template/libs/vuetify/components/_pagination.scss b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/template/libs/vuetify/components/_pagination.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/template/libs/vuetify/components/_progress.scss b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/template/libs/vuetify/components/_progress.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/template/libs/vuetify/components/_radio.scss b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/template/libs/vuetify/components/_radio.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/template/libs/vuetify/components/_rating.scss b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/template/libs/vuetify/components/_rating.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/template/libs/vuetify/components/_slider.scss b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/template/libs/vuetify/components/_slider.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/template/libs/vuetify/components/_snackbar.scss b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/template/libs/vuetify/components/_snackbar.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/template/libs/vuetify/components/_switch.scss b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/template/libs/vuetify/components/_switch.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/template/libs/vuetify/components/_table.scss b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/template/libs/vuetify/components/_table.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/template/libs/vuetify/components/_tabs.scss b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/template/libs/vuetify/components/_tabs.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/template/libs/vuetify/components/_textarea.scss b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/template/libs/vuetify/components/_textarea.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/template/libs/vuetify/components/_timeline.scss b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/template/libs/vuetify/components/_timeline.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/template/libs/vuetify/components/_tooltip.scss b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/template/libs/vuetify/components/_tooltip.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/template/libs/vuetify/components/index.scss b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/template/libs/vuetify/components/index.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/template/libs/vuetify/index.scss b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/template/libs/vuetify/index.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/template/pages/misc.scss b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/template/pages/misc.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/template/pages/page-auth.scss b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/template/pages/page-auth.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/template/placeholders/_default-layout-vertical-nav.scss b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/template/placeholders/_default-layout-vertical-nav.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/template/placeholders/_index.scss b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/template/placeholders/_index.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/template/placeholders/_misc.scss b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/template/placeholders/_misc.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/template/placeholders/_nav.scss b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/template/placeholders/_nav.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/template/placeholders/_vertical-nav.scss b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/scss/template/placeholders/_vertical-nav.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/utils/colorConverter.ts b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/utils/colorConverter.ts old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/utils/formatters.ts b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/utils/formatters.ts old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/utils/helpers.ts b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/utils/helpers.ts old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/utils/plugins.ts b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@core/utils/plugins.ts old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@layouts/components.ts b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@layouts/components.ts old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@layouts/components/TransitionExpand.vue b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@layouts/components/TransitionExpand.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@layouts/components/VerticalNav.vue b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@layouts/components/VerticalNav.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@layouts/components/VerticalNavGroup.vue b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@layouts/components/VerticalNavGroup.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@layouts/components/VerticalNavLayout.vue b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@layouts/components/VerticalNavLayout.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@layouts/components/VerticalNavLink.vue b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@layouts/components/VerticalNavLink.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@layouts/components/VerticalNavSectionTitle.vue b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@layouts/components/VerticalNavSectionTitle.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@layouts/enums.ts b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@layouts/enums.ts old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@layouts/index.ts b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@layouts/index.ts old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@layouts/styles/_classes.scss b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@layouts/styles/_classes.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@layouts/styles/_default-layout.scss b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@layouts/styles/_default-layout.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@layouts/styles/_global.scss b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@layouts/styles/_global.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@layouts/styles/_mixins.scss b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@layouts/styles/_mixins.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@layouts/styles/_placeholders.scss b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@layouts/styles/_placeholders.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@layouts/styles/_rtl.scss b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@layouts/styles/_rtl.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@layouts/styles/_variables.scss b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@layouts/styles/_variables.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@layouts/styles/index.scss b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@layouts/styles/index.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@layouts/types.ts b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@layouts/types.ts old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@layouts/utils.ts b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/@layouts/utils.ts old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/App.vue b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/App.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/assets/images/avatars/avatar-1.png b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/assets/images/avatars/avatar-1.png old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/assets/images/avatars/avatar-10.png b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/assets/images/avatars/avatar-10.png old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/assets/images/avatars/avatar-11.png b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/assets/images/avatars/avatar-11.png old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/assets/images/avatars/avatar-12.png b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/assets/images/avatars/avatar-12.png old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/assets/images/avatars/avatar-13.png b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/assets/images/avatars/avatar-13.png old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/assets/images/avatars/avatar-14.png b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/assets/images/avatars/avatar-14.png old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/assets/images/avatars/avatar-15.png b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/assets/images/avatars/avatar-15.png old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/assets/images/avatars/avatar-2.png b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/assets/images/avatars/avatar-2.png old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/assets/images/avatars/avatar-3.png b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/assets/images/avatars/avatar-3.png old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/assets/images/avatars/avatar-4.png b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/assets/images/avatars/avatar-4.png old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/assets/images/avatars/avatar-5.png b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/assets/images/avatars/avatar-5.png old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/assets/images/avatars/avatar-6.png b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/assets/images/avatars/avatar-6.png old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/assets/images/avatars/avatar-7.png b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/assets/images/avatars/avatar-7.png old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/assets/images/avatars/avatar-8.png b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/assets/images/avatars/avatar-8.png old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/assets/images/avatars/avatar-9.png b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/assets/images/avatars/avatar-9.png old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/assets/images/eCommerce/2.png b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/assets/images/eCommerce/2.png old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/assets/images/logo.svg b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/assets/images/logo.svg old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/assets/images/logos/american-bank.png b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/assets/images/logos/american-bank.png old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/assets/images/logos/aviato.png b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/assets/images/logos/aviato.png old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/assets/images/logos/aws.png b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/assets/images/logos/aws.png old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/assets/images/logos/bitbank.png b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/assets/images/logos/bitbank.png old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/assets/images/logos/chrome.png b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/assets/images/logos/chrome.png old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/assets/images/logos/citi-bank.png b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/assets/images/logos/citi-bank.png old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/assets/images/logos/digital-ocean.png b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/assets/images/logos/digital-ocean.png old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/assets/images/logos/github.png b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/assets/images/logos/github.png old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/assets/images/logos/google.png b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/assets/images/logos/google.png old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/assets/images/logos/gumroad.png b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/assets/images/logos/gumroad.png old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/assets/images/logos/mastercard-label.png b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/assets/images/logos/mastercard-label.png old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/assets/images/logos/slack.png b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/assets/images/logos/slack.png old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/assets/images/logos/stripe.png b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/assets/images/logos/stripe.png old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/assets/images/logos/zipcar.png b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/assets/images/logos/zipcar.png old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/assets/images/misc/trophy.png b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/assets/images/misc/trophy.png old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/assets/images/pages/1.png b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/assets/images/pages/1.png old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/assets/images/pages/2.png b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/assets/images/pages/2.png old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/assets/images/pages/3.png b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/assets/images/pages/3.png old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/assets/images/pages/404.png b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/assets/images/pages/404.png old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/assets/images/pages/5.jpg b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/assets/images/pages/5.jpg old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/assets/images/pages/6.jpg b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/assets/images/pages/6.jpg old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/assets/images/pages/auth-v1-mask-dark.png b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/assets/images/pages/auth-v1-mask-dark.png old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/assets/images/pages/auth-v1-mask-light.png b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/assets/images/pages/auth-v1-mask-light.png old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/assets/images/pages/auth-v1-tree-2.png b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/assets/images/pages/auth-v1-tree-2.png old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/assets/images/pages/auth-v1-tree.png b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/assets/images/pages/auth-v1-tree.png old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/assets/images/pages/misc-mask-dark.png b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/assets/images/pages/misc-mask-dark.png old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/assets/images/pages/misc-mask-light.png b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/assets/images/pages/misc-mask-light.png old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/assets/images/pages/tree.png b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/assets/images/pages/tree.png old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/assets/images/svg/checkbox-checked.svg b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/assets/images/svg/checkbox-checked.svg old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/assets/images/svg/checkbox-indeterminate.svg b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/assets/images/svg/checkbox-indeterminate.svg old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/assets/images/svg/checkbox-unchecked.svg b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/assets/images/svg/checkbox-unchecked.svg old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/assets/images/svg/radio-checked.svg b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/assets/images/svg/radio-checked.svg old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/assets/images/svg/radio-unchecked.svg b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/assets/images/svg/radio-unchecked.svg old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/assets/styles/styles.scss b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/assets/styles/styles.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/assets/styles/variables/_template.scss b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/assets/styles/variables/_template.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/assets/styles/variables/_vuetify.scss b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/assets/styles/variables/_vuetify.scss old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/components/ErrorHeader.vue b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/components/ErrorHeader.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/components/UpgradeToPro.vue b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/components/UpgradeToPro.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/layouts/blank.vue b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/layouts/blank.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/layouts/components/DefaultLayoutWithVerticalNav.vue b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/layouts/components/DefaultLayoutWithVerticalNav.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/layouts/components/Footer.vue b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/layouts/components/Footer.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/layouts/components/NavItems.vue b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/layouts/components/NavItems.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/layouts/components/NavbarThemeSwitcher.vue b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/layouts/components/NavbarThemeSwitcher.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/layouts/components/UserProfile.vue b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/layouts/components/UserProfile.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/layouts/default.vue b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/layouts/default.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/main.ts b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/main.ts old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/pages/[...error].vue b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/pages/[...error].vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/pages/account-settings.vue b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/pages/account-settings.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/pages/card-basic.vue b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/pages/card-basic.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/pages/cards.vue b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/pages/cards.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/pages/dashboard.vue b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/pages/dashboard.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/pages/form-layouts.vue b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/pages/form-layouts.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/pages/icons.vue b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/pages/icons.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/pages/login.vue b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/pages/login.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/pages/register.vue b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/pages/register.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/pages/tables.vue b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/pages/tables.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/pages/typography.vue b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/pages/typography.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/plugins/iconify/build-icons.ts b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/plugins/iconify/build-icons.ts old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/plugins/iconify/index.ts b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/plugins/iconify/index.ts old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/plugins/iconify/package.json b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/plugins/iconify/package.json old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/plugins/pinia.ts b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/plugins/pinia.ts old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/plugins/router/index.ts b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/plugins/router/index.ts old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/plugins/router/routes.ts b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/plugins/router/routes.ts old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/plugins/vuetify/defaults.ts b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/plugins/vuetify/defaults.ts old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/plugins/vuetify/icons.ts b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/plugins/vuetify/icons.ts old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/plugins/vuetify/index.ts b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/plugins/vuetify/index.ts old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/plugins/vuetify/theme.ts b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/plugins/vuetify/theme.ts old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/plugins/webfontloader.ts b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/plugins/webfontloader.ts old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/utils/paginationMeta.ts b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/utils/paginationMeta.ts old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/views/dashboard/AnalyticsAward.vue b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/views/dashboard/AnalyticsAward.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/views/dashboard/AnalyticsBarCharts.vue b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/views/dashboard/AnalyticsBarCharts.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/views/dashboard/AnalyticsDepositWithdraw.vue b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/views/dashboard/AnalyticsDepositWithdraw.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/views/dashboard/AnalyticsSalesByCountries.vue b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/views/dashboard/AnalyticsSalesByCountries.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/views/dashboard/AnalyticsTotalEarning.vue b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/views/dashboard/AnalyticsTotalEarning.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/views/dashboard/AnalyticsTotalProfitLineCharts.vue b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/views/dashboard/AnalyticsTotalProfitLineCharts.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/views/dashboard/AnalyticsTransactions.vue b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/views/dashboard/AnalyticsTransactions.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/views/dashboard/AnalyticsUserTable.vue b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/views/dashboard/AnalyticsUserTable.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/views/dashboard/AnalyticsWeeklyOverview.vue b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/views/dashboard/AnalyticsWeeklyOverview.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/views/pages/account-settings/AccountSettingsAccount.vue b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/views/pages/account-settings/AccountSettingsAccount.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/views/pages/account-settings/AccountSettingsNotification.vue b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/views/pages/account-settings/AccountSettingsNotification.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/views/pages/account-settings/AccountSettingsSecurity.vue b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/views/pages/account-settings/AccountSettingsSecurity.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/views/pages/authentication/AuthProvider.vue b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/views/pages/authentication/AuthProvider.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/views/pages/cards/card-basic/CardBasic.vue b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/views/pages/cards/card-basic/CardBasic.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/views/pages/cards/card-basic/CardNavigation.vue b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/views/pages/cards/card-basic/CardNavigation.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/views/pages/cards/card-basic/CardSolid.vue b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/views/pages/cards/card-basic/CardSolid.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/views/pages/form-layouts/DemoFormLayoutHorizontalForm.vue b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/views/pages/form-layouts/DemoFormLayoutHorizontalForm.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/views/pages/form-layouts/DemoFormLayoutHorizontalFormWithIcons.vue b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/views/pages/form-layouts/DemoFormLayoutHorizontalFormWithIcons.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/views/pages/form-layouts/DemoFormLayoutMultipleColumn.vue b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/views/pages/form-layouts/DemoFormLayoutMultipleColumn.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/views/pages/form-layouts/DemoFormLayoutVerticalForm.vue b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/views/pages/form-layouts/DemoFormLayoutVerticalForm.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/views/pages/form-layouts/DemoFormLayoutVerticalFormWithIcons.vue b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/views/pages/form-layouts/DemoFormLayoutVerticalFormWithIcons.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/views/pages/tables/DemoSimpleTableBasics.vue b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/views/pages/tables/DemoSimpleTableBasics.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/views/pages/tables/DemoSimpleTableDensity.vue b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/views/pages/tables/DemoSimpleTableDensity.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/views/pages/tables/DemoSimpleTableFixedHeader.vue b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/views/pages/tables/DemoSimpleTableFixedHeader.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/views/pages/tables/DemoSimpleTableHeight.vue b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/views/pages/tables/DemoSimpleTableHeight.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/views/pages/tables/DemoSimpleTableTheme.vue b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/views/pages/tables/DemoSimpleTableTheme.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/views/user-interface/form-layouts/DemoFormLayoutHorizontalForm.vue b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/views/user-interface/form-layouts/DemoFormLayoutHorizontalForm.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/views/user-interface/form-layouts/DemoFormLayoutHorizontalFormWithIcons.vue b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/views/user-interface/form-layouts/DemoFormLayoutHorizontalFormWithIcons.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/views/user-interface/form-layouts/DemoFormLayoutMultipleColumn.vue b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/views/user-interface/form-layouts/DemoFormLayoutMultipleColumn.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/views/user-interface/form-layouts/DemoFormLayoutVerticalForm.vue b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/views/user-interface/form-layouts/DemoFormLayoutVerticalForm.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/views/user-interface/form-layouts/DemoFormLayoutVerticalFormWithIcons.vue b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/views/user-interface/form-layouts/DemoFormLayoutVerticalFormWithIcons.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/views/user-interface/tables/TableBasic.vue b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/views/user-interface/tables/TableBasic.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/views/user-interface/tables/TableDark.vue b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/views/user-interface/tables/TableDark.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/views/user-interface/tables/TableDensity.vue b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/views/user-interface/tables/TableDensity.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/views/user-interface/tables/TableFixedHeader.vue b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/views/user-interface/tables/TableFixedHeader.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/views/user-interface/tables/TableHeight.vue b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/views/user-interface/tables/TableHeight.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/views/user-interface/typography/TypographyHeadlines.vue b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/views/user-interface/typography/TypographyHeadlines.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/views/user-interface/typography/TypographyTexts.vue b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/src/views/user-interface/typography/TypographyTexts.vue old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/tsconfig.json b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/tsconfig.json old mode 100644 new mode 100755 diff --git a/src/materio-vuetify-vuejs-admin-template-free/typescript-version/vite.config.ts b/src/materio-vuetify-vuejs-admin-template-free/typescript-version/vite.config.ts old mode 100644 new mode 100755 diff --git a/tests/api/MicCheck.Api.Tests.Integration/Common/FlagApiHttpClient.cs b/tests/api/MicCheck.Api.Tests.Integration/Common/FlagApiHttpClient.cs old mode 100644 new mode 100755 diff --git a/tests/api/MicCheck.Api.Tests.Integration/Common/HttpFile.cs b/tests/api/MicCheck.Api.Tests.Integration/Common/HttpFile.cs old mode 100644 new mode 100755 diff --git a/tests/api/MicCheck.Api.Tests.Integration/Common/IntegrationTestSettings.cs b/tests/api/MicCheck.Api.Tests.Integration/Common/IntegrationTestSettings.cs old mode 100644 new mode 100755 diff --git a/tests/api/MicCheck.Api.Tests.Integration/Common/TestDatabase.cs b/tests/api/MicCheck.Api.Tests.Integration/Common/TestDatabase.cs old mode 100644 new mode 100755 diff --git a/tests/api/MicCheck.Api.Tests.Integration/Flags/FlagEnabledTests.cs b/tests/api/MicCheck.Api.Tests.Integration/Flags/FlagEnabledTests.cs old mode 100644 new mode 100755 diff --git a/tests/api/MicCheck.Api.Tests.Integration/Flags/FlagSeed.cs b/tests/api/MicCheck.Api.Tests.Integration/Flags/FlagSeed.cs old mode 100644 new mode 100755 diff --git a/tests/api/MicCheck.Api.Tests.Integration/HttpFiles/Flags.http b/tests/api/MicCheck.Api.Tests.Integration/HttpFiles/Flags.http old mode 100644 new mode 100755 diff --git a/tests/api/MicCheck.Api.Tests.Integration/MicCheck.Api.Tests.Integration.csproj b/tests/api/MicCheck.Api.Tests.Integration/MicCheck.Api.Tests.Integration.csproj old mode 100644 new mode 100755 diff --git a/tests/api/MicCheck.Api.Tests.Integration/local.runsettings b/tests/api/MicCheck.Api.Tests.Integration/local.runsettings old mode 100644 new mode 100755 diff --git a/tests/api/MicCheck.Api.Tests.Integration/readme.md b/tests/api/MicCheck.Api.Tests.Integration/readme.md old mode 100644 new mode 100755 diff --git a/tests/api/MicCheck.Api.Tests.Unit/Admin/AdminApiIntegrationTests.cs b/tests/api/MicCheck.Api.Tests.Unit/Admin/AdminApiIntegrationTests.cs old mode 100644 new mode 100755 index cec3fad..14df3b3 --- a/tests/api/MicCheck.Api.Tests.Unit/Admin/AdminApiIntegrationTests.cs +++ b/tests/api/MicCheck.Api.Tests.Unit/Admin/AdminApiIntegrationTests.cs @@ -1,268 +1,268 @@ -using System.Net; -using System.Net.Http.Json; -using MicCheck.Api.Common.Security.ApiKeys; -using MicCheck.Api.Data; -using MicCheck.Api.Features; -using MicCheck.Api.Organizations; -using MicCheck.Api.Projects; -using Microsoft.Extensions.DependencyInjection; -using NUnit.Framework; -using AppEnvironment = MicCheck.Api.Environments.Environment; - -namespace MicCheck.Api.Tests.Unit.Admin; - -[TestFixture] -public class AdminApiIntegrationTests -{ - private MicCheckWebApplicationFactory _factory = null!; - private string _rawApiKey = null!; - - [SetUp] - public void SetUp() - { - _factory = new MicCheckWebApplicationFactory(); - _rawApiKey = SeedOrganizationWithApiKey(); - } - - [TearDown] - public void TearDown() => _factory.Dispose(); - - private string SeedOrganizationWithApiKey() - { - using var scope = _factory.Services.CreateScope(); - var db = scope.ServiceProvider.GetRequiredService(); - - var org = new Organization { Name = "Test Org", CreatedAt = DateTimeOffset.UtcNow }; - db.Organizations.Add(org); - db.SaveChanges(); - - var rawKey = ApiKeyHasher.GenerateKey(); - var hashedKey = ApiKeyHasher.Hash(rawKey); - var prefix = rawKey.Length >= 8 ? rawKey[..8] : rawKey; - - db.ApiKeys.Add(new ApiKey - { - Key = hashedKey, - Prefix = prefix, - Name = "Test Key", - OrganizationId = org.Id, - IsActive = true, - CreatedAt = DateTimeOffset.UtcNow - }); - db.SaveChanges(); - - return rawKey; - } - - private HttpClient CreateAuthenticatedClient() - { - var client = _factory.CreateClient(); - client.DefaultRequestHeaders.Add("Authorization", $"Api-Key {_rawApiKey}"); - return client; - } - - [Test] - public async Task WhenCreatingAProject_ThenProjectIsReturned() - { - var client = CreateAuthenticatedClient(); - - using var scope = _factory.Services.CreateScope(); - var db = scope.ServiceProvider.GetRequiredService(); - var org = db.Organizations.First(); - - var response = await client.PostAsJsonAsync("/api/v1/projects", new - { - name = "My Project", - organizationId = org.Id - }); - - Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.Created)); - } - - [Test] - public async Task WhenCreatingAFeature_ThenFeatureIsReturned() - { - var client = CreateAuthenticatedClient(); - - using var scope = _factory.Services.CreateScope(); - var db = scope.ServiceProvider.GetRequiredService(); - var org = db.Organizations.First(); - - var project = new Project - { - Name = "My Project", - OrganizationId = org.Id, - CreatedAt = DateTimeOffset.UtcNow - }; - db.Projects.Add(project); - db.SaveChanges(); - - var response = await client.PostAsJsonAsync($"/api/v1/projects/{project.Id}/features", new - { - name = "dark_mode", - type = "Standard", - initialValue = (string?)null, - description = (string?)null - }); - - Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.Created)); - } - - [Test] - public async Task WhenCreatingAFeature_ThenFeatureStateIsAutoCreatedForEnvironments() - { - var client = CreateAuthenticatedClient(); - - using var scope = _factory.Services.CreateScope(); - var db = scope.ServiceProvider.GetRequiredService(); - var org = db.Organizations.First(); - - var project = new Project - { - Name = "My Project", - OrganizationId = org.Id, - CreatedAt = DateTimeOffset.UtcNow - }; - db.Projects.Add(project); - db.SaveChanges(); - - db.Environments.Add(new AppEnvironment - { - Name = "Production", - ApiKey = "env-key-prod", - ProjectId = project.Id, - CreatedAt = DateTimeOffset.UtcNow - }); - db.SaveChanges(); - - await client.PostAsJsonAsync($"/api/v1/projects/{project.Id}/features", new - { - name = "flag_x", - type = "Standard", - initialValue = (string?)null, - description = (string?)null - }); - - using var verifyScope = _factory.Services.CreateScope(); - var verifyDb = verifyScope.ServiceProvider.GetRequiredService(); - var feature = verifyDb.Features.First(f => f.Name == "flag_x"); - var states = verifyDb.FeatureStates.Where(fs => fs.FeatureId == feature.Id).ToList(); - - Assert.That(states, Has.Count.EqualTo(1)); - } - - [Test] - public async Task WhenCreatingAnEnvironment_ThenFeatureStateIsAutoCreatedForExistingFeatures() - { - var client = CreateAuthenticatedClient(); - - using var scope = _factory.Services.CreateScope(); - var db = scope.ServiceProvider.GetRequiredService(); - var org = db.Organizations.First(); - - var project = new Project - { - Name = "My Project", - OrganizationId = org.Id, - CreatedAt = DateTimeOffset.UtcNow - }; - db.Projects.Add(project); - db.Features.Add(new Feature - { - Name = "existing_flag", - ProjectId = project.Id, - CreatedAt = DateTimeOffset.UtcNow - }); - db.SaveChanges(); - - var response = await client.PostAsJsonAsync("/api/v1/environments", new - { - name = "Staging", - projectId = project.Id - }); - - Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.Created)); - - using var verifyScope = _factory.Services.CreateScope(); - var verifyDb = verifyScope.ServiceProvider.GetRequiredService(); - var feature = verifyDb.Features.First(f => f.Name == "existing_flag"); - var env = verifyDb.Environments.First(e => e.ProjectId == project.Id); - var states = verifyDb.FeatureStates.Where(fs => fs.EnvironmentId == env.Id && fs.FeatureId == feature.Id).ToList(); - - Assert.That(states, Has.Count.EqualTo(1)); - } - - [Test] - public async Task WhenRequestIsMissingApiKey_ThenUnauthorizedIsReturned() - { - var client = _factory.CreateClient(); - - var response = await client.GetAsync("/api/v1/projects?organizationId=1"); - - Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.Unauthorized)); - } - - [Test] - public async Task WhenCreatingAFeatureWithInvalidName_ThenUnprocessableEntityIsReturned() - { - var client = CreateAuthenticatedClient(); - - using var scope = _factory.Services.CreateScope(); - var db = scope.ServiceProvider.GetRequiredService(); - var org = db.Organizations.First(); - - var project = new Project - { - Name = "My Project", - OrganizationId = org.Id, - CreatedAt = DateTimeOffset.UtcNow - }; - db.Projects.Add(project); - db.SaveChanges(); - - var response = await client.PostAsJsonAsync($"/api/v1/projects/{project.Id}/features", new - { - name = "invalid name with spaces!", - type = "Standard" - }); - - Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.UnprocessableEntity)); - } - - [Test] - public async Task WhenCreatingASegment_ThenSegmentIsReturned() - { - var client = CreateAuthenticatedClient(); - - using var scope = _factory.Services.CreateScope(); - var db = scope.ServiceProvider.GetRequiredService(); - var org = db.Organizations.First(); - - var project = new Project - { - Name = "My Project", - OrganizationId = org.Id, - CreatedAt = DateTimeOffset.UtcNow - }; - db.Projects.Add(project); - db.SaveChanges(); - - var response = await client.PostAsJsonAsync($"/api/v1/projects/{project.Id}/segments", new - { - name = "Premium Users", - rules = new[] - { - new - { - type = "All", - conditions = new[] - { - new { property = "plan", @operator = "Equal", value = "premium" } - } - } - } - }); - - Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.Created)); - } -} +using System.Net; +using System.Net.Http.Json; +using MicCheck.Api.Common.Security.ApiKeys; +using MicCheck.Api.Data; +using MicCheck.Api.Features; +using MicCheck.Api.Organizations; +using MicCheck.Api.Projects; +using Microsoft.Extensions.DependencyInjection; +using NUnit.Framework; +using AppEnvironment = MicCheck.Api.Environments.Environment; + +namespace MicCheck.Api.Tests.Unit.Admin; + +[TestFixture] +public class AdminApiIntegrationTests +{ + private MicCheckWebApplicationFactory _factory = null!; + private string _rawApiKey = null!; + + [SetUp] + public void SetUp() + { + _factory = new MicCheckWebApplicationFactory(); + _rawApiKey = SeedOrganizationWithApiKey(); + } + + [TearDown] + public void TearDown() => _factory.Dispose(); + + private string SeedOrganizationWithApiKey() + { + using var scope = _factory.Services.CreateScope(); + var db = scope.ServiceProvider.GetRequiredService(); + + var org = new Organization { Name = "Test Org", CreatedAt = DateTimeOffset.UtcNow }; + db.Organizations.Add(org); + db.SaveChanges(); + + var rawKey = ApiKeyHasher.GenerateKey(); + var hashedKey = ApiKeyHasher.Hash(rawKey); + var prefix = rawKey.Length >= 8 ? rawKey[..8] : rawKey; + + db.ApiKeys.Add(new ApiKey + { + Key = hashedKey, + Prefix = prefix, + Name = "Test Key", + OrganizationId = org.Id, + IsActive = true, + CreatedAt = DateTimeOffset.UtcNow + }); + db.SaveChanges(); + + return rawKey; + } + + private HttpClient CreateAuthenticatedClient() + { + var client = _factory.CreateClient(); + client.DefaultRequestHeaders.Add("Authorization", $"Api-Key {_rawApiKey}"); + return client; + } + + [Test] + public async Task WhenCreatingAProject_ThenProjectIsReturned() + { + var client = CreateAuthenticatedClient(); + + using var scope = _factory.Services.CreateScope(); + var db = scope.ServiceProvider.GetRequiredService(); + var org = db.Organizations.First(); + + var response = await client.PostAsJsonAsync("/api/v1/projects", new + { + name = "My Project", + organizationId = org.Id + }); + + Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.Created)); + } + + [Test] + public async Task WhenCreatingAFeature_ThenFeatureIsReturned() + { + var client = CreateAuthenticatedClient(); + + using var scope = _factory.Services.CreateScope(); + var db = scope.ServiceProvider.GetRequiredService(); + var org = db.Organizations.First(); + + var project = new Project + { + Name = "My Project", + OrganizationId = org.Id, + CreatedAt = DateTimeOffset.UtcNow + }; + db.Projects.Add(project); + db.SaveChanges(); + + var response = await client.PostAsJsonAsync($"/api/v1/projects/{project.Id}/features", new + { + name = "dark_mode", + type = "Standard", + initialValue = (string?)null, + description = (string?)null + }); + + Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.Created)); + } + + [Test] + public async Task WhenCreatingAFeature_ThenFeatureStateIsAutoCreatedForEnvironments() + { + var client = CreateAuthenticatedClient(); + + using var scope = _factory.Services.CreateScope(); + var db = scope.ServiceProvider.GetRequiredService(); + var org = db.Organizations.First(); + + var project = new Project + { + Name = "My Project", + OrganizationId = org.Id, + CreatedAt = DateTimeOffset.UtcNow + }; + db.Projects.Add(project); + db.SaveChanges(); + + db.Environments.Add(new AppEnvironment + { + Name = "Production", + ApiKey = "env-key-prod", + ProjectId = project.Id, + CreatedAt = DateTimeOffset.UtcNow + }); + db.SaveChanges(); + + await client.PostAsJsonAsync($"/api/v1/projects/{project.Id}/features", new + { + name = "flag_x", + type = "Standard", + initialValue = (string?)null, + description = (string?)null + }); + + using var verifyScope = _factory.Services.CreateScope(); + var verifyDb = verifyScope.ServiceProvider.GetRequiredService(); + var feature = verifyDb.Features.First(f => f.Name == "flag_x"); + var states = verifyDb.FeatureStates.Where(fs => fs.FeatureId == feature.Id).ToList(); + + Assert.That(states, Has.Count.EqualTo(1)); + } + + [Test] + public async Task WhenCreatingAnEnvironment_ThenFeatureStateIsAutoCreatedForExistingFeatures() + { + var client = CreateAuthenticatedClient(); + + using var scope = _factory.Services.CreateScope(); + var db = scope.ServiceProvider.GetRequiredService(); + var org = db.Organizations.First(); + + var project = new Project + { + Name = "My Project", + OrganizationId = org.Id, + CreatedAt = DateTimeOffset.UtcNow + }; + db.Projects.Add(project); + db.Features.Add(new Feature + { + Name = "existing_flag", + ProjectId = project.Id, + CreatedAt = DateTimeOffset.UtcNow + }); + db.SaveChanges(); + + var response = await client.PostAsJsonAsync("/api/v1/environments", new + { + name = "Staging", + projectId = project.Id + }); + + Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.Created)); + + using var verifyScope = _factory.Services.CreateScope(); + var verifyDb = verifyScope.ServiceProvider.GetRequiredService(); + var feature = verifyDb.Features.First(f => f.Name == "existing_flag"); + var env = verifyDb.Environments.First(e => e.ProjectId == project.Id); + var states = verifyDb.FeatureStates.Where(fs => fs.EnvironmentId == env.Id && fs.FeatureId == feature.Id).ToList(); + + Assert.That(states, Has.Count.EqualTo(1)); + } + + [Test] + public async Task WhenRequestIsMissingApiKey_ThenUnauthorizedIsReturned() + { + var client = _factory.CreateClient(); + + var response = await client.GetAsync("/api/v1/projects?organizationId=1"); + + Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.Unauthorized)); + } + + [Test] + public async Task WhenCreatingAFeatureWithInvalidName_ThenUnprocessableEntityIsReturned() + { + var client = CreateAuthenticatedClient(); + + using var scope = _factory.Services.CreateScope(); + var db = scope.ServiceProvider.GetRequiredService(); + var org = db.Organizations.First(); + + var project = new Project + { + Name = "My Project", + OrganizationId = org.Id, + CreatedAt = DateTimeOffset.UtcNow + }; + db.Projects.Add(project); + db.SaveChanges(); + + var response = await client.PostAsJsonAsync($"/api/v1/projects/{project.Id}/features", new + { + name = "invalid name with spaces!", + type = "Standard" + }); + + Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.UnprocessableEntity)); + } + + [Test] + public async Task WhenCreatingASegment_ThenSegmentIsReturned() + { + var client = CreateAuthenticatedClient(); + + using var scope = _factory.Services.CreateScope(); + var db = scope.ServiceProvider.GetRequiredService(); + var org = db.Organizations.First(); + + var project = new Project + { + Name = "My Project", + OrganizationId = org.Id, + CreatedAt = DateTimeOffset.UtcNow + }; + db.Projects.Add(project); + db.SaveChanges(); + + var response = await client.PostAsJsonAsync($"/api/v1/projects/{project.Id}/segments", new + { + name = "Premium Users", + rules = new[] + { + new + { + type = "All", + conditions = new[] + { + new { property = "plan", @operator = "Equal", value = "premium" } + } + } + } + }); + + Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.Created)); + } +} diff --git a/tests/api/MicCheck.Api.Tests.Unit/ApiKeys/ApiKeyHasherTests.cs b/tests/api/MicCheck.Api.Tests.Unit/ApiKeys/ApiKeyHasherTests.cs new file mode 100755 index 0000000..f3d93b5 --- /dev/null +++ b/tests/api/MicCheck.Api.Tests.Unit/ApiKeys/ApiKeyHasherTests.cs @@ -0,0 +1,72 @@ +using MicCheck.Api.ApiKeys; +using NUnit.Framework; + +namespace MicCheck.Api.Tests.Unit.ApiKeys; + +[TestFixture] +public class ApiKeyHasherTests +{ + [Test] + public void WhenKeyIsHashed_ThenHashIsDeterministic() + { + var key = "test-api-key"; + + var hash1 = ApiKeyHasher.Hash(key); + var hash2 = ApiKeyHasher.Hash(key); + + Assert.That(hash1, Is.EqualTo(hash2)); + } + + [Test] + public void WhenKeyIsHashed_ThenHashIsLowercaseHex() + { + var hash = ApiKeyHasher.Hash("any-key"); + + Assert.That(hash, Does.Match("^[0-9a-f]{64}$")); + } + + [Test] + public void WhenDifferentKeysAreHashed_ThenHashesDiffer() + { + var hash1 = ApiKeyHasher.Hash("key-one"); + var hash2 = ApiKeyHasher.Hash("key-two"); + + Assert.That(hash1, Is.Not.EqualTo(hash2)); + } + + [Test] + public void WhenGenerateKeyIsCalled_ThenKeyIsNotEmpty() + { + var key = ApiKeyHasher.GenerateKey(); + + Assert.That(key, Is.Not.Null.And.Not.Empty); + } + + [Test] + public void WhenGenerateKeyIsCalled_ThenEachKeyIsUnique() + { + var key1 = ApiKeyHasher.GenerateKey(); + var key2 = ApiKeyHasher.GenerateKey(); + + Assert.That(key1, Is.Not.EqualTo(key2)); + } + + [Test] + public void WhenGenerateKeyIsCalled_ThenKeyIsBase64UrlSafe() + { + var key = ApiKeyHasher.GenerateKey(); + + Assert.That(key, Does.Not.Contain("+")); + Assert.That(key, Does.Not.Contain("/")); + Assert.That(key, Does.Not.Contain("=")); + } + + [Test] + public void WhenGenerateKeyIsHashed_ThenHashCanBeUsedToVerify() + { + var rawKey = ApiKeyHasher.GenerateKey(); + var hash = ApiKeyHasher.Hash(rawKey); + + Assert.That(ApiKeyHasher.Hash(rawKey), Is.EqualTo(hash)); + } +} diff --git a/tests/api/MicCheck.Api.Tests.Unit/ApiKeys/ApiKeyTests.cs b/tests/api/MicCheck.Api.Tests.Unit/ApiKeys/ApiKeyTests.cs new file mode 100755 index 0000000..7993d7b --- /dev/null +++ b/tests/api/MicCheck.Api.Tests.Unit/ApiKeys/ApiKeyTests.cs @@ -0,0 +1,53 @@ +using NUnit.Framework; +using MicCheck.Api.ApiKeys; + +namespace MicCheck.Api.Tests.Unit.ApiKeys; + +[TestFixture] +public class ApiKeyTests +{ + [Test] + public void WhenAnApiKeyIsCreated_ThenRequiredFieldsAreSet() + { + var apiKey = new ApiKey + { + Key = "hashed-value", + Prefix = "abc12345", + Name = "CI Pipeline Key", + OrganizationId = 1 + }; + + Assert.That(apiKey.Key, Is.EqualTo("hashed-value")); + Assert.That(apiKey.Prefix, Is.EqualTo("hashed-value".Substring(0, 8)).Or.EqualTo("abc12345")); + Assert.That(apiKey.Name, Is.EqualTo("CI Pipeline Key")); + Assert.That(apiKey.OrganizationId, Is.EqualTo(1)); + } + + [Test] + public void WhenAnApiKeyIsCreated_ThenIsActiveDefaultsToFalse() + { + var apiKey = new ApiKey + { + Key = "hashed-value", + Prefix = "abc12345", + Name = "Test Key", + OrganizationId = 1 + }; + + Assert.That(apiKey.IsActive, Is.False); + } + + [Test] + public void WhenAnApiKeyIsCreated_ThenExpiresAtDefaultsToNull() + { + var apiKey = new ApiKey + { + Key = "hashed-value", + Prefix = "abc12345", + Name = "Test Key", + OrganizationId = 1 + }; + + Assert.That(apiKey.ExpiresAt, Is.Null); + } +} diff --git a/tests/api/MicCheck.Api.Tests.Unit/Audit/AuditLogTests.cs b/tests/api/MicCheck.Api.Tests.Unit/Audit/AuditLogTests.cs old mode 100644 new mode 100755 diff --git a/tests/api/MicCheck.Api.Tests.Unit/Audit/AuditServiceTests.cs b/tests/api/MicCheck.Api.Tests.Unit/Audit/AuditServiceTests.cs old mode 100644 new mode 100755 diff --git a/tests/api/MicCheck.Api.Tests.Unit/Authentication/ApiKeyAuthenticationHandlerTests.cs b/tests/api/MicCheck.Api.Tests.Unit/Authentication/ApiKeyAuthenticationHandlerTests.cs new file mode 100755 index 0000000..021b1cd --- /dev/null +++ b/tests/api/MicCheck.Api.Tests.Unit/Authentication/ApiKeyAuthenticationHandlerTests.cs @@ -0,0 +1,142 @@ +using System.Net; +using System.Net.Http.Headers; +using MicCheck.Api.ApiKeys; +using MicCheck.Api.Data; +using Microsoft.Extensions.DependencyInjection; +using NUnit.Framework; + +namespace MicCheck.Api.Tests.Unit.Authentication; + +[TestFixture] +public class ApiKeyAuthenticationHandlerTests +{ + private MicCheckWebApplicationFactory _factory = null!; + + [SetUp] + public void SetUp() + { + _factory = new MicCheckWebApplicationFactory(); + } + + [TearDown] + public void TearDown() => _factory.Dispose(); + + private async Task SeedActiveApiKeyAsync(int organizationId = 1) + { + using var scope = _factory.Services.CreateScope(); + var db = scope.ServiceProvider.GetRequiredService(); + + var rawKey = ApiKeyHasher.GenerateKey(); + db.ApiKeys.Add(new ApiKey + { + Key = ApiKeyHasher.Hash(rawKey), + Prefix = rawKey[..8], + Name = "Test Key", + OrganizationId = organizationId, + IsActive = true, + CreatedAt = DateTimeOffset.UtcNow + }); + await db.SaveChangesAsync(); + + return rawKey; + } + + [Test] + public async Task WhenAuthorizationHeaderIsAbsent_ThenUnauthorizedIsReturned() + { + var client = _factory.CreateClient(); + + var response = await client.GetAsync("/api/v1/organisations/1/api-keys/"); + + Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.Unauthorized)); + } + + [Test] + public async Task WhenAuthorizationHeaderIsNotApiKeyScheme_ThenUnauthorizedIsReturned() + { + var client = _factory.CreateClient(); + client.DefaultRequestHeaders.Authorization = + new AuthenticationHeaderValue("Bearer", "not-a-jwt"); + + var response = await client.GetAsync("/api/v1/organisations/1/api-keys/"); + + Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.Unauthorized)); + } + + [Test] + public async Task WhenApiKeyIsInvalid_ThenUnauthorizedIsReturned() + { + var client = _factory.CreateClient(); + client.DefaultRequestHeaders.Add("Authorization", "Api-Key not-a-real-key"); + + var response = await client.GetAsync("/api/v1/organisations/1/api-keys/"); + + Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.Unauthorized)); + } + + [Test] + public async Task WhenApiKeyIsInactive_ThenUnauthorizedIsReturned() + { + using var scope = _factory.Services.CreateScope(); + var db = scope.ServiceProvider.GetRequiredService(); + + var rawKey = ApiKeyHasher.GenerateKey(); + db.ApiKeys.Add(new ApiKey + { + Key = ApiKeyHasher.Hash(rawKey), + Prefix = rawKey[..8], + Name = "Inactive Key", + OrganizationId = 1, + IsActive = false, + CreatedAt = DateTimeOffset.UtcNow + }); + await db.SaveChangesAsync(); + + var client = _factory.CreateClient(); + client.DefaultRequestHeaders.Add("Authorization", $"Api-Key {rawKey}"); + + var response = await client.GetAsync("/api/v1/organisations/1/api-keys/"); + + Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.Unauthorized)); + } + + [Test] + public async Task WhenApiKeyIsExpired_ThenUnauthorizedIsReturned() + { + using var scope = _factory.Services.CreateScope(); + var db = scope.ServiceProvider.GetRequiredService(); + + var rawKey = ApiKeyHasher.GenerateKey(); + db.ApiKeys.Add(new ApiKey + { + Key = ApiKeyHasher.Hash(rawKey), + Prefix = rawKey[..8], + Name = "Expired Key", + OrganizationId = 1, + IsActive = true, + ExpiresAt = DateTimeOffset.UtcNow.AddDays(-1), + CreatedAt = DateTimeOffset.UtcNow.AddDays(-10) + }); + await db.SaveChangesAsync(); + + var client = _factory.CreateClient(); + client.DefaultRequestHeaders.Add("Authorization", $"Api-Key {rawKey}"); + + var response = await client.GetAsync("/api/v1/organisations/1/api-keys/"); + + Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.Unauthorized)); + } + + [Test] + public async Task WhenApiKeyIsValid_ThenOkIsReturned() + { + var rawKey = await SeedActiveApiKeyAsync(organizationId: 1); + + var client = _factory.CreateClient(); + client.DefaultRequestHeaders.Add("Authorization", $"Api-Key {rawKey}"); + + var response = await client.GetAsync("/api/v1/organisations/1/api-keys/"); + + Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK)); + } +} diff --git a/tests/api/MicCheck.Api.Tests.Unit/Authorization/AuthEndpointsTests.cs b/tests/api/MicCheck.Api.Tests.Unit/Authorization/AuthEndpointsTests.cs new file mode 100755 index 0000000..092c610 --- /dev/null +++ b/tests/api/MicCheck.Api.Tests.Unit/Authorization/AuthEndpointsTests.cs @@ -0,0 +1,185 @@ +using System.Net; +using System.Net.Http.Json; +using MicCheck.Api.Authorization; +using NUnit.Framework; + +namespace MicCheck.Api.Tests.Unit.Authorization; + +[TestFixture] +public class AuthEndpointsTests +{ + private MicCheckWebApplicationFactory _factory = null!; + + [SetUp] + public void SetUp() + { + _factory = new MicCheckWebApplicationFactory(); + } + + [TearDown] + public void TearDown() => _factory.Dispose(); + + [Test] + public async Task WhenRegisteringWithValidDetails_ThenOkIsReturnedWithTokens() + { + var client = _factory.CreateClient(); + + var response = await client.PostAsJsonAsync("/api/v1/auth/register", new RegisterRequest( + "alice@example.com", "SecurePass1!", "Alice", "Smith", "Acme Corp")); + + Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK)); + + var body = await response.Content.ReadFromJsonAsync(); + Assert.That(body?.AccessToken, Is.Not.Null.And.Not.Empty); + Assert.That(body?.RefreshToken, Is.Not.Null.And.Not.Empty); + } + + [Test] + public async Task WhenRegisteringWithDuplicateEmail_ThenConflictIsReturned() + { + var client = _factory.CreateClient(); + + await client.PostAsJsonAsync("/api/v1/auth/register", new RegisterRequest( + "alice@example.com", "SecurePass1!", "Alice", "Smith", "Acme Corp")); + + var response = await client.PostAsJsonAsync("/api/v1/auth/register", new RegisterRequest( + "alice@example.com", "AnotherPass1!", "Alice", "Jones", "Other Corp")); + + Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.Conflict)); + } + + [Test] + public async Task WhenLoginWithValidCredentials_ThenOkIsReturnedWithTokens() + { + var client = _factory.CreateClient(); + + await client.PostAsJsonAsync("/api/v1/auth/register", new RegisterRequest( + "bob@example.com", "SecurePass1!", "Bob", "Jones", "BobCo")); + + var response = await client.PostAsJsonAsync("/api/v1/auth/login", + new LoginRequest("bob@example.com", "SecurePass1!")); + + Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK)); + + var body = await response.Content.ReadFromJsonAsync(); + Assert.That(body?.AccessToken, Is.Not.Null.And.Not.Empty); + Assert.That(body?.RefreshToken, Is.Not.Null.And.Not.Empty); + } + + [Test] + public async Task WhenLoginWithWrongPassword_ThenUnauthorizedIsReturned() + { + var client = _factory.CreateClient(); + + await client.PostAsJsonAsync("/api/v1/auth/register", new RegisterRequest( + "carol@example.com", "CorrectPass1!", "Carol", "White", "CarolCo")); + + var response = await client.PostAsJsonAsync("/api/v1/auth/login", + new LoginRequest("carol@example.com", "WrongPassword")); + + Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.Unauthorized)); + } + + [Test] + public async Task WhenLoginWithUnknownEmail_ThenUnauthorizedIsReturned() + { + var client = _factory.CreateClient(); + + var response = await client.PostAsJsonAsync("/api/v1/auth/login", + new LoginRequest("nobody@example.com", "SomePass1!")); + + Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.Unauthorized)); + } + + [Test] + public async Task WhenLoginWithEmptyEmail_ThenBadRequestIsReturned() + { + var client = _factory.CreateClient(); + + var response = await client.PostAsJsonAsync("/api/v1/auth/login", + new LoginRequest("", "SomePass1!")); + + Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest)); + } + + [Test] + public async Task WhenRefreshingWithValidToken_ThenOkIsReturnedWithNewTokens() + { + var client = _factory.CreateClient(); + + var registerResponse = await client.PostAsJsonAsync("/api/v1/auth/register", new RegisterRequest( + "dave@example.com", "SecurePass1!", "Dave", "Brown", "DaveCo")); + var registerBody = await registerResponse.Content.ReadFromJsonAsync(); + + var response = await client.PostAsJsonAsync("/api/v1/auth/refresh", + new RefreshRequest(registerBody!.RefreshToken)); + + Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK)); + + var body = await response.Content.ReadFromJsonAsync(); + Assert.That(body?.AccessToken, Is.Not.Null.And.Not.Empty); + Assert.That(body?.RefreshToken, Is.Not.EqualTo(registerBody.RefreshToken)); + } + + [Test] + public async Task WhenRefreshingWithInvalidToken_ThenUnauthorizedIsReturned() + { + var client = _factory.CreateClient(); + + var response = await client.PostAsJsonAsync("/api/v1/auth/refresh", + new RefreshRequest("not-a-valid-refresh-token")); + + Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.Unauthorized)); + } + + [Test] + public async Task WhenRefreshingWithRevokedToken_ThenUnauthorizedIsReturned() + { + var client = _factory.CreateClient(); + + var registerResponse = await client.PostAsJsonAsync("/api/v1/auth/register", new RegisterRequest( + "eve@example.com", "SecurePass1!", "Eve", "Davis", "EveCo")); + var registerBody = await registerResponse.Content.ReadFromJsonAsync(); + + await client.PostAsJsonAsync("/api/v1/auth/refresh", + new RefreshRequest(registerBody!.RefreshToken)); + + var response = await client.PostAsJsonAsync("/api/v1/auth/refresh", + new RefreshRequest(registerBody.RefreshToken)); + + Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.Unauthorized)); + } + + [Test] + public async Task WhenLoggingOut_ThenNoContentIsReturned() + { + var client = _factory.CreateClient(); + + var registerResponse = await client.PostAsJsonAsync("/api/v1/auth/register", new RegisterRequest( + "frank@example.com", "SecurePass1!", "Frank", "Green", "FrankCo")); + var registerBody = await registerResponse.Content.ReadFromJsonAsync(); + + var response = await client.PostAsJsonAsync("/api/v1/auth/logout", + new LogoutRequest(registerBody!.RefreshToken)); + + Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.NoContent)); + } + + [Test] + public async Task WhenLoggingOutAndRefreshing_ThenUnauthorizedIsReturned() + { + var client = _factory.CreateClient(); + + var registerResponse = await client.PostAsJsonAsync("/api/v1/auth/register", new RegisterRequest( + "grace@example.com", "SecurePass1!", "Grace", "Black", "GraceCo")); + var registerBody = await registerResponse.Content.ReadFromJsonAsync(); + + await client.PostAsJsonAsync("/api/v1/auth/logout", + new LogoutRequest(registerBody!.RefreshToken)); + + var response = await client.PostAsJsonAsync("/api/v1/auth/refresh", + new RefreshRequest(registerBody.RefreshToken)); + + Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.Unauthorized)); + } +} diff --git a/tests/api/MicCheck.Api.Tests.Unit/Authorization/ProjectPermissionRequirementHandlerTests.cs b/tests/api/MicCheck.Api.Tests.Unit/Authorization/ProjectPermissionRequirementHandlerTests.cs new file mode 100755 index 0000000..f331775 --- /dev/null +++ b/tests/api/MicCheck.Api.Tests.Unit/Authorization/ProjectPermissionRequirementHandlerTests.cs @@ -0,0 +1,180 @@ +using System.IdentityModel.Tokens.Jwt; +using System.Security.Claims; +using MicCheck.Api.Authorization; +using MicCheck.Api.Data; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Http; +using Microsoft.EntityFrameworkCore; +using Moq; +using NUnit.Framework; + +namespace MicCheck.Api.Tests.Unit.Authorization; + +[TestFixture] +public class ProjectPermissionRequirementHandlerTests +{ + private MicCheckDbContext _db = null!; + private Mock _httpContextAccessor = null!; + private ProjectPermissionRequirementHandler _handler = null!; + + [SetUp] + public void SetUp() + { + var options = new DbContextOptionsBuilder() + .UseInMemoryDatabase(Guid.NewGuid().ToString()) + .Options; + _db = new MicCheckDbContext(options); + + _httpContextAccessor = new Mock(); + _handler = new ProjectPermissionRequirementHandler(_db, _httpContextAccessor.Object); + } + + [TearDown] + public void TearDown() => _db.Dispose(); + + private static AuthorizationHandlerContext CreateContext( + ClaimsPrincipal user, + ProjectPermission permission = ProjectPermission.ViewProject) + { + var requirement = new ProjectPermissionRequirement(permission); + return new AuthorizationHandlerContext([requirement], user, null); + } + + private static ClaimsPrincipal CreateUserWithClaims(params Claim[] claims) + { + return new ClaimsPrincipal(new ClaimsIdentity(claims, "Bearer")); + } + + private void SetupRouteProjectId(int projectId) + { + var httpContext = new DefaultHttpContext(); + httpContext.Request.RouteValues["projectId"] = projectId.ToString(); + _httpContextAccessor.Setup(a => a.HttpContext).Returns(httpContext); + } + + [Test] + public async Task WhenUserIsOrganizationAdmin_ThenRequirementSucceeds() + { + var user = CreateUserWithClaims( + new Claim(JwtRegisteredClaimNames.Sub, "1"), + new Claim("OrganizationRole", "Admin")); + + var context = CreateContext(user); + + await _handler.HandleAsync(context); + + Assert.That(context.HasSucceeded, Is.True); + } + + [Test] + public async Task WhenUserHasRequiredPermission_ThenRequirementSucceeds() + { + _db.UserProjectPermissions.Add(new UserProjectPermission + { + UserId = 1, + ProjectId = 10, + Permissions = [ProjectPermission.ViewProject] + }); + await _db.SaveChangesAsync(); + + SetupRouteProjectId(10); + + var user = CreateUserWithClaims( + new Claim(JwtRegisteredClaimNames.Sub, "1")); + + var context = CreateContext(user, ProjectPermission.ViewProject); + + await _handler.HandleAsync(context); + + Assert.That(context.HasSucceeded, Is.True); + } + + [Test] + public async Task WhenUserIsProjectAdmin_ThenAllPermissionsAreGranted() + { + _db.UserProjectPermissions.Add(new UserProjectPermission + { + UserId = 2, + ProjectId = 20, + IsAdmin = true, + Permissions = [] + }); + await _db.SaveChangesAsync(); + + SetupRouteProjectId(20); + + var user = CreateUserWithClaims( + new Claim(JwtRegisteredClaimNames.Sub, "2")); + + var context = CreateContext(user, ProjectPermission.DeleteFeature); + + await _handler.HandleAsync(context); + + Assert.That(context.HasSucceeded, Is.True); + } + + [Test] + public async Task WhenUserDoesNotHaveRequiredPermission_ThenRequirementFails() + { + _db.UserProjectPermissions.Add(new UserProjectPermission + { + UserId = 3, + ProjectId = 30, + Permissions = [ProjectPermission.ViewProject] + }); + await _db.SaveChangesAsync(); + + SetupRouteProjectId(30); + + var user = CreateUserWithClaims( + new Claim(JwtRegisteredClaimNames.Sub, "3")); + + var context = CreateContext(user, ProjectPermission.DeleteFeature); + + await _handler.HandleAsync(context); + + Assert.That(context.HasSucceeded, Is.False); + } + + [Test] + public async Task WhenUserHasNoProjectPermissionRecord_ThenRequirementFails() + { + SetupRouteProjectId(99); + + var user = CreateUserWithClaims( + new Claim(JwtRegisteredClaimNames.Sub, "5")); + + var context = CreateContext(user); + + await _handler.HandleAsync(context); + + Assert.That(context.HasSucceeded, Is.False); + } + + [Test] + public async Task WhenUserIdClaimIsMissing_ThenRequirementFails() + { + var user = CreateUserWithClaims(); + + var context = CreateContext(user); + + await _handler.HandleAsync(context); + + Assert.That(context.HasSucceeded, Is.False); + } + + [Test] + public async Task WhenProjectIdIsNotInRoute_ThenRequirementFails() + { + _httpContextAccessor.Setup(a => a.HttpContext).Returns(new DefaultHttpContext()); + + var user = CreateUserWithClaims( + new Claim(JwtRegisteredClaimNames.Sub, "1")); + + var context = CreateContext(user); + + await _handler.HandleAsync(context); + + Assert.That(context.HasSucceeded, Is.False); + } +} diff --git a/tests/api/MicCheck.Api.Tests.Unit/Authorization/TokenServiceTests.cs b/tests/api/MicCheck.Api.Tests.Unit/Authorization/TokenServiceTests.cs new file mode 100755 index 0000000..8235942 --- /dev/null +++ b/tests/api/MicCheck.Api.Tests.Unit/Authorization/TokenServiceTests.cs @@ -0,0 +1,103 @@ +using System.IdentityModel.Tokens.Jwt; +using MicCheck.Api.Authorization; +using MicCheck.Api.Organizations; +using MicCheck.Api.Users; +using Microsoft.Extensions.Configuration; +using NUnit.Framework; + +namespace MicCheck.Api.Tests.Unit.Authorization; + +[TestFixture] +public class TokenServiceTests +{ + private IConfiguration _configuration = null!; + private TokenService _tokenService = null!; + + [SetUp] + public void SetUp() + { + _configuration = new ConfigurationBuilder() + .AddInMemoryCollection(new Dictionary + { + ["Jwt:SecretKey"] = "test-secret-key-that-is-long-enough-32c", + ["Jwt:Issuer"] = "MicCheck", + ["Jwt:Audience"] = "MicCheck", + ["Jwt:ExpiryMinutes"] = "60", + }) + .Build(); + + _tokenService = new TokenService(_configuration); + } + + private static User BuildUser(int id = 1, string email = "alice@example.com") => + new() + { + Email = email, + FirstName = "Alice", + LastName = "Smith", + PasswordHash = "hashed", + IsActive = true, + CreatedAt = DateTimeOffset.UtcNow + }; + + [Test] + public void WhenAUserIsProvided_ThenATokenIsReturned() + { + var result = _tokenService.GenerateToken(BuildUser()); + + Assert.That(result.Token, Is.Not.Null.And.Not.Empty); + } + + [Test] + public void WhenATokenIsGenerated_ThenItContainsTheUserEmailClaim() + { + var user = BuildUser(email: "bob@example.com"); + + var result = _tokenService.GenerateToken(user); + + var handler = new JwtSecurityTokenHandler(); + var jwt = handler.ReadJwtToken(result.Token); + + Assert.That(jwt.Claims.Any(c => c.Type == JwtRegisteredClaimNames.Email && c.Value == "bob@example.com"), + Is.True); + } + + [Test] + public void WhenATokenIsGenerated_ThenItHasAFutureExpiry() + { + var result = _tokenService.GenerateToken(BuildUser()); + + Assert.That(result.ExpiresAt, Is.GreaterThan(DateTime.UtcNow)); + } + + [Test] + public void WhenATokenIsGenerated_ThenItHasTheConfiguredIssuer() + { + var result = _tokenService.GenerateToken(BuildUser()); + + var handler = new JwtSecurityTokenHandler(); + var jwt = handler.ReadJwtToken(result.Token); + + Assert.That(jwt.Issuer, Is.EqualTo("MicCheck")); + } + + [Test] + public void WhenUserBelongsToOrganizations_ThenTokenContainsOrganizationClaims() + { + var user = BuildUser(); + user.Organizations.Add(new OrganizationUser + { + OrganizationId = 42, + UserId = user.Id, + Role = OrganizationRole.Admin + }); + + var result = _tokenService.GenerateToken(user); + + var handler = new JwtSecurityTokenHandler(); + var jwt = handler.ReadJwtToken(result.Token); + + Assert.That(jwt.Claims.Any(c => c.Type == "OrganizationId" && c.Value == "42"), Is.True); + Assert.That(jwt.Claims.Any(c => c.Type == "OrganizationRole" && c.Value == "Admin"), Is.True); + } +} diff --git a/tests/api/MicCheck.Api.Tests.Unit/Common/Security/ApiKeys/ApiKeyHasherTests.cs b/tests/api/MicCheck.Api.Tests.Unit/Common/Security/ApiKeys/ApiKeyHasherTests.cs old mode 100644 new mode 100755 index cb6301d..14c1cc1 --- a/tests/api/MicCheck.Api.Tests.Unit/Common/Security/ApiKeys/ApiKeyHasherTests.cs +++ b/tests/api/MicCheck.Api.Tests.Unit/Common/Security/ApiKeys/ApiKeyHasherTests.cs @@ -1,72 +1,72 @@ -using MicCheck.Api.Common.Security.ApiKeys; -using NUnit.Framework; - -namespace MicCheck.Api.Tests.Unit.Common.Security.ApiKeys; - -[TestFixture] -public class ApiKeyHasherTests -{ - [Test] - public void WhenKeyIsHashed_ThenHashIsDeterministic() - { - var key = "test-api-key"; - - var hash1 = ApiKeyHasher.Hash(key); - var hash2 = ApiKeyHasher.Hash(key); - - Assert.That(hash1, Is.EqualTo(hash2)); - } - - [Test] - public void WhenKeyIsHashed_ThenHashIsLowercaseHex() - { - var hash = ApiKeyHasher.Hash("any-key"); - - Assert.That(hash, Does.Match("^[0-9a-f]{64}$")); - } - - [Test] - public void WhenDifferentKeysAreHashed_ThenHashesDiffer() - { - var hash1 = ApiKeyHasher.Hash("key-one"); - var hash2 = ApiKeyHasher.Hash("key-two"); - - Assert.That(hash1, Is.Not.EqualTo(hash2)); - } - - [Test] - public void WhenGenerateKeyIsCalled_ThenKeyIsNotEmpty() - { - var key = ApiKeyHasher.GenerateKey(); - - Assert.That(key, Is.Not.Null.And.Not.Empty); - } - - [Test] - public void WhenGenerateKeyIsCalled_ThenEachKeyIsUnique() - { - var key1 = ApiKeyHasher.GenerateKey(); - var key2 = ApiKeyHasher.GenerateKey(); - - Assert.That(key1, Is.Not.EqualTo(key2)); - } - - [Test] - public void WhenGenerateKeyIsCalled_ThenKeyIsBase64UrlSafe() - { - var key = ApiKeyHasher.GenerateKey(); - - Assert.That(key, Does.Not.Contain("+")); - Assert.That(key, Does.Not.Contain("/")); - Assert.That(key, Does.Not.Contain("=")); - } - - [Test] - public void WhenGenerateKeyIsHashed_ThenHashCanBeUsedToVerify() - { - var rawKey = ApiKeyHasher.GenerateKey(); - var hash = ApiKeyHasher.Hash(rawKey); - - Assert.That(ApiKeyHasher.Hash(rawKey), Is.EqualTo(hash)); - } -} +using MicCheck.Api.Common.Security.ApiKeys; +using NUnit.Framework; + +namespace MicCheck.Api.Tests.Unit.Common.Security.ApiKeys; + +[TestFixture] +public class ApiKeyHasherTests +{ + [Test] + public void WhenKeyIsHashed_ThenHashIsDeterministic() + { + var key = "test-api-key"; + + var hash1 = ApiKeyHasher.Hash(key); + var hash2 = ApiKeyHasher.Hash(key); + + Assert.That(hash1, Is.EqualTo(hash2)); + } + + [Test] + public void WhenKeyIsHashed_ThenHashIsLowercaseHex() + { + var hash = ApiKeyHasher.Hash("any-key"); + + Assert.That(hash, Does.Match("^[0-9a-f]{64}$")); + } + + [Test] + public void WhenDifferentKeysAreHashed_ThenHashesDiffer() + { + var hash1 = ApiKeyHasher.Hash("key-one"); + var hash2 = ApiKeyHasher.Hash("key-two"); + + Assert.That(hash1, Is.Not.EqualTo(hash2)); + } + + [Test] + public void WhenGenerateKeyIsCalled_ThenKeyIsNotEmpty() + { + var key = ApiKeyHasher.GenerateKey(); + + Assert.That(key, Is.Not.Null.And.Not.Empty); + } + + [Test] + public void WhenGenerateKeyIsCalled_ThenEachKeyIsUnique() + { + var key1 = ApiKeyHasher.GenerateKey(); + var key2 = ApiKeyHasher.GenerateKey(); + + Assert.That(key1, Is.Not.EqualTo(key2)); + } + + [Test] + public void WhenGenerateKeyIsCalled_ThenKeyIsBase64UrlSafe() + { + var key = ApiKeyHasher.GenerateKey(); + + Assert.That(key, Does.Not.Contain("+")); + Assert.That(key, Does.Not.Contain("/")); + Assert.That(key, Does.Not.Contain("=")); + } + + [Test] + public void WhenGenerateKeyIsHashed_ThenHashCanBeUsedToVerify() + { + var rawKey = ApiKeyHasher.GenerateKey(); + var hash = ApiKeyHasher.Hash(rawKey); + + Assert.That(ApiKeyHasher.Hash(rawKey), Is.EqualTo(hash)); + } +} diff --git a/tests/api/MicCheck.Api.Tests.Unit/Common/Security/ApiKeys/ApiKeyTests.cs b/tests/api/MicCheck.Api.Tests.Unit/Common/Security/ApiKeys/ApiKeyTests.cs old mode 100644 new mode 100755 index 222b5ea..1c44e3c --- a/tests/api/MicCheck.Api.Tests.Unit/Common/Security/ApiKeys/ApiKeyTests.cs +++ b/tests/api/MicCheck.Api.Tests.Unit/Common/Security/ApiKeys/ApiKeyTests.cs @@ -1,53 +1,53 @@ -using NUnit.Framework; -using MicCheck.Api.Common.Security.ApiKeys; - -namespace MicCheck.Api.Tests.Unit.Common.Security.ApiKeys; - -[TestFixture] -public class ApiKeyTests -{ - [Test] - public void WhenAnApiKeyIsCreated_ThenRequiredFieldsAreSet() - { - var apiKey = new ApiKey - { - Key = "hashed-value", - Prefix = "abc12345", - Name = "CI Pipeline Key", - OrganizationId = 1 - }; - - Assert.That(apiKey.Key, Is.EqualTo("hashed-value")); - Assert.That(apiKey.Prefix, Is.EqualTo("hashed-value".Substring(0, 8)).Or.EqualTo("abc12345")); - Assert.That(apiKey.Name, Is.EqualTo("CI Pipeline Key")); - Assert.That(apiKey.OrganizationId, Is.EqualTo(1)); - } - - [Test] - public void WhenAnApiKeyIsCreated_ThenIsActiveDefaultsToFalse() - { - var apiKey = new ApiKey - { - Key = "hashed-value", - Prefix = "abc12345", - Name = "Test Key", - OrganizationId = 1 - }; - - Assert.That(apiKey.IsActive, Is.False); - } - - [Test] - public void WhenAnApiKeyIsCreated_ThenExpiresAtDefaultsToNull() - { - var apiKey = new ApiKey - { - Key = "hashed-value", - Prefix = "abc12345", - Name = "Test Key", - OrganizationId = 1 - }; - - Assert.That(apiKey.ExpiresAt, Is.Null); - } -} +using NUnit.Framework; +using MicCheck.Api.Common.Security.ApiKeys; + +namespace MicCheck.Api.Tests.Unit.Common.Security.ApiKeys; + +[TestFixture] +public class ApiKeyTests +{ + [Test] + public void WhenAnApiKeyIsCreated_ThenRequiredFieldsAreSet() + { + var apiKey = new ApiKey + { + Key = "hashed-value", + Prefix = "abc12345", + Name = "CI Pipeline Key", + OrganizationId = 1 + }; + + Assert.That(apiKey.Key, Is.EqualTo("hashed-value")); + Assert.That(apiKey.Prefix, Is.EqualTo("hashed-value".Substring(0, 8)).Or.EqualTo("abc12345")); + Assert.That(apiKey.Name, Is.EqualTo("CI Pipeline Key")); + Assert.That(apiKey.OrganizationId, Is.EqualTo(1)); + } + + [Test] + public void WhenAnApiKeyIsCreated_ThenIsActiveDefaultsToFalse() + { + var apiKey = new ApiKey + { + Key = "hashed-value", + Prefix = "abc12345", + Name = "Test Key", + OrganizationId = 1 + }; + + Assert.That(apiKey.IsActive, Is.False); + } + + [Test] + public void WhenAnApiKeyIsCreated_ThenExpiresAtDefaultsToNull() + { + var apiKey = new ApiKey + { + Key = "hashed-value", + Prefix = "abc12345", + Name = "Test Key", + OrganizationId = 1 + }; + + Assert.That(apiKey.ExpiresAt, Is.Null); + } +} diff --git a/tests/api/MicCheck.Api.Tests.Unit/Common/Security/Authentication/ApiKeyAuthenticationHandlerTests.cs b/tests/api/MicCheck.Api.Tests.Unit/Common/Security/Authentication/ApiKeyAuthenticationHandlerTests.cs old mode 100644 new mode 100755 index 8b39c0a..af1f281 --- a/tests/api/MicCheck.Api.Tests.Unit/Common/Security/Authentication/ApiKeyAuthenticationHandlerTests.cs +++ b/tests/api/MicCheck.Api.Tests.Unit/Common/Security/Authentication/ApiKeyAuthenticationHandlerTests.cs @@ -1,142 +1,142 @@ -using System.Net; -using System.Net.Http.Headers; -using MicCheck.Api.Common.Security.ApiKeys; -using MicCheck.Api.Data; -using Microsoft.Extensions.DependencyInjection; -using NUnit.Framework; - -namespace MicCheck.Api.Tests.Unit.Common.Security.Authentication; - -[TestFixture] -public class ApiKeyAuthenticationHandlerTests -{ - private MicCheckWebApplicationFactory _factory = null!; - - [SetUp] - public void SetUp() - { - _factory = new MicCheckWebApplicationFactory(); - } - - [TearDown] - public void TearDown() => _factory.Dispose(); - - private async Task SeedActiveApiKeyAsync(int organizationId = 1) - { - using var scope = _factory.Services.CreateScope(); - var db = scope.ServiceProvider.GetRequiredService(); - - var rawKey = ApiKeyHasher.GenerateKey(); - db.ApiKeys.Add(new ApiKey - { - Key = ApiKeyHasher.Hash(rawKey), - Prefix = rawKey[..8], - Name = "Test Key", - OrganizationId = organizationId, - IsActive = true, - CreatedAt = DateTimeOffset.UtcNow - }); - await db.SaveChangesAsync(); - - return rawKey; - } - - [Test] - public async Task WhenAuthorizationHeaderIsAbsent_ThenUnauthorizedIsReturned() - { - var client = _factory.CreateClient(); - - var response = await client.GetAsync("/api/v1/organisations/1/api-keys/"); - - Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.Unauthorized)); - } - - [Test] - public async Task WhenAuthorizationHeaderIsNotApiKeyScheme_ThenUnauthorizedIsReturned() - { - var client = _factory.CreateClient(); - client.DefaultRequestHeaders.Authorization = - new AuthenticationHeaderValue("Bearer", "not-a-jwt"); - - var response = await client.GetAsync("/api/v1/organisations/1/api-keys/"); - - Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.Unauthorized)); - } - - [Test] - public async Task WhenApiKeyIsInvalid_ThenUnauthorizedIsReturned() - { - var client = _factory.CreateClient(); - client.DefaultRequestHeaders.Add("Authorization", "Api-Key not-a-real-key"); - - var response = await client.GetAsync("/api/v1/organisations/1/api-keys/"); - - Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.Unauthorized)); - } - - [Test] - public async Task WhenApiKeyIsInactive_ThenUnauthorizedIsReturned() - { - using var scope = _factory.Services.CreateScope(); - var db = scope.ServiceProvider.GetRequiredService(); - - var rawKey = ApiKeyHasher.GenerateKey(); - db.ApiKeys.Add(new ApiKey - { - Key = ApiKeyHasher.Hash(rawKey), - Prefix = rawKey[..8], - Name = "Inactive Key", - OrganizationId = 1, - IsActive = false, - CreatedAt = DateTimeOffset.UtcNow - }); - await db.SaveChangesAsync(); - - var client = _factory.CreateClient(); - client.DefaultRequestHeaders.Add("Authorization", $"Api-Key {rawKey}"); - - var response = await client.GetAsync("/api/v1/organisations/1/api-keys/"); - - Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.Unauthorized)); - } - - [Test] - public async Task WhenApiKeyIsExpired_ThenUnauthorizedIsReturned() - { - using var scope = _factory.Services.CreateScope(); - var db = scope.ServiceProvider.GetRequiredService(); - - var rawKey = ApiKeyHasher.GenerateKey(); - db.ApiKeys.Add(new ApiKey - { - Key = ApiKeyHasher.Hash(rawKey), - Prefix = rawKey[..8], - Name = "Expired Key", - OrganizationId = 1, - IsActive = true, - ExpiresAt = DateTimeOffset.UtcNow.AddDays(-1), - CreatedAt = DateTimeOffset.UtcNow.AddDays(-10) - }); - await db.SaveChangesAsync(); - - var client = _factory.CreateClient(); - client.DefaultRequestHeaders.Add("Authorization", $"Api-Key {rawKey}"); - - var response = await client.GetAsync("/api/v1/organisations/1/api-keys/"); - - Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.Unauthorized)); - } - - [Test] - public async Task WhenApiKeyIsValid_ThenOkIsReturned() - { - var rawKey = await SeedActiveApiKeyAsync(organizationId: 1); - - var client = _factory.CreateClient(); - client.DefaultRequestHeaders.Add("Authorization", $"Api-Key {rawKey}"); - - var response = await client.GetAsync("/api/v1/organisations/1/api-keys/"); - - Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK)); - } -} +using System.Net; +using System.Net.Http.Headers; +using MicCheck.Api.Common.Security.ApiKeys; +using MicCheck.Api.Data; +using Microsoft.Extensions.DependencyInjection; +using NUnit.Framework; + +namespace MicCheck.Api.Tests.Unit.Common.Security.Authentication; + +[TestFixture] +public class ApiKeyAuthenticationHandlerTests +{ + private MicCheckWebApplicationFactory _factory = null!; + + [SetUp] + public void SetUp() + { + _factory = new MicCheckWebApplicationFactory(); + } + + [TearDown] + public void TearDown() => _factory.Dispose(); + + private async Task SeedActiveApiKeyAsync(int organizationId = 1) + { + using var scope = _factory.Services.CreateScope(); + var db = scope.ServiceProvider.GetRequiredService(); + + var rawKey = ApiKeyHasher.GenerateKey(); + db.ApiKeys.Add(new ApiKey + { + Key = ApiKeyHasher.Hash(rawKey), + Prefix = rawKey[..8], + Name = "Test Key", + OrganizationId = organizationId, + IsActive = true, + CreatedAt = DateTimeOffset.UtcNow + }); + await db.SaveChangesAsync(); + + return rawKey; + } + + [Test] + public async Task WhenAuthorizationHeaderIsAbsent_ThenUnauthorizedIsReturned() + { + var client = _factory.CreateClient(); + + var response = await client.GetAsync("/api/v1/organisations/1/api-keys/"); + + Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.Unauthorized)); + } + + [Test] + public async Task WhenAuthorizationHeaderIsNotApiKeyScheme_ThenUnauthorizedIsReturned() + { + var client = _factory.CreateClient(); + client.DefaultRequestHeaders.Authorization = + new AuthenticationHeaderValue("Bearer", "not-a-jwt"); + + var response = await client.GetAsync("/api/v1/organisations/1/api-keys/"); + + Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.Unauthorized)); + } + + [Test] + public async Task WhenApiKeyIsInvalid_ThenUnauthorizedIsReturned() + { + var client = _factory.CreateClient(); + client.DefaultRequestHeaders.Add("Authorization", "Api-Key not-a-real-key"); + + var response = await client.GetAsync("/api/v1/organisations/1/api-keys/"); + + Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.Unauthorized)); + } + + [Test] + public async Task WhenApiKeyIsInactive_ThenUnauthorizedIsReturned() + { + using var scope = _factory.Services.CreateScope(); + var db = scope.ServiceProvider.GetRequiredService(); + + var rawKey = ApiKeyHasher.GenerateKey(); + db.ApiKeys.Add(new ApiKey + { + Key = ApiKeyHasher.Hash(rawKey), + Prefix = rawKey[..8], + Name = "Inactive Key", + OrganizationId = 1, + IsActive = false, + CreatedAt = DateTimeOffset.UtcNow + }); + await db.SaveChangesAsync(); + + var client = _factory.CreateClient(); + client.DefaultRequestHeaders.Add("Authorization", $"Api-Key {rawKey}"); + + var response = await client.GetAsync("/api/v1/organisations/1/api-keys/"); + + Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.Unauthorized)); + } + + [Test] + public async Task WhenApiKeyIsExpired_ThenUnauthorizedIsReturned() + { + using var scope = _factory.Services.CreateScope(); + var db = scope.ServiceProvider.GetRequiredService(); + + var rawKey = ApiKeyHasher.GenerateKey(); + db.ApiKeys.Add(new ApiKey + { + Key = ApiKeyHasher.Hash(rawKey), + Prefix = rawKey[..8], + Name = "Expired Key", + OrganizationId = 1, + IsActive = true, + ExpiresAt = DateTimeOffset.UtcNow.AddDays(-1), + CreatedAt = DateTimeOffset.UtcNow.AddDays(-10) + }); + await db.SaveChangesAsync(); + + var client = _factory.CreateClient(); + client.DefaultRequestHeaders.Add("Authorization", $"Api-Key {rawKey}"); + + var response = await client.GetAsync("/api/v1/organisations/1/api-keys/"); + + Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.Unauthorized)); + } + + [Test] + public async Task WhenApiKeyIsValid_ThenOkIsReturned() + { + var rawKey = await SeedActiveApiKeyAsync(organizationId: 1); + + var client = _factory.CreateClient(); + client.DefaultRequestHeaders.Add("Authorization", $"Api-Key {rawKey}"); + + var response = await client.GetAsync("/api/v1/organisations/1/api-keys/"); + + Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK)); + } +} diff --git a/tests/api/MicCheck.Api.Tests.Unit/Common/Security/Authorization/AuthEndpointsTests.cs b/tests/api/MicCheck.Api.Tests.Unit/Common/Security/Authorization/AuthEndpointsTests.cs old mode 100644 new mode 100755 index fda8cf5..bb30c84 --- a/tests/api/MicCheck.Api.Tests.Unit/Common/Security/Authorization/AuthEndpointsTests.cs +++ b/tests/api/MicCheck.Api.Tests.Unit/Common/Security/Authorization/AuthEndpointsTests.cs @@ -1,185 +1,185 @@ -using System.Net; -using System.Net.Http.Json; -using MicCheck.Api.Common.Security.Authorization; -using NUnit.Framework; - -namespace MicCheck.Api.Tests.Unit.Common.Security.Authorization; - -[TestFixture] -public class AuthEndpointsTests -{ - private MicCheckWebApplicationFactory _factory = null!; - - [SetUp] - public void SetUp() - { - _factory = new MicCheckWebApplicationFactory(); - } - - [TearDown] - public void TearDown() => _factory.Dispose(); - - [Test] - public async Task WhenRegisteringWithValidDetails_ThenOkIsReturnedWithTokens() - { - var client = _factory.CreateClient(); - - var response = await client.PostAsJsonAsync("/api/v1/auth/register", new RegisterRequest( - "alice@example.com", "SecurePass1!", "Alice", "Smith", "Acme Corp")); - - Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK)); - - var body = await response.Content.ReadFromJsonAsync(); - Assert.That(body?.AccessToken, Is.Not.Null.And.Not.Empty); - Assert.That(body?.RefreshToken, Is.Not.Null.And.Not.Empty); - } - - [Test] - public async Task WhenRegisteringWithDuplicateEmail_ThenConflictIsReturned() - { - var client = _factory.CreateClient(); - - await client.PostAsJsonAsync("/api/v1/auth/register", new RegisterRequest( - "alice@example.com", "SecurePass1!", "Alice", "Smith", "Acme Corp")); - - var response = await client.PostAsJsonAsync("/api/v1/auth/register", new RegisterRequest( - "alice@example.com", "AnotherPass1!", "Alice", "Jones", "Other Corp")); - - Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.Conflict)); - } - - [Test] - public async Task WhenLoginWithValidCredentials_ThenOkIsReturnedWithTokens() - { - var client = _factory.CreateClient(); - - await client.PostAsJsonAsync("/api/v1/auth/register", new RegisterRequest( - "bob@example.com", "SecurePass1!", "Bob", "Jones", "BobCo")); - - var response = await client.PostAsJsonAsync("/api/v1/auth/login", - new LoginRequest("bob@example.com", "SecurePass1!")); - - Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK)); - - var body = await response.Content.ReadFromJsonAsync(); - Assert.That(body?.AccessToken, Is.Not.Null.And.Not.Empty); - Assert.That(body?.RefreshToken, Is.Not.Null.And.Not.Empty); - } - - [Test] - public async Task WhenLoginWithWrongPassword_ThenUnauthorizedIsReturned() - { - var client = _factory.CreateClient(); - - await client.PostAsJsonAsync("/api/v1/auth/register", new RegisterRequest( - "carol@example.com", "CorrectPass1!", "Carol", "White", "CarolCo")); - - var response = await client.PostAsJsonAsync("/api/v1/auth/login", - new LoginRequest("carol@example.com", "WrongPassword")); - - Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.Unauthorized)); - } - - [Test] - public async Task WhenLoginWithUnknownEmail_ThenUnauthorizedIsReturned() - { - var client = _factory.CreateClient(); - - var response = await client.PostAsJsonAsync("/api/v1/auth/login", - new LoginRequest("nobody@example.com", "SomePass1!")); - - Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.Unauthorized)); - } - - [Test] - public async Task WhenLoginWithEmptyEmail_ThenBadRequestIsReturned() - { - var client = _factory.CreateClient(); - - var response = await client.PostAsJsonAsync("/api/v1/auth/login", - new LoginRequest("", "SomePass1!")); - - Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest)); - } - - [Test] - public async Task WhenRefreshingWithValidToken_ThenOkIsReturnedWithNewTokens() - { - var client = _factory.CreateClient(); - - var registerResponse = await client.PostAsJsonAsync("/api/v1/auth/register", new RegisterRequest( - "dave@example.com", "SecurePass1!", "Dave", "Brown", "DaveCo")); - var registerBody = await registerResponse.Content.ReadFromJsonAsync(); - - var response = await client.PostAsJsonAsync("/api/v1/auth/refresh", - new RefreshRequest(registerBody!.RefreshToken)); - - Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK)); - - var body = await response.Content.ReadFromJsonAsync(); - Assert.That(body?.AccessToken, Is.Not.Null.And.Not.Empty); - Assert.That(body?.RefreshToken, Is.Not.EqualTo(registerBody.RefreshToken)); - } - - [Test] - public async Task WhenRefreshingWithInvalidToken_ThenUnauthorizedIsReturned() - { - var client = _factory.CreateClient(); - - var response = await client.PostAsJsonAsync("/api/v1/auth/refresh", - new RefreshRequest("not-a-valid-refresh-token")); - - Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.Unauthorized)); - } - - [Test] - public async Task WhenRefreshingWithRevokedToken_ThenUnauthorizedIsReturned() - { - var client = _factory.CreateClient(); - - var registerResponse = await client.PostAsJsonAsync("/api/v1/auth/register", new RegisterRequest( - "eve@example.com", "SecurePass1!", "Eve", "Davis", "EveCo")); - var registerBody = await registerResponse.Content.ReadFromJsonAsync(); - - await client.PostAsJsonAsync("/api/v1/auth/refresh", - new RefreshRequest(registerBody!.RefreshToken)); - - var response = await client.PostAsJsonAsync("/api/v1/auth/refresh", - new RefreshRequest(registerBody.RefreshToken)); - - Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.Unauthorized)); - } - - [Test] - public async Task WhenLoggingOut_ThenNoContentIsReturned() - { - var client = _factory.CreateClient(); - - var registerResponse = await client.PostAsJsonAsync("/api/v1/auth/register", new RegisterRequest( - "frank@example.com", "SecurePass1!", "Frank", "Green", "FrankCo")); - var registerBody = await registerResponse.Content.ReadFromJsonAsync(); - - var response = await client.PostAsJsonAsync("/api/v1/auth/logout", - new LogoutRequest(registerBody!.RefreshToken)); - - Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.NoContent)); - } - - [Test] - public async Task WhenLoggingOutAndRefreshing_ThenUnauthorizedIsReturned() - { - var client = _factory.CreateClient(); - - var registerResponse = await client.PostAsJsonAsync("/api/v1/auth/register", new RegisterRequest( - "grace@example.com", "SecurePass1!", "Grace", "Black", "GraceCo")); - var registerBody = await registerResponse.Content.ReadFromJsonAsync(); - - await client.PostAsJsonAsync("/api/v1/auth/logout", - new LogoutRequest(registerBody!.RefreshToken)); - - var response = await client.PostAsJsonAsync("/api/v1/auth/refresh", - new RefreshRequest(registerBody.RefreshToken)); - - Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.Unauthorized)); - } -} +using System.Net; +using System.Net.Http.Json; +using MicCheck.Api.Common.Security.Authorization; +using NUnit.Framework; + +namespace MicCheck.Api.Tests.Unit.Common.Security.Authorization; + +[TestFixture] +public class AuthEndpointsTests +{ + private MicCheckWebApplicationFactory _factory = null!; + + [SetUp] + public void SetUp() + { + _factory = new MicCheckWebApplicationFactory(); + } + + [TearDown] + public void TearDown() => _factory.Dispose(); + + [Test] + public async Task WhenRegisteringWithValidDetails_ThenOkIsReturnedWithTokens() + { + var client = _factory.CreateClient(); + + var response = await client.PostAsJsonAsync("/api/v1/auth/register", new RegisterRequest( + "alice@example.com", "SecurePass1!", "Alice", "Smith", "Acme Corp")); + + Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK)); + + var body = await response.Content.ReadFromJsonAsync(); + Assert.That(body?.AccessToken, Is.Not.Null.And.Not.Empty); + Assert.That(body?.RefreshToken, Is.Not.Null.And.Not.Empty); + } + + [Test] + public async Task WhenRegisteringWithDuplicateEmail_ThenConflictIsReturned() + { + var client = _factory.CreateClient(); + + await client.PostAsJsonAsync("/api/v1/auth/register", new RegisterRequest( + "alice@example.com", "SecurePass1!", "Alice", "Smith", "Acme Corp")); + + var response = await client.PostAsJsonAsync("/api/v1/auth/register", new RegisterRequest( + "alice@example.com", "AnotherPass1!", "Alice", "Jones", "Other Corp")); + + Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.Conflict)); + } + + [Test] + public async Task WhenLoginWithValidCredentials_ThenOkIsReturnedWithTokens() + { + var client = _factory.CreateClient(); + + await client.PostAsJsonAsync("/api/v1/auth/register", new RegisterRequest( + "bob@example.com", "SecurePass1!", "Bob", "Jones", "BobCo")); + + var response = await client.PostAsJsonAsync("/api/v1/auth/login", + new LoginRequest("bob@example.com", "SecurePass1!")); + + Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK)); + + var body = await response.Content.ReadFromJsonAsync(); + Assert.That(body?.AccessToken, Is.Not.Null.And.Not.Empty); + Assert.That(body?.RefreshToken, Is.Not.Null.And.Not.Empty); + } + + [Test] + public async Task WhenLoginWithWrongPassword_ThenUnauthorizedIsReturned() + { + var client = _factory.CreateClient(); + + await client.PostAsJsonAsync("/api/v1/auth/register", new RegisterRequest( + "carol@example.com", "CorrectPass1!", "Carol", "White", "CarolCo")); + + var response = await client.PostAsJsonAsync("/api/v1/auth/login", + new LoginRequest("carol@example.com", "WrongPassword")); + + Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.Unauthorized)); + } + + [Test] + public async Task WhenLoginWithUnknownEmail_ThenUnauthorizedIsReturned() + { + var client = _factory.CreateClient(); + + var response = await client.PostAsJsonAsync("/api/v1/auth/login", + new LoginRequest("nobody@example.com", "SomePass1!")); + + Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.Unauthorized)); + } + + [Test] + public async Task WhenLoginWithEmptyEmail_ThenBadRequestIsReturned() + { + var client = _factory.CreateClient(); + + var response = await client.PostAsJsonAsync("/api/v1/auth/login", + new LoginRequest("", "SomePass1!")); + + Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.BadRequest)); + } + + [Test] + public async Task WhenRefreshingWithValidToken_ThenOkIsReturnedWithNewTokens() + { + var client = _factory.CreateClient(); + + var registerResponse = await client.PostAsJsonAsync("/api/v1/auth/register", new RegisterRequest( + "dave@example.com", "SecurePass1!", "Dave", "Brown", "DaveCo")); + var registerBody = await registerResponse.Content.ReadFromJsonAsync(); + + var response = await client.PostAsJsonAsync("/api/v1/auth/refresh", + new RefreshRequest(registerBody!.RefreshToken)); + + Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK)); + + var body = await response.Content.ReadFromJsonAsync(); + Assert.That(body?.AccessToken, Is.Not.Null.And.Not.Empty); + Assert.That(body?.RefreshToken, Is.Not.EqualTo(registerBody.RefreshToken)); + } + + [Test] + public async Task WhenRefreshingWithInvalidToken_ThenUnauthorizedIsReturned() + { + var client = _factory.CreateClient(); + + var response = await client.PostAsJsonAsync("/api/v1/auth/refresh", + new RefreshRequest("not-a-valid-refresh-token")); + + Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.Unauthorized)); + } + + [Test] + public async Task WhenRefreshingWithRevokedToken_ThenUnauthorizedIsReturned() + { + var client = _factory.CreateClient(); + + var registerResponse = await client.PostAsJsonAsync("/api/v1/auth/register", new RegisterRequest( + "eve@example.com", "SecurePass1!", "Eve", "Davis", "EveCo")); + var registerBody = await registerResponse.Content.ReadFromJsonAsync(); + + await client.PostAsJsonAsync("/api/v1/auth/refresh", + new RefreshRequest(registerBody!.RefreshToken)); + + var response = await client.PostAsJsonAsync("/api/v1/auth/refresh", + new RefreshRequest(registerBody.RefreshToken)); + + Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.Unauthorized)); + } + + [Test] + public async Task WhenLoggingOut_ThenNoContentIsReturned() + { + var client = _factory.CreateClient(); + + var registerResponse = await client.PostAsJsonAsync("/api/v1/auth/register", new RegisterRequest( + "frank@example.com", "SecurePass1!", "Frank", "Green", "FrankCo")); + var registerBody = await registerResponse.Content.ReadFromJsonAsync(); + + var response = await client.PostAsJsonAsync("/api/v1/auth/logout", + new LogoutRequest(registerBody!.RefreshToken)); + + Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.NoContent)); + } + + [Test] + public async Task WhenLoggingOutAndRefreshing_ThenUnauthorizedIsReturned() + { + var client = _factory.CreateClient(); + + var registerResponse = await client.PostAsJsonAsync("/api/v1/auth/register", new RegisterRequest( + "grace@example.com", "SecurePass1!", "Grace", "Black", "GraceCo")); + var registerBody = await registerResponse.Content.ReadFromJsonAsync(); + + await client.PostAsJsonAsync("/api/v1/auth/logout", + new LogoutRequest(registerBody!.RefreshToken)); + + var response = await client.PostAsJsonAsync("/api/v1/auth/refresh", + new RefreshRequest(registerBody.RefreshToken)); + + Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.Unauthorized)); + } +} diff --git a/tests/api/MicCheck.Api.Tests.Unit/Common/Security/Authorization/ProjectPermissionRequirementHandlerTests.cs b/tests/api/MicCheck.Api.Tests.Unit/Common/Security/Authorization/ProjectPermissionRequirementHandlerTests.cs old mode 100644 new mode 100755 index 634bc42..0d2c8b3 --- a/tests/api/MicCheck.Api.Tests.Unit/Common/Security/Authorization/ProjectPermissionRequirementHandlerTests.cs +++ b/tests/api/MicCheck.Api.Tests.Unit/Common/Security/Authorization/ProjectPermissionRequirementHandlerTests.cs @@ -1,180 +1,180 @@ -using System.IdentityModel.Tokens.Jwt; -using System.Security.Claims; -using MicCheck.Api.Common.Security.Authorization; -using MicCheck.Api.Data; -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Http; -using Microsoft.EntityFrameworkCore; -using Moq; -using NUnit.Framework; - -namespace MicCheck.Api.Tests.Unit.Common.Security.Authorization; - -[TestFixture] -public class ProjectPermissionRequirementHandlerTests -{ - private MicCheckDbContext _db = null!; - private Mock _httpContextAccessor = null!; - private ProjectPermissionRequirementHandler _handler = null!; - - [SetUp] - public void SetUp() - { - var options = new DbContextOptionsBuilder() - .UseInMemoryDatabase(Guid.NewGuid().ToString()) - .Options; - _db = new MicCheckDbContext(options); - - _httpContextAccessor = new Mock(); - _handler = new ProjectPermissionRequirementHandler(_db, _httpContextAccessor.Object); - } - - [TearDown] - public void TearDown() => _db.Dispose(); - - private static AuthorizationHandlerContext CreateContext( - ClaimsPrincipal user, - ProjectPermission permission = ProjectPermission.ViewProject) - { - var requirement = new ProjectPermissionRequirement(permission); - return new AuthorizationHandlerContext([requirement], user, null); - } - - private static ClaimsPrincipal CreateUserWithClaims(params Claim[] claims) - { - return new ClaimsPrincipal(new ClaimsIdentity(claims, "Bearer")); - } - - private void SetupRouteProjectId(int projectId) - { - var httpContext = new DefaultHttpContext(); - httpContext.Request.RouteValues["projectId"] = projectId.ToString(); - _httpContextAccessor.Setup(a => a.HttpContext).Returns(httpContext); - } - - [Test] - public async Task WhenUserIsOrganizationAdmin_ThenRequirementSucceeds() - { - var user = CreateUserWithClaims( - new Claim(JwtRegisteredClaimNames.Sub, "1"), - new Claim("OrganizationRole", "Admin")); - - var context = CreateContext(user); - - await _handler.HandleAsync(context); - - Assert.That(context.HasSucceeded, Is.True); - } - - [Test] - public async Task WhenUserHasRequiredPermission_ThenRequirementSucceeds() - { - _db.UserProjectPermissions.Add(new UserProjectPermission - { - UserId = 1, - ProjectId = 10, - Permissions = [ProjectPermission.ViewProject] - }); - await _db.SaveChangesAsync(); - - SetupRouteProjectId(10); - - var user = CreateUserWithClaims( - new Claim(JwtRegisteredClaimNames.Sub, "1")); - - var context = CreateContext(user, ProjectPermission.ViewProject); - - await _handler.HandleAsync(context); - - Assert.That(context.HasSucceeded, Is.True); - } - - [Test] - public async Task WhenUserIsProjectAdmin_ThenAllPermissionsAreGranted() - { - _db.UserProjectPermissions.Add(new UserProjectPermission - { - UserId = 2, - ProjectId = 20, - IsAdmin = true, - Permissions = [] - }); - await _db.SaveChangesAsync(); - - SetupRouteProjectId(20); - - var user = CreateUserWithClaims( - new Claim(JwtRegisteredClaimNames.Sub, "2")); - - var context = CreateContext(user, ProjectPermission.DeleteFeature); - - await _handler.HandleAsync(context); - - Assert.That(context.HasSucceeded, Is.True); - } - - [Test] - public async Task WhenUserDoesNotHaveRequiredPermission_ThenRequirementFails() - { - _db.UserProjectPermissions.Add(new UserProjectPermission - { - UserId = 3, - ProjectId = 30, - Permissions = [ProjectPermission.ViewProject] - }); - await _db.SaveChangesAsync(); - - SetupRouteProjectId(30); - - var user = CreateUserWithClaims( - new Claim(JwtRegisteredClaimNames.Sub, "3")); - - var context = CreateContext(user, ProjectPermission.DeleteFeature); - - await _handler.HandleAsync(context); - - Assert.That(context.HasSucceeded, Is.False); - } - - [Test] - public async Task WhenUserHasNoProjectPermissionRecord_ThenRequirementFails() - { - SetupRouteProjectId(99); - - var user = CreateUserWithClaims( - new Claim(JwtRegisteredClaimNames.Sub, "5")); - - var context = CreateContext(user); - - await _handler.HandleAsync(context); - - Assert.That(context.HasSucceeded, Is.False); - } - - [Test] - public async Task WhenUserIdClaimIsMissing_ThenRequirementFails() - { - var user = CreateUserWithClaims(); - - var context = CreateContext(user); - - await _handler.HandleAsync(context); - - Assert.That(context.HasSucceeded, Is.False); - } - - [Test] - public async Task WhenProjectIdIsNotInRoute_ThenRequirementFails() - { - _httpContextAccessor.Setup(a => a.HttpContext).Returns(new DefaultHttpContext()); - - var user = CreateUserWithClaims( - new Claim(JwtRegisteredClaimNames.Sub, "1")); - - var context = CreateContext(user); - - await _handler.HandleAsync(context); - - Assert.That(context.HasSucceeded, Is.False); - } -} +using System.IdentityModel.Tokens.Jwt; +using System.Security.Claims; +using MicCheck.Api.Common.Security.Authorization; +using MicCheck.Api.Data; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Http; +using Microsoft.EntityFrameworkCore; +using Moq; +using NUnit.Framework; + +namespace MicCheck.Api.Tests.Unit.Common.Security.Authorization; + +[TestFixture] +public class ProjectPermissionRequirementHandlerTests +{ + private MicCheckDbContext _db = null!; + private Mock _httpContextAccessor = null!; + private ProjectPermissionRequirementHandler _handler = null!; + + [SetUp] + public void SetUp() + { + var options = new DbContextOptionsBuilder() + .UseInMemoryDatabase(Guid.NewGuid().ToString()) + .Options; + _db = new MicCheckDbContext(options); + + _httpContextAccessor = new Mock(); + _handler = new ProjectPermissionRequirementHandler(_db, _httpContextAccessor.Object); + } + + [TearDown] + public void TearDown() => _db.Dispose(); + + private static AuthorizationHandlerContext CreateContext( + ClaimsPrincipal user, + ProjectPermission permission = ProjectPermission.ViewProject) + { + var requirement = new ProjectPermissionRequirement(permission); + return new AuthorizationHandlerContext([requirement], user, null); + } + + private static ClaimsPrincipal CreateUserWithClaims(params Claim[] claims) + { + return new ClaimsPrincipal(new ClaimsIdentity(claims, "Bearer")); + } + + private void SetupRouteProjectId(int projectId) + { + var httpContext = new DefaultHttpContext(); + httpContext.Request.RouteValues["projectId"] = projectId.ToString(); + _httpContextAccessor.Setup(a => a.HttpContext).Returns(httpContext); + } + + [Test] + public async Task WhenUserIsOrganizationAdmin_ThenRequirementSucceeds() + { + var user = CreateUserWithClaims( + new Claim(JwtRegisteredClaimNames.Sub, "1"), + new Claim("OrganizationRole", "Admin")); + + var context = CreateContext(user); + + await _handler.HandleAsync(context); + + Assert.That(context.HasSucceeded, Is.True); + } + + [Test] + public async Task WhenUserHasRequiredPermission_ThenRequirementSucceeds() + { + _db.UserProjectPermissions.Add(new UserProjectPermission + { + UserId = 1, + ProjectId = 10, + Permissions = [ProjectPermission.ViewProject] + }); + await _db.SaveChangesAsync(); + + SetupRouteProjectId(10); + + var user = CreateUserWithClaims( + new Claim(JwtRegisteredClaimNames.Sub, "1")); + + var context = CreateContext(user, ProjectPermission.ViewProject); + + await _handler.HandleAsync(context); + + Assert.That(context.HasSucceeded, Is.True); + } + + [Test] + public async Task WhenUserIsProjectAdmin_ThenAllPermissionsAreGranted() + { + _db.UserProjectPermissions.Add(new UserProjectPermission + { + UserId = 2, + ProjectId = 20, + IsAdmin = true, + Permissions = [] + }); + await _db.SaveChangesAsync(); + + SetupRouteProjectId(20); + + var user = CreateUserWithClaims( + new Claim(JwtRegisteredClaimNames.Sub, "2")); + + var context = CreateContext(user, ProjectPermission.DeleteFeature); + + await _handler.HandleAsync(context); + + Assert.That(context.HasSucceeded, Is.True); + } + + [Test] + public async Task WhenUserDoesNotHaveRequiredPermission_ThenRequirementFails() + { + _db.UserProjectPermissions.Add(new UserProjectPermission + { + UserId = 3, + ProjectId = 30, + Permissions = [ProjectPermission.ViewProject] + }); + await _db.SaveChangesAsync(); + + SetupRouteProjectId(30); + + var user = CreateUserWithClaims( + new Claim(JwtRegisteredClaimNames.Sub, "3")); + + var context = CreateContext(user, ProjectPermission.DeleteFeature); + + await _handler.HandleAsync(context); + + Assert.That(context.HasSucceeded, Is.False); + } + + [Test] + public async Task WhenUserHasNoProjectPermissionRecord_ThenRequirementFails() + { + SetupRouteProjectId(99); + + var user = CreateUserWithClaims( + new Claim(JwtRegisteredClaimNames.Sub, "5")); + + var context = CreateContext(user); + + await _handler.HandleAsync(context); + + Assert.That(context.HasSucceeded, Is.False); + } + + [Test] + public async Task WhenUserIdClaimIsMissing_ThenRequirementFails() + { + var user = CreateUserWithClaims(); + + var context = CreateContext(user); + + await _handler.HandleAsync(context); + + Assert.That(context.HasSucceeded, Is.False); + } + + [Test] + public async Task WhenProjectIdIsNotInRoute_ThenRequirementFails() + { + _httpContextAccessor.Setup(a => a.HttpContext).Returns(new DefaultHttpContext()); + + var user = CreateUserWithClaims( + new Claim(JwtRegisteredClaimNames.Sub, "1")); + + var context = CreateContext(user); + + await _handler.HandleAsync(context); + + Assert.That(context.HasSucceeded, Is.False); + } +} diff --git a/tests/api/MicCheck.Api.Tests.Unit/Common/Security/Authorization/TokenServiceTests.cs b/tests/api/MicCheck.Api.Tests.Unit/Common/Security/Authorization/TokenServiceTests.cs old mode 100644 new mode 100755 index 3a227a8..e5d0bd4 --- a/tests/api/MicCheck.Api.Tests.Unit/Common/Security/Authorization/TokenServiceTests.cs +++ b/tests/api/MicCheck.Api.Tests.Unit/Common/Security/Authorization/TokenServiceTests.cs @@ -1,103 +1,103 @@ -using System.IdentityModel.Tokens.Jwt; -using MicCheck.Api.Common.Security.Authorization; -using MicCheck.Api.Organizations; -using MicCheck.Api.Users; -using Microsoft.Extensions.Configuration; -using NUnit.Framework; - -namespace MicCheck.Api.Tests.Unit.Common.Security.Authorization; - -[TestFixture] -public class TokenServiceTests -{ - private IConfiguration _configuration = null!; - private TokenService _tokenService = null!; - - [SetUp] - public void SetUp() - { - _configuration = new ConfigurationBuilder() - .AddInMemoryCollection(new Dictionary - { - ["Jwt:SecretKey"] = "test-secret-key-that-is-long-enough-32c", - ["Jwt:Issuer"] = "MicCheck", - ["Jwt:Audience"] = "MicCheck", - ["Jwt:ExpiryMinutes"] = "60", - }) - .Build(); - - _tokenService = new TokenService(_configuration); - } - - private static User BuildUser(int id = 1, string email = "alice@example.com") => - new() - { - Email = email, - FirstName = "Alice", - LastName = "Smith", - PasswordHash = "hashed", - IsActive = true, - CreatedAt = DateTimeOffset.UtcNow - }; - - [Test] - public void WhenAUserIsProvided_ThenATokenIsReturned() - { - var result = _tokenService.GenerateToken(BuildUser()); - - Assert.That(result.Token, Is.Not.Null.And.Not.Empty); - } - - [Test] - public void WhenATokenIsGenerated_ThenItContainsTheUserEmailClaim() - { - var user = BuildUser(email: "bob@example.com"); - - var result = _tokenService.GenerateToken(user); - - var handler = new JwtSecurityTokenHandler(); - var jwt = handler.ReadJwtToken(result.Token); - - Assert.That(jwt.Claims.Any(c => c.Type == JwtRegisteredClaimNames.Email && c.Value == "bob@example.com"), - Is.True); - } - - [Test] - public void WhenATokenIsGenerated_ThenItHasAFutureExpiry() - { - var result = _tokenService.GenerateToken(BuildUser()); - - Assert.That(result.ExpiresAt, Is.GreaterThan(DateTime.UtcNow)); - } - - [Test] - public void WhenATokenIsGenerated_ThenItHasTheConfiguredIssuer() - { - var result = _tokenService.GenerateToken(BuildUser()); - - var handler = new JwtSecurityTokenHandler(); - var jwt = handler.ReadJwtToken(result.Token); - - Assert.That(jwt.Issuer, Is.EqualTo("MicCheck")); - } - - [Test] - public void WhenUserBelongsToOrganizations_ThenTokenContainsOrganizationClaims() - { - var user = BuildUser(); - user.Organizations.Add(new OrganizationUser - { - OrganizationId = 42, - UserId = user.Id, - Role = OrganizationRole.Admin - }); - - var result = _tokenService.GenerateToken(user); - - var handler = new JwtSecurityTokenHandler(); - var jwt = handler.ReadJwtToken(result.Token); - - Assert.That(jwt.Claims.Any(c => c.Type == "OrganizationId" && c.Value == "42"), Is.True); - Assert.That(jwt.Claims.Any(c => c.Type == "OrganizationRole" && c.Value == "Admin"), Is.True); - } -} +using System.IdentityModel.Tokens.Jwt; +using MicCheck.Api.Common.Security.Authorization; +using MicCheck.Api.Organizations; +using MicCheck.Api.Users; +using Microsoft.Extensions.Configuration; +using NUnit.Framework; + +namespace MicCheck.Api.Tests.Unit.Common.Security.Authorization; + +[TestFixture] +public class TokenServiceTests +{ + private IConfiguration _configuration = null!; + private TokenService _tokenService = null!; + + [SetUp] + public void SetUp() + { + _configuration = new ConfigurationBuilder() + .AddInMemoryCollection(new Dictionary + { + ["Jwt:SecretKey"] = "test-secret-key-that-is-long-enough-32c", + ["Jwt:Issuer"] = "MicCheck", + ["Jwt:Audience"] = "MicCheck", + ["Jwt:ExpiryMinutes"] = "60", + }) + .Build(); + + _tokenService = new TokenService(_configuration); + } + + private static User BuildUser(int id = 1, string email = "alice@example.com") => + new() + { + Email = email, + FirstName = "Alice", + LastName = "Smith", + PasswordHash = "hashed", + IsActive = true, + CreatedAt = DateTimeOffset.UtcNow + }; + + [Test] + public void WhenAUserIsProvided_ThenATokenIsReturned() + { + var result = _tokenService.GenerateToken(BuildUser()); + + Assert.That(result.Token, Is.Not.Null.And.Not.Empty); + } + + [Test] + public void WhenATokenIsGenerated_ThenItContainsTheUserEmailClaim() + { + var user = BuildUser(email: "bob@example.com"); + + var result = _tokenService.GenerateToken(user); + + var handler = new JwtSecurityTokenHandler(); + var jwt = handler.ReadJwtToken(result.Token); + + Assert.That(jwt.Claims.Any(c => c.Type == JwtRegisteredClaimNames.Email && c.Value == "bob@example.com"), + Is.True); + } + + [Test] + public void WhenATokenIsGenerated_ThenItHasAFutureExpiry() + { + var result = _tokenService.GenerateToken(BuildUser()); + + Assert.That(result.ExpiresAt, Is.GreaterThan(DateTime.UtcNow)); + } + + [Test] + public void WhenATokenIsGenerated_ThenItHasTheConfiguredIssuer() + { + var result = _tokenService.GenerateToken(BuildUser()); + + var handler = new JwtSecurityTokenHandler(); + var jwt = handler.ReadJwtToken(result.Token); + + Assert.That(jwt.Issuer, Is.EqualTo("MicCheck")); + } + + [Test] + public void WhenUserBelongsToOrganizations_ThenTokenContainsOrganizationClaims() + { + var user = BuildUser(); + user.Organizations.Add(new OrganizationUser + { + OrganizationId = 42, + UserId = user.Id, + Role = OrganizationRole.Admin + }); + + var result = _tokenService.GenerateToken(user); + + var handler = new JwtSecurityTokenHandler(); + var jwt = handler.ReadJwtToken(result.Token); + + Assert.That(jwt.Claims.Any(c => c.Type == "OrganizationId" && c.Value == "42"), Is.True); + Assert.That(jwt.Claims.Any(c => c.Type == "OrganizationRole" && c.Value == "Admin"), Is.True); + } +} diff --git a/tests/api/MicCheck.Api.Tests.Unit/Data/DatabaseUrlParserTests.cs b/tests/api/MicCheck.Api.Tests.Unit/Data/DatabaseUrlParserTests.cs old mode 100644 new mode 100755 diff --git a/tests/api/MicCheck.Api.Tests.Unit/Data/MicCheckDbContextTests.cs b/tests/api/MicCheck.Api.Tests.Unit/Data/MicCheckDbContextTests.cs old mode 100644 new mode 100755 index 07a3f20..8e52315 --- a/tests/api/MicCheck.Api.Tests.Unit/Data/MicCheckDbContextTests.cs +++ b/tests/api/MicCheck.Api.Tests.Unit/Data/MicCheckDbContextTests.cs @@ -1,224 +1,224 @@ -using NUnit.Framework; -using MicCheck.Api.Data; -using MicCheck.Api.Features; -using MicCheck.Api.Organizations; -using MicCheck.Api.Projects; -using MicCheck.Api.Segments; -using MicCheck.Api.Identities; -using MicCheck.Api.Audit; -using MicCheck.Api.Webhooks; -using MicCheck.Api.Common.Security.ApiKeys; -using MicCheck.Api.Users; -using Microsoft.EntityFrameworkCore; -using AppEnvironment = MicCheck.Api.Environments.Environment; - -namespace MicCheck.Api.Tests.Unit.Data; - -[TestFixture] -public class MicCheckDbContextTests -{ - private MicCheckDbContext _db = null!; - - [SetUp] - public void SetUp() - { - var options = new DbContextOptionsBuilder() - .UseInMemoryDatabase(Guid.NewGuid().ToString()) - .Options; - _db = new MicCheckDbContext(options); - } - - [TearDown] - public void TearDown() => _db.Dispose(); - - [Test] - public async Task WhenAnOrganizationIsSaved_ThenItCanBeRetrievedById() - { - var organization = new Organization { Name = "Acme", CreatedAt = DateTimeOffset.UtcNow }; - _db.Organizations.Add(organization); - await _db.SaveChangesAsync(); - - var retrieved = await _db.Organizations.FindAsync(organization.Id); - - Assert.That(retrieved, Is.Not.Null); - Assert.That(retrieved!.Name, Is.EqualTo("Acme")); - } - - [Test] - public async Task WhenAProjectIsSaved_ThenItCanBeRetrievedByOrganization() - { - var organization = new Organization { Name = "Acme", CreatedAt = DateTimeOffset.UtcNow }; - _db.Organizations.Add(organization); - await _db.SaveChangesAsync(); - - var project = new Project { Name = "My Project", OrganizationId = organization.Id, CreatedAt = DateTimeOffset.UtcNow }; - _db.Projects.Add(project); - await _db.SaveChangesAsync(); - - var projects = await _db.Projects.Where(p => p.OrganizationId == organization.Id).ToListAsync(); - - Assert.That(projects, Has.Count.EqualTo(1)); - Assert.That(projects[0].Name, Is.EqualTo("My Project")); - } - - [Test] - public async Task WhenAnEnvironmentIsSaved_ThenItCanBeRetrievedByApiKey() - { - var project = new Project { Name = "Test", OrganizationId = 1, CreatedAt = DateTimeOffset.UtcNow }; - _db.Projects.Add(project); - await _db.SaveChangesAsync(); - - var env = new AppEnvironment { Name = "Production", ApiKey = "env-key-abc", ProjectId = project.Id, CreatedAt = DateTimeOffset.UtcNow }; - _db.Environments.Add(env); - await _db.SaveChangesAsync(); - - var retrieved = await _db.Environments.FirstOrDefaultAsync(e => e.ApiKey == "env-key-abc"); - - Assert.That(retrieved, Is.Not.Null); - Assert.That(retrieved!.Name, Is.EqualTo("Production")); - } - - [Test] - public async Task WhenAFeatureIsSaved_ThenItCanBeRetrievedByProject() - { - var feature = new Feature { Name = "dark_mode", ProjectId = 1, CreatedAt = DateTimeOffset.UtcNow }; - _db.Features.Add(feature); - await _db.SaveChangesAsync(); - - var features = await _db.Features.Where(f => f.ProjectId == 1).ToListAsync(); - - Assert.That(features, Has.Count.EqualTo(1)); - Assert.That(features[0].Name, Is.EqualTo("dark_mode")); - } - - [Test] - public async Task WhenAFeatureStateIsSaved_ThenItCanBeQueriedByEnvironment() - { - var state = new FeatureState - { - FeatureId = 1, - EnvironmentId = 1, - Enabled = true, - CreatedAt = DateTimeOffset.UtcNow, - UpdatedAt = DateTimeOffset.UtcNow - }; - _db.FeatureStates.Add(state); - await _db.SaveChangesAsync(); - - var states = await _db.FeatureStates.Where(fs => fs.EnvironmentId == 1).ToListAsync(); - - Assert.That(states, Has.Count.EqualTo(1)); - Assert.That(states[0].Enabled, Is.True); - } - - [Test] - public async Task WhenASegmentIsSaved_ThenItsRulesCanBeLoaded() - { - var segment = new Segment { Name = "Power Users", ProjectId = 1, CreatedAt = DateTimeOffset.UtcNow }; - _db.Segments.Add(segment); - await _db.SaveChangesAsync(); - - var rule = new SegmentRule { SegmentId = segment.Id, Type = SegmentRuleType.All }; - _db.SegmentRules.Add(rule); - await _db.SaveChangesAsync(); - - var loaded = await _db.Segments - .Include(s => s.Rules) - .FirstAsync(s => s.Id == segment.Id); - - Assert.That(loaded.Rules, Has.Count.EqualTo(1)); - } - - [Test] - public async Task WhenAnIdentityIsSaved_ThenItsTraitsCanBeLoaded() - { - var identity = new Identity { Identifier = "user-123", EnvironmentId = 1, CreatedAt = DateTimeOffset.UtcNow }; - _db.Identities.Add(identity); - await _db.SaveChangesAsync(); - - _db.IdentityTraits.Add(new IdentityTrait { IdentityId = identity.Id, Key = "plan", Value = "premium" }); - await _db.SaveChangesAsync(); - - var loaded = await _db.Identities - .Include(i => i.Traits) - .FirstAsync(i => i.Id == identity.Id); - - Assert.That(loaded.Traits, Has.Count.EqualTo(1)); - Assert.That(loaded.Traits.First().Key, Is.EqualTo("plan")); - } - - [Test] - public async Task WhenAnAuditLogIsSaved_ThenItCanBeFilteredByOrganization() - { - _db.AuditLogs.Add(new AuditLog - { - ResourceType = "Feature", - ResourceId = "1", - Action = "Created", - OrganizationId = 42, - CreatedAt = DateTimeOffset.UtcNow - }); - await _db.SaveChangesAsync(); - - var logs = await _db.AuditLogs.Where(a => a.OrganizationId == 42).ToListAsync(); - - Assert.That(logs, Has.Count.EqualTo(1)); - } - - [Test] - public async Task WhenAWebhookIsSaved_ThenItCanBeFilteredByEnvironment() - { - _db.Webhooks.Add(new Webhook - { - Url = "https://example.com/hook", - Scope = WebhookScope.Environment, - EnvironmentId = 5, - CreatedAt = DateTimeOffset.UtcNow - }); - await _db.SaveChangesAsync(); - - var webhooks = await _db.Webhooks.Where(w => w.EnvironmentId == 5).ToListAsync(); - - Assert.That(webhooks, Has.Count.EqualTo(1)); - } - - [Test] - public async Task WhenAnApiKeyIsSaved_ThenItCanBeRetrievedByHashedKey() - { - _db.ApiKeys.Add(new ApiKey - { - Key = "hashed-value-xyz", - Prefix = "hashed-va", - Name = "CI Key", - OrganizationId = 1, - IsActive = true, - CreatedAt = DateTimeOffset.UtcNow - }); - await _db.SaveChangesAsync(); - - var key = await _db.ApiKeys.FirstOrDefaultAsync(k => k.Key == "hashed-value-xyz"); - - Assert.That(key, Is.Not.Null); - Assert.That(key!.IsActive, Is.True); - } - - [Test] - public async Task WhenAUserIsSaved_ThenItCanBeRetrievedByEmail() - { - _db.Users.Add(new User - { - Email = "alice@example.com", - PasswordHash = "hashed", - FirstName = "Alice", - LastName = "Smith", - IsActive = true, - CreatedAt = DateTimeOffset.UtcNow - }); - await _db.SaveChangesAsync(); - - var user = await _db.Users.FirstOrDefaultAsync(u => u.Email == "alice@example.com"); - - Assert.That(user, Is.Not.Null); - Assert.That(user!.FirstName, Is.EqualTo("Alice")); - } -} +using NUnit.Framework; +using MicCheck.Api.Data; +using MicCheck.Api.Features; +using MicCheck.Api.Organizations; +using MicCheck.Api.Projects; +using MicCheck.Api.Segments; +using MicCheck.Api.Identities; +using MicCheck.Api.Audit; +using MicCheck.Api.Webhooks; +using MicCheck.Api.Common.Security.ApiKeys; +using MicCheck.Api.Users; +using Microsoft.EntityFrameworkCore; +using AppEnvironment = MicCheck.Api.Environments.Environment; + +namespace MicCheck.Api.Tests.Unit.Data; + +[TestFixture] +public class MicCheckDbContextTests +{ + private MicCheckDbContext _db = null!; + + [SetUp] + public void SetUp() + { + var options = new DbContextOptionsBuilder() + .UseInMemoryDatabase(Guid.NewGuid().ToString()) + .Options; + _db = new MicCheckDbContext(options); + } + + [TearDown] + public void TearDown() => _db.Dispose(); + + [Test] + public async Task WhenAnOrganizationIsSaved_ThenItCanBeRetrievedById() + { + var organization = new Organization { Name = "Acme", CreatedAt = DateTimeOffset.UtcNow }; + _db.Organizations.Add(organization); + await _db.SaveChangesAsync(); + + var retrieved = await _db.Organizations.FindAsync(organization.Id); + + Assert.That(retrieved, Is.Not.Null); + Assert.That(retrieved!.Name, Is.EqualTo("Acme")); + } + + [Test] + public async Task WhenAProjectIsSaved_ThenItCanBeRetrievedByOrganization() + { + var organization = new Organization { Name = "Acme", CreatedAt = DateTimeOffset.UtcNow }; + _db.Organizations.Add(organization); + await _db.SaveChangesAsync(); + + var project = new Project { Name = "My Project", OrganizationId = organization.Id, CreatedAt = DateTimeOffset.UtcNow }; + _db.Projects.Add(project); + await _db.SaveChangesAsync(); + + var projects = await _db.Projects.Where(p => p.OrganizationId == organization.Id).ToListAsync(); + + Assert.That(projects, Has.Count.EqualTo(1)); + Assert.That(projects[0].Name, Is.EqualTo("My Project")); + } + + [Test] + public async Task WhenAnEnvironmentIsSaved_ThenItCanBeRetrievedByApiKey() + { + var project = new Project { Name = "Test", OrganizationId = 1, CreatedAt = DateTimeOffset.UtcNow }; + _db.Projects.Add(project); + await _db.SaveChangesAsync(); + + var env = new AppEnvironment { Name = "Production", ApiKey = "env-key-abc", ProjectId = project.Id, CreatedAt = DateTimeOffset.UtcNow }; + _db.Environments.Add(env); + await _db.SaveChangesAsync(); + + var retrieved = await _db.Environments.FirstOrDefaultAsync(e => e.ApiKey == "env-key-abc"); + + Assert.That(retrieved, Is.Not.Null); + Assert.That(retrieved!.Name, Is.EqualTo("Production")); + } + + [Test] + public async Task WhenAFeatureIsSaved_ThenItCanBeRetrievedByProject() + { + var feature = new Feature { Name = "dark_mode", ProjectId = 1, CreatedAt = DateTimeOffset.UtcNow }; + _db.Features.Add(feature); + await _db.SaveChangesAsync(); + + var features = await _db.Features.Where(f => f.ProjectId == 1).ToListAsync(); + + Assert.That(features, Has.Count.EqualTo(1)); + Assert.That(features[0].Name, Is.EqualTo("dark_mode")); + } + + [Test] + public async Task WhenAFeatureStateIsSaved_ThenItCanBeQueriedByEnvironment() + { + var state = new FeatureState + { + FeatureId = 1, + EnvironmentId = 1, + Enabled = true, + CreatedAt = DateTimeOffset.UtcNow, + UpdatedAt = DateTimeOffset.UtcNow + }; + _db.FeatureStates.Add(state); + await _db.SaveChangesAsync(); + + var states = await _db.FeatureStates.Where(fs => fs.EnvironmentId == 1).ToListAsync(); + + Assert.That(states, Has.Count.EqualTo(1)); + Assert.That(states[0].Enabled, Is.True); + } + + [Test] + public async Task WhenASegmentIsSaved_ThenItsRulesCanBeLoaded() + { + var segment = new Segment { Name = "Power Users", ProjectId = 1, CreatedAt = DateTimeOffset.UtcNow }; + _db.Segments.Add(segment); + await _db.SaveChangesAsync(); + + var rule = new SegmentRule { SegmentId = segment.Id, Type = SegmentRuleType.All }; + _db.SegmentRules.Add(rule); + await _db.SaveChangesAsync(); + + var loaded = await _db.Segments + .Include(s => s.Rules) + .FirstAsync(s => s.Id == segment.Id); + + Assert.That(loaded.Rules, Has.Count.EqualTo(1)); + } + + [Test] + public async Task WhenAnIdentityIsSaved_ThenItsTraitsCanBeLoaded() + { + var identity = new Identity { Identifier = "user-123", EnvironmentId = 1, CreatedAt = DateTimeOffset.UtcNow }; + _db.Identities.Add(identity); + await _db.SaveChangesAsync(); + + _db.IdentityTraits.Add(new IdentityTrait { IdentityId = identity.Id, Key = "plan", Value = "premium" }); + await _db.SaveChangesAsync(); + + var loaded = await _db.Identities + .Include(i => i.Traits) + .FirstAsync(i => i.Id == identity.Id); + + Assert.That(loaded.Traits, Has.Count.EqualTo(1)); + Assert.That(loaded.Traits.First().Key, Is.EqualTo("plan")); + } + + [Test] + public async Task WhenAnAuditLogIsSaved_ThenItCanBeFilteredByOrganization() + { + _db.AuditLogs.Add(new AuditLog + { + ResourceType = "Feature", + ResourceId = "1", + Action = "Created", + OrganizationId = 42, + CreatedAt = DateTimeOffset.UtcNow + }); + await _db.SaveChangesAsync(); + + var logs = await _db.AuditLogs.Where(a => a.OrganizationId == 42).ToListAsync(); + + Assert.That(logs, Has.Count.EqualTo(1)); + } + + [Test] + public async Task WhenAWebhookIsSaved_ThenItCanBeFilteredByEnvironment() + { + _db.Webhooks.Add(new Webhook + { + Url = "https://example.com/hook", + Scope = WebhookScope.Environment, + EnvironmentId = 5, + CreatedAt = DateTimeOffset.UtcNow + }); + await _db.SaveChangesAsync(); + + var webhooks = await _db.Webhooks.Where(w => w.EnvironmentId == 5).ToListAsync(); + + Assert.That(webhooks, Has.Count.EqualTo(1)); + } + + [Test] + public async Task WhenAnApiKeyIsSaved_ThenItCanBeRetrievedByHashedKey() + { + _db.ApiKeys.Add(new ApiKey + { + Key = "hashed-value-xyz", + Prefix = "hashed-va", + Name = "CI Key", + OrganizationId = 1, + IsActive = true, + CreatedAt = DateTimeOffset.UtcNow + }); + await _db.SaveChangesAsync(); + + var key = await _db.ApiKeys.FirstOrDefaultAsync(k => k.Key == "hashed-value-xyz"); + + Assert.That(key, Is.Not.Null); + Assert.That(key!.IsActive, Is.True); + } + + [Test] + public async Task WhenAUserIsSaved_ThenItCanBeRetrievedByEmail() + { + _db.Users.Add(new User + { + Email = "alice@example.com", + PasswordHash = "hashed", + FirstName = "Alice", + LastName = "Smith", + IsActive = true, + CreatedAt = DateTimeOffset.UtcNow + }); + await _db.SaveChangesAsync(); + + var user = await _db.Users.FirstOrDefaultAsync(u => u.Email == "alice@example.com"); + + Assert.That(user, Is.Not.Null); + Assert.That(user!.FirstName, Is.EqualTo("Alice")); + } +} diff --git a/tests/api/MicCheck.Api.Tests.Unit/Environments/EnvironmentServiceTests.cs b/tests/api/MicCheck.Api.Tests.Unit/Environments/EnvironmentServiceTests.cs old mode 100644 new mode 100755 diff --git a/tests/api/MicCheck.Api.Tests.Unit/Environments/EnvironmentTests.cs b/tests/api/MicCheck.Api.Tests.Unit/Environments/EnvironmentTests.cs old mode 100644 new mode 100755 diff --git a/tests/api/MicCheck.Api.Tests.Unit/Features/FeatureEvaluationServiceTests.cs b/tests/api/MicCheck.Api.Tests.Unit/Features/FeatureEvaluationServiceTests.cs old mode 100644 new mode 100755 diff --git a/tests/api/MicCheck.Api.Tests.Unit/Features/FeatureServiceTests.cs b/tests/api/MicCheck.Api.Tests.Unit/Features/FeatureServiceTests.cs old mode 100644 new mode 100755 diff --git a/tests/api/MicCheck.Api.Tests.Unit/Features/FeatureTests.cs b/tests/api/MicCheck.Api.Tests.Unit/Features/FeatureTests.cs old mode 100644 new mode 100755 diff --git a/tests/api/MicCheck.Api.Tests.Unit/Features/FlagsApiIntegrationTests.cs b/tests/api/MicCheck.Api.Tests.Unit/Features/FlagsApiIntegrationTests.cs old mode 100644 new mode 100755 diff --git a/tests/api/MicCheck.Api.Tests.Unit/Identities/IdentityTests.cs b/tests/api/MicCheck.Api.Tests.Unit/Identities/IdentityTests.cs old mode 100644 new mode 100755 diff --git a/tests/api/MicCheck.Api.Tests.Unit/MicCheck.Api.Tests.Unit.csproj b/tests/api/MicCheck.Api.Tests.Unit/MicCheck.Api.Tests.Unit.csproj old mode 100644 new mode 100755 diff --git a/tests/api/MicCheck.Api.Tests.Unit/MicCheckWebApplicationFactory.cs b/tests/api/MicCheck.Api.Tests.Unit/MicCheckWebApplicationFactory.cs old mode 100644 new mode 100755 diff --git a/tests/api/MicCheck.Api.Tests.Unit/Organizations/OrganizationTests.cs b/tests/api/MicCheck.Api.Tests.Unit/Organizations/OrganizationTests.cs old mode 100644 new mode 100755 index e34f0c7..382c95e --- a/tests/api/MicCheck.Api.Tests.Unit/Organizations/OrganizationTests.cs +++ b/tests/api/MicCheck.Api.Tests.Unit/Organizations/OrganizationTests.cs @@ -1,70 +1,70 @@ -using NUnit.Framework; -using MicCheck.Api.Common.Security.ApiKeys; -using MicCheck.Api.Organizations; -using MicCheck.Api.Projects; - -namespace MicCheck.Api.Tests.Unit.Organizations; - -[TestFixture] -public class OrganizationTests -{ - [Test] - public void WhenAnOrganizationIsCreated_ThenCollectionsAreInitializedEmpty() - { - var organization = new Organization { Name = "Acme" }; - - Assert.That(organization.Projects, Is.Empty); - Assert.That(organization.Members, Is.Empty); - Assert.That(organization.ApiKeys, Is.Empty); - } - - [Test] - public void WhenAnOrganizationIsCreated_ThenNameIsSet() - { - var organization = new Organization { Name = "Acme" }; - - Assert.That(organization.Name, Is.EqualTo("Acme")); - } - - [Test] - public void WhenAProjectIsAddedToAnOrganization_ThenItAppearsInTheProjectsCollection() - { - var organization = new Organization { Name = "Acme" }; - var project = new Project { Name = "My Project", OrganizationId = organization.Id }; - - organization.Projects.Add(project); - - Assert.That(organization.Projects, Has.Count.EqualTo(1)); - } - - [Test] - public void WhenAnApiKeyIsAddedToAnOrganization_ThenItAppearsInTheApiKeysCollection() - { - var organization = new Organization { Name = "Acme" }; - var apiKey = new ApiKey { Key = "hashed-key", Prefix = "abc12345", Name = "CI Key", OrganizationId = organization.Id }; - - organization.ApiKeys.Add(apiKey); - - Assert.That(organization.ApiKeys, Has.Count.EqualTo(1)); - } -} - -[TestFixture] -public class OrganizationUserTests -{ - [Test] - public void WhenAnOrganizationUserIsCreated_ThenRoleDefaultsToUser() - { - var member = new OrganizationUser { OrganizationId = 1, UserId = 1 }; - - Assert.That(member.Role, Is.EqualTo(OrganizationRole.User)); - } - - [Test] - public void WhenAnOrganizationUserRoleIsSetToAdmin_ThenRoleIsAdmin() - { - var member = new OrganizationUser { OrganizationId = 1, UserId = 1, Role = OrganizationRole.Admin }; - - Assert.That(member.Role, Is.EqualTo(OrganizationRole.Admin)); - } -} +using NUnit.Framework; +using MicCheck.Api.Common.Security.ApiKeys; +using MicCheck.Api.Organizations; +using MicCheck.Api.Projects; + +namespace MicCheck.Api.Tests.Unit.Organizations; + +[TestFixture] +public class OrganizationTests +{ + [Test] + public void WhenAnOrganizationIsCreated_ThenCollectionsAreInitializedEmpty() + { + var organization = new Organization { Name = "Acme" }; + + Assert.That(organization.Projects, Is.Empty); + Assert.That(organization.Members, Is.Empty); + Assert.That(organization.ApiKeys, Is.Empty); + } + + [Test] + public void WhenAnOrganizationIsCreated_ThenNameIsSet() + { + var organization = new Organization { Name = "Acme" }; + + Assert.That(organization.Name, Is.EqualTo("Acme")); + } + + [Test] + public void WhenAProjectIsAddedToAnOrganization_ThenItAppearsInTheProjectsCollection() + { + var organization = new Organization { Name = "Acme" }; + var project = new Project { Name = "My Project", OrganizationId = organization.Id }; + + organization.Projects.Add(project); + + Assert.That(organization.Projects, Has.Count.EqualTo(1)); + } + + [Test] + public void WhenAnApiKeyIsAddedToAnOrganization_ThenItAppearsInTheApiKeysCollection() + { + var organization = new Organization { Name = "Acme" }; + var apiKey = new ApiKey { Key = "hashed-key", Prefix = "abc12345", Name = "CI Key", OrganizationId = organization.Id }; + + organization.ApiKeys.Add(apiKey); + + Assert.That(organization.ApiKeys, Has.Count.EqualTo(1)); + } +} + +[TestFixture] +public class OrganizationUserTests +{ + [Test] + public void WhenAnOrganizationUserIsCreated_ThenRoleDefaultsToUser() + { + var member = new OrganizationUser { OrganizationId = 1, UserId = 1 }; + + Assert.That(member.Role, Is.EqualTo(OrganizationRole.User)); + } + + [Test] + public void WhenAnOrganizationUserRoleIsSetToAdmin_ThenRoleIsAdmin() + { + var member = new OrganizationUser { OrganizationId = 1, UserId = 1, Role = OrganizationRole.Admin }; + + Assert.That(member.Role, Is.EqualTo(OrganizationRole.Admin)); + } +} diff --git a/tests/api/MicCheck.Api.Tests.Unit/Projects/ProjectTests.cs b/tests/api/MicCheck.Api.Tests.Unit/Projects/ProjectTests.cs old mode 100644 new mode 100755 diff --git a/tests/api/MicCheck.Api.Tests.Unit/Segments/SegmentEvaluatorTests.cs b/tests/api/MicCheck.Api.Tests.Unit/Segments/SegmentEvaluatorTests.cs old mode 100644 new mode 100755 diff --git a/tests/api/MicCheck.Api.Tests.Unit/Segments/SegmentServiceTests.cs b/tests/api/MicCheck.Api.Tests.Unit/Segments/SegmentServiceTests.cs old mode 100644 new mode 100755 diff --git a/tests/api/MicCheck.Api.Tests.Unit/Segments/SegmentTests.cs b/tests/api/MicCheck.Api.Tests.Unit/Segments/SegmentTests.cs old mode 100644 new mode 100755 diff --git a/tests/api/MicCheck.Api.Tests.Unit/Users/UserTests.cs b/tests/api/MicCheck.Api.Tests.Unit/Users/UserTests.cs old mode 100644 new mode 100755 diff --git a/tests/api/MicCheck.Api.Tests.Unit/Webhooks/WebhookDispatcherTests.cs b/tests/api/MicCheck.Api.Tests.Unit/Webhooks/WebhookDispatcherTests.cs old mode 100644 new mode 100755 diff --git a/tests/api/MicCheck.Api.Tests.Unit/Webhooks/WebhookRetryTests.cs b/tests/api/MicCheck.Api.Tests.Unit/Webhooks/WebhookRetryTests.cs old mode 100644 new mode 100755 diff --git a/tests/api/MicCheck.Api.Tests.Unit/Webhooks/WebhookTests.cs b/tests/api/MicCheck.Api.Tests.Unit/Webhooks/WebhookTests.cs old mode 100644 new mode 100755