From 52a567f81d96d398f6adf76028bf2f4821bfc931 Mon Sep 17 00:00:00 2001 From: AishwaryaRameshbabu-SF3446 Date: Mon, 23 Mar 2026 14:02:52 +0530 Subject: [PATCH 1/6] 1017111-PostgreSQL-sample-added --- .../Grid_PostgreSQL.Server/CHANGELOG.md | 8 + .../Controllers/PurchaseOrderController.cs | 157 + .../Controllers/WeatherForecastController.cs | 26 + .../Data/PurchaseOrder.cs | 96 + .../Data/PurchaseOrderDbContext.cs | 142 + .../Grid_PostgreSQL.Server.csproj | 28 + .../Grid_PostgreSQL.Server.csproj.user | 8 + .../Grid_PostgreSQL.Server.http | 6 + .../Grid_PostgreSQL.Server/Program.cs | 73 + .../Properties/launchSettings.json | 26 + .../Grid_PostgreSQL.Server/WeatherForecast.cs | 13 + .../appsettings.Development.json | 8 + .../Grid_PostgreSQL.Server/appsettings.json | 12 + .../Grid_PostgreSQL.slnx | 7 + .../grid_postgresql.client/.gitignore | 24 + .../grid_postgresql.client/CHANGELOG.md | 16 + .../grid_postgresql.client/README.md | 73 + .../grid_postgresql.client/eslint.config.js | 23 + .../grid_postgresql.client.esproj | 11 + .../grid_postgresql.client/index.html | 13 + .../grid_postgresql.client/package-lock.json | 3498 +++++++++++++++++ .../grid_postgresql.client/package.json | 32 + .../grid_postgresql.client/public/vite.svg | 1 + .../grid_postgresql.client/src/App.css | 11 + .../grid_postgresql.client/src/App.tsx | 71 + .../src/CustomAdaptor.ts | 69 + .../src/assets/react.svg | 1 + .../grid_postgresql.client/src/index.css | 10 + .../grid_postgresql.client/src/main.tsx | 10 + .../grid_postgresql.client/tsconfig.app.json | 28 + .../grid_postgresql.client/tsconfig.json | 7 + .../grid_postgresql.client/tsconfig.node.json | 26 + .../grid_postgresql.client/vite.config.ts | 61 + 33 files changed, 4595 insertions(+) create mode 100644 connecting-to-database/syncfusion-react-grid-PostgreSQL/Grid_PostgreSQL.Server/CHANGELOG.md create mode 100644 connecting-to-database/syncfusion-react-grid-PostgreSQL/Grid_PostgreSQL.Server/Controllers/PurchaseOrderController.cs create mode 100644 connecting-to-database/syncfusion-react-grid-PostgreSQL/Grid_PostgreSQL.Server/Controllers/WeatherForecastController.cs create mode 100644 connecting-to-database/syncfusion-react-grid-PostgreSQL/Grid_PostgreSQL.Server/Data/PurchaseOrder.cs create mode 100644 connecting-to-database/syncfusion-react-grid-PostgreSQL/Grid_PostgreSQL.Server/Data/PurchaseOrderDbContext.cs create mode 100644 connecting-to-database/syncfusion-react-grid-PostgreSQL/Grid_PostgreSQL.Server/Grid_PostgreSQL.Server.csproj create mode 100644 connecting-to-database/syncfusion-react-grid-PostgreSQL/Grid_PostgreSQL.Server/Grid_PostgreSQL.Server.csproj.user create mode 100644 connecting-to-database/syncfusion-react-grid-PostgreSQL/Grid_PostgreSQL.Server/Grid_PostgreSQL.Server.http create mode 100644 connecting-to-database/syncfusion-react-grid-PostgreSQL/Grid_PostgreSQL.Server/Program.cs create mode 100644 connecting-to-database/syncfusion-react-grid-PostgreSQL/Grid_PostgreSQL.Server/Properties/launchSettings.json create mode 100644 connecting-to-database/syncfusion-react-grid-PostgreSQL/Grid_PostgreSQL.Server/WeatherForecast.cs create mode 100644 connecting-to-database/syncfusion-react-grid-PostgreSQL/Grid_PostgreSQL.Server/appsettings.Development.json create mode 100644 connecting-to-database/syncfusion-react-grid-PostgreSQL/Grid_PostgreSQL.Server/appsettings.json create mode 100644 connecting-to-database/syncfusion-react-grid-PostgreSQL/Grid_PostgreSQL.slnx create mode 100644 connecting-to-database/syncfusion-react-grid-PostgreSQL/grid_postgresql.client/.gitignore create mode 100644 connecting-to-database/syncfusion-react-grid-PostgreSQL/grid_postgresql.client/CHANGELOG.md create mode 100644 connecting-to-database/syncfusion-react-grid-PostgreSQL/grid_postgresql.client/README.md create mode 100644 connecting-to-database/syncfusion-react-grid-PostgreSQL/grid_postgresql.client/eslint.config.js create mode 100644 connecting-to-database/syncfusion-react-grid-PostgreSQL/grid_postgresql.client/grid_postgresql.client.esproj create mode 100644 connecting-to-database/syncfusion-react-grid-PostgreSQL/grid_postgresql.client/index.html create mode 100644 connecting-to-database/syncfusion-react-grid-PostgreSQL/grid_postgresql.client/package-lock.json create mode 100644 connecting-to-database/syncfusion-react-grid-PostgreSQL/grid_postgresql.client/package.json create mode 100644 connecting-to-database/syncfusion-react-grid-PostgreSQL/grid_postgresql.client/public/vite.svg create mode 100644 connecting-to-database/syncfusion-react-grid-PostgreSQL/grid_postgresql.client/src/App.css create mode 100644 connecting-to-database/syncfusion-react-grid-PostgreSQL/grid_postgresql.client/src/App.tsx create mode 100644 connecting-to-database/syncfusion-react-grid-PostgreSQL/grid_postgresql.client/src/CustomAdaptor.ts create mode 100644 connecting-to-database/syncfusion-react-grid-PostgreSQL/grid_postgresql.client/src/assets/react.svg create mode 100644 connecting-to-database/syncfusion-react-grid-PostgreSQL/grid_postgresql.client/src/index.css create mode 100644 connecting-to-database/syncfusion-react-grid-PostgreSQL/grid_postgresql.client/src/main.tsx create mode 100644 connecting-to-database/syncfusion-react-grid-PostgreSQL/grid_postgresql.client/tsconfig.app.json create mode 100644 connecting-to-database/syncfusion-react-grid-PostgreSQL/grid_postgresql.client/tsconfig.json create mode 100644 connecting-to-database/syncfusion-react-grid-PostgreSQL/grid_postgresql.client/tsconfig.node.json create mode 100644 connecting-to-database/syncfusion-react-grid-PostgreSQL/grid_postgresql.client/vite.config.ts diff --git a/connecting-to-database/syncfusion-react-grid-PostgreSQL/Grid_PostgreSQL.Server/CHANGELOG.md b/connecting-to-database/syncfusion-react-grid-PostgreSQL/Grid_PostgreSQL.Server/CHANGELOG.md new file mode 100644 index 0000000..03c2619 --- /dev/null +++ b/connecting-to-database/syncfusion-react-grid-PostgreSQL/Grid_PostgreSQL.Server/CHANGELOG.md @@ -0,0 +1,8 @@ +This file explains how Visual Studio created the project. + +The following steps were used to generate this project: +- Create new ASP\.NET Core Web API project. +- Update project file to add a reference to the frontend project and set SPA properties. +- Update `launchSettings.json` to register the SPA proxy as a startup assembly. +- Add project to the startup projects list. +- Write this file. diff --git a/connecting-to-database/syncfusion-react-grid-PostgreSQL/Grid_PostgreSQL.Server/Controllers/PurchaseOrderController.cs b/connecting-to-database/syncfusion-react-grid-PostgreSQL/Grid_PostgreSQL.Server/Controllers/PurchaseOrderController.cs new file mode 100644 index 0000000..efdfd00 --- /dev/null +++ b/connecting-to-database/syncfusion-react-grid-PostgreSQL/Grid_PostgreSQL.Server/Controllers/PurchaseOrderController.cs @@ -0,0 +1,157 @@ +using Grid_PostgreSQL.Server.Data; +using Microsoft.AspNetCore.Mvc; +using Microsoft.EntityFrameworkCore; +using Syncfusion.EJ2.Base; +using System.Linq; + +namespace Grid_PostgreSQL.Server.Controllers +{ + [ApiController] + [Route("api/[controller]")] + public class PurchaseOrderController : ControllerBase + { + private readonly PurchaseOrderDbContext _dbContext; + + public PurchaseOrderController(PurchaseOrderDbContext dbContext) + { + _dbContext = dbContext; + } + + // READ + [HttpPost("url")] + public IActionResult UrlDataSource([FromBody] DataManagerRequest request) + { + IQueryable purchaseOrdersQuery = _dbContext.PurchaseOrders.AsNoTracking(); + var dataOperations = new DataOperations(); + + if (request.Search?.Count > 0) + purchaseOrdersQuery = dataOperations.PerformSearching(purchaseOrdersQuery, request.Search) + .Cast() + .AsQueryable(); + + if (request.Where?.Count > 0) + purchaseOrdersQuery = dataOperations.PerformFiltering(purchaseOrdersQuery, request.Where, request.Where[0].Operator) + .Cast() + .AsQueryable(); + + if (request.Sorted?.Count > 0) + purchaseOrdersQuery = dataOperations.PerformSorting(purchaseOrdersQuery, request.Sorted) + .Cast() + .AsQueryable(); + else + purchaseOrdersQuery = purchaseOrdersQuery.OrderBy(p => p.PurchaseOrderId); + + var totalCount = purchaseOrdersQuery.Count(); + + if (request.Skip > 0) + purchaseOrdersQuery = purchaseOrdersQuery.Skip(request.Skip); + + if (request.Take > 0) + purchaseOrdersQuery = purchaseOrdersQuery.Take(request.Take); + + return request.RequiresCounts + ? Ok(new { result = purchaseOrdersQuery.ToList(), count = totalCount }) + : Ok(purchaseOrdersQuery.ToList()); + } + + // CREATE + [HttpPost("insert")] + public IActionResult Insert([FromBody] CRUDModel crudRequest) + { + var purchaseOrder = crudRequest.Value; + + purchaseOrder.PurchaseOrderId = 0; + purchaseOrder.TotalAmount = purchaseOrder.Quantity * purchaseOrder.UnitPrice; + purchaseOrder.UpdatedOn = DateTime.UtcNow; + + _dbContext.PurchaseOrders.Add(purchaseOrder); + _dbContext.SaveChanges(); + + return Ok(purchaseOrder); + } + + // UPDATE + [HttpPost("update")] + public IActionResult Update([FromBody] CRUDModel crudRequest) + { + var purchaseOrder = crudRequest.Value; + + purchaseOrder.TotalAmount = purchaseOrder.Quantity * purchaseOrder.UnitPrice; + purchaseOrder.UpdatedOn = DateTime.UtcNow; + + _dbContext.Entry(purchaseOrder).State = EntityState.Modified; + _dbContext.SaveChanges(); + + return Ok(purchaseOrder); + } + + // DELETE + [HttpPost("remove")] + public IActionResult Remove([FromBody] CRUDModel crudRequest) + { + // Safely parse the key + var purchaseOrderId = int.Parse(crudRequest.Key.ToString()); + + var existingOrder = _dbContext.PurchaseOrders + .FirstOrDefault(p => p.PurchaseOrderId == purchaseOrderId); + + if (existingOrder != null) + { + _dbContext.PurchaseOrders.Remove(existingOrder); + _dbContext.SaveChanges(); + } + + return Ok(crudRequest); + } + + // BATCH + [HttpPost("batch")] + public IActionResult Batch([FromBody] CRUDModel crudRequest) + { + // Handle updated records + if (crudRequest.Changed != null) + { + foreach (var purchaseOrder in crudRequest.Changed) + { + purchaseOrder.TotalAmount = purchaseOrder.Quantity * purchaseOrder.UnitPrice; + purchaseOrder.UpdatedOn = DateTime.UtcNow; // safe with timestamp with time zone + _dbContext.PurchaseOrders.Attach(purchaseOrder); + _dbContext.Entry(purchaseOrder).State = EntityState.Modified; + } + } + + // Handle newly added records + if (crudRequest.Added != null) + { + foreach (var purchaseOrder in crudRequest.Added) + { + purchaseOrder.PurchaseOrderId = 0; + purchaseOrder.TotalAmount = purchaseOrder.Quantity * purchaseOrder.UnitPrice; + purchaseOrder.UpdatedOn = DateTime.UtcNow; + _dbContext.PurchaseOrders.Add(purchaseOrder); + } + } + + // Handle deleted records + if (crudRequest.Deleted != null) + { + foreach (var deletedItem in crudRequest.Deleted) + { + // Safely parse the key if it comes as JsonElement + var idString = deletedItem.PurchaseOrderId.ToString(); + if (int.TryParse(idString, out var purchaseOrderId)) + { + var existingOrder = _dbContext.PurchaseOrders.Find(purchaseOrderId); + if (existingOrder != null) + { + _dbContext.PurchaseOrders.Remove(existingOrder); + } + } + } + } + + _dbContext.SaveChanges(); + return Ok(crudRequest); + } + } +} diff --git a/connecting-to-database/syncfusion-react-grid-PostgreSQL/Grid_PostgreSQL.Server/Controllers/WeatherForecastController.cs b/connecting-to-database/syncfusion-react-grid-PostgreSQL/Grid_PostgreSQL.Server/Controllers/WeatherForecastController.cs new file mode 100644 index 0000000..1a157bb --- /dev/null +++ b/connecting-to-database/syncfusion-react-grid-PostgreSQL/Grid_PostgreSQL.Server/Controllers/WeatherForecastController.cs @@ -0,0 +1,26 @@ +using Microsoft.AspNetCore.Mvc; + +namespace Grid_PostgreSQL.Server.Controllers +{ + [ApiController] + [Route("[controller]")] + public class WeatherForecastController : ControllerBase + { + private static readonly string[] Summaries = + [ + "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching" + ]; + + [HttpGet(Name = "GetWeatherForecast")] + public IEnumerable Get() + { + return Enumerable.Range(1, 5).Select(index => new WeatherForecast + { + Date = DateOnly.FromDateTime(DateTime.Now.AddDays(index)), + TemperatureC = Random.Shared.Next(-20, 55), + Summary = Summaries[Random.Shared.Next(Summaries.Length)] + }) + .ToArray(); + } + } +} diff --git a/connecting-to-database/syncfusion-react-grid-PostgreSQL/Grid_PostgreSQL.Server/Data/PurchaseOrder.cs b/connecting-to-database/syncfusion-react-grid-PostgreSQL/Grid_PostgreSQL.Server/Data/PurchaseOrder.cs new file mode 100644 index 0000000..6cb6960 --- /dev/null +++ b/connecting-to-database/syncfusion-react-grid-PostgreSQL/Grid_PostgreSQL.Server/Data/PurchaseOrder.cs @@ -0,0 +1,96 @@ +using System.ComponentModel.DataAnnotations; + +namespace Grid_PostgreSQL.Server.Data +{ + /// + /// Represents a purchase order record mapped to the 'PurchaseOrder' table in the database. + /// This model defines the structure of purchase order-related data used throughout the application. + /// + public class PurchaseOrder + { + /// + /// Gets or sets the unique identifier for the purchase order record. + /// This is the primary key and auto-incremented by the database. + /// + [Key] + public int PurchaseOrderId { get; set; } + + /// + /// Gets or sets the public-facing purchase order number (e.g., PO-2025-0001). + /// This is a unique identifier visible to users and external systems. + /// + public string? PoNumber { get; set; } + + /// + /// Gets or sets the vendor identifier (e.g., VEN-9001). + /// Links the purchase order to a specific vendor. + /// + public string? VendorID { get; set; } + + /// + /// Gets or sets the name or description of the item being ordered. + /// + public string? ItemName { get; set; } + + /// + /// Gets or sets the category of the item (e.g., Electronics, Office Supplies, Hardware). + /// + public string? ItemCategory { get; set; } + + /// + /// Gets or sets the quantity of items being ordered. + /// Must be a positive integer. + /// + public int Quantity { get; set; } + + /// + /// Gets or sets the unit price of each item (e.g., 899.99). + /// Stored with precision of 12 digits and 2 decimal places. + /// + public decimal UnitPrice { get; set; } + + /// + /// Gets or sets the total amount for the order (Quantity × UnitPrice). + /// Auto-calculated and stored with precision of 14 digits and 2 decimal places. + /// + public decimal? TotalAmount { get; set; } + + /// + /// Gets or sets the current status of the purchase order. + /// Possible values: Pending, Approved, Ordered, Received, Canceled, Completed. + /// + public string? Status { get; set; } + + /// + /// Gets or sets the name of the person who created the purchase order. + /// + public string? OrderedBy { get; set; } + + /// + /// Gets or sets the name of the person who approved the purchase order. + /// + public string? ApprovedBy { get; set; } + + /// + /// Gets or sets the date when the purchase order was placed. + /// + public DateTime OrderDate { get; set; } + + /// + /// Gets or sets the expected delivery date for the ordered items. + /// + public DateTime? ExpectedDeliveryDate { get; set; } + + /// + /// Gets or sets the timestamp indicating when the purchase order record was created. + /// Auto-set to the current date and time by the database. + /// + public DateTimeOffset CreatedOn { get; set; } + + /// + /// Gets or sets the timestamp indicating when the purchase order record was last updated. + /// Auto-updated to the current date and time whenever a modification occurs. + /// + public DateTimeOffset UpdatedOn { get; set; } + } +} \ No newline at end of file diff --git a/connecting-to-database/syncfusion-react-grid-PostgreSQL/Grid_PostgreSQL.Server/Data/PurchaseOrderDbContext.cs b/connecting-to-database/syncfusion-react-grid-PostgreSQL/Grid_PostgreSQL.Server/Data/PurchaseOrderDbContext.cs new file mode 100644 index 0000000..1e6de61 --- /dev/null +++ b/connecting-to-database/syncfusion-react-grid-PostgreSQL/Grid_PostgreSQL.Server/Data/PurchaseOrderDbContext.cs @@ -0,0 +1,142 @@ +using Microsoft.EntityFrameworkCore; + +namespace Grid_PostgreSQL.Server.Data +{ + /// + /// DbContext for Purchase Order entity + /// Manages database connections and entity configurations for the Purchase Order Management System + /// This context bridges the application with PostgreSQL database + /// + public class PurchaseOrderDbContext : DbContext + { + public PurchaseOrderDbContext(DbContextOptions options) + : base(options) + { + } + + public DbSet PurchaseOrders => Set(); + + protected override void OnModelCreating(ModelBuilder modelBuilder) + { + base.OnModelCreating(modelBuilder); + + modelBuilder.Entity(entity => + { + // ✅ Use exact table name with correct casing + entity.ToTable("PurchaseOrder", schema: "public"); + + entity.HasKey(e => e.PurchaseOrderId) + .HasName("pk_purchaseorder_id"); + + entity.Property(e => e.PurchaseOrderId) + .ValueGeneratedOnAdd() + .HasColumnName("PurchaseOrderId") + .HasColumnType("integer"); + + entity.Property(e => e.PoNumber) + .HasColumnName("PoNumber") + .HasColumnType("character varying(30)") + .HasMaxLength(30) + .IsRequired(true); + + entity.HasIndex(e => e.PoNumber) + .IsUnique() + .HasDatabaseName("uq_purchaseorder_ponumber"); + + entity.Property(e => e.VendorID) + .HasColumnName("VendorID") + .HasColumnType("character varying(50)") + .HasMaxLength(50) + .IsRequired(true); + + entity.Property(e => e.ItemName) + .HasColumnName("ItemName") + .HasColumnType("character varying(200)") + .HasMaxLength(200) + .IsRequired(true); + + entity.Property(e => e.ItemCategory) + .HasColumnName("ItemCategory") + .HasColumnType("character varying(100)") + .HasMaxLength(100) + .IsRequired(false); + + entity.Property(e => e.Quantity) + .HasColumnName("Quantity") + .HasColumnType("integer") + .IsRequired(true); + + entity.Property(e => e.UnitPrice) + .HasColumnName("UnitPrice") + .HasColumnType("numeric(12,2)") + .HasPrecision(12, 2) + .IsRequired(true); + + entity.Property(e => e.TotalAmount) + .HasColumnName("TotalAmount") + .HasColumnType("numeric(14,2)") + .HasPrecision(14, 2) + .IsRequired(false); + + entity.Property(e => e.Status) + .HasColumnName("Status") + .HasColumnType("character varying(30)") + .HasMaxLength(30) + .IsRequired(true) + .HasDefaultValue("Pending"); + + entity.Property(e => e.OrderedBy) + .HasColumnName("OrderedBy") + .HasColumnType("character varying(100)") + .HasMaxLength(100) + .IsRequired(true); + + entity.Property(e => e.ApprovedBy) + .HasColumnName("ApprovedBy") + .HasColumnType("character varying(100)") + .HasMaxLength(100) + .IsRequired(false); + + entity.Property(e => e.OrderDate) + .HasColumnName("OrderDate") + .HasColumnType("date") + .IsRequired(true); + + entity.Property(e => e.ExpectedDeliveryDate) + .HasColumnName("ExpectedDeliveryDate") + .HasColumnType("date") + .IsRequired(false); + + entity.Property(e => e.CreatedOn) + .HasColumnName("CreatedOn") + .HasColumnType("timestamp with time zone") + .IsRequired(true) + .HasDefaultValueSql("NOW()"); + + entity.Property(e => e.UpdatedOn) + .HasColumnName("UpdatedOn") + .HasColumnType("timestamp with time zone") + .IsRequired(true) + .HasDefaultValueSql("NOW()"); + + entity.HasIndex(e => e.Status) + .HasDatabaseName("ix_purchaseorder_status"); + + entity.HasIndex(e => e.VendorID) + .HasDatabaseName("ix_purchaseorder_vendorid"); + + entity.HasIndex(e => e.OrderDate) + .HasDatabaseName("ix_purchaseorder_orderdate"); + + entity.HasIndex(e => e.OrderedBy) + .HasDatabaseName("ix_purchaseorder_orderedby"); + + entity.HasIndex(e => e.CreatedOn) + .HasDatabaseName("ix_purchaseorder_createdOn"); + + entity.HasIndex(e => new { e.Status, e.OrderDate }) + .HasDatabaseName("ix_purchaseorder_status_orderdate"); + }); + } + } +} diff --git a/connecting-to-database/syncfusion-react-grid-PostgreSQL/Grid_PostgreSQL.Server/Grid_PostgreSQL.Server.csproj b/connecting-to-database/syncfusion-react-grid-PostgreSQL/Grid_PostgreSQL.Server/Grid_PostgreSQL.Server.csproj new file mode 100644 index 0000000..b0c362e --- /dev/null +++ b/connecting-to-database/syncfusion-react-grid-PostgreSQL/Grid_PostgreSQL.Server/Grid_PostgreSQL.Server.csproj @@ -0,0 +1,28 @@ + + + + net10.0 + enable + enable + ..\grid_postgresql.client + npm run dev + https://localhost:58587 + + + + + + 10.*-* + + + + + + + + + false + + + + diff --git a/connecting-to-database/syncfusion-react-grid-PostgreSQL/Grid_PostgreSQL.Server/Grid_PostgreSQL.Server.csproj.user b/connecting-to-database/syncfusion-react-grid-PostgreSQL/Grid_PostgreSQL.Server/Grid_PostgreSQL.Server.csproj.user new file mode 100644 index 0000000..031db34 --- /dev/null +++ b/connecting-to-database/syncfusion-react-grid-PostgreSQL/Grid_PostgreSQL.Server/Grid_PostgreSQL.Server.csproj.user @@ -0,0 +1,8 @@ + + + + https + MvcControllerEmptyScaffolder + root/Common/MVC/Controller + + \ No newline at end of file diff --git a/connecting-to-database/syncfusion-react-grid-PostgreSQL/Grid_PostgreSQL.Server/Grid_PostgreSQL.Server.http b/connecting-to-database/syncfusion-react-grid-PostgreSQL/Grid_PostgreSQL.Server/Grid_PostgreSQL.Server.http new file mode 100644 index 0000000..0595e06 --- /dev/null +++ b/connecting-to-database/syncfusion-react-grid-PostgreSQL/Grid_PostgreSQL.Server/Grid_PostgreSQL.Server.http @@ -0,0 +1,6 @@ +@Grid_PostgreSQL.Server_HostAddress = http://localhost:5093 + +GET {{Grid_PostgreSQL.Server_HostAddress}}/weatherforecast/ +Accept: application/json + +### diff --git a/connecting-to-database/syncfusion-react-grid-PostgreSQL/Grid_PostgreSQL.Server/Program.cs b/connecting-to-database/syncfusion-react-grid-PostgreSQL/Grid_PostgreSQL.Server/Program.cs new file mode 100644 index 0000000..d670af1 --- /dev/null +++ b/connecting-to-database/syncfusion-react-grid-PostgreSQL/Grid_PostgreSQL.Server/Program.cs @@ -0,0 +1,73 @@ + +using Grid_PostgreSQL.Server.Data; +using Microsoft.EntityFrameworkCore; +var builder = WebApplication.CreateBuilder(args); + +// Add services to the container. + +// CORS: allow all (simple for local dev / separate frontend) +builder.Services.AddCors(options => +{ + options.AddDefaultPolicy(policy => policy.AllowAnyOrigin().AllowAnyHeader().AllowAnyMethod()); +}); + +// Controllers with System.Text.Json configured to KEEP PascalCase +builder.Services.AddControllers() + .AddJsonOptions(o => + { + // Keep property names as declared in C# (PascalCase) + o.JsonSerializerOptions.PropertyNamingPolicy = null; + // Keep dictionary keys as-is too + o.JsonSerializerOptions.DictionaryKeyPolicy = null; + // Allow case-insensitive reads (accept camelCase or PascalCase on input) + o.JsonSerializerOptions.PropertyNameCaseInsensitive = true; + }); +// Learn more about configuring OpenAPI at https://aka.ms/aspnet/openapi +builder.Services.AddOpenApi(); + +// ========== ENTITY FRAMEWORK CORE CONFIGURATION ========== +// Get connection string from appsettings.json +var connectionString = builder.Configuration.GetConnectionString("DefaultConnection"); + +if (string.IsNullOrEmpty(connectionString)) +{ + throw new InvalidOperationException("Connection string 'DefaultConnection' not found in configuration."); +} + +// Register DbContext with PostgreSQL provider (Npgsql) +builder.Services.AddDbContext(options => +{ + options.UseNpgsql(connectionString); + + // Enable detailed error messages in development + if (builder.Environment.IsDevelopment()) + { + options.EnableSensitiveDataLogging(); + options.EnableDetailedErrors(); + } +}); + +//// Register Repository for dependency injection +//builder.Services.AddScoped(); +// ======================================================= + +var app = builder.Build(); +app.UseCors(); +app.UseDefaultFiles(); +app.MapStaticAssets(); + +// Configure the HTTP request pipeline. +if (app.Environment.IsDevelopment()) +{ + app.MapOpenApi(); +} + +app.UseHttpsRedirection(); + +app.UseAuthorization(); + +app.MapControllers(); + +app.MapFallbackToFile("/index.html"); + +app.Run(); diff --git a/connecting-to-database/syncfusion-react-grid-PostgreSQL/Grid_PostgreSQL.Server/Properties/launchSettings.json b/connecting-to-database/syncfusion-react-grid-PostgreSQL/Grid_PostgreSQL.Server/Properties/launchSettings.json new file mode 100644 index 0000000..6d62145 --- /dev/null +++ b/connecting-to-database/syncfusion-react-grid-PostgreSQL/Grid_PostgreSQL.Server/Properties/launchSettings.json @@ -0,0 +1,26 @@ +{ + "$schema": "https://json.schemastore.org/launchsettings.json", + "profiles": { + "http": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": false, + "applicationUrl": "http://localhost:5093", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development", + "ASPNETCORE_HOSTINGSTARTUPASSEMBLIES": "Microsoft.AspNetCore.SpaProxy" + } + }, + "https": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": false, + "applicationUrl": "https://localhost:7016;http://localhost:5093", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development", + "ASPNETCORE_HOSTINGSTARTUPASSEMBLIES": "Microsoft.AspNetCore.SpaProxy" + } + } + } +} + diff --git a/connecting-to-database/syncfusion-react-grid-PostgreSQL/Grid_PostgreSQL.Server/WeatherForecast.cs b/connecting-to-database/syncfusion-react-grid-PostgreSQL/Grid_PostgreSQL.Server/WeatherForecast.cs new file mode 100644 index 0000000..d95b9ac --- /dev/null +++ b/connecting-to-database/syncfusion-react-grid-PostgreSQL/Grid_PostgreSQL.Server/WeatherForecast.cs @@ -0,0 +1,13 @@ +namespace Grid_PostgreSQL.Server +{ + public class WeatherForecast + { + public DateOnly Date { get; set; } + + public int TemperatureC { get; set; } + + public int TemperatureF => 32 + (int)(TemperatureC / 0.5556); + + public string? Summary { get; set; } + } +} diff --git a/connecting-to-database/syncfusion-react-grid-PostgreSQL/Grid_PostgreSQL.Server/appsettings.Development.json b/connecting-to-database/syncfusion-react-grid-PostgreSQL/Grid_PostgreSQL.Server/appsettings.Development.json new file mode 100644 index 0000000..0c208ae --- /dev/null +++ b/connecting-to-database/syncfusion-react-grid-PostgreSQL/Grid_PostgreSQL.Server/appsettings.Development.json @@ -0,0 +1,8 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + } +} diff --git a/connecting-to-database/syncfusion-react-grid-PostgreSQL/Grid_PostgreSQL.Server/appsettings.json b/connecting-to-database/syncfusion-react-grid-PostgreSQL/Grid_PostgreSQL.Server/appsettings.json new file mode 100644 index 0000000..bf0ef7c --- /dev/null +++ b/connecting-to-database/syncfusion-react-grid-PostgreSQL/Grid_PostgreSQL.Server/appsettings.json @@ -0,0 +1,12 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "AllowedHosts": "*", + "ConnectionStrings": { + "DefaultConnection": "Server=localhost;Port=5432;Database=PurchaseOrderDB;User Id=postgres;Password=Syncfusion@123" + } +} diff --git a/connecting-to-database/syncfusion-react-grid-PostgreSQL/Grid_PostgreSQL.slnx b/connecting-to-database/syncfusion-react-grid-PostgreSQL/Grid_PostgreSQL.slnx new file mode 100644 index 0000000..8c4892f --- /dev/null +++ b/connecting-to-database/syncfusion-react-grid-PostgreSQL/Grid_PostgreSQL.slnx @@ -0,0 +1,7 @@ + + + + + + + diff --git a/connecting-to-database/syncfusion-react-grid-PostgreSQL/grid_postgresql.client/.gitignore b/connecting-to-database/syncfusion-react-grid-PostgreSQL/grid_postgresql.client/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/connecting-to-database/syncfusion-react-grid-PostgreSQL/grid_postgresql.client/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/connecting-to-database/syncfusion-react-grid-PostgreSQL/grid_postgresql.client/CHANGELOG.md b/connecting-to-database/syncfusion-react-grid-PostgreSQL/grid_postgresql.client/CHANGELOG.md new file mode 100644 index 0000000..1e5bc92 --- /dev/null +++ b/connecting-to-database/syncfusion-react-grid-PostgreSQL/grid_postgresql.client/CHANGELOG.md @@ -0,0 +1,16 @@ +This file explains how Visual Studio created the project. + +The following tools were used to generate this project: +- create-vite + +The following steps were used to generate this project: +- Create react project with create-vite: `npm init --yes vite@latest grid_postgresql.client -- --template=react-ts --no-rolldown --no-immediate`. +- Update `vite.config.ts` to set up proxying and certs. +- Add `@type/node` for `vite.config.js` typing. +- Update `App` component to fetch and display weather information. +- Create project file (`grid_postgresql.client.esproj`). +- Create `launch.json` to enable debugging. +- Add project to solution. +- Update proxy endpoint to be the backend server endpoint. +- Add project to the startup projects list. +- Write this file. diff --git a/connecting-to-database/syncfusion-react-grid-PostgreSQL/grid_postgresql.client/README.md b/connecting-to-database/syncfusion-react-grid-PostgreSQL/grid_postgresql.client/README.md new file mode 100644 index 0000000..d2e7761 --- /dev/null +++ b/connecting-to-database/syncfusion-react-grid-PostgreSQL/grid_postgresql.client/README.md @@ -0,0 +1,73 @@ +# React + TypeScript + Vite + +This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. + +Currently, two official plugins are available: + +- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react) uses [Babel](https://babeljs.io/) (or [oxc](https://oxc.rs) when used in [rolldown-vite](https://vite.dev/guide/rolldown)) for Fast Refresh +- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh + +## React Compiler + +The React Compiler is not enabled on this template because of its impact on dev & build performances. To add it, see [this documentation](https://react.dev/learn/react-compiler/installation). + +## Expanding the ESLint configuration + +If you are developing a production application, we recommend updating the configuration to enable type-aware lint rules: + +```js +export default defineConfig([ + globalIgnores(['dist']), + { + files: ['**/*.{ts,tsx}'], + extends: [ + // Other configs... + + // Remove tseslint.configs.recommended and replace with this + tseslint.configs.recommendedTypeChecked, + // Alternatively, use this for stricter rules + tseslint.configs.strictTypeChecked, + // Optionally, add this for stylistic rules + tseslint.configs.stylisticTypeChecked, + + // Other configs... + ], + languageOptions: { + parserOptions: { + project: ['./tsconfig.node.json', './tsconfig.app.json'], + tsconfigRootDir: import.meta.dirname, + }, + // other options... + }, + }, +]) +``` + +You can also install [eslint-plugin-react-x](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-x) and [eslint-plugin-react-dom](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-dom) for React-specific lint rules: + +```js +// eslint.config.js +import reactX from 'eslint-plugin-react-x' +import reactDom from 'eslint-plugin-react-dom' + +export default defineConfig([ + globalIgnores(['dist']), + { + files: ['**/*.{ts,tsx}'], + extends: [ + // Other configs... + // Enable lint rules for React + reactX.configs['recommended-typescript'], + // Enable lint rules for React DOM + reactDom.configs.recommended, + ], + languageOptions: { + parserOptions: { + project: ['./tsconfig.node.json', './tsconfig.app.json'], + tsconfigRootDir: import.meta.dirname, + }, + // other options... + }, + }, +]) +``` diff --git a/connecting-to-database/syncfusion-react-grid-PostgreSQL/grid_postgresql.client/eslint.config.js b/connecting-to-database/syncfusion-react-grid-PostgreSQL/grid_postgresql.client/eslint.config.js new file mode 100644 index 0000000..5e6b472 --- /dev/null +++ b/connecting-to-database/syncfusion-react-grid-PostgreSQL/grid_postgresql.client/eslint.config.js @@ -0,0 +1,23 @@ +import js from '@eslint/js' +import globals from 'globals' +import reactHooks from 'eslint-plugin-react-hooks' +import reactRefresh from 'eslint-plugin-react-refresh' +import tseslint from 'typescript-eslint' +import { defineConfig, globalIgnores } from 'eslint/config' + +export default defineConfig([ + globalIgnores(['dist']), + { + files: ['**/*.{ts,tsx}'], + extends: [ + js.configs.recommended, + tseslint.configs.recommended, + reactHooks.configs.flat.recommended, + reactRefresh.configs.vite, + ], + languageOptions: { + ecmaVersion: 2020, + globals: globals.browser, + }, + }, +]) diff --git a/connecting-to-database/syncfusion-react-grid-PostgreSQL/grid_postgresql.client/grid_postgresql.client.esproj b/connecting-to-database/syncfusion-react-grid-PostgreSQL/grid_postgresql.client/grid_postgresql.client.esproj new file mode 100644 index 0000000..930514f --- /dev/null +++ b/connecting-to-database/syncfusion-react-grid-PostgreSQL/grid_postgresql.client/grid_postgresql.client.esproj @@ -0,0 +1,11 @@ + + + npm run dev + src\ + Vitest + + false + + $(MSBuildProjectDirectory)\dist + + \ No newline at end of file diff --git a/connecting-to-database/syncfusion-react-grid-PostgreSQL/grid_postgresql.client/index.html b/connecting-to-database/syncfusion-react-grid-PostgreSQL/grid_postgresql.client/index.html new file mode 100644 index 0000000..ca7deba --- /dev/null +++ b/connecting-to-database/syncfusion-react-grid-PostgreSQL/grid_postgresql.client/index.html @@ -0,0 +1,13 @@ + + + + + + + grid_postgresql.client + + +
+ + + diff --git a/connecting-to-database/syncfusion-react-grid-PostgreSQL/grid_postgresql.client/package-lock.json b/connecting-to-database/syncfusion-react-grid-PostgreSQL/grid_postgresql.client/package-lock.json new file mode 100644 index 0000000..8a11d26 --- /dev/null +++ b/connecting-to-database/syncfusion-react-grid-PostgreSQL/grid_postgresql.client/package-lock.json @@ -0,0 +1,3498 @@ +{ + "name": "grid_postgresql.client", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "grid_postgresql.client", + "version": "0.0.0", + "dependencies": { + "@syncfusion/ej2-data": "*", + "@syncfusion/ej2-react-grids": "*", + "react": "^19.2.0", + "react-dom": "^19.2.0" + }, + "devDependencies": { + "@eslint/js": "^9.39.1", + "@types/node": "^24.10.1", + "@types/react": "^19.2.7", + "@types/react-dom": "^19.2.3", + "@vitejs/plugin-react": "^5.1.1", + "eslint": "^9.39.1", + "eslint-plugin-react-hooks": "^7.0.1", + "eslint-plugin-react-refresh": "^0.4.24", + "globals": "^16.5.0", + "typescript": "~5.9.3", + "typescript-eslint": "^8.48.0", + "vite": "^7.3.1" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz", + "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", + "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helpers": "^7.28.6", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.29.0", + "@babel/types": "^7.29.0", + "@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.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", + "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", + "@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-compilation-targets": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", + "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.6.tgz", + "integrity": "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.0.tgz", + "integrity": "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", + "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", + "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz", + "integrity": "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.3.tgz", + "integrity": "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.3.tgz", + "integrity": "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.3.tgz", + "integrity": "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.3.tgz", + "integrity": "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.3.tgz", + "integrity": "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.3.tgz", + "integrity": "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.3.tgz", + "integrity": "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.3.tgz", + "integrity": "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.3.tgz", + "integrity": "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.3.tgz", + "integrity": "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.3.tgz", + "integrity": "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.3.tgz", + "integrity": "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.3.tgz", + "integrity": "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.3.tgz", + "integrity": "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.3.tgz", + "integrity": "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.3.tgz", + "integrity": "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.3.tgz", + "integrity": "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.3.tgz", + "integrity": "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.3.tgz", + "integrity": "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.3.tgz", + "integrity": "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.3.tgz", + "integrity": "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.3.tgz", + "integrity": "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.3.tgz", + "integrity": "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.3.tgz", + "integrity": "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.3.tgz", + "integrity": "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "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.21.1", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", + "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.7", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", + "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", + "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.4.tgz", + "integrity": "sha512-4h4MVF8pmBsncB60r0wSJiIeUKTSD4m7FmTFThG8RHlsg9ajqckLm9OraguFGZE4vVdpiI1Q4+hFnisopmG6gQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.14.0", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.1", + "minimatch": "^3.1.3", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "9.39.3", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.3.tgz", + "integrity": "sha512-1B1VkCq6FuUNlQvlBYb+1jDu/gV297TIs/OeiaSR9l1H27SVW55ONE1e1Vp16NqP683+xEGzxYtv4XCiDPaQiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", + "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", + "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.7", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", + "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.4.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/@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==", + "dev": true, + "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/@rolldown/pluginutils": { + "version": "1.0.0-rc.3", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.3.tgz", + "integrity": "sha512-eybk3TjzzzV97Dlj5c+XrBFW57eTNhzod66y9HrBlzJ6NsCrWCp/2kaPS3K9wJmurBC0Tdw4yPjXKZqlznim3Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.59.0.tgz", + "integrity": "sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.59.0.tgz", + "integrity": "sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.59.0.tgz", + "integrity": "sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.59.0.tgz", + "integrity": "sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.59.0.tgz", + "integrity": "sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.59.0.tgz", + "integrity": "sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.59.0.tgz", + "integrity": "sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.59.0.tgz", + "integrity": "sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.59.0.tgz", + "integrity": "sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.59.0.tgz", + "integrity": "sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.59.0.tgz", + "integrity": "sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.59.0.tgz", + "integrity": "sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.59.0.tgz", + "integrity": "sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.59.0.tgz", + "integrity": "sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.59.0.tgz", + "integrity": "sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.59.0.tgz", + "integrity": "sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.59.0.tgz", + "integrity": "sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.59.0.tgz", + "integrity": "sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.59.0.tgz", + "integrity": "sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.59.0.tgz", + "integrity": "sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.59.0.tgz", + "integrity": "sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.59.0.tgz", + "integrity": "sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.59.0.tgz", + "integrity": "sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.59.0.tgz", + "integrity": "sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.59.0.tgz", + "integrity": "sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@syncfusion/ej2-base": { + "version": "32.2.6", + "resolved": "https://registry.npmjs.org/@syncfusion/ej2-base/-/ej2-base-32.2.6.tgz", + "integrity": "sha512-H7L8WT0+o5oSo+CTGjSWj5H+UFkQSEgkC5YpLMZJ+/LkdVTrTnw+iuwdWwd8miNEualm12QmZf8RnXccHPfg9w==", + "license": "SEE LICENSE IN license", + "dependencies": { + "@syncfusion/ej2-icons": "~32.2.3" + }, + "bin": { + "syncfusion-license": "bin/syncfusion-license.js" + } + }, + "node_modules/@syncfusion/ej2-buttons": { + "version": "32.2.7", + "resolved": "https://registry.npmjs.org/@syncfusion/ej2-buttons/-/ej2-buttons-32.2.7.tgz", + "integrity": "sha512-mDE4pfF9dBrBwwuTztRjaTDWtqnSLKYX7Uu2sjwM0qpJsn7kDh6ld6qhA32JKOJEu2esCvS7zcD2ElOgry21uA==", + "license": "SEE LICENSE IN license", + "dependencies": { + "@syncfusion/ej2-base": "~32.2.6" + } + }, + "node_modules/@syncfusion/ej2-calendars": { + "version": "32.2.8", + "resolved": "https://registry.npmjs.org/@syncfusion/ej2-calendars/-/ej2-calendars-32.2.8.tgz", + "integrity": "sha512-+VMHXiffCDGv8HWg3HQpkli2xp1RprBoU2mAqUiOqn6QTlj+xNd5juo7cG3Sb8WWhIvIC765+S2tqdnRVSMzkw==", + "license": "SEE LICENSE IN license", + "dependencies": { + "@syncfusion/ej2-base": "~32.2.6", + "@syncfusion/ej2-buttons": "~32.2.7", + "@syncfusion/ej2-inputs": "~32.2.8", + "@syncfusion/ej2-lists": "~32.2.7", + "@syncfusion/ej2-popups": "~32.2.8" + } + }, + "node_modules/@syncfusion/ej2-compression": { + "version": "32.2.3", + "resolved": "https://registry.npmjs.org/@syncfusion/ej2-compression/-/ej2-compression-32.2.3.tgz", + "integrity": "sha512-VYSaHfinIoGgiG5EUuWrhh5n/Nw+n19cy1J/dcqVyIXxTSOrS2SOAiMUmyzNg3ZBcPNREJ2xd+xGfHo8i8BpsQ==", + "license": "SEE LICENSE IN license", + "dependencies": { + "@syncfusion/ej2-file-utils": "~32.2.3" + } + }, + "node_modules/@syncfusion/ej2-data": { + "version": "32.2.3", + "resolved": "https://registry.npmjs.org/@syncfusion/ej2-data/-/ej2-data-32.2.3.tgz", + "integrity": "sha512-5m/8v7MLl2m63QNj++oVh/It82pGdB1mL3M8rxTnKni3w5L4tWb78s5LNKEzvz4x8/lcaC3Kg5vnS8ZJqNOI2g==", + "license": "SEE LICENSE IN license", + "dependencies": { + "@syncfusion/ej2-base": "~32.2.3" + } + }, + "node_modules/@syncfusion/ej2-dropdowns": { + "version": "32.2.8", + "resolved": "https://registry.npmjs.org/@syncfusion/ej2-dropdowns/-/ej2-dropdowns-32.2.8.tgz", + "integrity": "sha512-QFkIQwVfPMa/tNm0Uj3UzzRLWp1RYawDIRUEu069fHtTXjvt/2rC3SYh03RPbSOvc/JoXBtUxlSX/O4HOGro1A==", + "license": "SEE LICENSE IN license", + "dependencies": { + "@syncfusion/ej2-base": "~32.2.6", + "@syncfusion/ej2-data": "~32.2.3", + "@syncfusion/ej2-inputs": "~32.2.8", + "@syncfusion/ej2-lists": "~32.2.7", + "@syncfusion/ej2-navigations": "~32.2.8", + "@syncfusion/ej2-notifications": "~32.2.3", + "@syncfusion/ej2-popups": "~32.2.8" + } + }, + "node_modules/@syncfusion/ej2-excel-export": { + "version": "32.2.3", + "resolved": "https://registry.npmjs.org/@syncfusion/ej2-excel-export/-/ej2-excel-export-32.2.3.tgz", + "integrity": "sha512-UwqXX1vxr1pSaCgwr93TEuujJt65nUUOolo7uAux9xfay1eT6X1Do77yxlqdpFXHbnmXoVmPsYDw4tFGpnFAWA==", + "license": "SEE LICENSE IN license", + "dependencies": { + "@syncfusion/ej2-base": "~32.2.3", + "@syncfusion/ej2-compression": "~32.2.3" + } + }, + "node_modules/@syncfusion/ej2-file-utils": { + "version": "32.2.3", + "resolved": "https://registry.npmjs.org/@syncfusion/ej2-file-utils/-/ej2-file-utils-32.2.3.tgz", + "integrity": "sha512-hxySQtoRAZXxqEYEYc6DeOJyxFxvV3em4o9ss3/o3YZLx6ymDwOS7oyaSCRkVHJF5tHsISB1ULrDSj2dTwhOEw==", + "license": "SEE LICENSE IN license" + }, + "node_modules/@syncfusion/ej2-grids": { + "version": "32.2.8", + "resolved": "https://registry.npmjs.org/@syncfusion/ej2-grids/-/ej2-grids-32.2.8.tgz", + "integrity": "sha512-005cRtiD1FsyRAQzkkBfZXENmYCaxIW5EMhfHy8/0ZVSRBdtwHAAyn5rjL+CCA7p9BqKnWCVUjDADeMk+P0A/w==", + "license": "SEE LICENSE IN license", + "dependencies": { + "@syncfusion/ej2-base": "~32.2.6", + "@syncfusion/ej2-buttons": "~32.2.7", + "@syncfusion/ej2-calendars": "~32.2.8", + "@syncfusion/ej2-compression": "~32.2.3", + "@syncfusion/ej2-data": "~32.2.3", + "@syncfusion/ej2-dropdowns": "~32.2.8", + "@syncfusion/ej2-excel-export": "~32.2.3", + "@syncfusion/ej2-file-utils": "~32.2.3", + "@syncfusion/ej2-inputs": "~32.2.8", + "@syncfusion/ej2-lists": "~32.2.7", + "@syncfusion/ej2-navigations": "~32.2.8", + "@syncfusion/ej2-notifications": "~32.2.3", + "@syncfusion/ej2-pdf-export": "~32.2.3", + "@syncfusion/ej2-popups": "~32.2.8", + "@syncfusion/ej2-splitbuttons": "~32.2.7" + } + }, + "node_modules/@syncfusion/ej2-icons": { + "version": "32.2.3", + "resolved": "https://registry.npmjs.org/@syncfusion/ej2-icons/-/ej2-icons-32.2.3.tgz", + "integrity": "sha512-bZn+4SWasVNRLB0C1Gt6Z4NAM1MDYIqU/uRlhAPJK9itPAvxo3buQAcrokm+3te6k39vxwFuNlMn0dFoI1zWuw==", + "license": "SEE LICENSE IN license" + }, + "node_modules/@syncfusion/ej2-inputs": { + "version": "32.2.8", + "resolved": "https://registry.npmjs.org/@syncfusion/ej2-inputs/-/ej2-inputs-32.2.8.tgz", + "integrity": "sha512-r+gFEAjrd4k+J9p8I9a0xfUCYNjH+S6zdspT0+5cIsJA3imLl8RvuNOVQpQA58mTXVEjdwe+0Qa17jA2Y9cYNw==", + "license": "SEE LICENSE IN license", + "dependencies": { + "@syncfusion/ej2-base": "~32.2.6", + "@syncfusion/ej2-buttons": "~32.2.7", + "@syncfusion/ej2-popups": "~32.2.8", + "@syncfusion/ej2-splitbuttons": "~32.2.7" + } + }, + "node_modules/@syncfusion/ej2-lists": { + "version": "32.2.7", + "resolved": "https://registry.npmjs.org/@syncfusion/ej2-lists/-/ej2-lists-32.2.7.tgz", + "integrity": "sha512-S5izl23SMMEbet8wU7NvplzjHxiMgdpGeY6NYaJjw2nNvC/D0Lm07Kh7yF9AZwpg7LOS7ckmBPO1GmSG1ApP1g==", + "license": "SEE LICENSE IN license", + "dependencies": { + "@syncfusion/ej2-base": "~32.2.6", + "@syncfusion/ej2-buttons": "~32.2.7", + "@syncfusion/ej2-data": "~32.2.3", + "@syncfusion/ej2-popups": "~32.2.7" + } + }, + "node_modules/@syncfusion/ej2-navigations": { + "version": "32.2.8", + "resolved": "https://registry.npmjs.org/@syncfusion/ej2-navigations/-/ej2-navigations-32.2.8.tgz", + "integrity": "sha512-l842BgZxDpouCVoNm60hH0u+foTirPyV4KLbLP8FFo1mK7GqZe5kmIoKOSTFiBc3eJ/QWv6WYjgIH1cCc8nfsA==", + "license": "SEE LICENSE IN license", + "dependencies": { + "@syncfusion/ej2-base": "~32.2.6", + "@syncfusion/ej2-buttons": "~32.2.7", + "@syncfusion/ej2-data": "~32.2.3", + "@syncfusion/ej2-inputs": "~32.2.8", + "@syncfusion/ej2-lists": "~32.2.7", + "@syncfusion/ej2-popups": "~32.2.8" + } + }, + "node_modules/@syncfusion/ej2-notifications": { + "version": "32.2.3", + "resolved": "https://registry.npmjs.org/@syncfusion/ej2-notifications/-/ej2-notifications-32.2.3.tgz", + "integrity": "sha512-+9RT5ml9JGCcnZ5grbyC6skwL9lIahedDUnS7kcHIiqHNoyJ+SJnp8qzilI4K7AjvdLvnme7LEd5wN4eZVh8UA==", + "license": "SEE LICENSE IN license", + "dependencies": { + "@syncfusion/ej2-base": "~32.2.3", + "@syncfusion/ej2-buttons": "~32.2.3", + "@syncfusion/ej2-popups": "~32.2.3" + } + }, + "node_modules/@syncfusion/ej2-pdf-export": { + "version": "32.2.3", + "resolved": "https://registry.npmjs.org/@syncfusion/ej2-pdf-export/-/ej2-pdf-export-32.2.3.tgz", + "integrity": "sha512-ognKqb7jSUGn9O6+tL9D9ONs7I4ThJYFyqzuU0pYR3ESX7siKuSf7YjV+YdLOxJ7aE9r2TLZYEUARLxUeh6ALg==", + "license": "SEE LICENSE IN license", + "dependencies": { + "@syncfusion/ej2-compression": "~32.2.3" + } + }, + "node_modules/@syncfusion/ej2-popups": { + "version": "32.2.8", + "resolved": "https://registry.npmjs.org/@syncfusion/ej2-popups/-/ej2-popups-32.2.8.tgz", + "integrity": "sha512-yIbsv+X2Vgb3tpJ1K+HyS10tmH6ifpmNGfrYFTqxmMwVuB/77apMMa6yJrkAoCtWPuE2sP0AuAIhxW4b5mxNkw==", + "license": "SEE LICENSE IN license", + "dependencies": { + "@syncfusion/ej2-base": "~32.2.6", + "@syncfusion/ej2-buttons": "~32.2.7" + } + }, + "node_modules/@syncfusion/ej2-react-base": { + "version": "32.2.3", + "resolved": "https://registry.npmjs.org/@syncfusion/ej2-react-base/-/ej2-react-base-32.2.3.tgz", + "integrity": "sha512-xAh78u1v4QSce/KlDIcZiZmjiGwmEFIjWqFRAqI69YJ8vdfmrrITj9ybZiWYtcDXvsxgWAhOvX6uPE3neI3vqg==", + "license": "SEE LICENSE IN license", + "dependencies": { + "@syncfusion/ej2-base": "~32.2.3" + } + }, + "node_modules/@syncfusion/ej2-react-grids": { + "version": "32.2.8", + "resolved": "https://registry.npmjs.org/@syncfusion/ej2-react-grids/-/ej2-react-grids-32.2.8.tgz", + "integrity": "sha512-eCmaZmH+tcRqQspiFS51yBpUgeBEPErJtxBt1dj5Vk+CxqYCqlAbJ+0FrhkBU+S5LIPDcBggTJxWpvbVrtOZ7Q==", + "license": "SEE LICENSE IN license", + "dependencies": { + "@syncfusion/ej2-base": "~32.2.6", + "@syncfusion/ej2-grids": "32.2.8", + "@syncfusion/ej2-react-base": "~32.2.3" + } + }, + "node_modules/@syncfusion/ej2-splitbuttons": { + "version": "32.2.7", + "resolved": "https://registry.npmjs.org/@syncfusion/ej2-splitbuttons/-/ej2-splitbuttons-32.2.7.tgz", + "integrity": "sha512-jOrDYB2rJlJx2OjQCMc+ECU13kiHNAx1ypffufKacMDVBo89sKHkFfW3qOjo9IK/XessQqS9/ogBNaa+EXSsGQ==", + "license": "SEE LICENSE IN license", + "dependencies": { + "@syncfusion/ej2-base": "~32.2.6", + "@syncfusion/ej2-popups": "~32.2.7" + } + }, + "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/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "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": "24.12.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.12.0.tgz", + "integrity": "sha512-GYDxsZi3ChgmckRT9HPU0WEhKLP08ev/Yfcq2AstjrDASOYCSXeyjDsHg4v5t4jOj7cyDX3vmprafKlWIG9MXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@types/react": { + "version": "19.2.14", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz", + "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==", + "dev": true, + "license": "MIT", + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.2.3", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", + "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.2.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.56.1.tgz", + "integrity": "sha512-Jz9ZztpB37dNC+HU2HI28Bs9QXpzCz+y/twHOwhyrIRdbuVDxSytJNDl6z/aAKlaRIwC7y8wJdkBv7FxYGgi0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.56.1", + "@typescript-eslint/type-utils": "8.56.1", + "@typescript-eslint/utils": "8.56.1", + "@typescript-eslint/visitor-keys": "8.56.1", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.56.1", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.56.1.tgz", + "integrity": "sha512-klQbnPAAiGYFyI02+znpBRLyjL4/BrBd0nyWkdC0s/6xFLkXYQ8OoRrSkqacS1ddVxf/LDyODIKbQ5TgKAf/Fg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.56.1", + "@typescript-eslint/types": "8.56.1", + "@typescript-eslint/typescript-estree": "8.56.1", + "@typescript-eslint/visitor-keys": "8.56.1", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.56.1.tgz", + "integrity": "sha512-TAdqQTzHNNvlVFfR+hu2PDJrURiwKsUvxFn1M0h95BB8ah5jejas08jUWG4dBA68jDMI988IvtfdAI53JzEHOQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.56.1", + "@typescript-eslint/types": "^8.56.1", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.56.1.tgz", + "integrity": "sha512-YAi4VDKcIZp0O4tz/haYKhmIDZFEUPOreKbfdAN3SzUDMcPhJ8QI99xQXqX+HoUVq8cs85eRKnD+rne2UAnj2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.56.1", + "@typescript-eslint/visitor-keys": "8.56.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.56.1.tgz", + "integrity": "sha512-qOtCYzKEeyr3aR9f28mPJqBty7+DBqsdd63eO0yyDwc6vgThj2UjWfJIcsFeSucYydqcuudMOprZ+x1SpF3ZuQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.56.1.tgz", + "integrity": "sha512-yB/7dxi7MgTtGhZdaHCemf7PuwrHMenHjmzgUW1aJpO+bBU43OycnM3Wn+DdvDO/8zzA9HlhaJ0AUGuvri4oGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.56.1", + "@typescript-eslint/typescript-estree": "8.56.1", + "@typescript-eslint/utils": "8.56.1", + "debug": "^4.4.3", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.56.1.tgz", + "integrity": "sha512-dbMkdIUkIkchgGDIv7KLUpa0Mda4IYjo4IAMJUZ+3xNoUXxMsk9YtKpTHSChRS85o+H9ftm51gsK1dZReY9CVw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.56.1.tgz", + "integrity": "sha512-qzUL1qgalIvKWAf9C1HpvBjif+Vm6rcT5wZd4VoMb9+Km3iS3Cv9DY6dMRMDtPnwRAFyAi7YXJpTIEXLvdfPxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.56.1", + "@typescript-eslint/tsconfig-utils": "8.56.1", + "@typescript-eslint/types": "8.56.1", + "@typescript-eslint/visitor-keys": "8.56.1", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/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/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz", + "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "10.2.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", + "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.56.1.tgz", + "integrity": "sha512-HPAVNIME3tABJ61siYlHzSWCGtOoeP2RTIaHXFMPqjrQKCGB9OgUVdiNgH7TJS2JNIQ5qQ4RsAUDuGaGme/KOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.56.1", + "@typescript-eslint/types": "8.56.1", + "@typescript-eslint/typescript-estree": "8.56.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.56.1.tgz", + "integrity": "sha512-KiROIzYdEV85YygXw6BI/Dx4fnBlFQu6Mq4QE4MOH9fFnhohw6wX/OAvDY2/C+ut0I3RSPKenvZJIVYqJNkhEw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.56.1", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/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/@vitejs/plugin-react": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-5.1.4.tgz", + "integrity": "sha512-VIcFLdRi/VYRU8OL/puL7QXMYafHmqOnwTZY50U1JPlCNj30PxCMx65c494b1K9be9hX83KVt0+gTEwTWLqToA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.29.0", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-rc.3", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.18.0" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.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-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/ajv": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", + "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", + "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-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/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.0.tgz", + "integrity": "sha512-lIyg0szRfYbiy67j9KN8IyeD7q7hcmqnJ1ddWmNt19ItGpNN64mnllmxUNFIOdOm6by97jlL6wfpTTJrmnjWAA==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/browserslist": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", + "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.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "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/caniuse-lite": { + "version": "1.0.30001777", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001777.tgz", + "integrity": "sha512-tmN+fJxroPndC74efCdp12j+0rk0RHwV5Jwa1zWaFVyw2ZxAuPeG8ZgWC3Wz7uSjT3qMRQ5XHZ4COgQmsCMJAQ==", + "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": "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/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/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/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "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/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/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "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/electron-to-chromium": { + "version": "1.5.307", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.307.tgz", + "integrity": "sha512-5z3uFKBWjiNR44nFcYdkcXjKMbg5KXNdciu7mhTPo9tB7NbqSNP2sSnGR+fqknZSCwKkBN+oxiiajWs4dT6ORg==", + "dev": true, + "license": "ISC" + }, + "node_modules/esbuild": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.3.tgz", + "integrity": "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.3", + "@esbuild/android-arm": "0.27.3", + "@esbuild/android-arm64": "0.27.3", + "@esbuild/android-x64": "0.27.3", + "@esbuild/darwin-arm64": "0.27.3", + "@esbuild/darwin-x64": "0.27.3", + "@esbuild/freebsd-arm64": "0.27.3", + "@esbuild/freebsd-x64": "0.27.3", + "@esbuild/linux-arm": "0.27.3", + "@esbuild/linux-arm64": "0.27.3", + "@esbuild/linux-ia32": "0.27.3", + "@esbuild/linux-loong64": "0.27.3", + "@esbuild/linux-mips64el": "0.27.3", + "@esbuild/linux-ppc64": "0.27.3", + "@esbuild/linux-riscv64": "0.27.3", + "@esbuild/linux-s390x": "0.27.3", + "@esbuild/linux-x64": "0.27.3", + "@esbuild/netbsd-arm64": "0.27.3", + "@esbuild/netbsd-x64": "0.27.3", + "@esbuild/openbsd-arm64": "0.27.3", + "@esbuild/openbsd-x64": "0.27.3", + "@esbuild/openharmony-arm64": "0.27.3", + "@esbuild/sunos-x64": "0.27.3", + "@esbuild/win32-arm64": "0.27.3", + "@esbuild/win32-ia32": "0.27.3", + "@esbuild/win32-x64": "0.27.3" + } + }, + "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": "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": { + "version": "9.39.3", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.3.tgz", + "integrity": "sha512-VmQ+sifHUbI/IcSopBCF/HO3YiHQx/AVd3UVyYL6weuwW+HvON9VYn5l6Zl1WZzPWXPNZrSQpxwkkZ/VuvJZzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.1", + "@eslint/config-helpers": "^0.4.2", + "@eslint/core": "^0.17.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.39.3", + "@eslint/plugin-kit": "^0.4.1", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.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", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.0.1.tgz", + "integrity": "sha512-O0d0m04evaNzEPoSW+59Mezf8Qt0InfgGIBJnpC0h3NH/WjUAR7BIKUfysC6todmtiZ/A0oUVS8Gce0WhBrHsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.24.4", + "@babel/parser": "^7.24.4", + "hermes-parser": "^0.25.1", + "zod": "^3.25.0 || ^4.0.0", + "zod-validation-error": "^3.5.0 || ^4.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" + } + }, + "node_modules/eslint-plugin-react-refresh": { + "version": "0.4.26", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.26.tgz", + "integrity": "sha512-1RETEylht2O6FM/MvgnyvT+8K21wLqDNg4qD51Zj3guhjt433XbnnkVttHMyaVyAFD03QSV4LPS5iE3VQmO7XQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "eslint": ">=8.40" + } + }, + "node_modules/eslint-scope": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "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/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/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/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "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/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/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.3.4", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.4.tgz", + "integrity": "sha512-3+mMldrTAPdta5kjX2G2J7iX4zxtnwpdA8Tr2ZSjkyPSanvbZAcy6flmtnXbEybHrDcU9641lxrMfFuUxVz9vA==", + "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==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "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/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/globals": { + "version": "16.5.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.5.0.tgz", + "integrity": "sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/hermes-estree": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz", + "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==", + "dev": true, + "license": "MIT" + }, + "node_modules/hermes-parser": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz", + "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hermes-estree": "0.25.1" + } + }, + "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/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "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/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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/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": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "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-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/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/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/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "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/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/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "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/node-releases": { + "version": "2.0.36", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.36.tgz", + "integrity": "sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA==", + "dev": true, + "license": "MIT" + }, + "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": "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/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "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-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/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz", + "integrity": "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==", + "dev": true, + "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.11", + "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/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/react": { + "version": "19.2.4", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.4.tgz", + "integrity": "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.2.4", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.4.tgz", + "integrity": "sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.4" + } + }, + "node_modules/react-refresh": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.18.0.tgz", + "integrity": "sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/rollup": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.59.0.tgz", + "integrity": "sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.59.0", + "@rollup/rollup-android-arm64": "4.59.0", + "@rollup/rollup-darwin-arm64": "4.59.0", + "@rollup/rollup-darwin-x64": "4.59.0", + "@rollup/rollup-freebsd-arm64": "4.59.0", + "@rollup/rollup-freebsd-x64": "4.59.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.59.0", + "@rollup/rollup-linux-arm-musleabihf": "4.59.0", + "@rollup/rollup-linux-arm64-gnu": "4.59.0", + "@rollup/rollup-linux-arm64-musl": "4.59.0", + "@rollup/rollup-linux-loong64-gnu": "4.59.0", + "@rollup/rollup-linux-loong64-musl": "4.59.0", + "@rollup/rollup-linux-ppc64-gnu": "4.59.0", + "@rollup/rollup-linux-ppc64-musl": "4.59.0", + "@rollup/rollup-linux-riscv64-gnu": "4.59.0", + "@rollup/rollup-linux-riscv64-musl": "4.59.0", + "@rollup/rollup-linux-s390x-gnu": "4.59.0", + "@rollup/rollup-linux-x64-gnu": "4.59.0", + "@rollup/rollup-linux-x64-musl": "4.59.0", + "@rollup/rollup-openbsd-x64": "4.59.0", + "@rollup/rollup-openharmony-arm64": "4.59.0", + "@rollup/rollup-win32-arm64-msvc": "4.59.0", + "@rollup/rollup-win32-ia32-msvc": "4.59.0", + "@rollup/rollup-win32-x64-gnu": "4.59.0", + "@rollup/rollup-win32-x64-msvc": "4.59.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/scheduler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "license": "MIT" + }, + "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/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==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "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/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/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/ts-api-utils": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.4.0.tgz", + "integrity": "sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "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/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-eslint": { + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.56.1.tgz", + "integrity": "sha512-U4lM6pjmBX7J5wk4szltF7I1cGBHXZopnAXCMXb3+fZ3B/0Z3hq3wS/CCUB2NZBNAExK92mCU2tEohWuwVMsDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.56.1", + "@typescript-eslint/parser": "8.56.1", + "@typescript-eslint/typescript-estree": "8.56.1", + "@typescript-eslint/utils": "8.56.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/undici-types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "dev": true, + "license": "MIT" + }, + "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/vite": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.1.tgz", + "integrity": "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.27.0", + "fdir": "^6.5.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.15" + }, + "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", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "lightningcss": "^1.21.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 + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "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/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/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/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" + } + }, + "node_modules/zod": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz", + "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-validation-error": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz", + "integrity": "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "zod": "^3.25.0 || ^4.0.0" + } + } + } +} diff --git a/connecting-to-database/syncfusion-react-grid-PostgreSQL/grid_postgresql.client/package.json b/connecting-to-database/syncfusion-react-grid-PostgreSQL/grid_postgresql.client/package.json new file mode 100644 index 0000000..f725fd5 --- /dev/null +++ b/connecting-to-database/syncfusion-react-grid-PostgreSQL/grid_postgresql.client/package.json @@ -0,0 +1,32 @@ +{ + "name": "grid_postgresql.client", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc -b && vite build", + "lint": "eslint .", + "preview": "vite preview" + }, + "dependencies": { + "react": "^19.2.0", + "react-dom": "^19.2.0", + "@syncfusion/ej2-react-grids": "*", + "@syncfusion/ej2-data": "*" + }, + "devDependencies": { + "@eslint/js": "^9.39.1", + "@types/node": "^24.10.1", + "@types/react": "^19.2.7", + "@types/react-dom": "^19.2.3", + "@vitejs/plugin-react": "^5.1.1", + "eslint": "^9.39.1", + "eslint-plugin-react-hooks": "^7.0.1", + "eslint-plugin-react-refresh": "^0.4.24", + "globals": "^16.5.0", + "typescript": "~5.9.3", + "typescript-eslint": "^8.48.0", + "vite": "^7.3.1" + } +} \ No newline at end of file diff --git a/connecting-to-database/syncfusion-react-grid-PostgreSQL/grid_postgresql.client/public/vite.svg b/connecting-to-database/syncfusion-react-grid-PostgreSQL/grid_postgresql.client/public/vite.svg new file mode 100644 index 0000000..e7b8dfb --- /dev/null +++ b/connecting-to-database/syncfusion-react-grid-PostgreSQL/grid_postgresql.client/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/connecting-to-database/syncfusion-react-grid-PostgreSQL/grid_postgresql.client/src/App.css b/connecting-to-database/syncfusion-react-grid-PostgreSQL/grid_postgresql.client/src/App.css new file mode 100644 index 0000000..32d0d22 --- /dev/null +++ b/connecting-to-database/syncfusion-react-grid-PostgreSQL/grid_postgresql.client/src/App.css @@ -0,0 +1,11 @@ +#root { + max-width: 1280px; + margin: 0 auto; + padding: 2rem; + text-align: center; +} + +th, td { + padding-left: 1rem; + padding-right: 1rem; +} \ No newline at end of file diff --git a/connecting-to-database/syncfusion-react-grid-PostgreSQL/grid_postgresql.client/src/App.tsx b/connecting-to-database/syncfusion-react-grid-PostgreSQL/grid_postgresql.client/src/App.tsx new file mode 100644 index 0000000..d6ed6a7 --- /dev/null +++ b/connecting-to-database/syncfusion-react-grid-PostgreSQL/grid_postgresql.client/src/App.tsx @@ -0,0 +1,71 @@ +import React, { useMemo } from 'react'; +import { + GridComponent, ColumnsDirective, ColumnDirective, Inject, Page, Sort, Filter, Group, Toolbar, Edit, + type ToolbarItems, type FilterSettingsModel, type PageSettingsModel, type EditSettingsModel +} from '@syncfusion/ej2-react-grids'; +import { DataManager } from '@syncfusion/ej2-data'; +import { CustomAdaptor } from './CustomAdaptor'; + +export interface PurchaseOrder { + PurchaseOrderId: number; + PoNumber: string; + VendorID: string | number; + ItemName: string; + ItemCategory: string; + Quantity: number; + UnitPrice: number; + TotalAmount?: number; + Status: string; + OrderedBy: string; + ApprovedBy: string; + OrderDate: string | Date; + ExpectedDeliveryDate: string | Date; + CreatedOn: string | Date; + UpdatedOn: string | Date; +} + +const App: React.FC = () => { + const toolbarOptions: ToolbarItems[] = ['Add', 'Edit', 'Delete', 'Update', 'Cancel', 'Search']; + const pageSettings: PageSettingsModel = { pageSize: 10 }; + const filterSettings: FilterSettingsModel = { type: 'Excel' }; + const editSettings: EditSettingsModel = { allowEditing: true, allowAdding: true, allowDeleting: true }; + const requiredRule = { required: true }; + + const dataManager = useMemo(() => new DataManager({ + url: 'https://localhost:7016/api/PurchaseOrder/url', + insertUrl: 'https://localhost:7016/api/PurchaseOrder/insert', + updateUrl: 'https://localhost:7016/api/PurchaseOrder/update', + removeUrl: 'https://localhost:7016/api/PurchaseOrder/remove', + // batchUrl: 'https://localhost:7016/api/PurchaseOrder/batch', + adaptor: new CustomAdaptor(), + }), []); + + const statusTemplate = (props: PurchaseOrder) => {props.Status}; + const priceTemplate = (props: PurchaseOrder) => ₹{props.UnitPrice.toFixed(2)}; + const approvedByTemplate = (props: PurchaseOrder) => {props.ApprovedBy || 'Pending'}; + + return ( + + + + + + + + + + + + + + + + + + + + + ); +}; + +export default App; diff --git a/connecting-to-database/syncfusion-react-grid-PostgreSQL/grid_postgresql.client/src/CustomAdaptor.ts b/connecting-to-database/syncfusion-react-grid-PostgreSQL/grid_postgresql.client/src/CustomAdaptor.ts new file mode 100644 index 0000000..f5f4047 --- /dev/null +++ b/connecting-to-database/syncfusion-react-grid-PostgreSQL/grid_postgresql.client/src/CustomAdaptor.ts @@ -0,0 +1,69 @@ +// File: src/app/custom-adaptor.ts +import { type BatchChanges } from "@syncfusion/ej2-react-grids"; +import { + DataManager, + UrlAdaptor, + type ReturnOption, + type DataResult, +} from "@syncfusion/ej2-data"; + +export class CustomAdaptor extends UrlAdaptor { + public override processResponse(data: DataResult): ReturnOption { + const original = data as any; + if (original && original.result) { + let i = 0; + original.result.forEach((item: any) => (item.SNo = ++i)); + } + return original; + } + + public override beforeSend( + dm: DataManager, + request: Request, + settings?: any, + ): void { + super.beforeSend(dm, request, settings); + } + + public override insert(dm: DataManager, data: DataResult) { + return { + url: `${dm.dataSource["insertUrl"]}`, + type: "POST", + contentType: "application/json; charset=utf-8", + data: JSON.stringify({ value: data }), + }; + } + + public override update(dm: DataManager, _keyField: string, value: any) { + return { + url: `${dm.dataSource["updateUrl"]}`, + type: "POST", + contentType: "application/json; charset=utf-8", + data: JSON.stringify({ value }), + }; + } + + public override remove(dm: DataManager, keyField: string, value: any) { + const keyValue = + value && typeof value === "object" ? value[keyField] : value; + return { + url: `${dm.dataSource["removeUrl"]}`, + type: "POST", + contentType: "application/json; charset=utf-8", + data: JSON.stringify({ key: keyValue }), + }; + } + + public override batchRequest(dm: DataManager, changes: BatchChanges) { + return { + url: `${dm.dataSource["batchUrl"]}`, + type: "POST", + contentType: "application/json; charset=utf-8", + data: JSON.stringify({ + added: changes.addedRecords, + changed: changes.changedRecords, + deleted: changes.deletedRecords, + }), + }; + } +} diff --git a/connecting-to-database/syncfusion-react-grid-PostgreSQL/grid_postgresql.client/src/assets/react.svg b/connecting-to-database/syncfusion-react-grid-PostgreSQL/grid_postgresql.client/src/assets/react.svg new file mode 100644 index 0000000..6c87de9 --- /dev/null +++ b/connecting-to-database/syncfusion-react-grid-PostgreSQL/grid_postgresql.client/src/assets/react.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/connecting-to-database/syncfusion-react-grid-PostgreSQL/grid_postgresql.client/src/index.css b/connecting-to-database/syncfusion-react-grid-PostgreSQL/grid_postgresql.client/src/index.css new file mode 100644 index 0000000..b74eea4 --- /dev/null +++ b/connecting-to-database/syncfusion-react-grid-PostgreSQL/grid_postgresql.client/src/index.css @@ -0,0 +1,10 @@ +@import '../node_modules/@syncfusion/ej2-base/styles/material3.css'; +@import '../node_modules/@syncfusion/ej2-buttons/styles/material3.css'; +@import '../node_modules/@syncfusion/ej2-calendars/styles/material3.css'; +@import '../node_modules/@syncfusion/ej2-dropdowns/styles/material3.css'; +@import '../node_modules/@syncfusion/ej2-inputs/styles/material3.css'; +@import '../node_modules/@syncfusion/ej2-navigations/styles/material3.css'; +@import '../node_modules/@syncfusion/ej2-popups/styles/material3.css'; +@import '../node_modules/@syncfusion/ej2-splitbuttons/styles/material3.css'; +@import '../node_modules/@syncfusion/ej2-notifications/styles/material3.css'; +@import "../node_modules/@syncfusion/ej2-react-grids/styles/material3.css"; diff --git a/connecting-to-database/syncfusion-react-grid-PostgreSQL/grid_postgresql.client/src/main.tsx b/connecting-to-database/syncfusion-react-grid-PostgreSQL/grid_postgresql.client/src/main.tsx new file mode 100644 index 0000000..bef5202 --- /dev/null +++ b/connecting-to-database/syncfusion-react-grid-PostgreSQL/grid_postgresql.client/src/main.tsx @@ -0,0 +1,10 @@ +import { StrictMode } from 'react' +import { createRoot } from 'react-dom/client' +import './index.css' +import App from './App.tsx' + +createRoot(document.getElementById('root')!).render( + + + , +) diff --git a/connecting-to-database/syncfusion-react-grid-PostgreSQL/grid_postgresql.client/tsconfig.app.json b/connecting-to-database/syncfusion-react-grid-PostgreSQL/grid_postgresql.client/tsconfig.app.json new file mode 100644 index 0000000..a9b5a59 --- /dev/null +++ b/connecting-to-database/syncfusion-react-grid-PostgreSQL/grid_postgresql.client/tsconfig.app.json @@ -0,0 +1,28 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", + "target": "ES2022", + "useDefineForClassFields": true, + "lib": ["ES2022", "DOM", "DOM.Iterable"], + "module": "ESNext", + "types": ["vite/client"], + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "moduleDetection": "force", + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "erasableSyntaxOnly": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true + }, + "include": ["src"] +} diff --git a/connecting-to-database/syncfusion-react-grid-PostgreSQL/grid_postgresql.client/tsconfig.json b/connecting-to-database/syncfusion-react-grid-PostgreSQL/grid_postgresql.client/tsconfig.json new file mode 100644 index 0000000..1ffef60 --- /dev/null +++ b/connecting-to-database/syncfusion-react-grid-PostgreSQL/grid_postgresql.client/tsconfig.json @@ -0,0 +1,7 @@ +{ + "files": [], + "references": [ + { "path": "./tsconfig.app.json" }, + { "path": "./tsconfig.node.json" } + ] +} diff --git a/connecting-to-database/syncfusion-react-grid-PostgreSQL/grid_postgresql.client/tsconfig.node.json b/connecting-to-database/syncfusion-react-grid-PostgreSQL/grid_postgresql.client/tsconfig.node.json new file mode 100644 index 0000000..8a67f62 --- /dev/null +++ b/connecting-to-database/syncfusion-react-grid-PostgreSQL/grid_postgresql.client/tsconfig.node.json @@ -0,0 +1,26 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", + "target": "ES2023", + "lib": ["ES2023"], + "module": "ESNext", + "types": ["node"], + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "moduleDetection": "force", + "noEmit": true, + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "erasableSyntaxOnly": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/connecting-to-database/syncfusion-react-grid-PostgreSQL/grid_postgresql.client/vite.config.ts b/connecting-to-database/syncfusion-react-grid-PostgreSQL/grid_postgresql.client/vite.config.ts new file mode 100644 index 0000000..e692e74 --- /dev/null +++ b/connecting-to-database/syncfusion-react-grid-PostgreSQL/grid_postgresql.client/vite.config.ts @@ -0,0 +1,61 @@ +import { fileURLToPath, URL } from 'node:url'; + +import { defineConfig } from 'vite'; +import plugin from '@vitejs/plugin-react'; +import fs from 'fs'; +import path from 'path'; +import child_process from 'child_process'; +import { env } from 'process'; + +const baseFolder = + env.APPDATA !== undefined && env.APPDATA !== '' + ? `${env.APPDATA}/ASP.NET/https` + : `${env.HOME}/.aspnet/https`; + +const certificateName = "grid_postgresql.client"; +const certFilePath = path.join(baseFolder, `${certificateName}.pem`); +const keyFilePath = path.join(baseFolder, `${certificateName}.key`); + +if (!fs.existsSync(baseFolder)) { + fs.mkdirSync(baseFolder, { recursive: true }); +} + +if (!fs.existsSync(certFilePath) || !fs.existsSync(keyFilePath)) { + if (0 !== child_process.spawnSync('dotnet', [ + 'dev-certs', + 'https', + '--export-path', + certFilePath, + '--format', + 'Pem', + '--no-password', + ], { stdio: 'inherit', }).status) { + throw new Error("Could not create certificate."); + } +} + +const target = env.ASPNETCORE_HTTPS_PORT ? `https://localhost:${env.ASPNETCORE_HTTPS_PORT}` : + env.ASPNETCORE_URLS ? env.ASPNETCORE_URLS.split(';')[0] : 'https://localhost:7016'; + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [plugin()], + resolve: { + alias: { + '@': fileURLToPath(new URL('./src', import.meta.url)) + } + }, + server: { + proxy: { + '^/weatherforecast': { + target, + secure: false + } + }, + port: parseInt(env.DEV_SERVER_PORT || '58587'), + https: { + key: fs.readFileSync(keyFilePath), + cert: fs.readFileSync(certFilePath), + } + } +}) From 569e3eb095b230e5f225d8130192d3bd848d86de Mon Sep 17 00:00:00 2001 From: AishwaryaRameshbabu-SF3446 Date: Thu, 26 Mar 2026 18:11:14 +0530 Subject: [PATCH 2/6] 1017111-PostgreSQL-readme-added --- .../README.md | 378 ++++++++++++++++++ 1 file changed, 378 insertions(+) create mode 100644 connecting-to-database/syncfusion-react-grid-PostgreSQL/README.md diff --git a/connecting-to-database/syncfusion-react-grid-PostgreSQL/README.md b/connecting-to-database/syncfusion-react-grid-PostgreSQL/README.md new file mode 100644 index 0000000..bed0b8e --- /dev/null +++ b/connecting-to-database/syncfusion-react-grid-PostgreSQL/README.md @@ -0,0 +1,378 @@ +# React Grid with PostgreSQL and Entity Framework Core + +## Project Overview + +This repository demonstrates a production-ready pattern for binding **PostgreSQL** data to **Syncfusion React Grid** using **Entity Framework Core (EF Core)**. The sample application provides complete CRUD (Create, Read, Update, Delete) operations, filtering, sorting, paging, and batch updates. The implementation follows industry best practices using ASP.NET Core Web API, DbContext, Entity Framework Core with Npgsql provider, and React services for seamless grid-to-server communication. + +## Key Features + +- **PostgreSQL–Entity Framework Core Integration**: Models, DbContext, and Entity Framework Core with Npgsql provider for database operations +- **Syncfusion React Grid**: Built-in search, filter, sort, paging, and toolbar capabilities +- **Complete CRUD Operations**: Add, edit, delete, and batch update purchase order records directly from the grid +- **DataSourceType Pattern**: Full control over grid data operations with RESTful API communication +- **ASP.NET Core Web API**: RESTful backend service with proper CORS configuration +- **Batch Operations Support**: Efficient handling of multiple add, update, and delete operations +- **Configurable Connection String**: Database credentials managed via **appsettings.json** +- **Cross-Platform Database**: PostgreSQL runs on Windows, Linux, and macOS + +## Prerequisites + +| Component | Version | Purpose | +|-----------|---------|---------| +| Visual Studio 2022 | 17.0 or later | Development IDE with React and ASP.NET Core workload | +| .NET SDK | 10.0 or later | Runtime and build tools for backend API | +| Node.js | 18.x or later | JavaScript runtime for React development | +| npm | 9.x or later | Package manager | +| PostgreSQL | 12 or later | Open-source relational database server | +| pgAdmin 4 | Latest | PostgreSQL GUI management and administration tool | +| Microsoft.EntityFrameworkCore | 10.0.3 or later | Core framework for database operations | +| Npgsql.EntityFrameworkCore.PostgreSQL | 10.0.3 or later | PostgreSQL provider for Entity Framework Core | +| Syncfusion.EJ2.Base | Latest | Backend support for Syncfusion components | +| @syncfusion/ej2-react-grids | Latest | React Grid component | +| @syncfusion/ej2-data | Latest | Data management utilities | +| React | 18.x or later | JavaScript library for UI development | + +## Quick Start + +### 1. Clone the repository + +```bash +git clone +cd Grid_PostgreSQL +``` + +### 2. Create the database and table in PostgreSQL + +Connect to PostgreSQL using **pgAdmin 4** or the **psql** command-line tool and execute the following SQL script: + +```sql +-- Create Database +CREATE DATABASE "PurchaseOrderDB"; + +-- Connect to the database +\c "PurchaseOrderDB" + +-- Create PurchaseOrder Table +CREATE TABLE public."PurchaseOrder" ( + "PurchaseOrderId" SERIAL PRIMARY KEY, + "PoNumber" VARCHAR(30) NOT NULL UNIQUE, + "VendorID" VARCHAR(50) NOT NULL, + "ItemName" VARCHAR(200) NOT NULL, + "ItemCategory" VARCHAR(100), + "Quantity" INTEGER NOT NULL, + "UnitPrice" NUMERIC(12,2) NOT NULL, + "TotalAmount" NUMERIC(14,2), + "Status" VARCHAR(50), + "OrderedBy" VARCHAR(100), + "ApprovedBy" VARCHAR(100), + "OrderDate" DATE NOT NULL, + "ExpectedDeliveryDate" DATE, + "CreatedOn" TIMESTAMP NOT NULL DEFAULT NOW(), + "UpdatedOn" TIMESTAMP NOT NULL DEFAULT NOW() +); + +-- Create Unique Index on PoNumber +CREATE UNIQUE INDEX uq_purchaseorder_ponumber ON public."PurchaseOrder"("PoNumber"); + +-- Insert Sample Data (Optional) +INSERT INTO public."PurchaseOrder" +("PoNumber", "VendorID", "ItemName", "ItemCategory", "Quantity", "UnitPrice", "TotalAmount", "Status", "OrderedBy", "ApprovedBy", "OrderDate", "ExpectedDeliveryDate", "CreatedOn", "UpdatedOn") +VALUES +('PO-2025-0001', 'VEN-9001', 'FHD Laptop', 'Electronics', 5, 899.99, 4499.95, 'Pending', 'Alice Johnson', 'Carol Davis', '2025-01-10', '2025-01-20', NOW(), NOW()), +('PO-2025-0002', 'VEN-9002', 'Fibre Cables', 'Networking', 100, 15.50, 1550.00, 'Approved', 'Bob Smith', 'Alice Johnson', '2025-01-09', '2025-01-17', NOW(), NOW()); +``` + +**Using pgAdmin 4 UI:** +1. Open pgAdmin 4 and connect to the PostgreSQL server +2. Right-click on **Databases** → Select **Create** → **Database** +3. Name it `PurchaseOrderDB` and click **Save** +4. Right-click on the database → **Query Tool** +5. Paste the SQL script above and execute it (F5 or Run button) + +### 3. Update the connection string + +Open **Grid_PostgreSQL.Server/appsettings.json** and configure the PostgreSQL connection: + +```json +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "AllowedHosts": "*", + "ConnectionStrings": { + "DefaultConnection": "Server=localhost;Port=5432;Database=PurchaseOrderDB;User Id=postgres;Password=" + } +} +``` + +**Connection String Components:** + +| Component | Description | Example | +|-----------|-------------|---------| +| Server | PostgreSQL server address | `localhost` or `192.168.1.100` | +| Port | PostgreSQL port (default is 5432) | `5432` | +| Database | Database name | `PurchaseOrderDB` | +| User Id | PostgreSQL username | `postgres` | +| Password | PostgreSQL user password | `Syncfusion@123` | + +### 4. Install server dependencies and run the API + +Open a terminal and navigate to the server project: + +```bash +cd Grid_PostgreSQL.Server +dotnet build +dotnet run +``` + +The API will run at `https://localhost:7102` (or the port shown in terminal). + +### 5. Install client dependencies and run the React app + +Open a new terminal: + +```bash +cd Grid_PostgreSQL.Client +npm install +npm start +``` + +The React development server will run at `http://localhost:3000`. + +### 6. Open the application + +Navigate to `http://localhost:3000` in your browser. + +## Configuration + +### Connection String + +The connection string in **appsettings.json** defines how the application connects to PostgreSQL: + +``` +Server=localhost;Port=5432;Database=PurchaseOrderDB;User Id=postgres;Password=Syncfusion@123 +``` + +**Security Note:** For production environments, store sensitive credentials using: +- User secrets for development: `dotnet user-secrets set "ConnectionStrings:DefaultConnection" "..."` +- Environment variables for production +- Azure Key Vault or similar secure storage solutions +- Connection string encryption + +### Entity Framework Core with PostgreSQL + +Entity Framework Core is configured in **Program.cs** to use the **Npgsql** provider: + +```csharp +builder.Services.AddDbContext(options => +{ + options.UseNpgsql(connectionString); + + if (builder.Environment.IsDevelopment()) + { + options.EnableSensitiveDataLogging(); + options.EnableDetailedErrors(); + } +}); +``` + +The Npgsql provider bridges EF Core and PostgreSQL, enabling: +- LINQ-to-SQL query translation for PostgreSQL syntax +- Type mapping for PostgreSQL-specific data types (NUMERIC, TIMESTAMP, etc.) +- Constraint management (PRIMARY KEY, UNIQUE, DEFAULT values) +- Automatic migration support + +## Project Layout + +| File/Folder | Purpose | +|-------------|---------| +| **Backend (Grid_PostgreSQL.Server)** | | +| `Data/PurchaseOrder.cs` | Entity model representing the PurchaseOrder table with EF Core annotations | +| `Data/PurchaseOrderDbContext.cs` | Entity Framework Core DbContext for PostgreSQL database operations | +| `Controllers/PurchaseOrderController.cs` | ASP.NET Core Web API controller with CRUD endpoints | +| `Program.cs` | Service registration, EF Core with Npgsql configuration, and CORS setup | +| `appsettings.json` | Application configuration including PostgreSQL connection string | +| **Frontend (Grid_PostgreSQL.Client)** | | +| `src/index.js` | React DOM render entry point | +| `src/App.jsx` | Syncfusion Grid component with CRUD operations | +| `src/App.css` | Global CSS styles including Syncfusion theme imports | +| `package.json` | NPM dependencies and scripts | +| `public/index.html` | HTML entry point | + +## Common Tasks + +### Add a Purchase Order +1. Click the **Add** button in the grid toolbar +2. Fill in the form fields (PO Number, Vendor ID, Item Name, Quantity, Unit Price, etc.) +3. Click **Update** to persist the record to PostgreSQL +4. The grid automatically refreshes with the new purchase order + +### Edit a Purchase Order +1. Select a row in the grid +2. Click the **Edit** button in the toolbar (or double-click the row) +3. Modify the required fields using the appropriate editors +4. Click **Update** to save changes +5. PostgreSQL is immediately updated via Entity Framework Core + +### Delete a Purchase Order +1. Select a row in the grid +2. Click the **Delete** button in the toolbar +3. Confirm the deletion +4. The record is removed from PostgreSQL and the grid + +### Search Records +1. Use the **Search** box in the toolbar +2. Enter keywords to filter records across configured columns +3. Results are displayed in real-time from PostgreSQL + +### Filter Records +1. Click the filter icon in any column header +2. Select filter criteria (equals, contains, greater than, etc.) +3. Click **Filter** to apply +4. Results are filtered on the server using PostgreSQL queries + +### Sort Records +1. Click the column header to sort ascending +2. Click again to sort descending +3. Hold **Shift** and click another column for multi-column sorting + +### Batch Operations +1. Enable batch mode by setting `editSettings={{ mode: 'Batch' }}` in Grid component +2. Make multiple changes (add, edit, delete) in the grid +3. Click **Update** to send all changes in a single batch request +4. All operations are processed together on PostgreSQL using Entity Framework Core + +## Architecture Overview + +### Backend Data Flow + +1. **Client Request**: React Grid sends HTTP POST requests to `/api/PurchaseOrder/*` endpoints +2. **Controller**: `PurchaseOrderController` receives the request with `DataManagerRequest` parameters +3. **DataOperations**: Syncfusion's `DataOperations` class processes filtering, sorting, and paging +4. **DbContext**: Entity Framework Core translates LINQ queries to PostgreSQL SQL syntax +5. **Database**: PostgreSQL executes the query and returns results +6. **Response**: Data flows back through DbContext → controller → HTTP response → React Grid + +### Data Service Pattern + +The **API Service** intercepts data operations and handles: +- **Read operations**: POST requests with query parameters for filtering, sorting, paging +- **CRUD operations**: POST requests for insert/update/delete +- **Batch operations**: Handles multiple changes in a single request +- **Response transformation**: Processes server responses into Grid-compatible format + +### API Endpoints + +| Operation | HTTP Method | Endpoint | Purpose | +|-----------|-------------|----------|---------| +| Read/Filter/Sort/Page | POST | `/api/PurchaseOrder/url` | Retrieves data with applied filters, sorting, and paging | +| Insert | POST | `/api/PurchaseOrder/insert` | Adds a new purchase order record | +| Update | POST | `/api/PurchaseOrder/update` | Updates an existing purchase order record | +| Delete | POST | `/api/PurchaseOrder/remove` | Deletes a purchase order record | +| Batch Operations | POST | `/api/PurchaseOrder/batch` | Handles multiple add, update, and delete operations in a single request | + +## Troubleshooting + +### PostgreSQL Connection Error +- Verify PostgreSQL is running and accessible on the specified host and port +- Confirm the database name, username, and password are correct +- Test connection using `psql` command: `psql -h localhost -U postgres -d PurchaseOrderDB` +- Ensure the firewall allows connections on port 5432 +- Check `appsettings.json` connection string syntax + +### Missing Tables +- Verify the SQL script was executed successfully in pgAdmin 4 +- Run the database creation script again +- Confirm the table name is `public."PurchaseOrder"` with correct schema +- Check that the unique constraint on `PoNumber` was created +- Query the table: `SELECT * FROM public."PurchaseOrder";` + +### Entity Framework Core Mapping Issues +- Ensure the `PurchaseOrder` model properties match the database column names exactly +- Check that the DbContext is correctly configured with `ToTable("PurchaseOrder", schema: "public")` +- Verify column type mappings: `HasColumnType("character varying(30)")`, `HasColumnType("numeric(14,2)")`, etc. +- Use `HasMaxLength()` for string properties to match VARCHAR limits +- Ensure the connection string points to the correct database + +### CORS Issues +- Verify CORS is configured in `Program.cs` with `AddDefaultPolicy()` +- Check that the policy allows the client origin (`AllowAnyOrigin()` or specific origins) +- Clear browser cache and restart both server and client +- Ensure `app.UseCors()` is called before `app.MapControllers()` +- Check browser console for CORS error details + +### Grid Not Loading Data +- Check browser console for errors (F12) +- Verify the API is running and accessible at the configured URL +- Test the API endpoint directly using Postman: POST to `https://localhost:7102/api/PurchaseOrder/url` +- Ensure the DataManager is correctly configured with the API URL +- Check that Entity Framework Core DbContext is properly registered in `Program.cs` +- Verify `appsettings.json` has the correct connection string +- Confirm environment variables are properly set in the React app + +### React Environment Variables Not Loading +- Ensure `.env` file is in the React project root directory +- Variables must start with `REACT_APP_` prefix to be accessible via `process.env` +- Restart the React development server after modifying `.env` file +- Check that `process.env.REACT_APP_API_URL` is used correctly in your code + +### Identity Column Issues +- Ensure `PurchaseOrderId` is marked as SERIAL PRIMARY KEY in PostgreSQL +- When inserting, the ID is auto-generated by PostgreSQL (no need to set) +- Verify that the DbContext property is marked with `ValueGeneratedOnAdd()` + +### JSON Serialization Issues +- The API uses `PropertyNamingPolicy = null` to preserve PascalCase +- Ensure the client sends proper JSON structure matching the model +- Check that date/time values are in ISO 8601 format or use JSON converters +- Verify nullable reference types are properly handled on both backend and frontend + +### Type Mismatch Issues +- DateTimeOffset: Used for `CreatedOn` and `UpdatedOn` to store timezone-aware timestamps +- DateTime: Used for `OrderDate` and `ExpectedDeliveryDate` (date only) +- NUMERIC(12,2): Used for `UnitPrice` with 12 digits total, 2 decimal places +- NUMERIC(14,2): Used for `TotalAmount` with 14 digits total, 2 decimal places + +### Version Conflicts +- Ensure Entity Framework Core, Npgsql provider, and React packages are compatible versions +- Run `dotnet restore` for server and `npm install` for client to update packages +- Check `.csproj` and `package.json` files for conflicting version constraints +- Verify all packages are compatible with .NET 10.0, Node.js 18.x+, and React 18.x+ + +### API Port Conflicts +- If port 7102 is already in use, the .NET API will use a different port +- Check the console output running `dotnet run` to see the actual port +- Update the `REACT_APP_API_URL` in `.env` to match the actual API port +- Clear cached values and restart the React development server + +### Performance Optimization +- Use `AsNoTracking()` for read-only queries to improve performance +- Create database indexes on frequently filtered/sorted columns +- Use paging to avoid loading all records at once +- Consider connection pooling in production environments +- Monitor query performance using PostgreSQL query logs +- Implement React component memoization to prevent unnecessary re-renders +- Use lazy loading for grid data with virtual scrolling enabled + +## Steps to Download Using DownGit + +1. **Open the DownGit Website** + + Go to: https://downgit.github.io/#/home + +2. **Copy the GitHub URL** + + - Navigate to the sample folder and copy its URL + - Example: https://github.com/SyncfusionExamples/ej2-react-grid-samples/tree/master/connecting-to-database/syncfusion-react-grid-postgresql + +3. **Paste the URL into DownGit** + + In the DownGit input box, paste the copied GitHub URL + +4. **Download the ZIP** + + - Click **Download** + - DownGit will generate a ZIP file of the selected folder which you can extract locally From 83e0a09cb4cdda13e542d0638aa303997bf6afb5 Mon Sep 17 00:00:00 2001 From: AishwaryaRameshbabu-SF3446 Date: Tue, 7 Apr 2026 11:43:01 +0530 Subject: [PATCH 3/6] 1017111-PostgreSQL-sample-updated --- .../Controllers/PurchaseOrderController.cs | 2 +- .../grid_postgresql.client/src/App.tsx | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/connecting-to-database/syncfusion-react-grid-PostgreSQL/Grid_PostgreSQL.Server/Controllers/PurchaseOrderController.cs b/connecting-to-database/syncfusion-react-grid-PostgreSQL/Grid_PostgreSQL.Server/Controllers/PurchaseOrderController.cs index efdfd00..f44bff5 100644 --- a/connecting-to-database/syncfusion-react-grid-PostgreSQL/Grid_PostgreSQL.Server/Controllers/PurchaseOrderController.cs +++ b/connecting-to-database/syncfusion-react-grid-PostgreSQL/Grid_PostgreSQL.Server/Controllers/PurchaseOrderController.cs @@ -18,7 +18,7 @@ public PurchaseOrderController(PurchaseOrderDbContext dbContext) } // READ - [HttpPost("url")] + [HttpPost("getpurchasedata")] public IActionResult UrlDataSource([FromBody] DataManagerRequest request) { IQueryable purchaseOrdersQuery = _dbContext.PurchaseOrders.AsNoTracking(); diff --git a/connecting-to-database/syncfusion-react-grid-PostgreSQL/grid_postgresql.client/src/App.tsx b/connecting-to-database/syncfusion-react-grid-PostgreSQL/grid_postgresql.client/src/App.tsx index d6ed6a7..79a71e7 100644 --- a/connecting-to-database/syncfusion-react-grid-PostgreSQL/grid_postgresql.client/src/App.tsx +++ b/connecting-to-database/syncfusion-react-grid-PostgreSQL/grid_postgresql.client/src/App.tsx @@ -32,7 +32,7 @@ const App: React.FC = () => { const requiredRule = { required: true }; const dataManager = useMemo(() => new DataManager({ - url: 'https://localhost:7016/api/PurchaseOrder/url', + url: 'https://localhost:7016/api/PurchaseOrder/getpurchasedata', insertUrl: 'https://localhost:7016/api/PurchaseOrder/insert', updateUrl: 'https://localhost:7016/api/PurchaseOrder/update', removeUrl: 'https://localhost:7016/api/PurchaseOrder/remove', @@ -60,8 +60,8 @@ const App: React.FC = () => { - - + + From d3ed96ef968de843cb93350a2fa2e74dc1e22c9a Mon Sep 17 00:00:00 2001 From: AishwaryaRameshbabu-SF3446 Date: Tue, 7 Apr 2026 13:32:04 +0530 Subject: [PATCH 4/6] 1017111-PostgreSQL-sample-updated --- .../Controllers/PurchaseOrderController.cs | 1 + .../grid_postgresql.client/index.html | 5 +++-- .../grid_postgresql.client/src/App.tsx | 13 +++++-------- 3 files changed, 9 insertions(+), 10 deletions(-) diff --git a/connecting-to-database/syncfusion-react-grid-PostgreSQL/Grid_PostgreSQL.Server/Controllers/PurchaseOrderController.cs b/connecting-to-database/syncfusion-react-grid-PostgreSQL/Grid_PostgreSQL.Server/Controllers/PurchaseOrderController.cs index f44bff5..03d4cce 100644 --- a/connecting-to-database/syncfusion-react-grid-PostgreSQL/Grid_PostgreSQL.Server/Controllers/PurchaseOrderController.cs +++ b/connecting-to-database/syncfusion-react-grid-PostgreSQL/Grid_PostgreSQL.Server/Controllers/PurchaseOrderController.cs @@ -62,6 +62,7 @@ public IActionResult Insert([FromBody] CRUDModel crudRequest) purchaseOrder.PurchaseOrderId = 0; purchaseOrder.TotalAmount = purchaseOrder.Quantity * purchaseOrder.UnitPrice; + purchaseOrder.CreatedOn = DateTime.UtcNow; purchaseOrder.UpdatedOn = DateTime.UtcNow; _dbContext.PurchaseOrders.Add(purchaseOrder); diff --git a/connecting-to-database/syncfusion-react-grid-PostgreSQL/grid_postgresql.client/index.html b/connecting-to-database/syncfusion-react-grid-PostgreSQL/grid_postgresql.client/index.html index ca7deba..de4fd9a 100644 --- a/connecting-to-database/syncfusion-react-grid-PostgreSQL/grid_postgresql.client/index.html +++ b/connecting-to-database/syncfusion-react-grid-PostgreSQL/grid_postgresql.client/index.html @@ -1,11 +1,12 @@ - + grid_postgresql.client - + +
diff --git a/connecting-to-database/syncfusion-react-grid-PostgreSQL/grid_postgresql.client/src/App.tsx b/connecting-to-database/syncfusion-react-grid-PostgreSQL/grid_postgresql.client/src/App.tsx index 79a71e7..4fa747c 100644 --- a/connecting-to-database/syncfusion-react-grid-PostgreSQL/grid_postgresql.client/src/App.tsx +++ b/connecting-to-database/syncfusion-react-grid-PostgreSQL/grid_postgresql.client/src/App.tsx @@ -1,6 +1,6 @@ import React, { useMemo } from 'react'; import { - GridComponent, ColumnsDirective, ColumnDirective, Inject, Page, Sort, Filter, Group, Toolbar, Edit, + GridComponent, ColumnsDirective, ColumnDirective, Inject, Page, Sort, Filter, Toolbar, Edit, type ToolbarItems, type FilterSettingsModel, type PageSettingsModel, type EditSettingsModel } from '@syncfusion/ej2-react-grids'; import { DataManager } from '@syncfusion/ej2-data'; @@ -42,10 +42,9 @@ const App: React.FC = () => { const statusTemplate = (props: PurchaseOrder) => {props.Status}; const priceTemplate = (props: PurchaseOrder) => ₹{props.UnitPrice.toFixed(2)}; - const approvedByTemplate = (props: PurchaseOrder) => {props.ApprovedBy || 'Pending'}; return ( - + @@ -57,13 +56,11 @@ const App: React.FC = () => { - + - - - + - + ); }; From aff98c338aea001f1a99cf96d93d564e5d3170c5 Mon Sep 17 00:00:00 2001 From: AishwaryaRameshbabu-SF3446 Date: Tue, 7 Apr 2026 14:55:07 +0530 Subject: [PATCH 5/6] 1017111-PostgreSQL-sample-updated --- .../syncfusion-react-grid-PostgreSQL/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/connecting-to-database/syncfusion-react-grid-PostgreSQL/README.md b/connecting-to-database/syncfusion-react-grid-PostgreSQL/README.md index bed0b8e..a125703 100644 --- a/connecting-to-database/syncfusion-react-grid-PostgreSQL/README.md +++ b/connecting-to-database/syncfusion-react-grid-PostgreSQL/README.md @@ -268,7 +268,7 @@ The **API Service** intercepts data operations and handles: | Operation | HTTP Method | Endpoint | Purpose | |-----------|-------------|----------|---------| -| Read/Filter/Sort/Page | POST | `/api/PurchaseOrder/url` | Retrieves data with applied filters, sorting, and paging | +| Read/Filter/Sort/Page | POST | `/api/PurchaseOrder/getpurchasedata` | Retrieves data with applied filters, sorting, and paging | | Insert | POST | `/api/PurchaseOrder/insert` | Adds a new purchase order record | | Update | POST | `/api/PurchaseOrder/update` | Updates an existing purchase order record | | Delete | POST | `/api/PurchaseOrder/remove` | Deletes a purchase order record | @@ -307,7 +307,7 @@ The **API Service** intercepts data operations and handles: ### Grid Not Loading Data - Check browser console for errors (F12) - Verify the API is running and accessible at the configured URL -- Test the API endpoint directly using Postman: POST to `https://localhost:7102/api/PurchaseOrder/url` +- Test the API endpoint directly using Postman: POST to `https://localhost:7102/api/PurchaseOrder/getpurchasedata` - Ensure the DataManager is correctly configured with the API URL - Check that Entity Framework Core DbContext is properly registered in `Program.cs` - Verify `appsettings.json` has the correct connection string From d2a8ecb1a065e697ef6e6cfa9c928ca0f13957cd Mon Sep 17 00:00:00 2001 From: AishwaryaRameshbabu-SF3446 Date: Thu, 9 Apr 2026 15:47:57 +0530 Subject: [PATCH 6/6] 1017111-PostgreSQL-document-sample-update --- .../Controllers/PurchaseOrderController.cs | 1 + .../grid_postgresql.client/src/App.tsx | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/connecting-to-database/syncfusion-react-grid-PostgreSQL/Grid_PostgreSQL.Server/Controllers/PurchaseOrderController.cs b/connecting-to-database/syncfusion-react-grid-PostgreSQL/Grid_PostgreSQL.Server/Controllers/PurchaseOrderController.cs index 03d4cce..46359d6 100644 --- a/connecting-to-database/syncfusion-react-grid-PostgreSQL/Grid_PostgreSQL.Server/Controllers/PurchaseOrderController.cs +++ b/connecting-to-database/syncfusion-react-grid-PostgreSQL/Grid_PostgreSQL.Server/Controllers/PurchaseOrderController.cs @@ -116,6 +116,7 @@ public IActionResult Batch([FromBody] CRUDModel crudRequest) { purchaseOrder.TotalAmount = purchaseOrder.Quantity * purchaseOrder.UnitPrice; purchaseOrder.UpdatedOn = DateTime.UtcNow; // safe with timestamp with time zone + purchaseOrder.CreatedOn = DateTime.UtcNow; _dbContext.PurchaseOrders.Attach(purchaseOrder); _dbContext.Entry(purchaseOrder).State = EntityState.Modified; } diff --git a/connecting-to-database/syncfusion-react-grid-PostgreSQL/grid_postgresql.client/src/App.tsx b/connecting-to-database/syncfusion-react-grid-PostgreSQL/grid_postgresql.client/src/App.tsx index 4fa747c..cc13b76 100644 --- a/connecting-to-database/syncfusion-react-grid-PostgreSQL/grid_postgresql.client/src/App.tsx +++ b/connecting-to-database/syncfusion-react-grid-PostgreSQL/grid_postgresql.client/src/App.tsx @@ -52,7 +52,7 @@ const App: React.FC = () => { - +