From 33924078906d1535f8ff2dbf30280b6a5d2c7241 Mon Sep 17 00:00:00 2001 From: ChiaraBm Date: Thu, 5 Dec 2024 15:35:23 +0100 Subject: [PATCH] Recreated project with project template --- .gitignore | 10 +- .../Database/Entities/Allocation.cs | 12 - .../Database/Entities/Backup.cs | 18 - .../Database/Entities/Network.cs | 11 - .../Database/Entities/Node.cs | 16 - .../Database/Entities/Server.cs | 26 - .../Database/Entities/ServerVariable.cs | 11 - .../Database/Entities/Star.cs | 31 - .../Database/Entities/StarDockerImage.cs | 11 - .../Database/Entities/StarFolder.cs | 10 - .../Database/Entities/StarVariable.cs | 20 - ...0830074359_AddedServerEntities.Designer.cs | 519 ------- .../20240830074359_AddedServerEntities.cs | 434 ------ .../Migrations/ServersContextModelSnapshot.cs | 516 ------- .../Database/MoonlightServersDataContext.cs | 13 + .../Database/ServersContext.cs | 21 - .../Extensions/NodeExtensions.cs | 22 - .../Admin/Nodes/NodeAllocationsController.cs | 63 - .../Admin/Nodes/NodesController.cs | 105 -- .../Http/Controllers/ExampleController.cs | 28 + .../MoonlightServers.ApiServer.csproj | 54 +- .../MoonlightServersPlugin.cs | 34 - MoonlightServers.ApiServer/Program.cs | 7 + .../Properties/launchSettings.json | 17 + .../Services/ExampleService.cs | 22 + .../Startup/DatabaseStartup.cs | 15 + .../Startup/PluginStartup.cs | 29 + .../Implementations/ServersSidebarProvider.cs | 27 - .../MoonlightServers.Client.csproj | 40 - .../MoonlightServersClientPlugin.cs | 31 - .../Components/Forms/AllocationEditor.razor | 63 - .../UI/Components/Partials/NodeLogs.razor | 47 - .../UI/Components/Partials/NodeOverview.razor | 117 -- .../UI/Views/Admin/Index.razor | 5 - .../UI/Views/Admin/Nodes.razor | 224 --- MoonlightServers.Client/_Imports.razor | 15 - .../App/Configuration/AppConfiguration.cs | 6 - .../App/Helpers/HostHelper.cs | 109 -- .../Http/Controllers/Sys/InfoController.cs | 47 - .../MoonlightServers.Daemon.csproj | 29 - MoonlightServers.Daemon/Program.cs | 34 - .../Properties/launchSettings.json | 14 - MoonlightServers.Daemon/appsettings.json | 9 - .../Http/Resources/Sys/SystemInfoResponse.cs | 22 - .../MoonlightServers.DaemonShared.csproj | 14 - .../Implementations/SidebarImplementation.cs | 22 + .../MoonlightServers.Frontend.csproj | 35 + MoonlightServers.Frontend/Program.cs | 7 + .../Styles/additions/animations.css | 9 + .../Styles/additions/buttons.css | 80 + .../Styles/additions/cards.css | 19 + .../Styles/additions/fonts.css | 3 + .../Styles/additions/forms.css | 77 + .../Styles/additions/loaders.css | 19 + .../Styles/additions/progress.css | 25 + .../Styles/additions/scrollbar.css | 9 + MoonlightServers.Frontend/Styles/build.bat | 1 + MoonlightServers.Frontend/Styles/build.sh | 2 + .../Styles/package-lock.json | 1294 +++++++++++++++++ MoonlightServers.Frontend/Styles/package.json | 8 + MoonlightServers.Frontend/Styles/style.css | 79 + .../Styles/tailwind.config.js | 128 ++ .../UI/Views/Example.razor | 25 + MoonlightServers.Shared/Enums/BackupState.cs | 8 - .../Enums/StarVariableType.cs | 9 - .../Allocations/CreateAllocationRequest.cs | 14 - .../Allocations/UpdateAllocationRequest.cs | 14 - .../Requests/Admin/Nodes/CreateNodeRequest.cs | 17 - .../Requests/Admin/Nodes/UpdateNodeRequest.cs | 17 - .../Allocations/DetailAllocationResponse.cs | 8 - .../Admin/Nodes/DetailNodeResponse.cs | 11 - .../Admin/Nodes/StatusNodeResponse.cs | 22 - .../Http/Responses/ExampleResponse.cs | 6 + .../MoonlightServers.Shared.csproj | 2 +- MoonlightServers.sln | 42 +- README.md | 2 - 76 files changed, 2020 insertions(+), 2922 deletions(-) delete mode 100644 MoonlightServers.ApiServer/Database/Entities/Allocation.cs delete mode 100644 MoonlightServers.ApiServer/Database/Entities/Backup.cs delete mode 100644 MoonlightServers.ApiServer/Database/Entities/Network.cs delete mode 100644 MoonlightServers.ApiServer/Database/Entities/Node.cs delete mode 100644 MoonlightServers.ApiServer/Database/Entities/Server.cs delete mode 100644 MoonlightServers.ApiServer/Database/Entities/ServerVariable.cs delete mode 100644 MoonlightServers.ApiServer/Database/Entities/Star.cs delete mode 100644 MoonlightServers.ApiServer/Database/Entities/StarDockerImage.cs delete mode 100644 MoonlightServers.ApiServer/Database/Entities/StarFolder.cs delete mode 100644 MoonlightServers.ApiServer/Database/Entities/StarVariable.cs delete mode 100644 MoonlightServers.ApiServer/Database/Migrations/20240830074359_AddedServerEntities.Designer.cs delete mode 100644 MoonlightServers.ApiServer/Database/Migrations/20240830074359_AddedServerEntities.cs delete mode 100644 MoonlightServers.ApiServer/Database/Migrations/ServersContextModelSnapshot.cs create mode 100644 MoonlightServers.ApiServer/Database/MoonlightServersDataContext.cs delete mode 100644 MoonlightServers.ApiServer/Database/ServersContext.cs delete mode 100644 MoonlightServers.ApiServer/Extensions/NodeExtensions.cs delete mode 100644 MoonlightServers.ApiServer/Http/Controllers/Admin/Nodes/NodeAllocationsController.cs delete mode 100644 MoonlightServers.ApiServer/Http/Controllers/Admin/Nodes/NodesController.cs create mode 100644 MoonlightServers.ApiServer/Http/Controllers/ExampleController.cs delete mode 100644 MoonlightServers.ApiServer/MoonlightServersPlugin.cs create mode 100644 MoonlightServers.ApiServer/Program.cs create mode 100644 MoonlightServers.ApiServer/Properties/launchSettings.json create mode 100644 MoonlightServers.ApiServer/Services/ExampleService.cs create mode 100644 MoonlightServers.ApiServer/Startup/DatabaseStartup.cs create mode 100644 MoonlightServers.ApiServer/Startup/PluginStartup.cs delete mode 100644 MoonlightServers.Client/Implementations/ServersSidebarProvider.cs delete mode 100644 MoonlightServers.Client/MoonlightServers.Client.csproj delete mode 100644 MoonlightServers.Client/MoonlightServersClientPlugin.cs delete mode 100644 MoonlightServers.Client/UI/Components/Forms/AllocationEditor.razor delete mode 100644 MoonlightServers.Client/UI/Components/Partials/NodeLogs.razor delete mode 100644 MoonlightServers.Client/UI/Components/Partials/NodeOverview.razor delete mode 100644 MoonlightServers.Client/UI/Views/Admin/Index.razor delete mode 100644 MoonlightServers.Client/UI/Views/Admin/Nodes.razor delete mode 100644 MoonlightServers.Client/_Imports.razor delete mode 100644 MoonlightServers.Daemon/App/Configuration/AppConfiguration.cs delete mode 100644 MoonlightServers.Daemon/App/Helpers/HostHelper.cs delete mode 100644 MoonlightServers.Daemon/App/Http/Controllers/Sys/InfoController.cs delete mode 100644 MoonlightServers.Daemon/MoonlightServers.Daemon.csproj delete mode 100644 MoonlightServers.Daemon/Program.cs delete mode 100644 MoonlightServers.Daemon/Properties/launchSettings.json delete mode 100644 MoonlightServers.Daemon/appsettings.json delete mode 100644 MoonlightServers.DaemonShared/Http/Resources/Sys/SystemInfoResponse.cs delete mode 100644 MoonlightServers.DaemonShared/MoonlightServers.DaemonShared.csproj create mode 100644 MoonlightServers.Frontend/Implementations/SidebarImplementation.cs create mode 100644 MoonlightServers.Frontend/MoonlightServers.Frontend.csproj create mode 100644 MoonlightServers.Frontend/Program.cs create mode 100644 MoonlightServers.Frontend/Styles/additions/animations.css create mode 100644 MoonlightServers.Frontend/Styles/additions/buttons.css create mode 100644 MoonlightServers.Frontend/Styles/additions/cards.css create mode 100644 MoonlightServers.Frontend/Styles/additions/fonts.css create mode 100644 MoonlightServers.Frontend/Styles/additions/forms.css create mode 100644 MoonlightServers.Frontend/Styles/additions/loaders.css create mode 100644 MoonlightServers.Frontend/Styles/additions/progress.css create mode 100644 MoonlightServers.Frontend/Styles/additions/scrollbar.css create mode 100644 MoonlightServers.Frontend/Styles/build.bat create mode 100644 MoonlightServers.Frontend/Styles/build.sh create mode 100644 MoonlightServers.Frontend/Styles/package-lock.json create mode 100644 MoonlightServers.Frontend/Styles/package.json create mode 100644 MoonlightServers.Frontend/Styles/style.css create mode 100644 MoonlightServers.Frontend/Styles/tailwind.config.js create mode 100644 MoonlightServers.Frontend/UI/Views/Example.razor delete mode 100644 MoonlightServers.Shared/Enums/BackupState.cs delete mode 100644 MoonlightServers.Shared/Enums/StarVariableType.cs delete mode 100644 MoonlightServers.Shared/Http/Requests/Admin/Allocations/CreateAllocationRequest.cs delete mode 100644 MoonlightServers.Shared/Http/Requests/Admin/Allocations/UpdateAllocationRequest.cs delete mode 100644 MoonlightServers.Shared/Http/Requests/Admin/Nodes/CreateNodeRequest.cs delete mode 100644 MoonlightServers.Shared/Http/Requests/Admin/Nodes/UpdateNodeRequest.cs delete mode 100644 MoonlightServers.Shared/Http/Responses/Admin/Allocations/DetailAllocationResponse.cs delete mode 100644 MoonlightServers.Shared/Http/Responses/Admin/Nodes/DetailNodeResponse.cs delete mode 100644 MoonlightServers.Shared/Http/Responses/Admin/Nodes/StatusNodeResponse.cs create mode 100644 MoonlightServers.Shared/Http/Responses/ExampleResponse.cs delete mode 100644 README.md diff --git a/.gitignore b/.gitignore index a31043c..01ac454 100644 --- a/.gitignore +++ b/.gitignore @@ -421,5 +421,11 @@ FodyWeavers.xsd .idea/**/libraries # Moonlight -MoonlightServers/ApiServer/storage/** -/.idea/.idea.MoonlightServers/.idea +storage/ +.idea/**/.idea +MoonlightServers.min.css +core.min.css + +# Build script for nuget packages +finalPackages/ +nupkgs/ \ No newline at end of file diff --git a/MoonlightServers.ApiServer/Database/Entities/Allocation.cs b/MoonlightServers.ApiServer/Database/Entities/Allocation.cs deleted file mode 100644 index 03f4f21..0000000 --- a/MoonlightServers.ApiServer/Database/Entities/Allocation.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace MoonlightServers.ApiServer.Database.Entities; - -public class Allocation -{ - public int Id { get; set; } - - public string IpAddress { get; set; } = "0.0.0.0"; - public int Port { get; set; } - - public Server? Server { get; set; } - public Node Node { get; set; } -} \ No newline at end of file diff --git a/MoonlightServers.ApiServer/Database/Entities/Backup.cs b/MoonlightServers.ApiServer/Database/Entities/Backup.cs deleted file mode 100644 index de0b97e..0000000 --- a/MoonlightServers.ApiServer/Database/Entities/Backup.cs +++ /dev/null @@ -1,18 +0,0 @@ -using MoonlightServers.Shared.Enums; - -namespace MoonlightServers.ApiServer.Database.Entities; - -public class Backup -{ - public int Id { get; set; } - - public string Name { get; set; } - public BackupState State { get; set; } - - public long Size { get; set; } - - public DateTime CreatedAt { get; set; } = DateTime.UtcNow; - public DateTime FinishedAt { get; set; } = DateTime.UtcNow; - - public Server Server { get; set; } -} \ No newline at end of file diff --git a/MoonlightServers.ApiServer/Database/Entities/Network.cs b/MoonlightServers.ApiServer/Database/Entities/Network.cs deleted file mode 100644 index 404eb77..0000000 --- a/MoonlightServers.ApiServer/Database/Entities/Network.cs +++ /dev/null @@ -1,11 +0,0 @@ -namespace MoonlightServers.ApiServer.Database.Entities; - -public class Network -{ - public int Id { get; set; } - - public string Name { get; set; } - - public Node Node { get; set; } - public List Servers { get; set; } = new(); -} \ No newline at end of file diff --git a/MoonlightServers.ApiServer/Database/Entities/Node.cs b/MoonlightServers.ApiServer/Database/Entities/Node.cs deleted file mode 100644 index 6be8775..0000000 --- a/MoonlightServers.ApiServer/Database/Entities/Node.cs +++ /dev/null @@ -1,16 +0,0 @@ -namespace MoonlightServers.ApiServer.Database.Entities; - -public class Node -{ - public int Id { get; set; } - - public string Name { get; set; } - - public string Fqdn { get; set; } - public int ApiPort { get; set; } - public string Token { get; set; } - public bool SslEnabled { get; set; } - - public List Allocations { get; set; } = new(); - public List Servers { get; set; } = new(); -} \ No newline at end of file diff --git a/MoonlightServers.ApiServer/Database/Entities/Server.cs b/MoonlightServers.ApiServer/Database/Entities/Server.cs deleted file mode 100644 index eacec4c..0000000 --- a/MoonlightServers.ApiServer/Database/Entities/Server.cs +++ /dev/null @@ -1,26 +0,0 @@ -namespace MoonlightServers.ApiServer.Database.Entities; - -public class Server -{ - public int Id { get; set; } - - public string Name { get; set; } - - public int Cpu { get; set; } - public int Memory { get; set; } - public int Disk { get; set; } - - public string? OverrideStartupCommand { get; set; } = null; - public string? OverrideDockerImage { get; set; } = null; - - public bool VirtualDiskEnabled { get; set; } = false; - - public Star Star { get; set; } - public int DockerImageIndex { get; set; } = 0; - - public Node Node { get; set; } - public Network? Network { get; set; } - public List Allocations { get; set; } = new(); - public List Variables { get; set; } = new(); - public List Backups { get; set; } = new(); -} \ No newline at end of file diff --git a/MoonlightServers.ApiServer/Database/Entities/ServerVariable.cs b/MoonlightServers.ApiServer/Database/Entities/ServerVariable.cs deleted file mode 100644 index 1690c32..0000000 --- a/MoonlightServers.ApiServer/Database/Entities/ServerVariable.cs +++ /dev/null @@ -1,11 +0,0 @@ -namespace MoonlightServers.ApiServer.Database.Entities; - -public class ServerVariable -{ - public int Id { get; set; } - - public string Key { get; set; } - public string Value { get; set; } - - public Server Server { get; set; } -} \ No newline at end of file diff --git a/MoonlightServers.ApiServer/Database/Entities/Star.cs b/MoonlightServers.ApiServer/Database/Entities/Star.cs deleted file mode 100644 index a56f2f2..0000000 --- a/MoonlightServers.ApiServer/Database/Entities/Star.cs +++ /dev/null @@ -1,31 +0,0 @@ -namespace MoonlightServers.ApiServer.Database.Entities; - -public class Star -{ - public int Id { get; set; } - - public string Name { get; set; } - public string Author { get; set; } - - public string? DonationUrl { get; set; } - public string? UpdateUrl { get; set; } - - public string StartupCommand { get; set; } - public string StopCommand { get; set; } - public string OnlineDetection { get; set; } - - public string InstallShell { get; set; } - public string InstallDockerImage { get; set; } - public string InstallScript { get; set; } - public int RequiredAllocations { get; set; } - - public string ParseConfiguration { get; set; } - - public int DefaultDockerImageIndex { get; set; } - public bool AllowDockerImageChanging { get; set; } - - public List Variables { get; set; } = new(); - public List DockerImages { get; set; } = new(); - - public StarFolder? Folder { get; set; } -} \ No newline at end of file diff --git a/MoonlightServers.ApiServer/Database/Entities/StarDockerImage.cs b/MoonlightServers.ApiServer/Database/Entities/StarDockerImage.cs deleted file mode 100644 index 00d89b0..0000000 --- a/MoonlightServers.ApiServer/Database/Entities/StarDockerImage.cs +++ /dev/null @@ -1,11 +0,0 @@ -namespace MoonlightServers.ApiServer.Database.Entities; - -public class StarDockerImage -{ - public int Id { get; set; } - - public string Identifier { get; set; } - public string DisplayName { get; set; } - - public bool AutoPulling { get; set; } = true; -} \ No newline at end of file diff --git a/MoonlightServers.ApiServer/Database/Entities/StarFolder.cs b/MoonlightServers.ApiServer/Database/Entities/StarFolder.cs deleted file mode 100644 index cc6a34d..0000000 --- a/MoonlightServers.ApiServer/Database/Entities/StarFolder.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace MoonlightServers.ApiServer.Database.Entities; - -public class StarFolder -{ - public int Id { get; set; } - - public string Name { get; set; } - - public List Stars { get; set; } = new(); -} \ No newline at end of file diff --git a/MoonlightServers.ApiServer/Database/Entities/StarVariable.cs b/MoonlightServers.ApiServer/Database/Entities/StarVariable.cs deleted file mode 100644 index b4f7fb5..0000000 --- a/MoonlightServers.ApiServer/Database/Entities/StarVariable.cs +++ /dev/null @@ -1,20 +0,0 @@ -using MoonlightServers.Shared.Enums; - -namespace MoonlightServers.ApiServer.Database.Entities; - -public class StarVariable -{ - public int Id { get; set; } - - public string Key { get; set; } - public string DefaultValue { get; set; } - - public string DisplayName { get; set; } - public string Description { get; set; } - - public bool AllowViewing { get; set; } = false; - public bool AllowEditing { get; set; } = false; - - public string? Filter { get; set; } - public StarVariableType Type { get; set; } = StarVariableType.Text; -} \ No newline at end of file diff --git a/MoonlightServers.ApiServer/Database/Migrations/20240830074359_AddedServerEntities.Designer.cs b/MoonlightServers.ApiServer/Database/Migrations/20240830074359_AddedServerEntities.Designer.cs deleted file mode 100644 index 18ef4cb..0000000 --- a/MoonlightServers.ApiServer/Database/Migrations/20240830074359_AddedServerEntities.Designer.cs +++ /dev/null @@ -1,519 +0,0 @@ -// -using System; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Metadata; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using MoonlightServers.ApiServer.Database; - -#nullable disable - -namespace MoonlightServers.ApiServer.Database.Migrations -{ - [DbContext(typeof(ServersContext))] - [Migration("20240830074359_AddedServerEntities")] - partial class AddedServerEntities - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasDefaultSchema("Servers") - .HasAnnotation("ProductVersion", "8.0.7") - .HasAnnotation("Relational:MaxIdentifierLength", 64); - - MySqlModelBuilderExtensions.AutoIncrementColumns(modelBuilder); - - modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.Allocation", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("Id")); - - b.Property("IpAddress") - .IsRequired() - .HasColumnType("longtext"); - - b.Property("NodeId") - .HasColumnType("int"); - - b.Property("Port") - .HasColumnType("int"); - - b.Property("ServerId") - .HasColumnType("int"); - - b.HasKey("Id"); - - b.HasIndex("NodeId"); - - b.HasIndex("ServerId"); - - b.ToTable("Allocations", "Servers"); - }); - - modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.Backup", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("Id")); - - b.Property("CreatedAt") - .HasColumnType("datetime(6)"); - - b.Property("FinishedAt") - .HasColumnType("datetime(6)"); - - b.Property("Name") - .IsRequired() - .HasColumnType("longtext"); - - b.Property("ServerId") - .HasColumnType("int"); - - b.Property("Size") - .HasColumnType("bigint"); - - b.Property("State") - .HasColumnType("int"); - - b.HasKey("Id"); - - b.HasIndex("ServerId"); - - b.ToTable("Backups", "Servers"); - }); - - modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.Network", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("Id")); - - b.Property("Name") - .IsRequired() - .HasColumnType("longtext"); - - b.Property("NodeId") - .HasColumnType("int"); - - b.HasKey("Id"); - - b.HasIndex("NodeId"); - - b.ToTable("Networks", "Servers"); - }); - - modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.Node", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("Id")); - - b.Property("ApiPort") - .HasColumnType("int"); - - b.Property("Fqdn") - .IsRequired() - .HasColumnType("longtext"); - - b.Property("Name") - .IsRequired() - .HasColumnType("longtext"); - - b.Property("SslEnabled") - .HasColumnType("tinyint(1)"); - - b.Property("Token") - .IsRequired() - .HasColumnType("longtext"); - - b.HasKey("Id"); - - b.ToTable("Nodes", "Servers"); - }); - - modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.Server", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("Id")); - - b.Property("Cpu") - .HasColumnType("int"); - - b.Property("Disk") - .HasColumnType("int"); - - b.Property("DockerImageIndex") - .HasColumnType("int"); - - b.Property("Memory") - .HasColumnType("int"); - - b.Property("Name") - .IsRequired() - .HasColumnType("longtext"); - - b.Property("NetworkId") - .HasColumnType("int"); - - b.Property("NodeId") - .HasColumnType("int"); - - b.Property("OverrideDockerImage") - .HasColumnType("longtext"); - - b.Property("OverrideStartupCommand") - .HasColumnType("longtext"); - - b.Property("StarId") - .HasColumnType("int"); - - b.Property("VirtualDiskEnabled") - .HasColumnType("tinyint(1)"); - - b.HasKey("Id"); - - b.HasIndex("NetworkId"); - - b.HasIndex("NodeId"); - - b.HasIndex("StarId"); - - b.ToTable("Servers", "Servers"); - }); - - modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.ServerVariable", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("Id")); - - b.Property("Key") - .IsRequired() - .HasColumnType("longtext"); - - b.Property("ServerId") - .HasColumnType("int"); - - b.Property("Value") - .IsRequired() - .HasColumnType("longtext"); - - b.HasKey("Id"); - - b.HasIndex("ServerId"); - - b.ToTable("ServerVariables", "Servers"); - }); - - modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.Star", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("Id")); - - b.Property("AllowDockerImageChanging") - .HasColumnType("tinyint(1)"); - - b.Property("Author") - .IsRequired() - .HasColumnType("longtext"); - - b.Property("DefaultDockerImageIndex") - .HasColumnType("int"); - - b.Property("DonationUrl") - .HasColumnType("longtext"); - - b.Property("FolderId") - .HasColumnType("int"); - - b.Property("InstallDockerImage") - .IsRequired() - .HasColumnType("longtext"); - - b.Property("InstallScript") - .IsRequired() - .HasColumnType("longtext"); - - b.Property("InstallShell") - .IsRequired() - .HasColumnType("longtext"); - - b.Property("Name") - .IsRequired() - .HasColumnType("longtext"); - - b.Property("OnlineDetection") - .IsRequired() - .HasColumnType("longtext"); - - b.Property("ParseConfiguration") - .IsRequired() - .HasColumnType("longtext"); - - b.Property("RequiredAllocations") - .HasColumnType("int"); - - b.Property("StartupCommand") - .IsRequired() - .HasColumnType("longtext"); - - b.Property("StopCommand") - .IsRequired() - .HasColumnType("longtext"); - - b.Property("UpdateUrl") - .HasColumnType("longtext"); - - b.HasKey("Id"); - - b.HasIndex("FolderId"); - - b.ToTable("Stars", "Servers"); - }); - - modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.StarDockerImage", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("Id")); - - b.Property("AutoPulling") - .HasColumnType("tinyint(1)"); - - b.Property("DisplayName") - .IsRequired() - .HasColumnType("longtext"); - - b.Property("Identifier") - .IsRequired() - .HasColumnType("longtext"); - - b.Property("StarId") - .HasColumnType("int"); - - b.HasKey("Id"); - - b.HasIndex("StarId"); - - b.ToTable("StarDockerImages", "Servers"); - }); - - modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.StarFolder", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("Id")); - - b.Property("Name") - .IsRequired() - .HasColumnType("longtext"); - - b.HasKey("Id"); - - b.ToTable("StarFolders", "Servers"); - }); - - modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.StarVariable", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("Id")); - - b.Property("AllowEditing") - .HasColumnType("tinyint(1)"); - - b.Property("AllowViewing") - .HasColumnType("tinyint(1)"); - - b.Property("DefaultValue") - .IsRequired() - .HasColumnType("longtext"); - - b.Property("Description") - .IsRequired() - .HasColumnType("longtext"); - - b.Property("DisplayName") - .IsRequired() - .HasColumnType("longtext"); - - b.Property("Filter") - .HasColumnType("longtext"); - - b.Property("Key") - .IsRequired() - .HasColumnType("longtext"); - - b.Property("StarId") - .HasColumnType("int"); - - b.Property("Type") - .HasColumnType("int"); - - b.HasKey("Id"); - - b.HasIndex("StarId"); - - b.ToTable("StarVariables", "Servers"); - }); - - modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.Allocation", b => - { - b.HasOne("MoonlightServers.ApiServer.Database.Entities.Node", "Node") - .WithMany("Allocations") - .HasForeignKey("NodeId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MoonlightServers.ApiServer.Database.Entities.Server", "Server") - .WithMany("Allocations") - .HasForeignKey("ServerId"); - - b.Navigation("Node"); - - b.Navigation("Server"); - }); - - modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.Backup", b => - { - b.HasOne("MoonlightServers.ApiServer.Database.Entities.Server", "Server") - .WithMany("Backups") - .HasForeignKey("ServerId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Server"); - }); - - modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.Network", b => - { - b.HasOne("MoonlightServers.ApiServer.Database.Entities.Node", "Node") - .WithMany() - .HasForeignKey("NodeId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Node"); - }); - - modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.Server", b => - { - b.HasOne("MoonlightServers.ApiServer.Database.Entities.Network", "Network") - .WithMany("Servers") - .HasForeignKey("NetworkId"); - - b.HasOne("MoonlightServers.ApiServer.Database.Entities.Node", "Node") - .WithMany("Servers") - .HasForeignKey("NodeId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MoonlightServers.ApiServer.Database.Entities.Star", "Star") - .WithMany() - .HasForeignKey("StarId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Network"); - - b.Navigation("Node"); - - b.Navigation("Star"); - }); - - modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.ServerVariable", b => - { - b.HasOne("MoonlightServers.ApiServer.Database.Entities.Server", "Server") - .WithMany("Variables") - .HasForeignKey("ServerId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Server"); - }); - - modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.Star", b => - { - b.HasOne("MoonlightServers.ApiServer.Database.Entities.StarFolder", "Folder") - .WithMany("Stars") - .HasForeignKey("FolderId"); - - b.Navigation("Folder"); - }); - - modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.StarDockerImage", b => - { - b.HasOne("MoonlightServers.ApiServer.Database.Entities.Star", null) - .WithMany("DockerImages") - .HasForeignKey("StarId"); - }); - - modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.StarVariable", b => - { - b.HasOne("MoonlightServers.ApiServer.Database.Entities.Star", null) - .WithMany("Variables") - .HasForeignKey("StarId"); - }); - - modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.Network", b => - { - b.Navigation("Servers"); - }); - - modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.Node", b => - { - b.Navigation("Allocations"); - - b.Navigation("Servers"); - }); - - modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.Server", b => - { - b.Navigation("Allocations"); - - b.Navigation("Backups"); - - b.Navigation("Variables"); - }); - - modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.Star", b => - { - b.Navigation("DockerImages"); - - b.Navigation("Variables"); - }); - - modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.StarFolder", b => - { - b.Navigation("Stars"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/MoonlightServers.ApiServer/Database/Migrations/20240830074359_AddedServerEntities.cs b/MoonlightServers.ApiServer/Database/Migrations/20240830074359_AddedServerEntities.cs deleted file mode 100644 index 98f385e..0000000 --- a/MoonlightServers.ApiServer/Database/Migrations/20240830074359_AddedServerEntities.cs +++ /dev/null @@ -1,434 +0,0 @@ -using System; -using Microsoft.EntityFrameworkCore.Metadata; -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace MoonlightServers.ApiServer.Database.Migrations -{ - /// - public partial class AddedServerEntities : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.EnsureSchema( - name: "Servers"); - - migrationBuilder.AlterDatabase() - .Annotation("MySql:CharSet", "utf8mb4"); - - migrationBuilder.CreateTable( - name: "Nodes", - schema: "Servers", - columns: table => new - { - Id = table.Column(type: "int", nullable: false) - .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn), - Name = table.Column(type: "longtext", nullable: false) - .Annotation("MySql:CharSet", "utf8mb4"), - Fqdn = table.Column(type: "longtext", nullable: false) - .Annotation("MySql:CharSet", "utf8mb4"), - ApiPort = table.Column(type: "int", nullable: false), - Token = table.Column(type: "longtext", nullable: false) - .Annotation("MySql:CharSet", "utf8mb4"), - SslEnabled = table.Column(type: "tinyint(1)", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_Nodes", x => x.Id); - }) - .Annotation("MySql:CharSet", "utf8mb4"); - - migrationBuilder.CreateTable( - name: "StarFolders", - schema: "Servers", - columns: table => new - { - Id = table.Column(type: "int", nullable: false) - .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn), - Name = table.Column(type: "longtext", nullable: false) - .Annotation("MySql:CharSet", "utf8mb4") - }, - constraints: table => - { - table.PrimaryKey("PK_StarFolders", x => x.Id); - }) - .Annotation("MySql:CharSet", "utf8mb4"); - - migrationBuilder.CreateTable( - name: "Networks", - schema: "Servers", - columns: table => new - { - Id = table.Column(type: "int", nullable: false) - .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn), - Name = table.Column(type: "longtext", nullable: false) - .Annotation("MySql:CharSet", "utf8mb4"), - NodeId = table.Column(type: "int", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_Networks", x => x.Id); - table.ForeignKey( - name: "FK_Networks_Nodes_NodeId", - column: x => x.NodeId, - principalSchema: "Servers", - principalTable: "Nodes", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }) - .Annotation("MySql:CharSet", "utf8mb4"); - - migrationBuilder.CreateTable( - name: "Stars", - schema: "Servers", - columns: table => new - { - Id = table.Column(type: "int", nullable: false) - .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn), - Name = table.Column(type: "longtext", nullable: false) - .Annotation("MySql:CharSet", "utf8mb4"), - Author = table.Column(type: "longtext", nullable: false) - .Annotation("MySql:CharSet", "utf8mb4"), - DonationUrl = table.Column(type: "longtext", nullable: true) - .Annotation("MySql:CharSet", "utf8mb4"), - UpdateUrl = table.Column(type: "longtext", nullable: true) - .Annotation("MySql:CharSet", "utf8mb4"), - StartupCommand = table.Column(type: "longtext", nullable: false) - .Annotation("MySql:CharSet", "utf8mb4"), - StopCommand = table.Column(type: "longtext", nullable: false) - .Annotation("MySql:CharSet", "utf8mb4"), - OnlineDetection = table.Column(type: "longtext", nullable: false) - .Annotation("MySql:CharSet", "utf8mb4"), - InstallShell = table.Column(type: "longtext", nullable: false) - .Annotation("MySql:CharSet", "utf8mb4"), - InstallDockerImage = table.Column(type: "longtext", nullable: false) - .Annotation("MySql:CharSet", "utf8mb4"), - InstallScript = table.Column(type: "longtext", nullable: false) - .Annotation("MySql:CharSet", "utf8mb4"), - RequiredAllocations = table.Column(type: "int", nullable: false), - ParseConfiguration = table.Column(type: "longtext", nullable: false) - .Annotation("MySql:CharSet", "utf8mb4"), - DefaultDockerImageIndex = table.Column(type: "int", nullable: false), - AllowDockerImageChanging = table.Column(type: "tinyint(1)", nullable: false), - FolderId = table.Column(type: "int", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_Stars", x => x.Id); - table.ForeignKey( - name: "FK_Stars_StarFolders_FolderId", - column: x => x.FolderId, - principalSchema: "Servers", - principalTable: "StarFolders", - principalColumn: "Id"); - }) - .Annotation("MySql:CharSet", "utf8mb4"); - - migrationBuilder.CreateTable( - name: "Servers", - schema: "Servers", - columns: table => new - { - Id = table.Column(type: "int", nullable: false) - .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn), - Name = table.Column(type: "longtext", nullable: false) - .Annotation("MySql:CharSet", "utf8mb4"), - Cpu = table.Column(type: "int", nullable: false), - Memory = table.Column(type: "int", nullable: false), - Disk = table.Column(type: "int", nullable: false), - OverrideStartupCommand = table.Column(type: "longtext", nullable: true) - .Annotation("MySql:CharSet", "utf8mb4"), - OverrideDockerImage = table.Column(type: "longtext", nullable: true) - .Annotation("MySql:CharSet", "utf8mb4"), - VirtualDiskEnabled = table.Column(type: "tinyint(1)", nullable: false), - StarId = table.Column(type: "int", nullable: false), - DockerImageIndex = table.Column(type: "int", nullable: false), - NodeId = table.Column(type: "int", nullable: false), - NetworkId = table.Column(type: "int", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_Servers", x => x.Id); - table.ForeignKey( - name: "FK_Servers_Networks_NetworkId", - column: x => x.NetworkId, - principalSchema: "Servers", - principalTable: "Networks", - principalColumn: "Id"); - table.ForeignKey( - name: "FK_Servers_Nodes_NodeId", - column: x => x.NodeId, - principalSchema: "Servers", - principalTable: "Nodes", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - table.ForeignKey( - name: "FK_Servers_Stars_StarId", - column: x => x.StarId, - principalSchema: "Servers", - principalTable: "Stars", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }) - .Annotation("MySql:CharSet", "utf8mb4"); - - migrationBuilder.CreateTable( - name: "StarDockerImages", - schema: "Servers", - columns: table => new - { - Id = table.Column(type: "int", nullable: false) - .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn), - Identifier = table.Column(type: "longtext", nullable: false) - .Annotation("MySql:CharSet", "utf8mb4"), - DisplayName = table.Column(type: "longtext", nullable: false) - .Annotation("MySql:CharSet", "utf8mb4"), - AutoPulling = table.Column(type: "tinyint(1)", nullable: false), - StarId = table.Column(type: "int", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_StarDockerImages", x => x.Id); - table.ForeignKey( - name: "FK_StarDockerImages_Stars_StarId", - column: x => x.StarId, - principalSchema: "Servers", - principalTable: "Stars", - principalColumn: "Id"); - }) - .Annotation("MySql:CharSet", "utf8mb4"); - - migrationBuilder.CreateTable( - name: "StarVariables", - schema: "Servers", - columns: table => new - { - Id = table.Column(type: "int", nullable: false) - .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn), - Key = table.Column(type: "longtext", nullable: false) - .Annotation("MySql:CharSet", "utf8mb4"), - DefaultValue = table.Column(type: "longtext", nullable: false) - .Annotation("MySql:CharSet", "utf8mb4"), - DisplayName = table.Column(type: "longtext", nullable: false) - .Annotation("MySql:CharSet", "utf8mb4"), - Description = table.Column(type: "longtext", nullable: false) - .Annotation("MySql:CharSet", "utf8mb4"), - AllowViewing = table.Column(type: "tinyint(1)", nullable: false), - AllowEditing = table.Column(type: "tinyint(1)", nullable: false), - Filter = table.Column(type: "longtext", nullable: true) - .Annotation("MySql:CharSet", "utf8mb4"), - Type = table.Column(type: "int", nullable: false), - StarId = table.Column(type: "int", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_StarVariables", x => x.Id); - table.ForeignKey( - name: "FK_StarVariables_Stars_StarId", - column: x => x.StarId, - principalSchema: "Servers", - principalTable: "Stars", - principalColumn: "Id"); - }) - .Annotation("MySql:CharSet", "utf8mb4"); - - migrationBuilder.CreateTable( - name: "Allocations", - schema: "Servers", - columns: table => new - { - Id = table.Column(type: "int", nullable: false) - .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn), - IpAddress = table.Column(type: "longtext", nullable: false) - .Annotation("MySql:CharSet", "utf8mb4"), - Port = table.Column(type: "int", nullable: false), - ServerId = table.Column(type: "int", nullable: true), - NodeId = table.Column(type: "int", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_Allocations", x => x.Id); - table.ForeignKey( - name: "FK_Allocations_Nodes_NodeId", - column: x => x.NodeId, - principalSchema: "Servers", - principalTable: "Nodes", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - table.ForeignKey( - name: "FK_Allocations_Servers_ServerId", - column: x => x.ServerId, - principalSchema: "Servers", - principalTable: "Servers", - principalColumn: "Id"); - }) - .Annotation("MySql:CharSet", "utf8mb4"); - - migrationBuilder.CreateTable( - name: "Backups", - schema: "Servers", - columns: table => new - { - Id = table.Column(type: "int", nullable: false) - .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn), - Name = table.Column(type: "longtext", nullable: false) - .Annotation("MySql:CharSet", "utf8mb4"), - State = table.Column(type: "int", nullable: false), - Size = table.Column(type: "bigint", nullable: false), - CreatedAt = table.Column(type: "datetime(6)", nullable: false), - FinishedAt = table.Column(type: "datetime(6)", nullable: false), - ServerId = table.Column(type: "int", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_Backups", x => x.Id); - table.ForeignKey( - name: "FK_Backups_Servers_ServerId", - column: x => x.ServerId, - principalSchema: "Servers", - principalTable: "Servers", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }) - .Annotation("MySql:CharSet", "utf8mb4"); - - migrationBuilder.CreateTable( - name: "ServerVariables", - schema: "Servers", - columns: table => new - { - Id = table.Column(type: "int", nullable: false) - .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn), - Key = table.Column(type: "longtext", nullable: false) - .Annotation("MySql:CharSet", "utf8mb4"), - Value = table.Column(type: "longtext", nullable: false) - .Annotation("MySql:CharSet", "utf8mb4"), - ServerId = table.Column(type: "int", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_ServerVariables", x => x.Id); - table.ForeignKey( - name: "FK_ServerVariables_Servers_ServerId", - column: x => x.ServerId, - principalSchema: "Servers", - principalTable: "Servers", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }) - .Annotation("MySql:CharSet", "utf8mb4"); - - migrationBuilder.CreateIndex( - name: "IX_Allocations_NodeId", - schema: "Servers", - table: "Allocations", - column: "NodeId"); - - migrationBuilder.CreateIndex( - name: "IX_Allocations_ServerId", - schema: "Servers", - table: "Allocations", - column: "ServerId"); - - migrationBuilder.CreateIndex( - name: "IX_Backups_ServerId", - schema: "Servers", - table: "Backups", - column: "ServerId"); - - migrationBuilder.CreateIndex( - name: "IX_Networks_NodeId", - schema: "Servers", - table: "Networks", - column: "NodeId"); - - migrationBuilder.CreateIndex( - name: "IX_Servers_NetworkId", - schema: "Servers", - table: "Servers", - column: "NetworkId"); - - migrationBuilder.CreateIndex( - name: "IX_Servers_NodeId", - schema: "Servers", - table: "Servers", - column: "NodeId"); - - migrationBuilder.CreateIndex( - name: "IX_Servers_StarId", - schema: "Servers", - table: "Servers", - column: "StarId"); - - migrationBuilder.CreateIndex( - name: "IX_ServerVariables_ServerId", - schema: "Servers", - table: "ServerVariables", - column: "ServerId"); - - migrationBuilder.CreateIndex( - name: "IX_StarDockerImages_StarId", - schema: "Servers", - table: "StarDockerImages", - column: "StarId"); - - migrationBuilder.CreateIndex( - name: "IX_Stars_FolderId", - schema: "Servers", - table: "Stars", - column: "FolderId"); - - migrationBuilder.CreateIndex( - name: "IX_StarVariables_StarId", - schema: "Servers", - table: "StarVariables", - column: "StarId"); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropTable( - name: "Allocations", - schema: "Servers"); - - migrationBuilder.DropTable( - name: "Backups", - schema: "Servers"); - - migrationBuilder.DropTable( - name: "ServerVariables", - schema: "Servers"); - - migrationBuilder.DropTable( - name: "StarDockerImages", - schema: "Servers"); - - migrationBuilder.DropTable( - name: "StarVariables", - schema: "Servers"); - - migrationBuilder.DropTable( - name: "Servers", - schema: "Servers"); - - migrationBuilder.DropTable( - name: "Networks", - schema: "Servers"); - - migrationBuilder.DropTable( - name: "Stars", - schema: "Servers"); - - migrationBuilder.DropTable( - name: "Nodes", - schema: "Servers"); - - migrationBuilder.DropTable( - name: "StarFolders", - schema: "Servers"); - } - } -} diff --git a/MoonlightServers.ApiServer/Database/Migrations/ServersContextModelSnapshot.cs b/MoonlightServers.ApiServer/Database/Migrations/ServersContextModelSnapshot.cs deleted file mode 100644 index 8fd0248..0000000 --- a/MoonlightServers.ApiServer/Database/Migrations/ServersContextModelSnapshot.cs +++ /dev/null @@ -1,516 +0,0 @@ -// -using System; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Metadata; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using MoonlightServers.ApiServer.Database; - -#nullable disable - -namespace MoonlightServers.ApiServer.Database.Migrations -{ - [DbContext(typeof(ServersContext))] - partial class ServersContextModelSnapshot : ModelSnapshot - { - protected override void BuildModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasDefaultSchema("Servers") - .HasAnnotation("ProductVersion", "8.0.7") - .HasAnnotation("Relational:MaxIdentifierLength", 64); - - MySqlModelBuilderExtensions.AutoIncrementColumns(modelBuilder); - - modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.Allocation", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("Id")); - - b.Property("IpAddress") - .IsRequired() - .HasColumnType("longtext"); - - b.Property("NodeId") - .HasColumnType("int"); - - b.Property("Port") - .HasColumnType("int"); - - b.Property("ServerId") - .HasColumnType("int"); - - b.HasKey("Id"); - - b.HasIndex("NodeId"); - - b.HasIndex("ServerId"); - - b.ToTable("Allocations", "Servers"); - }); - - modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.Backup", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("Id")); - - b.Property("CreatedAt") - .HasColumnType("datetime(6)"); - - b.Property("FinishedAt") - .HasColumnType("datetime(6)"); - - b.Property("Name") - .IsRequired() - .HasColumnType("longtext"); - - b.Property("ServerId") - .HasColumnType("int"); - - b.Property("Size") - .HasColumnType("bigint"); - - b.Property("State") - .HasColumnType("int"); - - b.HasKey("Id"); - - b.HasIndex("ServerId"); - - b.ToTable("Backups", "Servers"); - }); - - modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.Network", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("Id")); - - b.Property("Name") - .IsRequired() - .HasColumnType("longtext"); - - b.Property("NodeId") - .HasColumnType("int"); - - b.HasKey("Id"); - - b.HasIndex("NodeId"); - - b.ToTable("Networks", "Servers"); - }); - - modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.Node", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("Id")); - - b.Property("ApiPort") - .HasColumnType("int"); - - b.Property("Fqdn") - .IsRequired() - .HasColumnType("longtext"); - - b.Property("Name") - .IsRequired() - .HasColumnType("longtext"); - - b.Property("SslEnabled") - .HasColumnType("tinyint(1)"); - - b.Property("Token") - .IsRequired() - .HasColumnType("longtext"); - - b.HasKey("Id"); - - b.ToTable("Nodes", "Servers"); - }); - - modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.Server", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("Id")); - - b.Property("Cpu") - .HasColumnType("int"); - - b.Property("Disk") - .HasColumnType("int"); - - b.Property("DockerImageIndex") - .HasColumnType("int"); - - b.Property("Memory") - .HasColumnType("int"); - - b.Property("Name") - .IsRequired() - .HasColumnType("longtext"); - - b.Property("NetworkId") - .HasColumnType("int"); - - b.Property("NodeId") - .HasColumnType("int"); - - b.Property("OverrideDockerImage") - .HasColumnType("longtext"); - - b.Property("OverrideStartupCommand") - .HasColumnType("longtext"); - - b.Property("StarId") - .HasColumnType("int"); - - b.Property("VirtualDiskEnabled") - .HasColumnType("tinyint(1)"); - - b.HasKey("Id"); - - b.HasIndex("NetworkId"); - - b.HasIndex("NodeId"); - - b.HasIndex("StarId"); - - b.ToTable("Servers", "Servers"); - }); - - modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.ServerVariable", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("Id")); - - b.Property("Key") - .IsRequired() - .HasColumnType("longtext"); - - b.Property("ServerId") - .HasColumnType("int"); - - b.Property("Value") - .IsRequired() - .HasColumnType("longtext"); - - b.HasKey("Id"); - - b.HasIndex("ServerId"); - - b.ToTable("ServerVariables", "Servers"); - }); - - modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.Star", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("Id")); - - b.Property("AllowDockerImageChanging") - .HasColumnType("tinyint(1)"); - - b.Property("Author") - .IsRequired() - .HasColumnType("longtext"); - - b.Property("DefaultDockerImageIndex") - .HasColumnType("int"); - - b.Property("DonationUrl") - .HasColumnType("longtext"); - - b.Property("FolderId") - .HasColumnType("int"); - - b.Property("InstallDockerImage") - .IsRequired() - .HasColumnType("longtext"); - - b.Property("InstallScript") - .IsRequired() - .HasColumnType("longtext"); - - b.Property("InstallShell") - .IsRequired() - .HasColumnType("longtext"); - - b.Property("Name") - .IsRequired() - .HasColumnType("longtext"); - - b.Property("OnlineDetection") - .IsRequired() - .HasColumnType("longtext"); - - b.Property("ParseConfiguration") - .IsRequired() - .HasColumnType("longtext"); - - b.Property("RequiredAllocations") - .HasColumnType("int"); - - b.Property("StartupCommand") - .IsRequired() - .HasColumnType("longtext"); - - b.Property("StopCommand") - .IsRequired() - .HasColumnType("longtext"); - - b.Property("UpdateUrl") - .HasColumnType("longtext"); - - b.HasKey("Id"); - - b.HasIndex("FolderId"); - - b.ToTable("Stars", "Servers"); - }); - - modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.StarDockerImage", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("Id")); - - b.Property("AutoPulling") - .HasColumnType("tinyint(1)"); - - b.Property("DisplayName") - .IsRequired() - .HasColumnType("longtext"); - - b.Property("Identifier") - .IsRequired() - .HasColumnType("longtext"); - - b.Property("StarId") - .HasColumnType("int"); - - b.HasKey("Id"); - - b.HasIndex("StarId"); - - b.ToTable("StarDockerImages", "Servers"); - }); - - modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.StarFolder", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("Id")); - - b.Property("Name") - .IsRequired() - .HasColumnType("longtext"); - - b.HasKey("Id"); - - b.ToTable("StarFolders", "Servers"); - }); - - modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.StarVariable", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("Id")); - - b.Property("AllowEditing") - .HasColumnType("tinyint(1)"); - - b.Property("AllowViewing") - .HasColumnType("tinyint(1)"); - - b.Property("DefaultValue") - .IsRequired() - .HasColumnType("longtext"); - - b.Property("Description") - .IsRequired() - .HasColumnType("longtext"); - - b.Property("DisplayName") - .IsRequired() - .HasColumnType("longtext"); - - b.Property("Filter") - .HasColumnType("longtext"); - - b.Property("Key") - .IsRequired() - .HasColumnType("longtext"); - - b.Property("StarId") - .HasColumnType("int"); - - b.Property("Type") - .HasColumnType("int"); - - b.HasKey("Id"); - - b.HasIndex("StarId"); - - b.ToTable("StarVariables", "Servers"); - }); - - modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.Allocation", b => - { - b.HasOne("MoonlightServers.ApiServer.Database.Entities.Node", "Node") - .WithMany("Allocations") - .HasForeignKey("NodeId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MoonlightServers.ApiServer.Database.Entities.Server", "Server") - .WithMany("Allocations") - .HasForeignKey("ServerId"); - - b.Navigation("Node"); - - b.Navigation("Server"); - }); - - modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.Backup", b => - { - b.HasOne("MoonlightServers.ApiServer.Database.Entities.Server", "Server") - .WithMany("Backups") - .HasForeignKey("ServerId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Server"); - }); - - modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.Network", b => - { - b.HasOne("MoonlightServers.ApiServer.Database.Entities.Node", "Node") - .WithMany() - .HasForeignKey("NodeId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Node"); - }); - - modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.Server", b => - { - b.HasOne("MoonlightServers.ApiServer.Database.Entities.Network", "Network") - .WithMany("Servers") - .HasForeignKey("NetworkId"); - - b.HasOne("MoonlightServers.ApiServer.Database.Entities.Node", "Node") - .WithMany("Servers") - .HasForeignKey("NodeId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MoonlightServers.ApiServer.Database.Entities.Star", "Star") - .WithMany() - .HasForeignKey("StarId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Network"); - - b.Navigation("Node"); - - b.Navigation("Star"); - }); - - modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.ServerVariable", b => - { - b.HasOne("MoonlightServers.ApiServer.Database.Entities.Server", "Server") - .WithMany("Variables") - .HasForeignKey("ServerId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Server"); - }); - - modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.Star", b => - { - b.HasOne("MoonlightServers.ApiServer.Database.Entities.StarFolder", "Folder") - .WithMany("Stars") - .HasForeignKey("FolderId"); - - b.Navigation("Folder"); - }); - - modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.StarDockerImage", b => - { - b.HasOne("MoonlightServers.ApiServer.Database.Entities.Star", null) - .WithMany("DockerImages") - .HasForeignKey("StarId"); - }); - - modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.StarVariable", b => - { - b.HasOne("MoonlightServers.ApiServer.Database.Entities.Star", null) - .WithMany("Variables") - .HasForeignKey("StarId"); - }); - - modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.Network", b => - { - b.Navigation("Servers"); - }); - - modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.Node", b => - { - b.Navigation("Allocations"); - - b.Navigation("Servers"); - }); - - modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.Server", b => - { - b.Navigation("Allocations"); - - b.Navigation("Backups"); - - b.Navigation("Variables"); - }); - - modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.Star", b => - { - b.Navigation("DockerImages"); - - b.Navigation("Variables"); - }); - - modelBuilder.Entity("MoonlightServers.ApiServer.Database.Entities.StarFolder", b => - { - b.Navigation("Stars"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/MoonlightServers.ApiServer/Database/MoonlightServersDataContext.cs b/MoonlightServers.ApiServer/Database/MoonlightServersDataContext.cs new file mode 100644 index 0000000..03552a2 --- /dev/null +++ b/MoonlightServers.ApiServer/Database/MoonlightServersDataContext.cs @@ -0,0 +1,13 @@ +using Moonlight.ApiServer.Configuration; +using Moonlight.ApiServer.Helpers; + +namespace MoonlightServers.ApiServer.Database; + +public class MoonlightServersDataContext : DatabaseContext +{ + public override string Prefix { get; } = "MoonlightServers"; + + public MoonlightServersDataContext(AppConfiguration configuration) : base(configuration) + { + } +} \ No newline at end of file diff --git a/MoonlightServers.ApiServer/Database/ServersContext.cs b/MoonlightServers.ApiServer/Database/ServersContext.cs deleted file mode 100644 index 86c4877..0000000 --- a/MoonlightServers.ApiServer/Database/ServersContext.cs +++ /dev/null @@ -1,21 +0,0 @@ -using Microsoft.EntityFrameworkCore; -using Moonlight.ApiServer.App.Helpers.Database; -using MoonlightServers.ApiServer.Database.Entities; - -namespace MoonlightServers.ApiServer.Database; - -public class ServersContext : DatabaseContext -{ - public override string Prefix => "Servers"; - - public DbSet Allocations { get; set; } - public DbSet Backups { get; set; } - public DbSet Networks { get; set; } - public DbSet Nodes { get; set; } - public DbSet Servers { get; set; } - public DbSet ServerVariables { get; set; } - public DbSet Stars { get; set; } - public DbSet StarDockerImages { get; set; } - public DbSet StarFolders { get; set; } - public DbSet StarVariables { get; set; } -} \ No newline at end of file diff --git a/MoonlightServers.ApiServer/Extensions/NodeExtensions.cs b/MoonlightServers.ApiServer/Extensions/NodeExtensions.cs deleted file mode 100644 index 870ce5b..0000000 --- a/MoonlightServers.ApiServer/Extensions/NodeExtensions.cs +++ /dev/null @@ -1,22 +0,0 @@ -using MoonCore.Helpers; -using MoonlightServers.ApiServer.Database.Entities; - -namespace MoonlightServers.ApiServer.Extensions; - -public static class NodeExtensions -{ - public static HttpApiClient CreateClient(this Node node) - { - var httpClient = new HttpClient(new HttpClientHandler() // TODO: Make global http config for proxy etc - { - UseProxy = false - }); - - var url = $"{(node.SslEnabled ? "https" : "http")}://{node.Fqdn}:{node.ApiPort}/"; - httpClient.BaseAddress = new Uri(url); - - httpClient.DefaultRequestHeaders.Add("Authorization", node.Token); - - return new HttpApiClient(httpClient); - } -} \ No newline at end of file diff --git a/MoonlightServers.ApiServer/Http/Controllers/Admin/Nodes/NodeAllocationsController.cs b/MoonlightServers.ApiServer/Http/Controllers/Admin/Nodes/NodeAllocationsController.cs deleted file mode 100644 index f9bb4fc..0000000 --- a/MoonlightServers.ApiServer/Http/Controllers/Admin/Nodes/NodeAllocationsController.cs +++ /dev/null @@ -1,63 +0,0 @@ -using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Mvc; -using Microsoft.EntityFrameworkCore; -using MoonCore.Extended.Abstractions; -using MoonCore.Helpers; -using Moonlight.ApiServer.App.Attributes; -using Moonlight.ApiServer.App.Exceptions; -using Moonlight.ApiServer.App.Helpers; -using MoonlightServers.ApiServer.Database.Entities; -using MoonlightServers.Shared.Http.Requests.Admin.Allocations; -using MoonlightServers.Shared.Http.Responses.Admin.Allocations; - -namespace MoonlightServers.ApiServer.Http.Controllers.Admin.Nodes; - -[ApiController] -[Route("admin/servers/nodes/{rootItem:int}/allocations")] -public class NodeAllocationsController : BaseSubCrudController -{ - public override Func> Property => node => node.Allocations; - - public NodeAllocationsController(DatabaseRepository itemRepository, DatabaseRepository rootItemRepository, IHttpContextAccessor contextAccessor) : base(itemRepository, rootItemRepository, contextAccessor) - { - PermissionPrefix = "admin.servers.nodes.allocations"; - } - - [HttpPost] - [RequirePermission("admin.servers.nodes.allocations.create")] - public override async Task> Create(CreateAllocationRequest request) - { - if (ItemRepository.Get().Any(x => x.IpAddress == request.IpAddress && x.Port == request.Port)) - throw new ApiException("An allocation with this ip and port already exists", statusCode: 400); - - var item = Mapper.Map(request!); - - Property.Invoke(RootItem).Add(item); - RootItemRepository.Update(RootItem); - - var response = Mapper.Map(item); - - return Ok(response); - } - - [HttpPatch("{id}")] - [RequirePermission("admin.servers.nodes.allocations.create")] - public override async Task> Update(int id, UpdateAllocationRequest request) - { - var item = LoadItemById(id); - - if (ItemRepository.Get().Any(x => x.IpAddress == request.IpAddress && x.Port == request.Port && x.Id != item.Id)) - throw new ApiException("An allocation with this ip and port already exists", statusCode: 400); - - var mappedItem = Mapper.Map(item, request!, ignoreNullValues: true); - - ItemRepository.Update(mappedItem); - - var response = Mapper.Map(mappedItem); - - return Ok(response); - } - - protected override IEnumerable IncludeRelations(IQueryable items) - => items.Include(x => x.Allocations); -} \ No newline at end of file diff --git a/MoonlightServers.ApiServer/Http/Controllers/Admin/Nodes/NodesController.cs b/MoonlightServers.ApiServer/Http/Controllers/Admin/Nodes/NodesController.cs deleted file mode 100644 index f47a953..0000000 --- a/MoonlightServers.ApiServer/Http/Controllers/Admin/Nodes/NodesController.cs +++ /dev/null @@ -1,105 +0,0 @@ -using System.Text.RegularExpressions; -using Microsoft.AspNetCore.Mvc; -using MoonCore.Extended.Abstractions; -using MoonCore.Helpers; -using Moonlight.ApiServer.App.Attributes; -using Moonlight.ApiServer.App.Exceptions; -using Moonlight.ApiServer.App.Helpers; -using MoonlightServers.DaemonShared.Http.Resources.Sys; -using MoonlightServers.ApiServer.Database.Entities; -using MoonlightServers.ApiServer.Extensions; -using MoonlightServers.Shared.Http.Requests.Admin.Nodes; -using MoonlightServers.Shared.Http.Responses.Admin.Nodes; - -namespace MoonlightServers.ApiServer.Http.Controllers.Admin.Nodes; - -[ApiController] -[Route("admin/servers/nodes")] -public class NodesController : BaseCrudController -{ - public NodesController(DatabaseRepository itemRepository) : base(itemRepository) - { - PermissionPrefix = "admin.servers.nodes"; - } - - [HttpPost] - [RequirePermission("admin.servers.nodes.create")] - public override async Task> Create(CreateNodeRequest request) - { - ValidateFqdn(request.Fqdn, request.SslEnabled); - - var node = Mapper.Map(request); - node.Token = Formatter.GenerateString(32); - - var finalNode = ItemRepository.Add(node); - - return Ok(Mapper.Map(finalNode)); - } - - [HttpPatch("{id}")] - [RequirePermission("admin.servers.nodes.update")] - public override async Task> Update(int id, UpdateNodeRequest request) - { - ValidateFqdn(request.Fqdn, request.SslEnabled); - - var item = LoadItemById(id); - - item = Mapper.Map(item, request); - - ItemRepository.Update(item); - - return Ok(Mapper.Map(item)); - } - - [HttpGet("{id}/status")] - [RequirePermission("admin.servers.nodes.status")] - public async Task> Status(int id) - { - var node = LoadItemById(id); - - using var httpClient = node.CreateClient(); - - SystemInfoResponse response; - - try - { - response = await httpClient.GetJson("system/info"); - } - catch (HttpRequestException e) - { - throw new ApiException( - "The requested node's api server was not reachable", - e.Message, - statusCode: 502 - ); - } - - var result = Mapper.Map(response); - - return Ok(result); - } - - private void ValidateFqdn(string fqdn, bool ssl) - { - if (ssl) - { - // Is it a valid domain? - if (Regex.IsMatch(fqdn, "^(?!-)(?:[a-zA-Z\\d-]{0,62}[a-zA-Z\\d]\\.)+(?:[a-zA-Z]{2,})$")) - return; - - throw new ApiException("The fqdn needs to be a valid domain. If you want to use an ip address as the fqdn, disable ssl for this node", statusCode: 400); - } - else - { - // Is it a valid domain? - if (Regex.IsMatch(fqdn, "^(?!-)(?:[a-zA-Z\\d-]{0,62}[a-zA-Z\\d]\\.)+(?:[a-zA-Z]{2,})$")) - return; - - // Is it a valid ip? - if (Regex.IsMatch(fqdn, "^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$")) - return; - - throw new ApiException("The fqdn needs to be either a domain or an ip", statusCode: 400); - } - } -} \ No newline at end of file diff --git a/MoonlightServers.ApiServer/Http/Controllers/ExampleController.cs b/MoonlightServers.ApiServer/Http/Controllers/ExampleController.cs new file mode 100644 index 0000000..1a4b4b9 --- /dev/null +++ b/MoonlightServers.ApiServer/Http/Controllers/ExampleController.cs @@ -0,0 +1,28 @@ +using Microsoft.AspNetCore.Mvc; +using MoonlightServers.ApiServer.Services; +using MoonlightServers.Shared.Http.Responses; + +namespace MoonlightServers.ApiServer.Http.Controllers; + +[ApiController] +[Route("api/example")] +public class ExampleController : Controller +{ + private readonly ExampleService ExampleService; + + public ExampleController(ExampleService exampleService) + { + ExampleService = exampleService; + } + + [HttpGet] + public async Task Get() + { + var val = await ExampleService.GetValue(); + + return new ExampleResponse() + { + Number = val + }; + } +} \ No newline at end of file diff --git a/MoonlightServers.ApiServer/MoonlightServers.ApiServer.csproj b/MoonlightServers.ApiServer/MoonlightServers.ApiServer.csproj index 8bef13b..cf02fcf 100644 --- a/MoonlightServers.ApiServer/MoonlightServers.ApiServer.csproj +++ b/MoonlightServers.ApiServer/MoonlightServers.ApiServer.csproj @@ -1,50 +1,30 @@ - + net8.0 - enable enable + enable - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - - - - - - - - - - ..\..\Moonlight\Moonlight\ApiServer\bin\Debug\net8.0\Moonlight.ApiServer.dll - - - ..\..\Moonlight\Moonlight\Shared\bin\Debug\net8.0\Moonlight.Shared.dll - + + + - - - - - - - - + + + + + + + + + + + + diff --git a/MoonlightServers.ApiServer/MoonlightServersPlugin.cs b/MoonlightServers.ApiServer/MoonlightServersPlugin.cs deleted file mode 100644 index e04d782..0000000 --- a/MoonlightServers.ApiServer/MoonlightServersPlugin.cs +++ /dev/null @@ -1,34 +0,0 @@ -using Microsoft.AspNetCore.Builder; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Logging; -using MoonCore.Extended.Helpers; -using Moonlight.ApiServer.App.PluginApi; -using MoonlightServers.ApiServer.Database; - -namespace MoonlightServers.ApiServer; - -public class MoonlightServersPlugin : MoonlightPlugin -{ - public MoonlightServersPlugin(ILogger logger, PluginService pluginService) : base(logger, pluginService) - { - } - - public override Task OnLoaded() - { - return Task.CompletedTask; - } - - public override Task OnAppBuilding(WebApplicationBuilder builder, DatabaseHelper databaseHelper) - { - // Register database - builder.Services.AddDbContext(); - databaseHelper.AddDbContext(); - - return Task.CompletedTask; - } - - public override Task OnAppConfiguring(WebApplication app) - { - return Task.CompletedTask; - } -} \ No newline at end of file diff --git a/MoonlightServers.ApiServer/Program.cs b/MoonlightServers.ApiServer/Program.cs new file mode 100644 index 0000000..5608152 --- /dev/null +++ b/MoonlightServers.ApiServer/Program.cs @@ -0,0 +1,7 @@ +using Moonlight.ApiServer; + +var startup = new Startup(); + +await startup.Run(args, [ + typeof(Program).Assembly +]); \ No newline at end of file diff --git a/MoonlightServers.ApiServer/Properties/launchSettings.json b/MoonlightServers.ApiServer/Properties/launchSettings.json new file mode 100644 index 0000000..cb3b758 --- /dev/null +++ b/MoonlightServers.ApiServer/Properties/launchSettings.json @@ -0,0 +1,17 @@ +{ + "$schema": "http://json.schemastore.org/launchsettings.json", + "profiles": { + "Dev Server": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": false, + "launchUrl": "swagger", + "applicationUrl": "http://localhost:5269", + "commandLineArgs": "--frontend-asset /css/MoonlightServers.min.css", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development", + "MOONLIGHT_APP_PUBLICURL": "http://localhost:5269" + } + } + } +} diff --git a/MoonlightServers.ApiServer/Services/ExampleService.cs b/MoonlightServers.ApiServer/Services/ExampleService.cs new file mode 100644 index 0000000..767084f --- /dev/null +++ b/MoonlightServers.ApiServer/Services/ExampleService.cs @@ -0,0 +1,22 @@ +using MoonCore.Attributes; + +namespace MoonlightServers.ApiServer.Services; + +[Singleton] +public class ExampleService +{ + private readonly Random Random; + private readonly ILogger Logger; + + public ExampleService(ILogger logger) + { + Logger = logger; + Random = new(); + } + + public async Task GetValue() + { + Logger.LogInformation("Generating value"); + return Random.Next(0, 10324); + } +} \ No newline at end of file diff --git a/MoonlightServers.ApiServer/Startup/DatabaseStartup.cs b/MoonlightServers.ApiServer/Startup/DatabaseStartup.cs new file mode 100644 index 0000000..68ed678 --- /dev/null +++ b/MoonlightServers.ApiServer/Startup/DatabaseStartup.cs @@ -0,0 +1,15 @@ +using Moonlight.ApiServer.Helpers; +using Moonlight.ApiServer.Interfaces.Startup; +using MoonlightServers.ApiServer.Database; + +namespace MoonlightServers.ApiServer.Startup; + +public class DatabaseStartup : IDatabaseStartup +{ + public Task ConfigureDatabase(DatabaseContextCollection collection) + { + collection.Add(); + + return Task.CompletedTask; + } +} \ No newline at end of file diff --git a/MoonlightServers.ApiServer/Startup/PluginStartup.cs b/MoonlightServers.ApiServer/Startup/PluginStartup.cs new file mode 100644 index 0000000..323b366 --- /dev/null +++ b/MoonlightServers.ApiServer/Startup/PluginStartup.cs @@ -0,0 +1,29 @@ +using MoonCore.Extensions; +using Moonlight.ApiServer.Interfaces.Startup; + +namespace MoonlightServers.ApiServer.Startup; + +public class PluginStartup : IAppStartup +{ + private readonly ILogger Logger; + + public PluginStartup(ILogger logger) + { + Logger = logger; + } + + public Task BuildApp(IHostApplicationBuilder builder) + { + Logger.LogInformation("Elo World from MoonlightServers"); + + // Scan the current plugin assembly for di services + builder.Services.AutoAddServices(); + + return Task.CompletedTask; + } + + public Task ConfigureApp(IApplicationBuilder app) + { + return Task.CompletedTask; + } +} \ No newline at end of file diff --git a/MoonlightServers.Client/Implementations/ServersSidebarProvider.cs b/MoonlightServers.Client/Implementations/ServersSidebarProvider.cs deleted file mode 100644 index cc0a0fa..0000000 --- a/MoonlightServers.Client/Implementations/ServersSidebarProvider.cs +++ /dev/null @@ -1,27 +0,0 @@ -using Moonlight.Client.App.Interfaces; -using Moonlight.Client.App.Models; - -namespace MoonlightServers.Client.Implementations; - -public class ServersSidebarProvider : ISidebarItemProvider -{ - public SidebarItem[] GetItems() - { - return [new () - { - Name = "Servers", - Target = "/servers", - Icon = "bi bi-hdd-rack", - Priority = 5 - }, - new() - { - Name = "Servers", - Target = "/admin/servers", - Priority = 5, - Icon = "bi bi-hdd-rack", - Group = "Admin", - Permission = "admin.servers.get" - }]; - } -} \ No newline at end of file diff --git a/MoonlightServers.Client/MoonlightServers.Client.csproj b/MoonlightServers.Client/MoonlightServers.Client.csproj deleted file mode 100644 index c0c825b..0000000 --- a/MoonlightServers.Client/MoonlightServers.Client.csproj +++ /dev/null @@ -1,40 +0,0 @@ - - - - net8.0 - enable - enable - - - - - - - - - - - - - - - - - - - - - ..\..\Moonlight\Moonlight\Client\bin\Debug\net8.0\Moonlight.Client.dll - - - ..\..\Moonlight\Moonlight\Shared\bin\Debug\net8.0\Moonlight.Shared.dll - - - - - - - - - - diff --git a/MoonlightServers.Client/MoonlightServersClientPlugin.cs b/MoonlightServers.Client/MoonlightServersClientPlugin.cs deleted file mode 100644 index 84718a5..0000000 --- a/MoonlightServers.Client/MoonlightServersClientPlugin.cs +++ /dev/null @@ -1,31 +0,0 @@ -using Microsoft.AspNetCore.Components.WebAssembly.Hosting; -using Microsoft.Extensions.Logging; -using Moonlight.Client.App.Interfaces; -using Moonlight.Client.App.PluginApi; -using MoonlightServers.Client.Implementations; - -namespace MoonlightServers.Client; - -public class MoonlightServersClientPlugin : MoonlightClientPlugin -{ - public MoonlightServersClientPlugin(ILogger logger, PluginService pluginService) : base(logger, pluginService) - { - } - - public override Task OnLoaded() - { - PluginService.RegisterImplementation(); - - return Task.CompletedTask; - } - - public override Task OnAppBuilding(WebAssemblyHostBuilder builder) - { - return Task.CompletedTask; - } - - public override Task OnAppConfiguring(WebAssemblyHost app) - { - return Task.CompletedTask; - } -} \ No newline at end of file diff --git a/MoonlightServers.Client/UI/Components/Forms/AllocationEditor.razor b/MoonlightServers.Client/UI/Components/Forms/AllocationEditor.razor deleted file mode 100644 index b478f64..0000000 --- a/MoonlightServers.Client/UI/Components/Forms/AllocationEditor.razor +++ /dev/null @@ -1,63 +0,0 @@ -@using Moonlight.Client.App.Models.Crud -@using Moonlight.Shared.Http.Resources -@using MoonlightServers.Shared.Http.Requests.Admin.Allocations -@using MoonlightServers.Shared.Http.Responses.Admin.Allocations - -@inject HttpApiClient HttpApiClient - - - - - - - - - -@code -{ - [Parameter] - public int NodeId { get; set; } - - private void OnConfigure(CrudOptions options) - { - options.Loader = async (page, pageSize) - => await HttpApiClient.GetJson>($"admin/servers/nodes/{NodeId}/allocations?page={page}&pageSize={pageSize}"); - - options.CreateFunction = async request => await HttpApiClient.Post($"admin/servers/nodes/{NodeId}/allocations", request); - options.UpdateFunction = async (request, item) => await HttpApiClient.Patch($"admin/servers/nodes/{NodeId}/allocations/{item.Id}", request); - options.DeleteFunction = async item => await HttpApiClient.Delete($"admin/servers/nodes/{NodeId}/allocations/{item.Id}"); - - options.OnConfigureCreate = option => - { - option - .DefaultPage - .DefaultSection - .AddProperty(x => x.IpAddress) - .WithColumns(6); - - option - .DefaultPage - .DefaultSection - .AddProperty(x => x.Port) - .WithColumns(6); - }; - - options.OnConfigureUpdate = (option, item) => - { - option - .DefaultPage - .DefaultSection - .AddProperty(x => x.IpAddress) - .WithColumns(6); - - option - .DefaultPage - .DefaultSection - .AddProperty(x => x.Port) - .WithColumns(6); - }; - } -} diff --git a/MoonlightServers.Client/UI/Components/Partials/NodeLogs.razor b/MoonlightServers.Client/UI/Components/Partials/NodeLogs.razor deleted file mode 100644 index 6b090f1..0000000 --- a/MoonlightServers.Client/UI/Components/Partials/NodeLogs.razor +++ /dev/null @@ -1,47 +0,0 @@ -
-
-
-
-
- -
- -
-
-
- -
- 10:43:29 [INF] ExecutionContext Loaded server 44 [23/25]
- 10:43:29 [INF] ExecutionContext Loaded server 45 [24/25]
- 10:43:29 [INF] ExecutionContext Loaded server 50 [25/25]
- 10:43:29 [INF] ExecutionContext Fetched servers. Closing websocket connection
- 10:43:29 [INF] AsyncTaskMethodBuilder Finishing boot
- 10:43:29 [INF] AsyncTaskMethodBuilder Restoring docker containers
- 10:43:29 [INF] ExecutionContext Restored server 35 and reattached stream
- 10:43:29 [INF] ExecutionContext Restored server 19 and reattached stream
- 10:43:29 [INF] ExecutionContext Restored server 2 and reattached stream
- 10:43:29 [INF] ExecutionContext Restored server 9 and reattached stream
- 10:43:29 [INF] ExecutionContext Restored server 44 and reattached stream
- 10:43:29 [INF] ExecutionContext Restored server 45 and reattached stream
- 10:43:29 [INF] ExecutionContext Restored server 42 and reattached stream
- 10:43:29 [INF] ExecutionContext Restored server 39 and reattached stream
- 10:43:29 [INF] ExecutionContext Restored server 17 and reattached stream
- 10:43:29 [INF] ExecutionContext Restored server 15 and reattached stream
- 10:43:29 [INF] ExecutionContext Restored server 12 and reattached stream
- 10:50:08 [FTL] ConnectionManager Connection id "0HN65LD3UMODC" application never completed.
- 11:20:29 [FTL] ConnectionManager Connection id "0HN65LD3UMOE9" application never completed.
- 15:53:04 [FTL] ConnectionManager Connection id "0HN65LD3UMPS5" application never completed.
- 15:53:04 [FTL] ConnectionManager Connection id "0HN65LD3UMPN2" application never completed.
- 15:53:04 [FTL] ConnectionManager Connection id "0HN65LD3UMPN9" application never completed.
- 15:53:04 [FTL] ConnectionManager Connection id "0HN65LD3UMPRK" application never completed.
- 20:11:22 [WRN] AsyncTaskMethodBuilder`1 Invalid username format received. Username: 'anonymous', Password: 'IEUser
-
-
- -@code -{ - [Parameter] public int NodeId { get; set; } -} \ No newline at end of file diff --git a/MoonlightServers.Client/UI/Components/Partials/NodeOverview.razor b/MoonlightServers.Client/UI/Components/Partials/NodeOverview.razor deleted file mode 100644 index 1369329..0000000 --- a/MoonlightServers.Client/UI/Components/Partials/NodeOverview.razor +++ /dev/null @@ -1,117 +0,0 @@ -@using System.Text.Json -@using MoonlightServers.Shared.Http.Responses.Admin.Nodes - -@implements IDisposable - -@inject HttpApiClient HttpApiClient - - -
- @if (IsOffline) - { - - - } - else - { - @* -
-

- Node overview -

-

- See all important details of this node at one quick look -

-
-*@ - - var cpuUsage = Math.Round(Status.CpuUsage.Average(x => x), 2) + "%"; - var memoryUsage = $"{Formatter.FormatSize((long)(Status.MemoryTotal - Status.MemoryAvailable))} / {Formatter.FormatSize((long)Status.MemoryTotal)}"; - var uptime = Formatter.FormatUptime(Status.Uptime); - var diskUsage = $"{Formatter.FormatSize((long)(Status.DiskTotal - Status.DiskFree))} / {Formatter.FormatSize((long)Status.DiskTotal)}"; - -
- - - - - - - - -
- -
-

- CPU Cores -

-

- View the nodes cpu usage in detail -

-
- -
- @{ - int index = 1; - } - - @foreach (var usage in Status.CpuUsage) - { - - - index++; - } -
- } -
-
- -@code -{ - [Parameter] public int NodeId { get; set; } - - private bool IsOffline = false; - private bool KeepRefreshing = true; - - private StatusNodeResponse Status; - - private async Task Load(LazyLoader arg) - { - await UpdateStatus(); - - Task.Run(async () => - { - while (KeepRefreshing) - { - await UpdateStatus(); - await InvokeAsync(StateHasChanged); - - await Task.Delay(TimeSpan.FromSeconds(1)); - } - }); - } - - private async Task UpdateStatus() - { - IsOffline = false; - - try - { - Status = await HttpApiClient.GetJson($"admin/servers/nodes/{NodeId}/status"); - - Console.WriteLine(JsonSerializer.Serialize(Status)); - } - catch (Exception) - { - IsOffline = true; - } - } - - public void Dispose() - { - KeepRefreshing = false; - } -} \ No newline at end of file diff --git a/MoonlightServers.Client/UI/Views/Admin/Index.razor b/MoonlightServers.Client/UI/Views/Admin/Index.razor deleted file mode 100644 index ae0fca9..0000000 --- a/MoonlightServers.Client/UI/Views/Admin/Index.razor +++ /dev/null @@ -1,5 +0,0 @@ -@page "/admin/servers" - -@attribute [RequirePermission("admin.servers.get")] - - \ No newline at end of file diff --git a/MoonlightServers.Client/UI/Views/Admin/Nodes.razor b/MoonlightServers.Client/UI/Views/Admin/Nodes.razor deleted file mode 100644 index b7f7237..0000000 --- a/MoonlightServers.Client/UI/Views/Admin/Nodes.razor +++ /dev/null @@ -1,224 +0,0 @@ -@page "/admin/servers/nodes" - -@using System.Diagnostics -@using MoonCore.Exceptions -@using Moonlight.Client.App.Models.Crud -@using Moonlight.Client.App.Services -@using Moonlight.Shared.Http.Resources -@using MoonlightServers.Client.UI.Components.Forms -@using MoonlightServers.Shared.Http.Requests.Admin.Nodes -@using MoonlightServers.Shared.Http.Responses.Admin.Nodes -@using MoonlightServers.Client.UI.Components.Partials - -@inject HttpApiClient HttpApiClient -@inject AlertService AlertService - -@attribute [RequirePermission("admin.servers.nodes.get")] - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - -
- -@code -{ - private readonly Dictionary StatusCache = new(); - - private void OnConfigure(CrudOptions options) - { - options.Loader = async (page, pageSize) => - { - var response = await HttpApiClient - .GetJson>($"admin/servers/nodes?page={page}&pageSize={pageSize}"); - - lock (StatusCache) - StatusCache.Clear(); - - Task.Run(async () => - { - foreach (var node in response.Items) - { - try - { - var status = await HttpApiClient.GetJson($"admin/servers/nodes/{node.Id}/status"); - - lock (StatusCache) - { - StatusCache.Add(node.Id, new() - { - Response = status - }); - } - } - catch (Exception e) - { - lock (StatusCache) - { - StatusCache.Add(node.Id, new() - { - Exception = e - }); - } - } - - await InvokeAsync(StateHasChanged); - } - }); - - return response; - }; - - options.CreateFunction = async request => await HttpApiClient.Post("admin/servers/nodes", request); - options.UpdateFunction = async (request, item) => await HttpApiClient.Patch($"admin/servers/nodes/{item.Id}", request); - options.DeleteFunction = async item => await HttpApiClient.Delete($"admin/servers/nodes/{item.Id}"); - - options.ShowCreateAsModal = false; - options.ShowUpdateAsModal = false; - options.ShowDetailsAsModal = false; - - options.ShowDetailsBar = false; - - options.OnConfigureCreate = option => - { - option - .DefaultPage - .DefaultSection - .AddProperty(x => x.Name); - - option - .DefaultPage - .DefaultSection - .AddProperty(x => x.Fqdn); - - option - .DefaultPage - .DefaultSection - .AddProperty(x => x.ApiPort); - - option - .DefaultPage - .DefaultSection - .AddProperty(x => x.SslEnabled); - }; - - options.OnConfigureUpdate = (option, item) => - { - option - .DefaultPage - .DefaultSection - .AddProperty(x => x.Name); - - option - .DefaultPage - .DefaultSection - .AddProperty(x => x.Fqdn); - - option - .DefaultPage - .DefaultSection - .AddProperty(x => x.ApiPort); - - option - .DefaultPage - .DefaultSection - .AddProperty(x => x.SslEnabled); - }; - } - - private async Task ShowDetails(Exception e) - { - await AlertService.ErrorLog("Node connection error", e.ToStringDemystified()); - } - - class NodeFetchState - { - public StatusNodeResponse? Response { get; set; } - public Exception? Exception { get; set; } - } -} \ No newline at end of file diff --git a/MoonlightServers.Client/_Imports.razor b/MoonlightServers.Client/_Imports.razor deleted file mode 100644 index a466a54..0000000 --- a/MoonlightServers.Client/_Imports.razor +++ /dev/null @@ -1,15 +0,0 @@ -@using System.Net.Http -@using System.Net.Http.Json -@using Microsoft.AspNetCore.Components.Routing -@using Microsoft.AspNetCore.Components.Web -@using Microsoft.AspNetCore.Components.WebAssembly.Http -@using Microsoft.JSInterop - -@using MoonCore.Services -@using MoonCore.Helpers - -@using Moonlight.Client -@using Moonlight.Client.App.UI -@using Moonlight.Client.App.UI.Components -@using Moonlight.Client.App.UI.Layouts -@using Moonlight.Client.App.Attributes \ No newline at end of file diff --git a/MoonlightServers.Daemon/App/Configuration/AppConfiguration.cs b/MoonlightServers.Daemon/App/Configuration/AppConfiguration.cs deleted file mode 100644 index 8e51b53..0000000 --- a/MoonlightServers.Daemon/App/Configuration/AppConfiguration.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace MoonlightServers.Daemon.App.Configuration; - -public class AppConfiguration -{ - -} \ No newline at end of file diff --git a/MoonlightServers.Daemon/App/Helpers/HostHelper.cs b/MoonlightServers.Daemon/App/Helpers/HostHelper.cs deleted file mode 100644 index ee5d5ed..0000000 --- a/MoonlightServers.Daemon/App/Helpers/HostHelper.cs +++ /dev/null @@ -1,109 +0,0 @@ -using System.Globalization; -using Mono.Unix.Native; -using MoonCore.Attributes; - -namespace MoonlightServers.Daemon.App.Helpers; - -[Singleton] -public class HostHelper -{ - public async Task GetCpuModel() - { - var lines = await File.ReadAllLinesAsync("/proc/cpuinfo"); - - foreach (var line in lines) - { - if (line.StartsWith("model name")) - return line.Split(":")[1].Trim(); - } - - return "Unknown processor"; - } - - public async Task GetCpuUsage() - { - var linesBefore = await File.ReadAllLinesAsync("/proc/stat"); - await Task.Delay(1000); // Wait for 1 second - var linesAfter = await File.ReadAllLinesAsync("/proc/stat"); - - var cpuDataBefore = linesBefore - .Where(line => line.StartsWith("cpu")) - .Select(line => line.Split([" "], StringSplitOptions.RemoveEmptyEntries).Skip(1).Select(long.Parse) - .ToArray()) - .ToList(); - - var cpuDataAfter = linesAfter - .Where(line => line.StartsWith("cpu")) - .Select(line => line.Split([" "], StringSplitOptions.RemoveEmptyEntries).Skip(1).Select(long.Parse) - .ToArray()) - .ToList(); - - var numCores = Environment.ProcessorCount; - var cpuUsagePerCore = new double[numCores]; - - for (var i = 0; i < numCores; i++) - { - var beforeIdle = cpuDataBefore[i][3]; - var beforeTotal = cpuDataBefore[i].Sum(); - var afterIdle = cpuDataAfter[i][3]; - var afterTotal = cpuDataAfter[i].Sum(); - - double idleDelta = afterIdle - beforeIdle; - double totalDelta = afterTotal - beforeTotal; - - var usage = 100.0 * (1.0 - idleDelta / totalDelta); - cpuUsagePerCore[i] = usage; - } - - return cpuUsagePerCore; - } - - public async Task GetUptime() - { - var uptimeText = await File.ReadAllTextAsync("/proc/uptime"); - var values = uptimeText.Split(" "); - var seconds = double.Parse(values[0], CultureInfo.InvariantCulture); - - return TimeSpan.FromSeconds(seconds); - } - - public async Task GetMemoryDetails() // 0, total - 1, free - 2, available - 3, cached - 4, swap total - 5, swap free - { - var result = new ulong[6]; - - var memInfoText = await File.ReadAllLinesAsync("/proc/meminfo"); - - foreach (var line in memInfoText) - { - if (line.StartsWith("MemTotal:")) - result[0] = 1024 * ulong.Parse(line.Replace("MemTotal:", "").Replace("kB", "").Trim()); - - if (line.StartsWith("MemFree:")) - result[1] = 1024 * ulong.Parse(line.Replace("MemFree:", "").Replace("kB", "").Trim()); - - if (line.StartsWith("MemAvailable:")) - result[2] = 1024 * ulong.Parse(line.Replace("MemAvailable:", "").Replace("kB", "").Trim()); - - if (line.StartsWith("Cached:")) - result[3] = 1024 * ulong.Parse(line.Replace("Cached:", "").Replace("kB", "").Trim()); - - if (line.StartsWith("SwapTotal:")) - result[4] = 1024 * ulong.Parse(line.Replace("SwapTotal:", "").Replace("kB", "").Trim()); - - if (line.StartsWith("SwapFree:")) - result[5] = 1024 * ulong.Parse(line.Replace("SwapFree:", "").Replace("kB", "").Trim()); - } - - return result; - } - - public async Task GetDiskUsage() // 0, Total size - 1, Free size, - 2, Total inodes - 3, free inodes - { - var sysCallRes = Syscall.statvfs("/", out var buf); - - if (sysCallRes == -1) - return [0, 0, 0, 0]; - - return [buf.f_blocks * buf.f_frsize, buf.f_bfree * buf.f_frsize, buf.f_files, buf.f_ffree]; - } -} \ No newline at end of file diff --git a/MoonlightServers.Daemon/App/Http/Controllers/Sys/InfoController.cs b/MoonlightServers.Daemon/App/Http/Controllers/Sys/InfoController.cs deleted file mode 100644 index a584091..0000000 --- a/MoonlightServers.Daemon/App/Http/Controllers/Sys/InfoController.cs +++ /dev/null @@ -1,47 +0,0 @@ -using Microsoft.AspNetCore.Mvc; -using MoonlightServers.Daemon.App.Helpers; -using MoonlightServers.DaemonShared.Http.Resources.Sys; - -namespace MoonlightServers.Daemon.App.Http.Controllers.Sys; - -[ApiController] -[Route("system/info")] -public class InfoController : Controller -{ - private readonly HostHelper HostHelper; - - public InfoController(HostHelper hostHelper) - { - HostHelper = hostHelper; - } - - [HttpGet] - public async Task> Get() - { - var memoryDetails = await HostHelper.GetMemoryDetails(); - var diskDetails = await HostHelper.GetDiskUsage(); - - var response = new SystemInfoResponse() - { - CpuModel = await HostHelper.GetCpuModel(), - CpuUsage = await HostHelper.GetCpuUsage(), - - Uptime = await HostHelper.GetUptime(), - - MemoryTotal = memoryDetails[0], - MemoryFree = memoryDetails[1], - MemoryAvailable = memoryDetails[2], - MemoryCached = memoryDetails[3], - - SwapTotal = memoryDetails[4], - SwapFree = memoryDetails[5], - - DiskTotal = diskDetails[0], - DiskFree = diskDetails[1], - DiskTotalInodes = diskDetails[2], - DiskFreeInodes = diskDetails[3] - }; - - return Ok(response); - } -} \ No newline at end of file diff --git a/MoonlightServers.Daemon/MoonlightServers.Daemon.csproj b/MoonlightServers.Daemon/MoonlightServers.Daemon.csproj deleted file mode 100644 index 9505a98..0000000 --- a/MoonlightServers.Daemon/MoonlightServers.Daemon.csproj +++ /dev/null @@ -1,29 +0,0 @@ - - - - net8.0 - enable - enable - - - - - - - - - - - - - - - - - - - - - - - diff --git a/MoonlightServers.Daemon/Program.cs b/MoonlightServers.Daemon/Program.cs deleted file mode 100644 index 704a873..0000000 --- a/MoonlightServers.Daemon/Program.cs +++ /dev/null @@ -1,34 +0,0 @@ -using MoonCore.Extensions; -using MoonCore.Helpers; - -var loggerFactory = new LoggerFactory(); - -var loggerProviders = LoggerBuildHelper.BuildFromConfiguration(configuration => -{ - configuration.Console.Enable = true; - configuration.Console.EnableAnsiMode = true; - - configuration.FileLogging.Enable = false; -}); - -loggerFactory.AddProviders(loggerProviders); - -var logger = loggerFactory.CreateLogger("Startup"); - -logger.LogInformation("Starting MoonlightServers Daemon v2.1 Galaxy"); //TODO: Versions - -var builder = WebApplication.CreateBuilder(args); - -builder.Logging.ClearProviders(); -builder.Logging.AddProviders(loggerProviders); - -builder.Services.AutoAddServices(); - -builder.Services.AddHttpContextAccessor(); -builder.Services.AddControllers(); - -var app = builder.Build(); - -app.MapControllers(); - -app.Run(); \ No newline at end of file diff --git a/MoonlightServers.Daemon/Properties/launchSettings.json b/MoonlightServers.Daemon/Properties/launchSettings.json deleted file mode 100644 index e346f1a..0000000 --- a/MoonlightServers.Daemon/Properties/launchSettings.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "profiles": { - "http": { - "commandName": "Project", - "dotnetRunMessages": true, - "launchBrowser": false, - "launchUrl": "swagger", - "applicationUrl": "http://localhost:5167", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - } - } -} diff --git a/MoonlightServers.Daemon/appsettings.json b/MoonlightServers.Daemon/appsettings.json deleted file mode 100644 index 10f68b8..0000000 --- a/MoonlightServers.Daemon/appsettings.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "Logging": { - "LogLevel": { - "Default": "Information", - "Microsoft.AspNetCore": "Warning" - } - }, - "AllowedHosts": "*" -} diff --git a/MoonlightServers.DaemonShared/Http/Resources/Sys/SystemInfoResponse.cs b/MoonlightServers.DaemonShared/Http/Resources/Sys/SystemInfoResponse.cs deleted file mode 100644 index 89b0163..0000000 --- a/MoonlightServers.DaemonShared/Http/Resources/Sys/SystemInfoResponse.cs +++ /dev/null @@ -1,22 +0,0 @@ -namespace MoonlightServers.DaemonShared.Http.Resources.Sys; - -public class SystemInfoResponse -{ - public string CpuModel { get; set; } - public double[] CpuUsage { get; set; } - public TimeSpan Uptime { get; set; } - - public ulong MemoryTotal { get; set; } - public ulong MemoryFree { get; set; } - public ulong MemoryAvailable { get; set; } - public ulong MemoryCached { get; set; } - - public ulong SwapTotal { get; set; } - public ulong SwapFree { get; set; } - - public ulong DiskTotal { get; set; } - public ulong DiskFree { get; set; } - - public ulong DiskTotalInodes { get; set; } - public ulong DiskFreeInodes { get; set; } -} \ No newline at end of file diff --git a/MoonlightServers.DaemonShared/MoonlightServers.DaemonShared.csproj b/MoonlightServers.DaemonShared/MoonlightServers.DaemonShared.csproj deleted file mode 100644 index af2fbdf..0000000 --- a/MoonlightServers.DaemonShared/MoonlightServers.DaemonShared.csproj +++ /dev/null @@ -1,14 +0,0 @@ - - - - net8.0 - enable - enable - - - - - - - - diff --git a/MoonlightServers.Frontend/Implementations/SidebarImplementation.cs b/MoonlightServers.Frontend/Implementations/SidebarImplementation.cs new file mode 100644 index 0000000..871dc20 --- /dev/null +++ b/MoonlightServers.Frontend/Implementations/SidebarImplementation.cs @@ -0,0 +1,22 @@ +using Moonlight.Client.Interfaces; +using Moonlight.Client.Models; + +namespace MoonlightServers.Frontend.Implementations; + +public class SidebarImplementation : ISidebarItemProvider +{ + public SidebarItem[] Get() + { + return + [ + new SidebarItem() + { + Name = "Example", + Path = "/example", + Icon = "icon-moon", + Group = "MoonlightServers", + Priority = 1 + } + ]; + } +} \ No newline at end of file diff --git a/MoonlightServers.Frontend/MoonlightServers.Frontend.csproj b/MoonlightServers.Frontend/MoonlightServers.Frontend.csproj new file mode 100644 index 0000000..e82c437 --- /dev/null +++ b/MoonlightServers.Frontend/MoonlightServers.Frontend.csproj @@ -0,0 +1,35 @@ + + + + net8.0 + enable + enable + + + + + + + + + + <_ContentIncludedByDefault Remove="wwwroot\css\app.css"/> + <_ContentIncludedByDefault Remove="Pages\Home.razor"/> + + + + + + + + + + + + + + + + + + diff --git a/MoonlightServers.Frontend/Program.cs b/MoonlightServers.Frontend/Program.cs new file mode 100644 index 0000000..6def57a --- /dev/null +++ b/MoonlightServers.Frontend/Program.cs @@ -0,0 +1,7 @@ +using Moonlight.Client; + +var startup = new Startup(); + +await startup.Run(args, [ + typeof(Program).Assembly +]); \ No newline at end of file diff --git a/MoonlightServers.Frontend/Styles/additions/animations.css b/MoonlightServers.Frontend/Styles/additions/animations.css new file mode 100644 index 0000000..cabfea9 --- /dev/null +++ b/MoonlightServers.Frontend/Styles/additions/animations.css @@ -0,0 +1,9 @@ +@keyframes shimmer { + 0% { + background-position: 0 0 + } + + to { + background-position: -200% 0 + } +} \ No newline at end of file diff --git a/MoonlightServers.Frontend/Styles/additions/buttons.css b/MoonlightServers.Frontend/Styles/additions/buttons.css new file mode 100644 index 0000000..02e1385 --- /dev/null +++ b/MoonlightServers.Frontend/Styles/additions/buttons.css @@ -0,0 +1,80 @@ +/* Buttons */ + +.btn, +.btn-lg, +.btn-sm, +.btn-xs { + @apply font-medium text-sm inline-flex items-center justify-center border border-transparent rounded-lg leading-5 shadow-sm transition; +} + +.btn { + @apply px-3 py-2; +} + +.btn-lg { + @apply px-4 py-3; +} + +.btn-sm { + @apply px-2 py-1; +} + +.btn-xs { + @apply px-2 py-0.5; +} + +/* Colors */ + +.btn-primary { + @apply bg-primary-600 hover:bg-primary-500 focus-visible:outline-primary-600; +} + +.btn-secondary { + @apply bg-secondary-800 hover:bg-secondary-700 focus-visible:outline-secondary-800; +} + +.btn-tertiary { + @apply bg-tertiary-600 hover:bg-tertiary-500 focus-visible:outline-tertiary-600; +} + +.btn-danger { + @apply bg-danger-600 hover:bg-danger-500 focus-visible:outline-danger-600; +} + +.btn-warning { + @apply bg-warning-500 hover:bg-warning-400 focus-visible:outline-warning-500; +} + +.btn-info { + @apply bg-info-600 hover:bg-info-500 focus-visible:outline-info-600; +} + +.btn-success { + @apply bg-success-600 hover:bg-success-500 focus-visible:outline-success-600; +} + +/* Outline */ + +.btn-outline-primary { + @apply bg-gray-800 hover:border-gray-600 text-primary-500; +} + +.btn-outline-tertiary { + @apply bg-gray-800 hover:border-gray-600 text-tertiary-500; +} + +.btn-outline-danger { + @apply bg-gray-800 hover:border-gray-600 text-danger-500; +} + +.btn-outline-warning { + @apply bg-gray-800 hover:border-gray-600 text-warning-400; +} + +.btn-outline-info { + @apply bg-gray-800 hover:border-gray-600 text-info-500; +} + +.btn-outline-success { + @apply bg-gray-800 hover:border-gray-600 text-success-500; +} \ No newline at end of file diff --git a/MoonlightServers.Frontend/Styles/additions/cards.css b/MoonlightServers.Frontend/Styles/additions/cards.css new file mode 100644 index 0000000..5e03f35 --- /dev/null +++ b/MoonlightServers.Frontend/Styles/additions/cards.css @@ -0,0 +1,19 @@ +.card { + @apply flex flex-col bg-gray-800 shadow-sm rounded-xl; +} + +.card-header { + @apply px-5 py-4 border-b border-gray-700/60 flex items-center; +} + +.card-title { + @apply font-semibold text-gray-100; +} + +.card-body { + @apply px-5 py-5; +} + +.card-footer { + @apply pt-3 pb-3 border-t border-gray-700/60 mt-auto; +} \ No newline at end of file diff --git a/MoonlightServers.Frontend/Styles/additions/fonts.css b/MoonlightServers.Frontend/Styles/additions/fonts.css new file mode 100644 index 0000000..1f03944 --- /dev/null +++ b/MoonlightServers.Frontend/Styles/additions/fonts.css @@ -0,0 +1,3 @@ +@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=fallback'); +@import url('https://fonts.googleapis.com/css2?family=Source+Code+Pro:ital,wght@0,200..900;1,200..900&display=swap'); +@import url("https://cdn.jsdelivr.net/npm/lucide-static@0.460.0/font/lucide.css"); \ No newline at end of file diff --git a/MoonlightServers.Frontend/Styles/additions/forms.css b/MoonlightServers.Frontend/Styles/additions/forms.css new file mode 100644 index 0000000..4172b17 --- /dev/null +++ b/MoonlightServers.Frontend/Styles/additions/forms.css @@ -0,0 +1,77 @@ +/* Forms */ +input[type="search"]::-webkit-search-decoration, +input[type="search"]::-webkit-search-cancel-button, +input[type="search"]::-webkit-search-results-button, +input[type="search"]::-webkit-search-results-decoration { + -webkit-appearance: none; +} + +.form-input, +.form-textarea, +.form-multiselect, +.form-select, +.form-checkbox, +.form-radio { + @apply bg-gray-700/60 border-2 focus:ring-0 focus:ring-offset-0 disabled:bg-gray-700/30 disabled:border-gray-700 disabled:hover:border-gray-700; +} + +.form-checkbox { + @apply rounded; +} + +.form-input, +.form-textarea, +.form-multiselect, +.form-select { + @apply text-sm text-gray-100 leading-5 py-2 px-3 border-gray-700 focus:border-primary-500 shadow-sm rounded-lg; +} + +.form-input, +.form-textarea { + @apply placeholder-gray-700; +} + +.form-select { + @apply pr-10; +} + +.form-checkbox, +.form-radio { + @apply text-primary-500 checked:bg-primary-500 checked:border-transparent border border-gray-700/60 focus:border-primary-500/50; +} + +/* Switch element */ +.form-switch { + @apply relative select-none; + width: 44px; +} + +.form-switch label { + @apply block overflow-hidden cursor-pointer h-6 rounded-full; +} + +.form-switch label > span:first-child { + @apply absolute block rounded-full; + width: 20px; + height: 20px; + top: 2px; + left: 2px; + right: 50%; + transition: all .15s ease-out; +} + +.form-switch input[type="checkbox"]:checked + label { + @apply bg-primary-600; +} + +.form-switch input[type="checkbox"]:checked + label > span:first-child { + left: 22px; +} + +.form-switch input[type="checkbox"]:disabled + label { + @apply cursor-not-allowed bg-gray-700/20 border border-gray-700/60; +} + +.form-switch input[type="checkbox"]:disabled + label > span:first-child { + @apply bg-gray-600; +} \ No newline at end of file diff --git a/MoonlightServers.Frontend/Styles/additions/loaders.css b/MoonlightServers.Frontend/Styles/additions/loaders.css new file mode 100644 index 0000000..dd5327b --- /dev/null +++ b/MoonlightServers.Frontend/Styles/additions/loaders.css @@ -0,0 +1,19 @@ +.loader { + width: 42px; + height: 42px; + border: 3px solid #FFF; + border-bottom-color: transparent; + border-radius: 50%; + display: inline-block; + box-sizing: border-box; + animation: loader-rotation 1s linear infinite; +} + +@keyframes loader-rotation { + 0% { + transform: rotate(0deg); + } + 100% { + transform: rotate(360deg); + } +} \ No newline at end of file diff --git a/MoonlightServers.Frontend/Styles/additions/progress.css b/MoonlightServers.Frontend/Styles/additions/progress.css new file mode 100644 index 0000000..3e2f9b9 --- /dev/null +++ b/MoonlightServers.Frontend/Styles/additions/progress.css @@ -0,0 +1,25 @@ +.progress { + @apply bg-gray-800 rounded-full overflow-hidden; +} + +.progress-bar { + @apply bg-primary-500 rounded-full h-3; + transition: width 0.6s ease; +} + +.progress-bar.progress-intermediate { + animation: progress-animation 1s infinite linear; + transform-origin: 0 50% +} + +@keyframes progress-animation { + 0% { + transform: translateX(0) scaleX(0); + } + 40% { + transform: translateX(0) scaleX(0.4); + } + 100% { + transform: translateX(100%) scaleX(0.5); + } +} \ No newline at end of file diff --git a/MoonlightServers.Frontend/Styles/additions/scrollbar.css b/MoonlightServers.Frontend/Styles/additions/scrollbar.css new file mode 100644 index 0000000..ac98733 --- /dev/null +++ b/MoonlightServers.Frontend/Styles/additions/scrollbar.css @@ -0,0 +1,9 @@ +* { + scrollbar-width: thin; + scrollbar-color: #64748b transparent; +} + +.no-scrollbar { + scrollbar-width: none; + scrollbar-color: transparent transparent; +} \ No newline at end of file diff --git a/MoonlightServers.Frontend/Styles/build.bat b/MoonlightServers.Frontend/Styles/build.bat new file mode 100644 index 0000000..f1d5249 --- /dev/null +++ b/MoonlightServers.Frontend/Styles/build.bat @@ -0,0 +1 @@ +npx tailwindcss -i style.css -o ../wwwroot/css/MoonlightServers.min.css --watch \ No newline at end of file diff --git a/MoonlightServers.Frontend/Styles/build.sh b/MoonlightServers.Frontend/Styles/build.sh new file mode 100644 index 0000000..077d877 --- /dev/null +++ b/MoonlightServers.Frontend/Styles/build.sh @@ -0,0 +1,2 @@ +#! /bin/bash +npx tailwindcss -i style.css -o ../wwwroot/css/MoonlightServers.min.css --watch \ No newline at end of file diff --git a/MoonlightServers.Frontend/Styles/package-lock.json b/MoonlightServers.Frontend/Styles/package-lock.json new file mode 100644 index 0000000..4d4ebe1 --- /dev/null +++ b/MoonlightServers.Frontend/Styles/package-lock.json @@ -0,0 +1,1294 @@ +{ + "name": "Styles", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "dependencies": { + "@tailwindcss/forms": "^0.5.9" + }, + "devDependencies": { + "tailwindcss": "^3.4.11" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "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==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@tailwindcss/forms": { + "version": "0.5.9", + "resolved": "https://registry.npmjs.org/@tailwindcss/forms/-/forms-0.5.9.tgz", + "integrity": "sha512-tM4XVr2+UVTxXJzey9Twx48c1gcxFStqn1pQz0tRsX8o3DvxhN5oY5pvyAbUx7VTaZxpej4Zzvc6h+1RJBzpIg==", + "dependencies": { + "mini-svg-data-uri": "^1.2.3" + }, + "peerDependencies": { + "tailwindcss": ">=3.0.0 || >= 3.0.0-alpha.1 || >= 4.0.0-alpha.20" + } + }, + "node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" + }, + "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==" + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "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==", + "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==" + }, + "node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/foreground-child": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", + "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/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==", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", + "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "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==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jiti": { + "version": "1.21.6", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz", + "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==", + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + }, + "node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mini-svg-data-uri": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz", + "integrity": "sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==", + "bin": { + "mini-svg-data-uri": "cli.js" + } + }, + "node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==" + }, + "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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss": { + "version": "8.4.49", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", + "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", + "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" + } + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", + "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "lilconfig": "^3.0.0", + "yaml": "^2.3.4" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-load-config/node_modules/lilconfig": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz", + "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/postcss-nested": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", + "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "postcss-selector-parser": "^6.1.1" + }, + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "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==", + "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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/sucrase": { + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", + "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "^10.3.10", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tailwindcss": { + "version": "3.4.15", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.15.tgz", + "integrity": "sha512-r4MeXnfBmSOuKUWmXe6h2CcyfzJCEk4F0pptO5jlnYSIViUkVmsawj80N5h2lO3gwcmSb4n3PuN+e+GC1Guylw==", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.6.0", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.2", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.21.6", + "lilconfig": "^2.1.0", + "micromatch": "^4.0.8", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.1.1", + "postcss": "^8.4.47", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.2", + "postcss-nested": "^6.2.0", + "postcss-selector-parser": "^6.1.2", + "resolve": "^1.22.8", + "sucrase": "^3.35.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==" + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yaml": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.6.1.tgz", + "integrity": "sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg==", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } + } + } +} diff --git a/MoonlightServers.Frontend/Styles/package.json b/MoonlightServers.Frontend/Styles/package.json new file mode 100644 index 0000000..7ad5346 --- /dev/null +++ b/MoonlightServers.Frontend/Styles/package.json @@ -0,0 +1,8 @@ +{ + "devDependencies": { + "tailwindcss": "^3.4.11" + }, + "dependencies": { + "@tailwindcss/forms": "^0.5.9" + } +} diff --git a/MoonlightServers.Frontend/Styles/style.css b/MoonlightServers.Frontend/Styles/style.css new file mode 100644 index 0000000..ae019c1 --- /dev/null +++ b/MoonlightServers.Frontend/Styles/style.css @@ -0,0 +1,79 @@ +@import "tailwindcss/base"; +@import "tailwindcss/components"; + +@import "additions/animations.css"; +@import "additions/fonts.css"; +@import "additions/buttons.css"; +@import "additions/cards.css"; +@import "additions/forms.css"; +@import "additions/progress.css"; +@import "additions/scrollbar.css"; +@import "additions/loaders.css"; + +@import "tailwindcss/utilities"; + +#blazor-error-ui { + display: none; +} + +#loader { + display: block; + width: 10rem; + height: 10rem; + border-radius: 50%; + border: 3px solid transparent; + border-top-color: #9370DB; + -webkit-animation: spin 2s linear infinite; + animation: spin 2s linear infinite; + @apply border-t-primary-500 +} +#loader:before { + content: ""; + position: absolute; + top: 5px; + left: 5px; + right: 5px; + bottom: 5px; + border-radius: 50%; + border: 3px solid transparent; + -webkit-animation: spin 3s linear infinite; + animation: spin 3s linear infinite; + @apply border-t-tertiary-500 +} +#loader:after { + content: ""; + position: absolute; + top: 15px; + left: 15px; + right: 15px; + bottom: 15px; + border-radius: 50%; + border: 3px solid transparent; + -webkit-animation: spin 1.5s linear infinite; + animation: spin 1.5s linear infinite; + @apply border-t-info-500 +} +@-webkit-keyframes spin { + 0% { + -webkit-transform: rotate(0deg); + -ms-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(360deg); + -ms-transform: rotate(360deg); + transform: rotate(360deg); + } +} +@keyframes spin { + 0% { + -webkit-transform: rotate(0deg); + -ms-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(360deg); + -ms-transform: rotate(360deg); + transform: rotate(360deg); + } +} \ No newline at end of file diff --git a/MoonlightServers.Frontend/Styles/tailwind.config.js b/MoonlightServers.Frontend/Styles/tailwind.config.js new file mode 100644 index 0000000..891d42e --- /dev/null +++ b/MoonlightServers.Frontend/Styles/tailwind.config.js @@ -0,0 +1,128 @@ +/** @type {import('tailwindcss').Config} */ +module.exports = { + corePlugins: { + preflight: false, + }, + content: [ + '../**/*.razor', + 'mappings/*.map' + ], + theme: { + extend: { + fontFamily: { + inter: ['Inter', 'sans-serif'], + scp: ['Source Code Pro', 'mono'], + }, + colors: { + primary: { + 50: '#eef2ff', + 100: '#e0e7ff', + 200: '#c7d2fe', + 300: '#a5b4fc', + 400: '#818cf8', + 500: '#6366f1', + 600: '#4f46e5', + 700: '#4338ca', + 800: '#3730a3', + 900: '#312e81', + 950: '#1e1b4b' + }, + secondary: { + 100: '#F9F9F9', + 200: '#F1F1F2', + 300: '#DBDFE9', + 400: '#B5B5C3', + 500: '#99A1B7', + 600: '#707993', + 700: '#444e6b', + 750: '#293249', + 800: '#1c2438', + 900: '#111721', + 950: '#0e121c', + }, + tertiary: { + 50: '#f5f3ff', + 100: '#ede9fe', + 200: '#ddd6fe', + 300: '#c4b5fd', + 400: '#a78bfa', + 500: '#8b5cf6', + 600: '#7c3aed', + 700: '#6d28d9', + 800: '#5b21b6', + 900: '#4c1d95', + 950: '#2e1065' + }, + warning: { + 50: '#fefce8', + 100: '#fef9c3', + 200: '#fef08a', + 300: '#fde047', + 400: '#facc15', + 500: '#eab308', + 600: '#ca8a04', + 700: '#a16207', + 800: '#854d0e', + 900: '#713f12', + 950: '#422006' + }, + danger: { + 50: '#fef2f2', + 100: '#fee2e2', + 200: '#fecaca', + 300: '#fca5a5', + 400: '#f87171', + 500: '#ef4444', + 600: '#dc2626', + 700: '#b91c1c', + 800: '#991b1b', + 900: '#7f1d1d', + 950: '#450a0a' + }, + success: { + 50: '#f0fdf4', + 100: '#dcfce7', + 200: '#bbf7d0', + 300: '#86efac', + 400: '#4ade80', + 500: '#22c55e', + 600: '#16a34a', + 700: '#15803d', + 800: '#166534', + 900: '#14532d', + 950: '#052e16' + }, + info: { + 50: '#eff6ff', + 100: '#dbeafe', + 200: '#bfdbfe', + 300: '#93c5fd', + 400: '#60a5fa', + 500: '#3b82f6', + 600: '#2563eb', + 700: '#1d4ed8', + 800: '#1e40af', + 900: '#1e3a8a', + 950: '#172554' + }, + gray: { + 100: '#F9F9F9', + 200: '#F1F1F2', + 300: '#DBDFE9', + 400: '#B5B5C3', + 500: '#99A1B7', + 600: '#707993', + 700: '#444e6b', + 750: '#293249', + 800: '#1c2438', + 900: '#111721', + 950: '#0e121c', + } + }, + animation: { + 'shimmer': 'shimmer 2s linear infinite', + } + }, + } +} + diff --git a/MoonlightServers.Frontend/UI/Views/Example.razor b/MoonlightServers.Frontend/UI/Views/Example.razor new file mode 100644 index 0000000..a859c82 --- /dev/null +++ b/MoonlightServers.Frontend/UI/Views/Example.razor @@ -0,0 +1,25 @@ +@page "/example" + +@using MoonCore.Helpers +@using MoonCore.Blazor.Tailwind.Components +@using MoonlightServers.Shared.Http.Responses + +@inject HttpApiClient ApiClient + +

Welcome to this example page

+ + +

+ @Response.Number +

+
+ +@code +{ + private ExampleResponse Response; + + private async Task Load(LazyLoader _) + { + Response = await ApiClient.GetJson("api/example"); + } +} \ No newline at end of file diff --git a/MoonlightServers.Shared/Enums/BackupState.cs b/MoonlightServers.Shared/Enums/BackupState.cs deleted file mode 100644 index 4b708ed..0000000 --- a/MoonlightServers.Shared/Enums/BackupState.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace MoonlightServers.Shared.Enums; - -public enum BackupState -{ - Creating = 0, - Failed = 1, - Created = 2 -} \ No newline at end of file diff --git a/MoonlightServers.Shared/Enums/StarVariableType.cs b/MoonlightServers.Shared/Enums/StarVariableType.cs deleted file mode 100644 index 638148e..0000000 --- a/MoonlightServers.Shared/Enums/StarVariableType.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace MoonlightServers.Shared.Enums; - -public enum StarVariableType -{ - Text = 0, - Number = 1, - Toggle = 2, - Select = 3 -} \ No newline at end of file diff --git a/MoonlightServers.Shared/Http/Requests/Admin/Allocations/CreateAllocationRequest.cs b/MoonlightServers.Shared/Http/Requests/Admin/Allocations/CreateAllocationRequest.cs deleted file mode 100644 index 07ae9f0..0000000 --- a/MoonlightServers.Shared/Http/Requests/Admin/Allocations/CreateAllocationRequest.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System.ComponentModel.DataAnnotations; - -namespace MoonlightServers.Shared.Http.Requests.Admin.Allocations; - -public class CreateAllocationRequest -{ - [Required(ErrorMessage = "You need to provide an ip address")] - [RegularExpression("^(?:[0-9]{1,3}\\.){3}[0-9]{1,3}$", ErrorMessage = "You need tp provide a valid ip address")] - public string IpAddress { get; set; } = "0.0.0.0"; - - [Required(ErrorMessage = "You need to provgide a port")] - [Range(1, 65535 , ErrorMessage = "You need to provide a valid port")] - public int Port { get; set; } -} \ No newline at end of file diff --git a/MoonlightServers.Shared/Http/Requests/Admin/Allocations/UpdateAllocationRequest.cs b/MoonlightServers.Shared/Http/Requests/Admin/Allocations/UpdateAllocationRequest.cs deleted file mode 100644 index ba97213..0000000 --- a/MoonlightServers.Shared/Http/Requests/Admin/Allocations/UpdateAllocationRequest.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System.ComponentModel.DataAnnotations; - -namespace MoonlightServers.Shared.Http.Requests.Admin.Allocations; - -public class UpdateAllocationRequest -{ - [Required(ErrorMessage = "You need to provide an ip address")] - [RegularExpression("^(?:[0-9]{1,3}\\.){3}[0-9]{1,3}$", ErrorMessage = "You need tp provide a valid ip address")] - public string IpAddress { get; set; } = "0.0.0.0"; - - [Required(ErrorMessage = "You need to provgide a port")] - [Range(1, 65535 , ErrorMessage = "You need to provide a valid port")] - public int Port { get; set; } -} \ No newline at end of file diff --git a/MoonlightServers.Shared/Http/Requests/Admin/Nodes/CreateNodeRequest.cs b/MoonlightServers.Shared/Http/Requests/Admin/Nodes/CreateNodeRequest.cs deleted file mode 100644 index 38a0242..0000000 --- a/MoonlightServers.Shared/Http/Requests/Admin/Nodes/CreateNodeRequest.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System.ComponentModel.DataAnnotations; - -namespace MoonlightServers.Shared.Http.Requests.Admin.Nodes; - -public class CreateNodeRequest -{ - [Required(ErrorMessage = "You need to provide a name")] - public string Name { get; set; } - - [Required(ErrorMessage = "You need to provide a fqdn")] - public string Fqdn { get; set; } - - [Range(1, 65535, ErrorMessage = "You need to provide a valid port")] - public int ApiPort { get; set; } = 8080; - - public bool SslEnabled { get; set; } = false; -} \ No newline at end of file diff --git a/MoonlightServers.Shared/Http/Requests/Admin/Nodes/UpdateNodeRequest.cs b/MoonlightServers.Shared/Http/Requests/Admin/Nodes/UpdateNodeRequest.cs deleted file mode 100644 index 7c6acd7..0000000 --- a/MoonlightServers.Shared/Http/Requests/Admin/Nodes/UpdateNodeRequest.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System.ComponentModel.DataAnnotations; - -namespace MoonlightServers.Shared.Http.Requests.Admin.Nodes; - -public class UpdateNodeRequest -{ - [Required(ErrorMessage = "You need to provide a name")] - public string Name { get; set; } - - [Required(ErrorMessage = "You need to provide a fqdn")] - public string Fqdn { get; set; } - - [Range(1, 65535, ErrorMessage = "You need to provide a valid port")] - public int ApiPort { get; set; } = 8080; - - public bool SslEnabled { get; set; } = false; -} \ No newline at end of file diff --git a/MoonlightServers.Shared/Http/Responses/Admin/Allocations/DetailAllocationResponse.cs b/MoonlightServers.Shared/Http/Responses/Admin/Allocations/DetailAllocationResponse.cs deleted file mode 100644 index c8c60be..0000000 --- a/MoonlightServers.Shared/Http/Responses/Admin/Allocations/DetailAllocationResponse.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace MoonlightServers.Shared.Http.Responses.Admin.Allocations; - -public class DetailAllocationResponse -{ - public int Id { get; set; } - public string IpAddress { get; set; } = "0.0.0.0"; - public int Port { get; set; } -} \ No newline at end of file diff --git a/MoonlightServers.Shared/Http/Responses/Admin/Nodes/DetailNodeResponse.cs b/MoonlightServers.Shared/Http/Responses/Admin/Nodes/DetailNodeResponse.cs deleted file mode 100644 index 166c322..0000000 --- a/MoonlightServers.Shared/Http/Responses/Admin/Nodes/DetailNodeResponse.cs +++ /dev/null @@ -1,11 +0,0 @@ -namespace MoonlightServers.Shared.Http.Responses.Admin.Nodes; - -public class DetailNodeResponse -{ - public int Id { get; set; } - - public string Name { get; set; } - public string Fqdn { get; set; } - public int ApiPort { get; set; } - public bool SslEnabled { get; set; } -} \ No newline at end of file diff --git a/MoonlightServers.Shared/Http/Responses/Admin/Nodes/StatusNodeResponse.cs b/MoonlightServers.Shared/Http/Responses/Admin/Nodes/StatusNodeResponse.cs deleted file mode 100644 index 84c6177..0000000 --- a/MoonlightServers.Shared/Http/Responses/Admin/Nodes/StatusNodeResponse.cs +++ /dev/null @@ -1,22 +0,0 @@ -namespace MoonlightServers.Shared.Http.Responses.Admin.Nodes; - -public class StatusNodeResponse -{ - public string CpuModel { get; set; } - public double[] CpuUsage { get; set; } - public TimeSpan Uptime { get; set; } - - public ulong MemoryTotal { get; set; } - public ulong MemoryFree { get; set; } - public ulong MemoryAvailable { get; set; } - public ulong MemoryCached { get; set; } - - public ulong SwapTotal { get; set; } - public ulong SwapFree { get; set; } - - public ulong DiskTotal { get; set; } - public ulong DiskFree { get; set; } - - public ulong DiskTotalInodes { get; set; } - public ulong DiskFreeInodes { get; set; } -} \ No newline at end of file diff --git a/MoonlightServers.Shared/Http/Responses/ExampleResponse.cs b/MoonlightServers.Shared/Http/Responses/ExampleResponse.cs new file mode 100644 index 0000000..a9287c1 --- /dev/null +++ b/MoonlightServers.Shared/Http/Responses/ExampleResponse.cs @@ -0,0 +1,6 @@ +namespace MoonlightServers.Shared.Http.Responses; + +public class ExampleResponse +{ + public int Number { get; set; } +} \ No newline at end of file diff --git a/MoonlightServers.Shared/MoonlightServers.Shared.csproj b/MoonlightServers.Shared/MoonlightServers.Shared.csproj index d8a2b4e..ce6ca8f 100644 --- a/MoonlightServers.Shared/MoonlightServers.Shared.csproj +++ b/MoonlightServers.Shared/MoonlightServers.Shared.csproj @@ -7,7 +7,7 @@ - +
diff --git a/MoonlightServers.sln b/MoonlightServers.sln index a87cafc..d95a8f0 100644 --- a/MoonlightServers.sln +++ b/MoonlightServers.sln @@ -1,14 +1,10 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MoonlightServers.Shared", "MoonlightServers.Shared\MoonlightServers.Shared.csproj", "{E16B0418-F865-41A6-A532-A2FF15651894}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MoonlightServers.ApiServer", "MoonlightServers.ApiServer\MoonlightServers.ApiServer.csproj", "{EAF24574-889F-41B8-85AA-7C0B856137BF}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MoonlightServers.ApiServer", "MoonlightServers.ApiServer\MoonlightServers.ApiServer.csproj", "{74EB54DC-0136-4A02-A888-EB69B4905631}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MoonlightServers.Frontend", "MoonlightServers.Frontend\MoonlightServers.Frontend.csproj", "{E7E39DA0-F920-4329-87FB-CBAF129B6835}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MoonlightServers.Client", "MoonlightServers.Client\MoonlightServers.Client.csproj", "{0D44004B-087F-4F4E-9346-9D079E40755E}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MoonlightServers.Daemon", "MoonlightServers.Daemon\MoonlightServers.Daemon.csproj", "{84E74090-85F3-4CCF-BD12-E533BDB869D8}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MoonlightServers.DaemonShared", "MoonlightServers.DaemonShared\MoonlightServers.DaemonShared.csproj", "{FCA17F9E-3734-4E94-8C6C-997012EBAB88}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MoonlightServers.Shared", "MoonlightServers.Shared\MoonlightServers.Shared.csproj", "{70FAFFFB-9EA6-4BB7-B4C0-A6BEF9684B32}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -16,25 +12,17 @@ Global Release|Any CPU = Release|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {E16B0418-F865-41A6-A532-A2FF15651894}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E16B0418-F865-41A6-A532-A2FF15651894}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E16B0418-F865-41A6-A532-A2FF15651894}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E16B0418-F865-41A6-A532-A2FF15651894}.Release|Any CPU.Build.0 = Release|Any CPU - {74EB54DC-0136-4A02-A888-EB69B4905631}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {74EB54DC-0136-4A02-A888-EB69B4905631}.Debug|Any CPU.Build.0 = Debug|Any CPU - {74EB54DC-0136-4A02-A888-EB69B4905631}.Release|Any CPU.ActiveCfg = Release|Any CPU - {74EB54DC-0136-4A02-A888-EB69B4905631}.Release|Any CPU.Build.0 = Release|Any CPU - {0D44004B-087F-4F4E-9346-9D079E40755E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {0D44004B-087F-4F4E-9346-9D079E40755E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {0D44004B-087F-4F4E-9346-9D079E40755E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {0D44004B-087F-4F4E-9346-9D079E40755E}.Release|Any CPU.Build.0 = Release|Any CPU - {84E74090-85F3-4CCF-BD12-E533BDB869D8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {84E74090-85F3-4CCF-BD12-E533BDB869D8}.Debug|Any CPU.Build.0 = Debug|Any CPU - {84E74090-85F3-4CCF-BD12-E533BDB869D8}.Release|Any CPU.ActiveCfg = Release|Any CPU - {84E74090-85F3-4CCF-BD12-E533BDB869D8}.Release|Any CPU.Build.0 = Release|Any CPU - {FCA17F9E-3734-4E94-8C6C-997012EBAB88}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {FCA17F9E-3734-4E94-8C6C-997012EBAB88}.Debug|Any CPU.Build.0 = Debug|Any CPU - {FCA17F9E-3734-4E94-8C6C-997012EBAB88}.Release|Any CPU.ActiveCfg = Release|Any CPU - {FCA17F9E-3734-4E94-8C6C-997012EBAB88}.Release|Any CPU.Build.0 = Release|Any CPU + {EAF24574-889F-41B8-85AA-7C0B856137BF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EAF24574-889F-41B8-85AA-7C0B856137BF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EAF24574-889F-41B8-85AA-7C0B856137BF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EAF24574-889F-41B8-85AA-7C0B856137BF}.Release|Any CPU.Build.0 = Release|Any CPU + {E7E39DA0-F920-4329-87FB-CBAF129B6835}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E7E39DA0-F920-4329-87FB-CBAF129B6835}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E7E39DA0-F920-4329-87FB-CBAF129B6835}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E7E39DA0-F920-4329-87FB-CBAF129B6835}.Release|Any CPU.Build.0 = Release|Any CPU + {70FAFFFB-9EA6-4BB7-B4C0-A6BEF9684B32}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {70FAFFFB-9EA6-4BB7-B4C0-A6BEF9684B32}.Debug|Any CPU.Build.0 = Debug|Any CPU + {70FAFFFB-9EA6-4BB7-B4C0-A6BEF9684B32}.Release|Any CPU.ActiveCfg = Release|Any CPU + {70FAFFFB-9EA6-4BB7-B4C0-A6BEF9684B32}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection EndGlobal diff --git a/README.md b/README.md deleted file mode 100644 index dfafbce..0000000 --- a/README.md +++ /dev/null @@ -1,2 +0,0 @@ -# Servers -A moonlight module allowing you to run programs and game servers in docker containers while offering an easy to use ui for them