From 686155663fab60a2229418e3b3d9aeac3d0ec893 Mon Sep 17 00:00:00 2001 From: siimav Date: Thu, 19 Sep 2024 01:02:07 +0300 Subject: [PATCH] Convert project to TS and Vite --- .gitignore | 1 + README.md | 11 +- RP1AnalyticsWebApp/.eslintrc.cjs | 15 + .../Areas/Admin/Pages/Races.cshtml | 21 +- .../Areas/Admin/Pages/_ViewImports.cshtml | 1 + .../{ => Configs}/contractData.json | 0 RP1AnalyticsWebApp/{ => Configs}/leaders.json | 0 .../{ => Configs}/milestoneContracts.json | 0 .../{ => Configs}/programs.json | 0 .../{ => Configs}/repeatableContracts.json | 0 .../{ => Configs}/techTree.json | 0 .../Models/Settings/ContractSettings.cs | 6 +- .../Models/Settings/LeaderSettings.cs | 2 +- .../Models/Settings/ProgramSettings.cs | 2 +- .../Models/Settings/TechTreeSettings.cs | 2 +- RP1AnalyticsWebApp/Pages/Index.cshtml | 66 +- RP1AnalyticsWebApp/Pages/Records.cshtml | 27 +- .../Pages/Shared/_Layout.cshtml | 29 +- RP1AnalyticsWebApp/Pages/_ViewImports.cshtml | 3 + .../Properties/launchSettings.json | 9 +- RP1AnalyticsWebApp/RP1AnalyticsWebApp.csproj | 140 +- RP1AnalyticsWebApp/Startup.cs | 13 + RP1AnalyticsWebApp/env.d.ts | 1 + RP1AnalyticsWebApp/package-lock.json | 3505 +++++++++++++++++ RP1AnalyticsWebApp/package.json | 36 + .../{wwwroot => public}/browserconfig.xml | 0 .../{wwwroot => public}/images/agathorn.webp | Bin .../images/android-icon-144x144.png | Bin .../images/android-icon-192x192.png | Bin .../images/android-icon-36x36.png | Bin .../images/android-icon-48x48.png | Bin .../images/android-icon-72x72.png | Bin .../images/android-icon-96x96.png | Bin .../images/apple-icon-114x114.png | Bin .../images/apple-icon-120x120.png | Bin .../images/apple-icon-144x144.png | Bin .../images/apple-icon-152x152.png | Bin .../images/apple-icon-180x180.png | Bin .../images/apple-icon-57x57.png | Bin .../images/apple-icon-60x60.png | Bin .../images/apple-icon-72x72.png | Bin .../images/apple-icon-76x76.png | Bin .../images/apple-icon-precomposed.png | Bin .../{wwwroot => public}/images/apple-icon.png | Bin .../images/favicon-16x16.png | Bin .../images/favicon-32x32.png | Bin .../images/favicon-96x96.png | Bin .../{wwwroot => public}/images/favicon.ico | Bin .../images/ms-icon-144x144.png | Bin .../images/ms-icon-150x150.png | Bin .../images/ms-icon-310x310.png | Bin .../images/ms-icon-70x70.png | Bin .../{wwwroot => public}/manifest.json | 0 RP1AnalyticsWebApp/src/assets/agathorn.webp | Bin 0 -> 3170 bytes RP1AnalyticsWebApp/src/careerlog-main.ts | 6 + .../src/components/CareerDates.vue | 57 + .../src/components/CareerFiltersModal.vue | 231 ++ .../src/components/CareerSelect.vue | 86 + .../src/components/Careerlog.vue | 201 + RP1AnalyticsWebApp/src/components/Chart.vue | 493 +++ .../components/ContractLeaderboardModal.vue | 80 + .../src/components/ContractRecordsTable.vue | 94 + .../src/components/DataTabMixin.vue | 58 + .../src/components/Facilities.vue | 132 + .../src/components/Launches.vue | 197 + RP1AnalyticsWebApp/src/components/Leaders.vue | 73 + .../src/components/LoadingSpinner.vue | 48 + .../src/components/MetaInformation.vue | 90 + .../src/components/MilestoneContracts.vue | 52 + RP1AnalyticsWebApp/src/components/Navbar.vue | 79 + .../components/ProgramLeaderboardModal.vue | 100 + .../components/ProgramRecordTypeSelect.vue} | 20 +- .../src/components/ProgramRecordsTable.vue | 98 + .../src/components/Programs.vue | 63 + .../src/components/RaceManagement.vue | 91 + RP1AnalyticsWebApp/src/components/Records.vue | 76 + .../src/components/RepeatableContracts.vue | 52 + .../components/SelectionTab.vue} | 19 +- .../src/components/TechUnlocks.vue | 57 + RP1AnalyticsWebApp/src/css/styles.scss | 39 + RP1AnalyticsWebApp/src/env.d.ts | 8 + RP1AnalyticsWebApp/src/navbar-main.ts | 8 + RP1AnalyticsWebApp/src/races-main.ts | 6 + RP1AnalyticsWebApp/src/records-main.ts | 6 + RP1AnalyticsWebApp/src/types.ts | 247 ++ RP1AnalyticsWebApp/src/utils/activeFilters.ts | 24 + .../src/utils/calculateYearRepMap.ts | 36 + .../src/utils/constructFilterQueryString.ts | 60 + RP1AnalyticsWebApp/src/utils/currentUser.ts | 4 + RP1AnalyticsWebApp/src/utils/parseUtcDate.ts | 5 + RP1AnalyticsWebApp/src/utils/programSpeeds.ts | 1 + RP1AnalyticsWebApp/tsconfig.json | 38 + RP1AnalyticsWebApp/tsconfig.node.json | 13 + RP1AnalyticsWebApp/vite.config.ts | 107 + RP1AnalyticsWebApp/wwwroot/css/styles.css | 107 - RP1AnalyticsWebApp/wwwroot/js/careerLog.js | 610 --- .../wwwroot/js/components/career-dates.js | 39 - .../js/components/career-filters-modal.js | 217 - .../wwwroot/js/components/career-filters.js | 111 - .../wwwroot/js/components/career-select.js | 56 - .../components/contract-leaderboard-modal.js | 54 - .../js/components/contract-records-table.js | 62 - .../wwwroot/js/components/data-tab-mixin.js | 45 - .../wwwroot/js/components/facilities.js | 115 - .../wwwroot/js/components/launches.js | 172 - .../wwwroot/js/components/leaders.js | 62 - .../wwwroot/js/components/loading-spinner.js | 3 - .../wwwroot/js/components/meta-information.js | 78 - .../js/components/milestone-contracts.js | 41 - .../components/program-leaderboard-modal.js | 73 - .../js/components/program-records-table.js | 65 - .../wwwroot/js/components/programs.js | 54 - .../wwwroot/js/components/race-management.js | 74 - .../js/components/repeatable-contracts.js | 41 - .../wwwroot/js/components/tech-unlocks.js | 46 - RP1AnalyticsWebApp/wwwroot/js/navbar.js | 16 - RP1AnalyticsWebApp/wwwroot/js/records.js | 52 - 117 files changed, 6889 insertions(+), 2349 deletions(-) create mode 100644 RP1AnalyticsWebApp/.eslintrc.cjs rename RP1AnalyticsWebApp/{ => Configs}/contractData.json (100%) rename RP1AnalyticsWebApp/{ => Configs}/leaders.json (100%) rename RP1AnalyticsWebApp/{ => Configs}/milestoneContracts.json (100%) rename RP1AnalyticsWebApp/{ => Configs}/programs.json (100%) rename RP1AnalyticsWebApp/{ => Configs}/repeatableContracts.json (100%) rename RP1AnalyticsWebApp/{ => Configs}/techTree.json (100%) create mode 100644 RP1AnalyticsWebApp/env.d.ts create mode 100644 RP1AnalyticsWebApp/package-lock.json create mode 100644 RP1AnalyticsWebApp/package.json rename RP1AnalyticsWebApp/{wwwroot => public}/browserconfig.xml (100%) rename RP1AnalyticsWebApp/{wwwroot => public}/images/agathorn.webp (100%) rename RP1AnalyticsWebApp/{wwwroot => public}/images/android-icon-144x144.png (100%) rename RP1AnalyticsWebApp/{wwwroot => public}/images/android-icon-192x192.png (100%) rename RP1AnalyticsWebApp/{wwwroot => public}/images/android-icon-36x36.png (100%) rename RP1AnalyticsWebApp/{wwwroot => public}/images/android-icon-48x48.png (100%) rename RP1AnalyticsWebApp/{wwwroot => public}/images/android-icon-72x72.png (100%) rename RP1AnalyticsWebApp/{wwwroot => public}/images/android-icon-96x96.png (100%) rename RP1AnalyticsWebApp/{wwwroot => public}/images/apple-icon-114x114.png (100%) rename RP1AnalyticsWebApp/{wwwroot => public}/images/apple-icon-120x120.png (100%) rename RP1AnalyticsWebApp/{wwwroot => public}/images/apple-icon-144x144.png (100%) rename RP1AnalyticsWebApp/{wwwroot => public}/images/apple-icon-152x152.png (100%) rename RP1AnalyticsWebApp/{wwwroot => public}/images/apple-icon-180x180.png (100%) rename RP1AnalyticsWebApp/{wwwroot => public}/images/apple-icon-57x57.png (100%) rename RP1AnalyticsWebApp/{wwwroot => public}/images/apple-icon-60x60.png (100%) rename RP1AnalyticsWebApp/{wwwroot => public}/images/apple-icon-72x72.png (100%) rename RP1AnalyticsWebApp/{wwwroot => public}/images/apple-icon-76x76.png (100%) rename RP1AnalyticsWebApp/{wwwroot => public}/images/apple-icon-precomposed.png (100%) rename RP1AnalyticsWebApp/{wwwroot => public}/images/apple-icon.png (100%) rename RP1AnalyticsWebApp/{wwwroot => public}/images/favicon-16x16.png (100%) rename RP1AnalyticsWebApp/{wwwroot => public}/images/favicon-32x32.png (100%) rename RP1AnalyticsWebApp/{wwwroot => public}/images/favicon-96x96.png (100%) rename RP1AnalyticsWebApp/{wwwroot => public}/images/favicon.ico (100%) rename RP1AnalyticsWebApp/{wwwroot => public}/images/ms-icon-144x144.png (100%) rename RP1AnalyticsWebApp/{wwwroot => public}/images/ms-icon-150x150.png (100%) rename RP1AnalyticsWebApp/{wwwroot => public}/images/ms-icon-310x310.png (100%) rename RP1AnalyticsWebApp/{wwwroot => public}/images/ms-icon-70x70.png (100%) rename RP1AnalyticsWebApp/{wwwroot => public}/manifest.json (100%) create mode 100644 RP1AnalyticsWebApp/src/assets/agathorn.webp create mode 100644 RP1AnalyticsWebApp/src/careerlog-main.ts create mode 100644 RP1AnalyticsWebApp/src/components/CareerDates.vue create mode 100644 RP1AnalyticsWebApp/src/components/CareerFiltersModal.vue create mode 100644 RP1AnalyticsWebApp/src/components/CareerSelect.vue create mode 100644 RP1AnalyticsWebApp/src/components/Careerlog.vue create mode 100644 RP1AnalyticsWebApp/src/components/Chart.vue create mode 100644 RP1AnalyticsWebApp/src/components/ContractLeaderboardModal.vue create mode 100644 RP1AnalyticsWebApp/src/components/ContractRecordsTable.vue create mode 100644 RP1AnalyticsWebApp/src/components/DataTabMixin.vue create mode 100644 RP1AnalyticsWebApp/src/components/Facilities.vue create mode 100644 RP1AnalyticsWebApp/src/components/Launches.vue create mode 100644 RP1AnalyticsWebApp/src/components/Leaders.vue create mode 100644 RP1AnalyticsWebApp/src/components/LoadingSpinner.vue create mode 100644 RP1AnalyticsWebApp/src/components/MetaInformation.vue create mode 100644 RP1AnalyticsWebApp/src/components/MilestoneContracts.vue create mode 100644 RP1AnalyticsWebApp/src/components/Navbar.vue create mode 100644 RP1AnalyticsWebApp/src/components/ProgramLeaderboardModal.vue rename RP1AnalyticsWebApp/{wwwroot/js/components/program-record-type-select.js => src/components/ProgramRecordTypeSelect.vue} (77%) create mode 100644 RP1AnalyticsWebApp/src/components/ProgramRecordsTable.vue create mode 100644 RP1AnalyticsWebApp/src/components/Programs.vue create mode 100644 RP1AnalyticsWebApp/src/components/RaceManagement.vue create mode 100644 RP1AnalyticsWebApp/src/components/Records.vue create mode 100644 RP1AnalyticsWebApp/src/components/RepeatableContracts.vue rename RP1AnalyticsWebApp/{wwwroot/js/components/selection-tab.js => src/components/SelectionTab.vue} (91%) create mode 100644 RP1AnalyticsWebApp/src/components/TechUnlocks.vue create mode 100644 RP1AnalyticsWebApp/src/css/styles.scss create mode 100644 RP1AnalyticsWebApp/src/env.d.ts create mode 100644 RP1AnalyticsWebApp/src/navbar-main.ts create mode 100644 RP1AnalyticsWebApp/src/races-main.ts create mode 100644 RP1AnalyticsWebApp/src/records-main.ts create mode 100644 RP1AnalyticsWebApp/src/types.ts create mode 100644 RP1AnalyticsWebApp/src/utils/activeFilters.ts create mode 100644 RP1AnalyticsWebApp/src/utils/calculateYearRepMap.ts create mode 100644 RP1AnalyticsWebApp/src/utils/constructFilterQueryString.ts create mode 100644 RP1AnalyticsWebApp/src/utils/currentUser.ts create mode 100644 RP1AnalyticsWebApp/src/utils/parseUtcDate.ts create mode 100644 RP1AnalyticsWebApp/src/utils/programSpeeds.ts create mode 100644 RP1AnalyticsWebApp/tsconfig.json create mode 100644 RP1AnalyticsWebApp/tsconfig.node.json create mode 100644 RP1AnalyticsWebApp/vite.config.ts delete mode 100644 RP1AnalyticsWebApp/wwwroot/css/styles.css delete mode 100644 RP1AnalyticsWebApp/wwwroot/js/careerLog.js delete mode 100644 RP1AnalyticsWebApp/wwwroot/js/components/career-dates.js delete mode 100644 RP1AnalyticsWebApp/wwwroot/js/components/career-filters-modal.js delete mode 100644 RP1AnalyticsWebApp/wwwroot/js/components/career-filters.js delete mode 100644 RP1AnalyticsWebApp/wwwroot/js/components/career-select.js delete mode 100644 RP1AnalyticsWebApp/wwwroot/js/components/contract-leaderboard-modal.js delete mode 100644 RP1AnalyticsWebApp/wwwroot/js/components/contract-records-table.js delete mode 100644 RP1AnalyticsWebApp/wwwroot/js/components/data-tab-mixin.js delete mode 100644 RP1AnalyticsWebApp/wwwroot/js/components/facilities.js delete mode 100644 RP1AnalyticsWebApp/wwwroot/js/components/launches.js delete mode 100644 RP1AnalyticsWebApp/wwwroot/js/components/leaders.js delete mode 100644 RP1AnalyticsWebApp/wwwroot/js/components/loading-spinner.js delete mode 100644 RP1AnalyticsWebApp/wwwroot/js/components/meta-information.js delete mode 100644 RP1AnalyticsWebApp/wwwroot/js/components/milestone-contracts.js delete mode 100644 RP1AnalyticsWebApp/wwwroot/js/components/program-leaderboard-modal.js delete mode 100644 RP1AnalyticsWebApp/wwwroot/js/components/program-records-table.js delete mode 100644 RP1AnalyticsWebApp/wwwroot/js/components/programs.js delete mode 100644 RP1AnalyticsWebApp/wwwroot/js/components/race-management.js delete mode 100644 RP1AnalyticsWebApp/wwwroot/js/components/repeatable-contracts.js delete mode 100644 RP1AnalyticsWebApp/wwwroot/js/components/tech-unlocks.js delete mode 100644 RP1AnalyticsWebApp/wwwroot/js/navbar.js delete mode 100644 RP1AnalyticsWebApp/wwwroot/js/records.js diff --git a/.gitignore b/.gitignore index 3c029b6..6a6d8a3 100644 --- a/.gitignore +++ b/.gitignore @@ -210,6 +210,7 @@ project.lock.json *.feature.xlsx.* *.Specs_*.html +RP1AnalyticsWebApp/wwwroot/* RP1AnalyticsWebApp/appsettings.Development.json RP1AnalyticsWebApp/appsettings.json *.pubxml diff --git a/README.md b/README.md index fa011f0..2c02c0b 100644 --- a/README.md +++ b/README.md @@ -2,14 +2,17 @@ Receives career progress information from the game and shows various useful visualizations for comparing careers and balancing RP-1. ## Technology stack -* .NET 5 -* ASP.NET Core 5 (Razor pages + web API) -* Vue.js +* .NET 6 +* ASP.NET Core 6 (Razor pages + web API) +* Vue.js 3 * MongoDB +* Microsoft.AspNetCore.OData * Application Insights * AspNetCore.Identity.Mongo * AspNet.Security.OAuth.GitHub * Swagger / OpenAPI +* Vite.AspNetCore +* Node.js 20 ## Install ### Production @@ -24,7 +27,7 @@ I.e: ``` ### Development -Add appsettings.json to \RP1AnalyticsWebApp\ and hit F5 in VS. +Add appsettings.json to \RP1AnalyticsWebApp\ and hit F5 in VS. Npm install will be run automatically and vite dev server will start on first request. Example settings file: ``` { diff --git a/RP1AnalyticsWebApp/.eslintrc.cjs b/RP1AnalyticsWebApp/.eslintrc.cjs new file mode 100644 index 0000000..7e079b8 --- /dev/null +++ b/RP1AnalyticsWebApp/.eslintrc.cjs @@ -0,0 +1,15 @@ +/* eslint-env node */ +require('@rushstack/eslint-patch/modern-module-resolution') + +module.exports = { + root: true, + 'extends': [ + 'plugin:vue/vue3-essential', + 'eslint:recommended', + '@vue/eslint-config-typescript', + '@vue/eslint-config-prettier/skip-formatting' + ], + parserOptions: { + ecmaVersion: 'latest' + } +} diff --git a/RP1AnalyticsWebApp/Areas/Admin/Pages/Races.cshtml b/RP1AnalyticsWebApp/Areas/Admin/Pages/Races.cshtml index e827398..e405de8 100644 --- a/RP1AnalyticsWebApp/Areas/Admin/Pages/Races.cshtml +++ b/RP1AnalyticsWebApp/Areas/Admin/Pages/Races.cshtml @@ -4,20 +4,11 @@ ViewData["Title"] = "Race management"; } -
-

Careers

- -
+
+@section Styles { + +} @section Scripts { - - - -} \ No newline at end of file + +} diff --git a/RP1AnalyticsWebApp/Areas/Admin/Pages/_ViewImports.cshtml b/RP1AnalyticsWebApp/Areas/Admin/Pages/_ViewImports.cshtml index a6a0d87..785ef8f 100644 --- a/RP1AnalyticsWebApp/Areas/Admin/Pages/_ViewImports.cshtml +++ b/RP1AnalyticsWebApp/Areas/Admin/Pages/_ViewImports.cshtml @@ -3,3 +3,4 @@ @using RP1AnalyticsWebApp.Areas.Admin @using RP1AnalyticsWebApp.Areas.Admin.Pages @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers +@addTagHelper *, Vite.AspNetCore diff --git a/RP1AnalyticsWebApp/contractData.json b/RP1AnalyticsWebApp/Configs/contractData.json similarity index 100% rename from RP1AnalyticsWebApp/contractData.json rename to RP1AnalyticsWebApp/Configs/contractData.json diff --git a/RP1AnalyticsWebApp/leaders.json b/RP1AnalyticsWebApp/Configs/leaders.json similarity index 100% rename from RP1AnalyticsWebApp/leaders.json rename to RP1AnalyticsWebApp/Configs/leaders.json diff --git a/RP1AnalyticsWebApp/milestoneContracts.json b/RP1AnalyticsWebApp/Configs/milestoneContracts.json similarity index 100% rename from RP1AnalyticsWebApp/milestoneContracts.json rename to RP1AnalyticsWebApp/Configs/milestoneContracts.json diff --git a/RP1AnalyticsWebApp/programs.json b/RP1AnalyticsWebApp/Configs/programs.json similarity index 100% rename from RP1AnalyticsWebApp/programs.json rename to RP1AnalyticsWebApp/Configs/programs.json diff --git a/RP1AnalyticsWebApp/repeatableContracts.json b/RP1AnalyticsWebApp/Configs/repeatableContracts.json similarity index 100% rename from RP1AnalyticsWebApp/repeatableContracts.json rename to RP1AnalyticsWebApp/Configs/repeatableContracts.json diff --git a/RP1AnalyticsWebApp/techTree.json b/RP1AnalyticsWebApp/Configs/techTree.json similarity index 100% rename from RP1AnalyticsWebApp/techTree.json rename to RP1AnalyticsWebApp/Configs/techTree.json diff --git a/RP1AnalyticsWebApp/Models/Settings/ContractSettings.cs b/RP1AnalyticsWebApp/Models/Settings/ContractSettings.cs index c7d1f9a..72f553d 100644 --- a/RP1AnalyticsWebApp/Models/Settings/ContractSettings.cs +++ b/RP1AnalyticsWebApp/Models/Settings/ContractSettings.cs @@ -13,17 +13,17 @@ public class ContractSettings : IContractSettings public ContractSettings() { - const string _fileName = @"contractData.json"; + const string _fileName = @"Configs/contractData.json"; string jsonString = File.ReadAllText(_fileName); var arr = JsonSerializer.Deserialize(jsonString); ContractNameDict = arr.ToDictionary(e => e.Name, e => e.Title); - const string _milestoneFileName = @"milestoneContracts.json"; + const string _milestoneFileName = @"Configs/milestoneContracts.json"; jsonString = File.ReadAllText(_milestoneFileName); var arr2 = JsonSerializer.Deserialize(jsonString); MilestoneContractNames = new HashSet(arr2); - const string _repeatableFileName = @"repeatableContracts.json"; + const string _repeatableFileName = @"Configs/repeatableContracts.json"; jsonString = File.ReadAllText(_repeatableFileName); var arr3 = JsonSerializer.Deserialize(jsonString); RepeatableContractNames = new HashSet(arr3); diff --git a/RP1AnalyticsWebApp/Models/Settings/LeaderSettings.cs b/RP1AnalyticsWebApp/Models/Settings/LeaderSettings.cs index d8f2c0c..e2961aa 100644 --- a/RP1AnalyticsWebApp/Models/Settings/LeaderSettings.cs +++ b/RP1AnalyticsWebApp/Models/Settings/LeaderSettings.cs @@ -11,7 +11,7 @@ public class LeaderSettings : ILeaderSettings public LeaderSettings() { - const string _fileName = @"leaders.json"; + const string _fileName = @"Configs/leaders.json"; string jsonString = File.ReadAllText(_fileName); var arr = JsonSerializer.Deserialize(jsonString); LeaderDict = arr.ToDictionary(e => e.Name); diff --git a/RP1AnalyticsWebApp/Models/Settings/ProgramSettings.cs b/RP1AnalyticsWebApp/Models/Settings/ProgramSettings.cs index c0ec4ed..b2f62b3 100644 --- a/RP1AnalyticsWebApp/Models/Settings/ProgramSettings.cs +++ b/RP1AnalyticsWebApp/Models/Settings/ProgramSettings.cs @@ -11,7 +11,7 @@ public class ProgramSettings : IProgramSettings public ProgramSettings() { - const string _fileName = @"programs.json"; + const string _fileName = @"Configs/programs.json"; string jsonString = File.ReadAllText(_fileName); var arr = JsonSerializer.Deserialize(jsonString); ProgramNameDict = arr.ToDictionary(e => e.Name, e => e.Title); diff --git a/RP1AnalyticsWebApp/Models/Settings/TechTreeSettings.cs b/RP1AnalyticsWebApp/Models/Settings/TechTreeSettings.cs index 9db2f3e..77ef15c 100644 --- a/RP1AnalyticsWebApp/Models/Settings/TechTreeSettings.cs +++ b/RP1AnalyticsWebApp/Models/Settings/TechTreeSettings.cs @@ -11,7 +11,7 @@ public class TechTreeSettings : ITechTreeSettings public TechTreeSettings() { - const string _fileName = @"techTree.json"; + const string _fileName = @"Configs/techTree.json"; string jsonString = File.ReadAllText(_fileName); var arr = JsonSerializer.Deserialize(jsonString); NodeTitleDict = arr.ToDictionary(e => e.ID, e => e.Title); diff --git a/RP1AnalyticsWebApp/Pages/Index.cshtml b/RP1AnalyticsWebApp/Pages/Index.cshtml index 1799d01..42fd405 100644 --- a/RP1AnalyticsWebApp/Pages/Index.cshtml +++ b/RP1AnalyticsWebApp/Pages/Index.cshtml @@ -5,65 +5,11 @@ ViewData["Title"] = "RP-1 Analytics"; } -
-
-
- -
-
- -
- -
- -
- -
-
- -
- -
- -
- -
- -
- -
- -
- -
- -
- -
- -
- -
- -
-
- - -
+
+@section Styles { + +} @section Scripts { - - - - - - - - - - - - - - -} \ No newline at end of file + +} diff --git a/RP1AnalyticsWebApp/Pages/Records.cshtml b/RP1AnalyticsWebApp/Pages/Records.cshtml index 5a814b3..13594b6 100644 --- a/RP1AnalyticsWebApp/Pages/Records.cshtml +++ b/RP1AnalyticsWebApp/Pages/Records.cshtml @@ -4,26 +4,11 @@ ViewData["Title"] = "Records"; } -
-

Program Records

-
- -
- - - -

Contract Records

- - -
+
+@section Styles { + +} @section Scripts { - - - - - - - - -} \ No newline at end of file + +} diff --git a/RP1AnalyticsWebApp/Pages/Shared/_Layout.cshtml b/RP1AnalyticsWebApp/Pages/Shared/_Layout.cshtml index 7fa729e..26ff431 100644 --- a/RP1AnalyticsWebApp/Pages/Shared/_Layout.cshtml +++ b/RP1AnalyticsWebApp/Pages/Shared/_Layout.cshtml @@ -1,6 +1,6 @@ -@using RP1AnalyticsWebApp.Utilities -@inject SignInManager SignInManager +@inject SignInManager SignInManager @inject UserManager UserManager +@inject IViteManifest Manifest @@ -8,17 +8,16 @@ @ViewData["Title"] - - - - - + - + + + + @await RenderSectionAsync("Styles", required: false) @@ -69,9 +68,6 @@ - - - + +
@RenderBody() - - - + @if (SignInManager.IsSignedIn(User)) { } - @RenderSection("Scripts", required: false) + + + + @await RenderSectionAsync("Scripts", required: false)
diff --git a/RP1AnalyticsWebApp/Pages/_ViewImports.cshtml b/RP1AnalyticsWebApp/Pages/_ViewImports.cshtml index 138fdf0..c21d4e3 100644 --- a/RP1AnalyticsWebApp/Pages/_ViewImports.cshtml +++ b/RP1AnalyticsWebApp/Pages/_ViewImports.cshtml @@ -1,4 +1,7 @@ @using Microsoft.AspNetCore.Identity @using RP1AnalyticsWebApp +@using RP1AnalyticsWebApp.Utilities +@using Vite.AspNetCore; @namespace RP1AnalyticsWebApp.Pages @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers +@addTagHelper *, Vite.AspNetCore diff --git a/RP1AnalyticsWebApp/Properties/launchSettings.json b/RP1AnalyticsWebApp/Properties/launchSettings.json index 0af41f3..3d164f3 100644 --- a/RP1AnalyticsWebApp/Properties/launchSettings.json +++ b/RP1AnalyticsWebApp/Properties/launchSettings.json @@ -9,12 +9,19 @@ }, "$schema": "http://json.schemastore.org/launchsettings.json", "profiles": { - "RP1AnalyticsWebApp": { + "RP1AnalyticsWebApp-dev": { "commandName": "Project", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" }, "applicationUrl": "https://localhost:5001;http://localhost:5000" + }, + "RP1AnalyticsWebApp-prod": { + "commandName": "Project", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Production" + }, + "applicationUrl": "https://localhost:5001;http://localhost:5000" } } } \ No newline at end of file diff --git a/RP1AnalyticsWebApp/RP1AnalyticsWebApp.csproj b/RP1AnalyticsWebApp/RP1AnalyticsWebApp.csproj index b8c4e83..9811eab 100644 --- a/RP1AnalyticsWebApp/RP1AnalyticsWebApp.csproj +++ b/RP1AnalyticsWebApp/RP1AnalyticsWebApp.csproj @@ -1,27 +1,123 @@ - - net6.0 - RP1AnalyticsWebApp - /subscriptions/4b00baf6-7f57-4be8-a64f-dbd94e553f28/resourcegroups/RP1CareerLog/providers/microsoft.insights/components/RP1CareerLog - 23129407-713f-4ed9-af75-39dffc62a42d - 2.0.0 - - - - - - - - - - - - - - - - + + net6.0 + RP1AnalyticsWebApp + /subscriptions/4b00baf6-7f57-4be8-a64f-dbd94e553f28/resourcegroups/RP1CareerLog/providers/microsoft.insights/components/RP1CareerLog + 23129407-713f-4ed9-af75-39dffc62a42d + 2.0.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + PreserveNewest + + + true + PreserveNewest + + + true + PreserveNewest + + + true + PreserveNewest + + + true + PreserveNewest + + + true + PreserveNewest + + + true + PreserveNewest + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/RP1AnalyticsWebApp/Startup.cs b/RP1AnalyticsWebApp/Startup.cs index 8d50c8f..4b0944c 100644 --- a/RP1AnalyticsWebApp/Startup.cs +++ b/RP1AnalyticsWebApp/Startup.cs @@ -18,6 +18,7 @@ using RP1AnalyticsWebApp.OData; using RP1AnalyticsWebApp.Services; using System.Linq; +using Vite.AspNetCore; namespace RP1AnalyticsWebApp { @@ -117,6 +118,12 @@ public void ConfigureServices(IServiceCollection services) }); services.AddHostedService(); + + services.AddViteServices(options => + { + options.Server.Https = true; + options.Server.AutoRun = true; + }); } // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. @@ -155,6 +162,12 @@ public void Configure(IApplicationBuilder app, IWebHostEnvironment env) endpoints.MapControllers(); endpoints.MapRazorPages(); }); + + if (env.IsDevelopment()) + { + app.UseWebSockets(); + app.UseViteDevelopmentServer(true); + } } private static IEdmModel GetEdmModel() diff --git a/RP1AnalyticsWebApp/env.d.ts b/RP1AnalyticsWebApp/env.d.ts new file mode 100644 index 0000000..151aa68 --- /dev/null +++ b/RP1AnalyticsWebApp/env.d.ts @@ -0,0 +1 @@ +/// \ No newline at end of file diff --git a/RP1AnalyticsWebApp/package-lock.json b/RP1AnalyticsWebApp/package-lock.json new file mode 100644 index 0000000..352adab --- /dev/null +++ b/RP1AnalyticsWebApp/package-lock.json @@ -0,0 +1,3505 @@ +{ + "name": "rp1analyticswebapp", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "rp1analyticswebapp", + "version": "1.0.0", + "dependencies": { + "@types/showdown": "^2.0.6", + "buffer": "^6.0.3", + "luxon": "^3.5.0", + "plotly.js-basic-dist": "^2.35.2", + "showdown": "^2.1.0", + "stream-browserify": "^3.0.0", + "vue": "^3.5.4" + }, + "devDependencies": { + "@rushstack/eslint-patch": "^1.10.4", + "@types/luxon": "^3.4.2", + "@types/node": "^20.14.2", + "@types/plotly.js-basic-dist": "^1.54.4", + "@vitejs/plugin-vue": "^5.1.3", + "@vue/eslint-config-typescript": "^13.0.0", + "@vue/tsconfig": "^0.5.1", + "eslint": "^8.57.0", + "eslint-plugin-vue": "^9.27.0", + "sass": "^1.77.5", + "typescript": "^5.4.5", + "vite": "^5.4.0", + "vue-tsc": "^2.0.29" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", + "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", + "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.6.tgz", + "integrity": "sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.25.6" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/types": { + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.6.tgz", + "integrity": "sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.24.8", + "@babel/helper-validator-identifier": "^7.24.7", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz", + "integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/js": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "deprecated": "Use @eslint/config-array instead", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", + "dev": true, + "license": "BSD-3-Clause" + }, + "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==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "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==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "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==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "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==", + "license": "MIT" + }, + "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==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "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==", + "dev": true, + "license": "MIT", + "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==", + "dev": true, + "license": "MIT", + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.21.2.tgz", + "integrity": "sha512-fSuPrt0ZO8uXeS+xP3b+yYTCBUd05MoSp2N/MFOgjhhUhMmchXlpTQrTpI8T+YAwAQuK7MafsCOxW7VrPMrJcg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.21.2.tgz", + "integrity": "sha512-xGU5ZQmPlsjQS6tzTTGwMsnKUtu0WVbl0hYpTPauvbRAnmIvpInhJtgjj3mcuJpEiuUw4v1s4BimkdfDWlh7gA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.21.2.tgz", + "integrity": "sha512-99AhQ3/ZMxU7jw34Sq8brzXqWH/bMnf7ZVhvLk9QU2cOepbQSVTns6qoErJmSiAvU3InRqC2RRZ5ovh1KN0d0Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.21.2.tgz", + "integrity": "sha512-ZbRaUvw2iN/y37x6dY50D8m2BnDbBjlnMPotDi/qITMJ4sIxNY33HArjikDyakhSv0+ybdUxhWxE6kTI4oX26w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.21.2.tgz", + "integrity": "sha512-ztRJJMiE8nnU1YFcdbd9BcH6bGWG1z+jP+IPW2oDUAPxPjo9dverIOyXz76m6IPA6udEL12reYeLojzW2cYL7w==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.21.2.tgz", + "integrity": "sha512-flOcGHDZajGKYpLV0JNc0VFH361M7rnV1ee+NTeC/BQQ1/0pllYcFmxpagltANYt8FYf9+kL6RSk80Ziwyhr7w==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.21.2.tgz", + "integrity": "sha512-69CF19Kp3TdMopyteO/LJbWufOzqqXzkrv4L2sP8kfMaAQ6iwky7NoXTp7bD6/irKgknDKM0P9E/1l5XxVQAhw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.21.2.tgz", + "integrity": "sha512-48pD/fJkTiHAZTnZwR0VzHrao70/4MlzJrq0ZsILjLW/Ab/1XlVUStYyGt7tdyIiVSlGZbnliqmult/QGA2O2w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.21.2.tgz", + "integrity": "sha512-cZdyuInj0ofc7mAQpKcPR2a2iu4YM4FQfuUzCVA2u4HI95lCwzjoPtdWjdpDKyHxI0UO82bLDoOaLfpZ/wviyQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.21.2.tgz", + "integrity": "sha512-RL56JMT6NwQ0lXIQmMIWr1SW28z4E4pOhRRNqwWZeXpRlykRIlEpSWdsgNWJbYBEWD84eocjSGDu/XxbYeCmwg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.21.2.tgz", + "integrity": "sha512-PMxkrWS9z38bCr3rWvDFVGD6sFeZJw4iQlhrup7ReGmfn7Oukrr/zweLhYX6v2/8J6Cep9IEA/SmjXjCmSbrMQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.21.2.tgz", + "integrity": "sha512-B90tYAUoLhU22olrafY3JQCFLnT3NglazdwkHyxNDYF/zAxJt5fJUB/yBoWFoIQ7SQj+KLe3iL4BhOMa9fzgpw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.21.2.tgz", + "integrity": "sha512-7twFizNXudESmC9oneLGIUmoHiiLppz/Xs5uJQ4ShvE6234K0VB1/aJYU3f/4g7PhssLGKBVCC37uRkkOi8wjg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.21.2.tgz", + "integrity": "sha512-9rRero0E7qTeYf6+rFh3AErTNU1VCQg2mn7CQcI44vNUWM9Ze7MSRS/9RFuSsox+vstRt97+x3sOhEey024FRQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.21.2.tgz", + "integrity": "sha512-5rA4vjlqgrpbFVVHX3qkrCo/fZTj1q0Xxpg+Z7yIo3J2AilW7t2+n6Q8Jrx+4MrYpAnjttTYF8rr7bP46BPzRw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.21.2.tgz", + "integrity": "sha512-6UUxd0+SKomjdzuAcp+HAmxw1FlGBnl1v2yEPSabtx4lBfdXHDVsW7+lQkgz9cNFJGY3AWR7+V8P5BqkD9L9nA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rushstack/eslint-patch": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.10.4.tgz", + "integrity": "sha512-WJgX9nzTqknM393q1QJDJmoW28kUfEnybeTfVNcNAPnIx210RXm2DiXiHzfNPJNIUUb1tJnz/l4QGtJ30PgWmA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/luxon": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.4.2.tgz", + "integrity": "sha512-TifLZlFudklWlMBfhubvgqTXRzLDI5pCbGa4P8a3wPyUQSW+1xQ5eDsreP9DWHX3tjq1ke96uYG/nwundroWcA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "20.16.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.16.5.tgz", + "integrity": "sha512-VwYCweNo3ERajwy0IUlqqcyZ8/A7Zwa9ZP3MnENWcB11AejO+tLy3pu850goUW2FC/IJMdZUfKpX/yxL1gymCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.19.2" + } + }, + "node_modules/@types/plotly.js": { + "version": "2.33.3", + "resolved": "https://registry.npmjs.org/@types/plotly.js/-/plotly.js-2.33.3.tgz", + "integrity": "sha512-Uu9aC8Z5oMj+oq1QHKtZAug9uAdPV66KPZrIa+r26bhktfuAbSCIq2HDN1kFPrcci0QKNCh8Gqj1GtMYvfoEUQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/plotly.js-basic-dist": { + "version": "1.54.4", + "resolved": "https://registry.npmjs.org/@types/plotly.js-basic-dist/-/plotly.js-basic-dist-1.54.4.tgz", + "integrity": "sha512-4Hwb5fB4sa3+SlgIDu4kfnUzhfJO789Drh7w5LvU6VglzYRcziztckvejbsnaP/TTRuiqIzLLRwqoflD6o1mKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/plotly.js": "*" + } + }, + "node_modules/@types/showdown": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/showdown/-/showdown-2.0.6.tgz", + "integrity": "sha512-pTvD/0CIeqe4x23+YJWlX2gArHa8G0J0Oh6GKaVXV7TAeickpkkZiNOgFcFcmLQ5lB/K0qBJL1FtRYltBfbGCQ==", + "license": "MIT" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.18.0.tgz", + "integrity": "sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "7.18.0", + "@typescript-eslint/type-utils": "7.18.0", + "@typescript-eslint/utils": "7.18.0", + "@typescript-eslint/visitor-keys": "7.18.0", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^7.0.0", + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.18.0.tgz", + "integrity": "sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/scope-manager": "7.18.0", + "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/typescript-estree": "7.18.0", + "@typescript-eslint/visitor-keys": "7.18.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.18.0.tgz", + "integrity": "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/visitor-keys": "7.18.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.18.0.tgz", + "integrity": "sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/typescript-estree": "7.18.0", + "@typescript-eslint/utils": "7.18.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz", + "integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.18.0.tgz", + "integrity": "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/visitor-keys": "7.18.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.18.0.tgz", + "integrity": "sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "7.18.0", + "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/typescript-estree": "7.18.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.18.0.tgz", + "integrity": "sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "7.18.0", + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/@vitejs/plugin-vue": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.1.3.tgz", + "integrity": "sha512-3xbWsKEKXYlmX82aOHufFQVnkbMC/v8fLpWwh6hWOUrK5fbbtBh9Q/WWse27BFgSy2/e2c0fz5Scgya9h2GLhw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "vite": "^5.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@volar/language-core": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.4.tgz", + "integrity": "sha512-kO9k4kTLfxpg+6lq7/KAIv3m2d62IHuCL6GbVgYZTpfKvIGoAIlDxK7pFcB/eczN2+ydg/vnyaeZ6SGyZrJw2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/source-map": "2.4.4" + } + }, + "node_modules/@volar/source-map": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.4.tgz", + "integrity": "sha512-xG3PZqOP2haG8XG4Pg3PD1UGDAdqZg24Ru8c/qYjYAnmcj6GBR64mstx+bZux5QOyRaJK+/lNM/RnpvBD3489g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@volar/typescript": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.4.tgz", + "integrity": "sha512-QQMQRVj0fVHJ3XdRKiS1LclhG0VBXdFYlyuHRQF/xLk2PuJuHNWP26MDZNvEVCvnyUQuUQhIAfylwY5TGPgc6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-core": "2.4.4", + "path-browserify": "^1.0.1", + "vscode-uri": "^3.0.8" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.4.tgz", + "integrity": "sha512-oNwn+BAt3n9dK9uAYvI+XGlutwuTq/wfj4xCBaZCqwwVIGtD7D6ViihEbyYZrDHIHTDE3Q6oL3/hqmAyFEy9DQ==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.25.3", + "@vue/shared": "3.5.4", + "entities": "^4.5.0", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.0" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.4.tgz", + "integrity": "sha512-yP9RRs4BDLOLfldn6ah+AGCNovGjMbL9uHvhDHf5wan4dAHLnFGOkqtfE7PPe4HTXIqE7l/NILdYw53bo1C8jw==", + "license": "MIT", + "dependencies": { + "@vue/compiler-core": "3.5.4", + "@vue/shared": "3.5.4" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.4.tgz", + "integrity": "sha512-P+yiPhL+NYH7m0ZgCq7AQR2q7OIE+mpAEgtkqEeH9oHSdIRvUO+4X6MPvblJIWcoe4YC5a2Gdf/RsoyP8FFiPQ==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.25.3", + "@vue/compiler-core": "3.5.4", + "@vue/compiler-dom": "3.5.4", + "@vue/compiler-ssr": "3.5.4", + "@vue/shared": "3.5.4", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.11", + "postcss": "^8.4.44", + "source-map-js": "^1.2.0" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.4.tgz", + "integrity": "sha512-acESdTXsxPnYr2C4Blv0ggx5zIFMgOzZmYU2UgvIff9POdRGbRNBHRyzHAnizcItvpgerSKQbllUc9USp3V7eg==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.4", + "@vue/shared": "3.5.4" + } + }, + "node_modules/@vue/compiler-vue2": { + "version": "2.7.16", + "resolved": "https://registry.npmjs.org/@vue/compiler-vue2/-/compiler-vue2-2.7.16.tgz", + "integrity": "sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==", + "dev": true, + "license": "MIT", + "dependencies": { + "de-indent": "^1.0.2", + "he": "^1.2.0" + } + }, + "node_modules/@vue/eslint-config-typescript": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@vue/eslint-config-typescript/-/eslint-config-typescript-13.0.0.tgz", + "integrity": "sha512-MHh9SncG/sfqjVqjcuFLOLD6Ed4dRAis4HNt0dXASeAuLqIAx4YMB1/m2o4pUKK1vCt8fUvYG8KKX2Ot3BVZTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "^7.1.1", + "@typescript-eslint/parser": "^7.1.1", + "vue-eslint-parser": "^9.3.1" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "peerDependencies": { + "eslint": "^8.56.0", + "eslint-plugin-vue": "^9.0.0", + "typescript": ">=4.7.4" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@vue/language-core": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-2.1.6.tgz", + "integrity": "sha512-MW569cSky9R/ooKMh6xa2g1D0AtRKbL56k83dzus/bx//RDJk24RHWkMzbAlXjMdDNyxAaagKPRquBIxkxlCkg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-core": "~2.4.1", + "@vue/compiler-dom": "^3.4.0", + "@vue/compiler-vue2": "^2.7.16", + "@vue/shared": "^3.4.0", + "computeds": "^0.0.1", + "minimatch": "^9.0.3", + "muggle-string": "^0.4.1", + "path-browserify": "^1.0.1" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@vue/language-core/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@vue/language-core/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@vue/reactivity": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.4.tgz", + "integrity": "sha512-HKKbEuP7tYSGCq4e4nK6ZW6l5hyG66OUetefBp4budUyjvAYsnQDf+bgFzg2RAgnH0CInyqXwD9y47jwJEHrQw==", + "license": "MIT", + "dependencies": { + "@vue/shared": "3.5.4" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.4.tgz", + "integrity": "sha512-f3ek2sTA0AFu0n+w+kCtz567Euqqa3eHewvo4klwS7mWfSj/A+UmYTwsnUFo35KeyAFY60JgrCGvEBsu1n/3LA==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.4", + "@vue/shared": "3.5.4" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.4.tgz", + "integrity": "sha512-ofyc0w6rbD5KtjhP1i9hGOKdxGpvmuB1jprP7Djlj0X7R5J/oLwuNuE98GJ8WW31Hu2VxQHtk/LYTAlW8xrJdw==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.4", + "@vue/runtime-core": "3.5.4", + "@vue/shared": "3.5.4", + "csstype": "^3.1.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.4.tgz", + "integrity": "sha512-FbjV6DJLgKRetMYFBA1UXCroCiED/Ckr53/ba9wivyd7D/Xw9fpo0T6zXzCnxQwyvkyrL7y6plgYhWhNjGxY5g==", + "license": "MIT", + "dependencies": { + "@vue/compiler-ssr": "3.5.4", + "@vue/shared": "3.5.4" + }, + "peerDependencies": { + "vue": "3.5.4" + } + }, + "node_modules/@vue/shared": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.4.tgz", + "integrity": "sha512-L2MCDD8l7yC62Te5UUyPVpmexhL9ipVnYRw9CsWfm/BGRL5FwDX4a25bcJ/OJSD3+Hx+k/a8LDKcG2AFdJV3BA==", + "license": "MIT" + }, + "node_modules/@vue/tsconfig": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@vue/tsconfig/-/tsconfig-0.5.1.tgz", + "integrity": "sha512-VcZK7MvpjuTPx2w6blwnwZAu5/LgBUtejFOi3pPGQFXQN5Ela03FUtd2Qtg4yWGGissVL0dr6Ro1LfOFh+PCuQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/acorn": { + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true, + "license": "ISC" + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", + "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/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/commander": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || >=14" + } + }, + "node_modules/computeds": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/computeds/-/computeds-0.0.1.tgz", + "integrity": "sha512-7CEBgcMjVmitjYo5q8JTJVra6X5mQ20uTThdK+0kR7UEaDrAWEQcRiBtWJzga4eRpP6afNwwLsX2SET2JhVB1Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "license": "MIT", + "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==", + "dev": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "license": "MIT" + }, + "node_modules/de-indent": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", + "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==", + "dev": true, + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-plugin-vue": { + "version": "9.28.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.28.0.tgz", + "integrity": "sha512-ShrihdjIhOTxs+MfWun6oJWuk+g/LAhN+CiuOl/jjkG3l0F2AuK5NMTaWqyvBgkFtpYmyks6P4603mLmhNJW8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "globals": "^13.24.0", + "natural-compare": "^1.4.0", + "nth-check": "^2.1.1", + "postcss-selector-parser": "^6.0.15", + "semver": "^7.6.3", + "vue-eslint-parser": "^9.4.3", + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": "^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0 || ^9.0.0" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "license": "MIT", + "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-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "dev": true, + "license": "ISC" + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, + "license": "MIT" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/immutable": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.7.tgz", + "integrity": "sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==", + "dev": true, + "license": "MIT" + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/luxon": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.5.0.tgz", + "integrity": "sha512-rh+Zjr6DNfUYR3bPwJEnuwDdqMbxZW7LOQfUN4B54+Cl+0o5zaU9RJ6bcidfDtC1cWCZXQ+nvX8bf6bAji37QQ==", + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/magic-string": { + "version": "0.30.11", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.11.tgz", + "integrity": "sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/muggle-string": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.4.1.tgz", + "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==", + "dev": true, + "license": "MIT" + }, + "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" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", + "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/plotly.js-basic-dist": { + "version": "2.35.2", + "resolved": "https://registry.npmjs.org/plotly.js-basic-dist/-/plotly.js-basic-dist-2.35.2.tgz", + "integrity": "sha512-cowePSVui1C6jx9hVi0wcYrIDS29Dp95HRjw31M8przgGls9t5jsdeScPzGGQuJ4/OTnQkTRZec25ZXDjfr/yA==", + "license": "MIT" + }, + "node_modules/postcss": { + "version": "8.4.45", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.45.tgz", + "integrity": "sha512-7KTLTdzdZZYscUc65XmjFiB73vBhBfbPztCYdUNvlaso9PrzjzcmjqBPR0lNGkcVlcO4BjiO5rK/qNz+XAen1Q==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.1", + "source-map-js": "^1.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=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==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.21.2.tgz", + "integrity": "sha512-e3TapAgYf9xjdLvKQCkQTnbTKd4a6jwlpQSJJFokHGaX2IVjoEqkIIhiQfqsi0cdwlOD+tQGuOd5AJkc5RngBw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.5" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.21.2", + "@rollup/rollup-android-arm64": "4.21.2", + "@rollup/rollup-darwin-arm64": "4.21.2", + "@rollup/rollup-darwin-x64": "4.21.2", + "@rollup/rollup-linux-arm-gnueabihf": "4.21.2", + "@rollup/rollup-linux-arm-musleabihf": "4.21.2", + "@rollup/rollup-linux-arm64-gnu": "4.21.2", + "@rollup/rollup-linux-arm64-musl": "4.21.2", + "@rollup/rollup-linux-powerpc64le-gnu": "4.21.2", + "@rollup/rollup-linux-riscv64-gnu": "4.21.2", + "@rollup/rollup-linux-s390x-gnu": "4.21.2", + "@rollup/rollup-linux-x64-gnu": "4.21.2", + "@rollup/rollup-linux-x64-musl": "4.21.2", + "@rollup/rollup-win32-arm64-msvc": "4.21.2", + "@rollup/rollup-win32-ia32-msvc": "4.21.2", + "@rollup/rollup-win32-x64-msvc": "4.21.2", + "fsevents": "~2.3.2" + } + }, + "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==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/sass": { + "version": "1.78.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.78.0.tgz", + "integrity": "sha512-AaIqGSrjo5lA2Yg7RvFZrlXDBCp3nV4XP73GrLGvdRWWwk+8H3l0SDvq/5bA4eF+0RFPLuWUk3E+P1U/YqnpsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/showdown": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/showdown/-/showdown-2.1.0.tgz", + "integrity": "sha512-/6NVYu4U819R2pUIk79n67SYgJHWCce0a5xTP979WbNp0FL9MN1I1QK662IDU1b6JzKTvmhgI7T7JYIxBi3kMQ==", + "license": "MIT", + "dependencies": { + "commander": "^9.0.0" + }, + "bin": { + "showdown": "bin/showdown.js" + }, + "funding": { + "type": "individual", + "url": "https://www.paypal.me/tiviesantos" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/stream-browserify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", + "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", + "license": "MIT", + "dependencies": { + "inherits": "~2.0.4", + "readable-stream": "^3.5.0" + } + }, + "node_modules/stream-browserify/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/terser": { + "version": "5.32.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.32.0.tgz", + "integrity": "sha512-v3Gtw3IzpBJ0ugkxEX8U0W6+TnPKRRCWGh1jC/iM/e3Ki5+qvO1L1EAZ56bZasc64aXHwRHNIQEzm6//i5cemQ==", + "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "peer": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true, + "license": "MIT" + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-api-utils": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", + "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", + "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", + "devOptional": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "dev": true, + "license": "MIT" + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/vite": { + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.3.tgz", + "integrity": "sha512-IH+nl64eq9lJjFqU+/yrRnrHPVTlgy42/+IzbOdaFDVlyLgI/wDlf+FCobXLX1cT0X5+7LMyH1mIy2xJdLfo8Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vscode-uri": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.8.tgz", + "integrity": "sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==", + "dev": true, + "license": "MIT" + }, + "node_modules/vue": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.4.tgz", + "integrity": "sha512-3yAj2gkmiY+i7+22A1PWM+kjOVXjU74UPINcTiN7grIVPyFFI0lpGwHlV/4xydDmobaBn7/xmi+YG8HeSlCTcg==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.4", + "@vue/compiler-sfc": "3.5.4", + "@vue/runtime-dom": "3.5.4", + "@vue/server-renderer": "3.5.4", + "@vue/shared": "3.5.4" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/vue-eslint-parser": { + "version": "9.4.3", + "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.4.3.tgz", + "integrity": "sha512-2rYRLWlIpaiN8xbPiDyXZXRgLGOtWxERV7ND5fFAv5qo1D2N9Fu9MNajBNc6o13lZ+24DAWCkQCvj4klgmcITg==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4", + "eslint-scope": "^7.1.1", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.3.1", + "esquery": "^1.4.0", + "lodash": "^4.17.21", + "semver": "^7.3.6" + }, + "engines": { + "node": "^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=6.0.0" + } + }, + "node_modules/vue-tsc": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-2.1.6.tgz", + "integrity": "sha512-f98dyZp5FOukcYmbFpuSCJ4Z0vHSOSmxGttZJCsFeX0M4w/Rsq0s4uKXjcSRsZqsRgQa6z7SfuO+y0HVICE57Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/typescript": "~2.4.1", + "@vue/language-core": "2.1.6", + "semver": "^7.5.4" + }, + "bin": { + "vue-tsc": "bin/vue-tsc.js" + }, + "peerDependencies": { + "typescript": ">=5.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/xml-name-validator": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", + "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/RP1AnalyticsWebApp/package.json b/RP1AnalyticsWebApp/package.json new file mode 100644 index 0000000..870f589 --- /dev/null +++ b/RP1AnalyticsWebApp/package.json @@ -0,0 +1,36 @@ +{ + "name": "rp1analyticswebapp", + "private": true, + "version": "1.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc && vite build", + "preview": "vite preview", + "lint": "eslint . --ext .vue,.js,.jsx,.cjs,.mjs,.ts,.tsx,.cts,.mts --fix --ignore-path .gitignore" + }, + "dependencies": { + "@types/showdown": "^2.0.6", + "buffer": "^6.0.3", + "luxon": "^3.5.0", + "plotly.js-basic-dist": "^2.35.2", + "showdown": "^2.1.0", + "stream-browserify": "^3.0.0", + "vue": "^3.5.4" + }, + "devDependencies": { + "@rushstack/eslint-patch": "^1.10.4", + "@types/luxon": "^3.4.2", + "@types/node": "^20.14.2", + "@types/plotly.js-basic-dist": "^1.54.4", + "@vitejs/plugin-vue": "^5.1.3", + "@vue/eslint-config-typescript": "^13.0.0", + "@vue/tsconfig": "^0.5.1", + "eslint": "^8.57.0", + "eslint-plugin-vue": "^9.27.0", + "sass": "^1.77.5", + "typescript": "^5.4.5", + "vite": "^5.4.0", + "vue-tsc": "^2.0.29" + } +} diff --git a/RP1AnalyticsWebApp/wwwroot/browserconfig.xml b/RP1AnalyticsWebApp/public/browserconfig.xml similarity index 100% rename from RP1AnalyticsWebApp/wwwroot/browserconfig.xml rename to RP1AnalyticsWebApp/public/browserconfig.xml diff --git a/RP1AnalyticsWebApp/wwwroot/images/agathorn.webp b/RP1AnalyticsWebApp/public/images/agathorn.webp similarity index 100% rename from RP1AnalyticsWebApp/wwwroot/images/agathorn.webp rename to RP1AnalyticsWebApp/public/images/agathorn.webp diff --git a/RP1AnalyticsWebApp/wwwroot/images/android-icon-144x144.png b/RP1AnalyticsWebApp/public/images/android-icon-144x144.png similarity index 100% rename from RP1AnalyticsWebApp/wwwroot/images/android-icon-144x144.png rename to RP1AnalyticsWebApp/public/images/android-icon-144x144.png diff --git a/RP1AnalyticsWebApp/wwwroot/images/android-icon-192x192.png b/RP1AnalyticsWebApp/public/images/android-icon-192x192.png similarity index 100% rename from RP1AnalyticsWebApp/wwwroot/images/android-icon-192x192.png rename to RP1AnalyticsWebApp/public/images/android-icon-192x192.png diff --git a/RP1AnalyticsWebApp/wwwroot/images/android-icon-36x36.png b/RP1AnalyticsWebApp/public/images/android-icon-36x36.png similarity index 100% rename from RP1AnalyticsWebApp/wwwroot/images/android-icon-36x36.png rename to RP1AnalyticsWebApp/public/images/android-icon-36x36.png diff --git a/RP1AnalyticsWebApp/wwwroot/images/android-icon-48x48.png b/RP1AnalyticsWebApp/public/images/android-icon-48x48.png similarity index 100% rename from RP1AnalyticsWebApp/wwwroot/images/android-icon-48x48.png rename to RP1AnalyticsWebApp/public/images/android-icon-48x48.png diff --git a/RP1AnalyticsWebApp/wwwroot/images/android-icon-72x72.png b/RP1AnalyticsWebApp/public/images/android-icon-72x72.png similarity index 100% rename from RP1AnalyticsWebApp/wwwroot/images/android-icon-72x72.png rename to RP1AnalyticsWebApp/public/images/android-icon-72x72.png diff --git a/RP1AnalyticsWebApp/wwwroot/images/android-icon-96x96.png b/RP1AnalyticsWebApp/public/images/android-icon-96x96.png similarity index 100% rename from RP1AnalyticsWebApp/wwwroot/images/android-icon-96x96.png rename to RP1AnalyticsWebApp/public/images/android-icon-96x96.png diff --git a/RP1AnalyticsWebApp/wwwroot/images/apple-icon-114x114.png b/RP1AnalyticsWebApp/public/images/apple-icon-114x114.png similarity index 100% rename from RP1AnalyticsWebApp/wwwroot/images/apple-icon-114x114.png rename to RP1AnalyticsWebApp/public/images/apple-icon-114x114.png diff --git a/RP1AnalyticsWebApp/wwwroot/images/apple-icon-120x120.png b/RP1AnalyticsWebApp/public/images/apple-icon-120x120.png similarity index 100% rename from RP1AnalyticsWebApp/wwwroot/images/apple-icon-120x120.png rename to RP1AnalyticsWebApp/public/images/apple-icon-120x120.png diff --git a/RP1AnalyticsWebApp/wwwroot/images/apple-icon-144x144.png b/RP1AnalyticsWebApp/public/images/apple-icon-144x144.png similarity index 100% rename from RP1AnalyticsWebApp/wwwroot/images/apple-icon-144x144.png rename to RP1AnalyticsWebApp/public/images/apple-icon-144x144.png diff --git a/RP1AnalyticsWebApp/wwwroot/images/apple-icon-152x152.png b/RP1AnalyticsWebApp/public/images/apple-icon-152x152.png similarity index 100% rename from RP1AnalyticsWebApp/wwwroot/images/apple-icon-152x152.png rename to RP1AnalyticsWebApp/public/images/apple-icon-152x152.png diff --git a/RP1AnalyticsWebApp/wwwroot/images/apple-icon-180x180.png b/RP1AnalyticsWebApp/public/images/apple-icon-180x180.png similarity index 100% rename from RP1AnalyticsWebApp/wwwroot/images/apple-icon-180x180.png rename to RP1AnalyticsWebApp/public/images/apple-icon-180x180.png diff --git a/RP1AnalyticsWebApp/wwwroot/images/apple-icon-57x57.png b/RP1AnalyticsWebApp/public/images/apple-icon-57x57.png similarity index 100% rename from RP1AnalyticsWebApp/wwwroot/images/apple-icon-57x57.png rename to RP1AnalyticsWebApp/public/images/apple-icon-57x57.png diff --git a/RP1AnalyticsWebApp/wwwroot/images/apple-icon-60x60.png b/RP1AnalyticsWebApp/public/images/apple-icon-60x60.png similarity index 100% rename from RP1AnalyticsWebApp/wwwroot/images/apple-icon-60x60.png rename to RP1AnalyticsWebApp/public/images/apple-icon-60x60.png diff --git a/RP1AnalyticsWebApp/wwwroot/images/apple-icon-72x72.png b/RP1AnalyticsWebApp/public/images/apple-icon-72x72.png similarity index 100% rename from RP1AnalyticsWebApp/wwwroot/images/apple-icon-72x72.png rename to RP1AnalyticsWebApp/public/images/apple-icon-72x72.png diff --git a/RP1AnalyticsWebApp/wwwroot/images/apple-icon-76x76.png b/RP1AnalyticsWebApp/public/images/apple-icon-76x76.png similarity index 100% rename from RP1AnalyticsWebApp/wwwroot/images/apple-icon-76x76.png rename to RP1AnalyticsWebApp/public/images/apple-icon-76x76.png diff --git a/RP1AnalyticsWebApp/wwwroot/images/apple-icon-precomposed.png b/RP1AnalyticsWebApp/public/images/apple-icon-precomposed.png similarity index 100% rename from RP1AnalyticsWebApp/wwwroot/images/apple-icon-precomposed.png rename to RP1AnalyticsWebApp/public/images/apple-icon-precomposed.png diff --git a/RP1AnalyticsWebApp/wwwroot/images/apple-icon.png b/RP1AnalyticsWebApp/public/images/apple-icon.png similarity index 100% rename from RP1AnalyticsWebApp/wwwroot/images/apple-icon.png rename to RP1AnalyticsWebApp/public/images/apple-icon.png diff --git a/RP1AnalyticsWebApp/wwwroot/images/favicon-16x16.png b/RP1AnalyticsWebApp/public/images/favicon-16x16.png similarity index 100% rename from RP1AnalyticsWebApp/wwwroot/images/favicon-16x16.png rename to RP1AnalyticsWebApp/public/images/favicon-16x16.png diff --git a/RP1AnalyticsWebApp/wwwroot/images/favicon-32x32.png b/RP1AnalyticsWebApp/public/images/favicon-32x32.png similarity index 100% rename from RP1AnalyticsWebApp/wwwroot/images/favicon-32x32.png rename to RP1AnalyticsWebApp/public/images/favicon-32x32.png diff --git a/RP1AnalyticsWebApp/wwwroot/images/favicon-96x96.png b/RP1AnalyticsWebApp/public/images/favicon-96x96.png similarity index 100% rename from RP1AnalyticsWebApp/wwwroot/images/favicon-96x96.png rename to RP1AnalyticsWebApp/public/images/favicon-96x96.png diff --git a/RP1AnalyticsWebApp/wwwroot/images/favicon.ico b/RP1AnalyticsWebApp/public/images/favicon.ico similarity index 100% rename from RP1AnalyticsWebApp/wwwroot/images/favicon.ico rename to RP1AnalyticsWebApp/public/images/favicon.ico diff --git a/RP1AnalyticsWebApp/wwwroot/images/ms-icon-144x144.png b/RP1AnalyticsWebApp/public/images/ms-icon-144x144.png similarity index 100% rename from RP1AnalyticsWebApp/wwwroot/images/ms-icon-144x144.png rename to RP1AnalyticsWebApp/public/images/ms-icon-144x144.png diff --git a/RP1AnalyticsWebApp/wwwroot/images/ms-icon-150x150.png b/RP1AnalyticsWebApp/public/images/ms-icon-150x150.png similarity index 100% rename from RP1AnalyticsWebApp/wwwroot/images/ms-icon-150x150.png rename to RP1AnalyticsWebApp/public/images/ms-icon-150x150.png diff --git a/RP1AnalyticsWebApp/wwwroot/images/ms-icon-310x310.png b/RP1AnalyticsWebApp/public/images/ms-icon-310x310.png similarity index 100% rename from RP1AnalyticsWebApp/wwwroot/images/ms-icon-310x310.png rename to RP1AnalyticsWebApp/public/images/ms-icon-310x310.png diff --git a/RP1AnalyticsWebApp/wwwroot/images/ms-icon-70x70.png b/RP1AnalyticsWebApp/public/images/ms-icon-70x70.png similarity index 100% rename from RP1AnalyticsWebApp/wwwroot/images/ms-icon-70x70.png rename to RP1AnalyticsWebApp/public/images/ms-icon-70x70.png diff --git a/RP1AnalyticsWebApp/wwwroot/manifest.json b/RP1AnalyticsWebApp/public/manifest.json similarity index 100% rename from RP1AnalyticsWebApp/wwwroot/manifest.json rename to RP1AnalyticsWebApp/public/manifest.json diff --git a/RP1AnalyticsWebApp/src/assets/agathorn.webp b/RP1AnalyticsWebApp/src/assets/agathorn.webp new file mode 100644 index 0000000000000000000000000000000000000000..7510ed5995635fffbb9bb8df82e1a1e6454408a1 GIT binary patch literal 3170 zcmV-o44v~*Nk&Fm3;+OEMM6+kP&gn?3;+P|GXR|dDu4ih06uLjl18K=A)zdo`>=ow ziEIGU<$?aquWi}C9KDfk-`KwkdZqCXqkOjcQ~hV%cfYUkp2UAef4TPn{W1Sp)EmqP z^MCNav%d14hkXG*n16Qv+t?%M0p*GNd+<;DQ~PJ|6Z;|R0q6n3$NlHFZ|k3r9)tL} z^Z&Uy$iCHn!~2)*=jD&cf8~4+;05^y^FQ;Sm)s_LhnN?&Uq%0u{h#rZoPQ7x%Z@YZ z0DflwtLgjoH=X~g{ewSSKjwBC{oM9AKydlXmC}=6MM$5i_C0ljoQ--rifYtxCW#{X z8$uHN(w|~hRR!Gtb3@yol@|1DT@arv$B;623{gtdh%N*}*O0rnFMh~>SsVo!o}-xS z?>XYqr_jpEDmQ_%7+PRf=Oh^Q1&xt3Z;*iOq3cK%wUHT;$a&-ljp}!U@;(0 z;MBu#{{`3^8e!nU{e-*nt0!ACf8aIYAOn6j`k&HQ;xRGq>k!PN;4WC(Y}Nhr$W&Tb z<=)pT5z7Pe(~QgUDtNVqy)~omy-jWIjzgzs8Ppnu;z+hn|cfIZ=Xm~F7Abz*0cUcY2D@w6Ye^I*S4m3 z{-dwIZl!Cp%iu_g=o!oCuxIQm(#R$5=~V%x+=@*0L;IPR%`JG&7zN7J~Y{(>tWnpBnKjzx*^t zpwc{|tV}kg!aIF4EuHsKQqdnWPWP2p4~~C!E59qNs{XSc@9nV9WqSM}AkxpmXPmp( z%5!-eK(C2<=P*42bPg}&YXmM18*)Hy(;sv`_@>^qHvY;-yX-vG{<+uq8G1EwJjMf| ziJ(`EG2or&yd=GyiQ*b_zJRXA-Xh2Kr6ZXW-Mg>&ls}m%^oW8$*f-jcb9cT}arPX8Aq|J?>xRBw1bLZZ$v|v! zi@mEI({5z9aC-;D-%r2uaFjapOtF3iEmX$|JrrBd>fZwJSgSUI|Bf(M^?coK2x#vD z{I?s*+E%cyjZBaf-G7!hf?3T4)^_Libp&*dKVMIc6B8nl5zH7VFgfVbD9Vp5zK6UK zlA0819-%fR-p|64@1SD_qchksvbmbP>;N^cGb5Py_~F}CZDNuB>5ytVidNHcGXH0z zmll{V7ROP3d)4_etMZ4djff5e_-vyM4a;VfE zEEYA-D7!Kh7iSAT$-k$p1Uas@Q!CEgjKi-^%FIi(Sqp4wIFml}vd}|8UZ!`YWggv9 z5PK3Ym*>CNd($iTAHl( zCq*B22-`<5ko9@y$6c2p)>lzX^SQ1Y84Wf|sG&F;dSty?bvsDa$P$l+!A@AHKAi_x z)Q#=If7^wzDCvS&{lbV>_<~HBxxV@ne0}NIr;_|fJ2?wk96r; zsIPe(MXc%18ujCf+Cc$4?&pAiUM=Npnk$fjWBK-}S{K`Vz_TCRzx(Q2l}fu3%ouU~ z`$`{pfm00e2>I8)7P41irU#`2uv3izp`OVXcIW?4H~;tP0GcOe6YP1Tl(@KoVo&1$ zI?+`=WD*3@(l(~|qpmdP7?9un4xZ&jOQ7m++eh<}^)TPUw|4#Gg#=So?qwMocyg3q zd(`ix8Xj)tr{Tkj2i}k(W(jPHmnwUDAC{!iI@cv)x)uvlwmX(~X+8sGk3Uwx_Z=Ky z(^MZuAK=KV@4vNSXnjk5rb7>C9cKm~T$z_tQ6%rHN5F zKkT5vdw1k&chy&Ut-NCfJO?I>f}c=#3gag=$e%>Bh}BKL8}+F?Mc&^{GrM|T>}Ge$ z8A^C4E;nmZPT9XRQjK~pSDU48BsHB4%z=E^M##P^l3|(5VE^Ov8 zDd3qn@&cGcZhYukEz-=BbC5`ZJyCN;A%+bO?v(EY#;2rLQ8jvPypYy!pP>n&hFgC# za-RwNJ_^37nAjWV591kz<}jXI6exy-Nnn*w>X{3UppaS@zOIfzn(8=K8}qIQ;M6b5 z4N@_&P-`p|7|^1gR6?X$81GhPay@F9)_FpX_%3B{btghSC+CR4t?DmTBt4>LKC*9* z2X}4GdKQKZh=HY5H|9gJZNYl_lYQ0cin`Qj4$u9S8!HMGjRt1|Ln^DBMzIc^k6=Ek z{Re{g7$Vr@3=qdJ=fTvO0mHt>zfc5iL#qf+$yd!lq2S@XrmHKs)2rqZ3~6mNZ5x>3 z;RDoQEo9_)x_(AR0iCp|VehYn-^K1Z?ouP>L~cr` z#sCLE?7cUUcQ8BL9G|k)UIY*I>ZWZX)V(v`+>_9Rixd#KK~IS3k3+r$9&`f|BBh(Y zfjt+L-#lh_&ucP0o(}MXAfIAc*v~(I&m}TFHNF^z+?Tt<9~(XQHv8g#*M(*>1QOEY`b({JxtkaI{N@lU<2Q^bjG~Lv(vo`f_uTWf=#QG4mL8Yvs5>j8 z2-t_ni!vpFvlYb|4G94AA>D9IOf%;iNc0=OX(_97j`7u&g`s`+!|CxxHa%W>1*m-2 z2K`!6BOuQ=f6r9PpUTK3|H_(;C<qY72~Jc${q&{&`{Tf*JU)OIH9rH)D9En}zX7g+2whGCT<bh_i zu^o3(?))bpj(`T$(Nk>BAF?)iGYogSfVcDym_J*cl$GcT03a@SfrfSy3WnC@P{0Rq I+wlwl05s=AK>z>% literal 0 HcmV?d00001 diff --git a/RP1AnalyticsWebApp/src/careerlog-main.ts b/RP1AnalyticsWebApp/src/careerlog-main.ts new file mode 100644 index 0000000..4e56039 --- /dev/null +++ b/RP1AnalyticsWebApp/src/careerlog-main.ts @@ -0,0 +1,6 @@ +import 'vite/modulepreload-polyfill'; +import { createApp } from 'vue'; +import CareerLog from './components/Careerlog.vue'; + +var app = createApp(CareerLog); +app.mount('#appWrapper'); diff --git a/RP1AnalyticsWebApp/src/components/CareerDates.vue b/RP1AnalyticsWebApp/src/components/CareerDates.vue new file mode 100644 index 0000000..c418771 --- /dev/null +++ b/RP1AnalyticsWebApp/src/components/CareerDates.vue @@ -0,0 +1,57 @@ + + + diff --git a/RP1AnalyticsWebApp/src/components/CareerFiltersModal.vue b/RP1AnalyticsWebApp/src/components/CareerFiltersModal.vue new file mode 100644 index 0000000..79bdf71 --- /dev/null +++ b/RP1AnalyticsWebApp/src/components/CareerFiltersModal.vue @@ -0,0 +1,231 @@ + + + diff --git a/RP1AnalyticsWebApp/src/components/CareerSelect.vue b/RP1AnalyticsWebApp/src/components/CareerSelect.vue new file mode 100644 index 0000000..960d6f0 --- /dev/null +++ b/RP1AnalyticsWebApp/src/components/CareerSelect.vue @@ -0,0 +1,86 @@ + + + diff --git a/RP1AnalyticsWebApp/src/components/Careerlog.vue b/RP1AnalyticsWebApp/src/components/Careerlog.vue new file mode 100644 index 0000000..b114b34 --- /dev/null +++ b/RP1AnalyticsWebApp/src/components/Careerlog.vue @@ -0,0 +1,201 @@ + + + diff --git a/RP1AnalyticsWebApp/src/components/Chart.vue b/RP1AnalyticsWebApp/src/components/Chart.vue new file mode 100644 index 0000000..6990b62 --- /dev/null +++ b/RP1AnalyticsWebApp/src/components/Chart.vue @@ -0,0 +1,493 @@ + + + + + diff --git a/RP1AnalyticsWebApp/src/components/ContractLeaderboardModal.vue b/RP1AnalyticsWebApp/src/components/ContractLeaderboardModal.vue new file mode 100644 index 0000000..4326a70 --- /dev/null +++ b/RP1AnalyticsWebApp/src/components/ContractLeaderboardModal.vue @@ -0,0 +1,80 @@ + + + diff --git a/RP1AnalyticsWebApp/src/components/ContractRecordsTable.vue b/RP1AnalyticsWebApp/src/components/ContractRecordsTable.vue new file mode 100644 index 0000000..1e1a33b --- /dev/null +++ b/RP1AnalyticsWebApp/src/components/ContractRecordsTable.vue @@ -0,0 +1,94 @@ + + + diff --git a/RP1AnalyticsWebApp/src/components/DataTabMixin.vue b/RP1AnalyticsWebApp/src/components/DataTabMixin.vue new file mode 100644 index 0000000..e652461 --- /dev/null +++ b/RP1AnalyticsWebApp/src/components/DataTabMixin.vue @@ -0,0 +1,58 @@ + diff --git a/RP1AnalyticsWebApp/src/components/Facilities.vue b/RP1AnalyticsWebApp/src/components/Facilities.vue new file mode 100644 index 0000000..377be7e --- /dev/null +++ b/RP1AnalyticsWebApp/src/components/Facilities.vue @@ -0,0 +1,132 @@ + + + diff --git a/RP1AnalyticsWebApp/src/components/Launches.vue b/RP1AnalyticsWebApp/src/components/Launches.vue new file mode 100644 index 0000000..27cc195 --- /dev/null +++ b/RP1AnalyticsWebApp/src/components/Launches.vue @@ -0,0 +1,197 @@ + + + + + diff --git a/RP1AnalyticsWebApp/src/components/Leaders.vue b/RP1AnalyticsWebApp/src/components/Leaders.vue new file mode 100644 index 0000000..0e04f35 --- /dev/null +++ b/RP1AnalyticsWebApp/src/components/Leaders.vue @@ -0,0 +1,73 @@ + + + diff --git a/RP1AnalyticsWebApp/src/components/LoadingSpinner.vue b/RP1AnalyticsWebApp/src/components/LoadingSpinner.vue new file mode 100644 index 0000000..8261cac --- /dev/null +++ b/RP1AnalyticsWebApp/src/components/LoadingSpinner.vue @@ -0,0 +1,48 @@ + + + diff --git a/RP1AnalyticsWebApp/src/components/MetaInformation.vue b/RP1AnalyticsWebApp/src/components/MetaInformation.vue new file mode 100644 index 0000000..155e679 --- /dev/null +++ b/RP1AnalyticsWebApp/src/components/MetaInformation.vue @@ -0,0 +1,90 @@ + + + diff --git a/RP1AnalyticsWebApp/src/components/MilestoneContracts.vue b/RP1AnalyticsWebApp/src/components/MilestoneContracts.vue new file mode 100644 index 0000000..0a5e3ff --- /dev/null +++ b/RP1AnalyticsWebApp/src/components/MilestoneContracts.vue @@ -0,0 +1,52 @@ + + + diff --git a/RP1AnalyticsWebApp/src/components/Navbar.vue b/RP1AnalyticsWebApp/src/components/Navbar.vue new file mode 100644 index 0000000..d3d0a33 --- /dev/null +++ b/RP1AnalyticsWebApp/src/components/Navbar.vue @@ -0,0 +1,79 @@ +// Template markup is defined in _Layout.cshtml + + + + diff --git a/RP1AnalyticsWebApp/src/components/ProgramLeaderboardModal.vue b/RP1AnalyticsWebApp/src/components/ProgramLeaderboardModal.vue new file mode 100644 index 0000000..703e098 --- /dev/null +++ b/RP1AnalyticsWebApp/src/components/ProgramLeaderboardModal.vue @@ -0,0 +1,100 @@ + + + diff --git a/RP1AnalyticsWebApp/wwwroot/js/components/program-record-type-select.js b/RP1AnalyticsWebApp/src/components/ProgramRecordTypeSelect.vue similarity index 77% rename from RP1AnalyticsWebApp/wwwroot/js/components/program-record-type-select.js rename to RP1AnalyticsWebApp/src/components/ProgramRecordTypeSelect.vue index 377dd43..a4668ae 100644 --- a/RP1AnalyticsWebApp/wwwroot/js/components/program-record-type-select.js +++ b/RP1AnalyticsWebApp/src/components/ProgramRecordTypeSelect.vue @@ -1,6 +1,4 @@ -const ProgramRecordTypeSelect = { - props: ['active'], - template: ` + + + diff --git a/RP1AnalyticsWebApp/src/components/ProgramRecordsTable.vue b/RP1AnalyticsWebApp/src/components/ProgramRecordsTable.vue new file mode 100644 index 0000000..a0fed1f --- /dev/null +++ b/RP1AnalyticsWebApp/src/components/ProgramRecordsTable.vue @@ -0,0 +1,98 @@ + + + diff --git a/RP1AnalyticsWebApp/src/components/Programs.vue b/RP1AnalyticsWebApp/src/components/Programs.vue new file mode 100644 index 0000000..354188e --- /dev/null +++ b/RP1AnalyticsWebApp/src/components/Programs.vue @@ -0,0 +1,63 @@ + + + diff --git a/RP1AnalyticsWebApp/src/components/RaceManagement.vue b/RP1AnalyticsWebApp/src/components/RaceManagement.vue new file mode 100644 index 0000000..d2e1e21 --- /dev/null +++ b/RP1AnalyticsWebApp/src/components/RaceManagement.vue @@ -0,0 +1,91 @@ + + + diff --git a/RP1AnalyticsWebApp/src/components/Records.vue b/RP1AnalyticsWebApp/src/components/Records.vue new file mode 100644 index 0000000..8286de5 --- /dev/null +++ b/RP1AnalyticsWebApp/src/components/Records.vue @@ -0,0 +1,76 @@ + + + diff --git a/RP1AnalyticsWebApp/src/components/RepeatableContracts.vue b/RP1AnalyticsWebApp/src/components/RepeatableContracts.vue new file mode 100644 index 0000000..3e0243f --- /dev/null +++ b/RP1AnalyticsWebApp/src/components/RepeatableContracts.vue @@ -0,0 +1,52 @@ + + + diff --git a/RP1AnalyticsWebApp/wwwroot/js/components/selection-tab.js b/RP1AnalyticsWebApp/src/components/SelectionTab.vue similarity index 91% rename from RP1AnalyticsWebApp/wwwroot/js/components/selection-tab.js rename to RP1AnalyticsWebApp/src/components/SelectionTab.vue index 3137441..e09da74 100644 --- a/RP1AnalyticsWebApp/wwwroot/js/components/selection-tab.js +++ b/RP1AnalyticsWebApp/src/components/SelectionTab.vue @@ -1,6 +1,4 @@ -const SelectionTab = { - props: ['active'], - template: ` + + + diff --git a/RP1AnalyticsWebApp/src/components/TechUnlocks.vue b/RP1AnalyticsWebApp/src/components/TechUnlocks.vue new file mode 100644 index 0000000..f864062 --- /dev/null +++ b/RP1AnalyticsWebApp/src/components/TechUnlocks.vue @@ -0,0 +1,57 @@ + + + diff --git a/RP1AnalyticsWebApp/src/css/styles.scss b/RP1AnalyticsWebApp/src/css/styles.scss new file mode 100644 index 0000000..f658cda --- /dev/null +++ b/RP1AnalyticsWebApp/src/css/styles.scss @@ -0,0 +1,39 @@ +[v-cloak] { + display: none +} + +* { + font-family: 'Poppins', sans-serif; +} + +.contracts-app { + h2 { + margin-top: 0.75rem; + } + + .collection .collection-item { + padding: 6px 12px; + } + + .preloader-wrapper { + margin: 2rem 10rem; + } + + .inline-icon { + margin-left: 5px; + vertical-align: middle; + } +} + +tr.clickable { + cursor: pointer; +} + +.date-col { + white-space: nowrap; +} + +.copy-url { + background: lightgray; + user-select: all; +} diff --git a/RP1AnalyticsWebApp/src/env.d.ts b/RP1AnalyticsWebApp/src/env.d.ts new file mode 100644 index 0000000..3825d3d --- /dev/null +++ b/RP1AnalyticsWebApp/src/env.d.ts @@ -0,0 +1,8 @@ +/// + +/* eslint-disable */ +declare module '*.vue' { + import type { DefineComponent } from 'vue' + const component: DefineComponent<{}, {}, any> + export default component +} diff --git a/RP1AnalyticsWebApp/src/navbar-main.ts b/RP1AnalyticsWebApp/src/navbar-main.ts new file mode 100644 index 0000000..9ed4309 --- /dev/null +++ b/RP1AnalyticsWebApp/src/navbar-main.ts @@ -0,0 +1,8 @@ +import 'vite/modulepreload-polyfill'; +import { createApp } from 'vue'; +import NavBar from './components/Navbar.vue'; +import CareerFiltersModal from './components/CareerFiltersModal.vue'; + +var app = createApp(NavBar); +app.component('CareerFiltersModal', CareerFiltersModal); +app.mount('#navbar'); diff --git a/RP1AnalyticsWebApp/src/races-main.ts b/RP1AnalyticsWebApp/src/races-main.ts new file mode 100644 index 0000000..d3a1f9b --- /dev/null +++ b/RP1AnalyticsWebApp/src/races-main.ts @@ -0,0 +1,6 @@ +import 'vite/modulepreload-polyfill'; +import { createApp } from 'vue'; +import RaceManagement from './components/RaceManagement.vue'; + +var app = createApp(RaceManagement); +app.mount('#app'); diff --git a/RP1AnalyticsWebApp/src/records-main.ts b/RP1AnalyticsWebApp/src/records-main.ts new file mode 100644 index 0000000..cd7f925 --- /dev/null +++ b/RP1AnalyticsWebApp/src/records-main.ts @@ -0,0 +1,6 @@ +import 'vite/modulepreload-polyfill'; +import { createApp } from 'vue'; +import Records from './components/Records.vue'; + +var app = createApp(Records); +app.mount('#app'); diff --git a/RP1AnalyticsWebApp/src/types.ts b/RP1AnalyticsWebApp/src/types.ts new file mode 100644 index 0000000..ab2178e --- /dev/null +++ b/RP1AnalyticsWebApp/src/types.ts @@ -0,0 +1,247 @@ +import { programSpeeds } from './utils/programSpeeds'; + +interface UserData { + userName: string; + preferredName: string; +} +export type { UserData }; + +interface CurrentUser { + userName: string; + roles: string[]; +} +export type { CurrentUser }; + +interface CareerLog { + id: string; + name: string; + userLogin: string; + token: string; + eligibleForRecords: boolean; + startDate: string; + endDate: string; + lastUpdate: string; + race: string; + careerLogEntries: CareerLogPeriod[]; + contractEventEntries: ContractEvent[]; + //lcs: LC[]; + //facilityConstructions: FacilityConstruction[]; + //techEventEntries: TechResearchEvent[]; + //launchEventEntries: LaunchEvent[]; + programs: ProgramItem[]; + //leaders: Leader[]; + careerLogMeta: CareerLogMeta; +} +export type { CareerLog }; + +interface CareerLogPeriod { + startDate: string; + endDate: string; + numEngineers: number; + numResearchers: number; + efficiencyEngineers: number; + currentFunds: number; + currentSci: number; + rnDQueueLength: number; + scienceEarned: number; + salaryEngineers: number; + salaryResearchers: number; + salaryCrew: number; + programFunds: number; + otherFundsEarned: number; + launchFees: number; + vesselPurchase: number; + vesselRecovery: number; + lcMaintenance: number; + facilityMaintenance: number; + maintenanceFees: number; + trainingFees: number; + toolingFees: number; + entryCosts: number; + spentUnlockCredit: number; + constructionFees: number; + hiringResearchers: number; + hiringEngineers: number; + otherFees: number; + subsidySize: number; + subsidyPaidOut: number; + repFromPrograms: number; + fundsGainMult: number; + numNautsKilled: number; + confidence: number; + reputation: number; +} +export type { CareerLogPeriod }; + +interface CareerLogMeta { + careerPlaystyle: string; + difficultyLevel: string; + configurableStart: string; + failureModel: string; + modRecency: string; + versionTag: string; + versionSort: number; + creationDate: string; + descriptionText: string; +} +export type { CareerLogMeta }; + +interface ContractEvent { + internalName: string; + date: string; + repChange: number; + type: number; +} +export type { ContractEvent }; + +interface ProgramItem { + name: string; + title: string; + accepted: string; + objectivesCompleted: string; + completed: string; + nominalDurationYears: number; + totalFunding: number; + fundsPaidOut: number; + repPenaltyAssessed: number; + speed: keyof typeof programSpeeds; + speedText: string; +} +export type { ProgramItem }; + +interface BaseContractEvent { + contractInternalName: string; + contractDisplayName: string; + type: number; + date: string; +} +export type { BaseContractEvent }; + +interface ContractEventWithCareerInfo extends BaseContractEvent { + CareerId: string; + CareerName: string; + UserLogin: string; + UserPreferredName: string; +} +export type { ContractEventWithCareerInfo }; + +interface Launch { + date: string; + vesselName: string; + vesselUID: string; + launchID: string; + builtAt: string; + failures: Failure[]; + metadata: LaunchMetadata; + visible: boolean; +} +export type { Launch }; + +interface Failure { + date: string; + part: string; + type: string; +} +export type { Failure }; + +interface LaunchMetadata { + success: boolean | null; +} +export type { LaunchMetadata }; + +interface LeaderEvent { + name: string; + title: string; + type: string; + dateAdd: string; + dateRemove: string; + fireCost: number; +} +export type { LeaderEvent }; + +interface FacilityEvent { + id: string; + facility: string; + newLevel: number; + cost: number; + state: string; + started: string; + ended: string; +} +export type { FacilityEvent }; + +interface LCItem { + id: string; + modId: string; + modCost: number; + name: string; + lcType: string; + massMax: number; + massOrig: number; + sizeMax: Vector3; + isHumanRated: boolean; + state: string; + constrStarted: string; + constrEnded: string; + visible: boolean; +} +export type { LCItem }; + +interface Vector3 { + x: number; + y: number; + z: number; +} +export type { Vector3 }; + +interface Filters { + player?: string; + race?: string; + ingameDateOp?: string; + ingameDate?: string; + lastUpdateOp?: string; + lastUpdate?: string; + rp1verOp?: string; + rp1ver?: string; + difficulty?: string; + playstyle?: string; +} +export type { Filters }; + +interface CareerListItem { + id: string; + name: string; + user: string; + userPreferredName: string; + race: string; + token: string; +} +export type { CareerListItem }; + +interface RaceManagementCareerListItem extends CareerListItem { + isUpdating: boolean; +} +export type { RaceManagementCareerListItem }; + +interface ProgramRecord { + careerId: string; + programName: string; + programDisplayName: string; + date: string; + careerName: string; + userLogin: string; + userPreferredName: string; + speed: string; +} +export type { ProgramRecord }; + +interface ContractRecord { + careerId: string; + contractInternalName: string; + contractDisplayName: string; + date: string; + careerName: string; + userLogin: string; + userPreferredName: string; +} +export type { ContractRecord }; diff --git a/RP1AnalyticsWebApp/src/utils/activeFilters.ts b/RP1AnalyticsWebApp/src/utils/activeFilters.ts new file mode 100644 index 0000000..69dac97 --- /dev/null +++ b/RP1AnalyticsWebApp/src/utils/activeFilters.ts @@ -0,0 +1,24 @@ +import { reactive } from 'vue'; +import type { Filters } from 'types'; + +let filters: Filters; +const sFilters = localStorage.getItem('filters'); +if (sFilters) { + filters = JSON.parse(sFilters); +} +else { + filters = { + player: '', + race: '', + ingameDateOp: '', + ingameDate: '', + lastUpdateOp: '', + lastUpdate: '', + rp1verOp: '', + rp1ver: '', + difficulty: '', + playstyle: '' + }; +} + +export const activeFilters: Filters = reactive(filters); diff --git a/RP1AnalyticsWebApp/src/utils/calculateYearRepMap.ts b/RP1AnalyticsWebApp/src/utils/calculateYearRepMap.ts new file mode 100644 index 0000000..a7fa323 --- /dev/null +++ b/RP1AnalyticsWebApp/src/utils/calculateYearRepMap.ts @@ -0,0 +1,36 @@ +import { DateTime } from 'luxon'; + +const repToSubsidyConversion = 100; +const subsidyMultiplierForMax = 2; +const perYearMinSubsidyArr = Object.freeze([ + 25000, + 30000, + 35000, + 40000, + 60000, + 80000, + 100000, + 125000, + 150000, + 200000, + 250000, + 300000, + 375000, + 450000, + 500000, + 550000, + 600000 +]); + +export function calculateYearRepMap(): Map { + const yearRepMap = new Map(); // Key is Unix timestamp of the year start; value is rep cap at that point in time + for(let i = 0; i = split.length) break; + const num = parseInt(split[i]); + if (!isNaN(num)) { + sortableVer += num * mults[i]; + } + } + + arr.push(`CareerLogMeta/VersionSort ${filters.rp1verOp} ${sortableVer}`); + } + } + + if (filters.difficulty) { + arr.push(`CareerLogMeta/DifficultyLevel eq '${filters.difficulty}'`); + } + + if (filters.playstyle) { + arr.push(`CareerLogMeta/CareerPlaystyle eq '${filters.playstyle}'`); + } + + if (arr.length === 0) return ''; + + return `${omitSeparator ? '' : '?'}$filter=${arr.join(' and ')}`; +} diff --git a/RP1AnalyticsWebApp/src/utils/currentUser.ts b/RP1AnalyticsWebApp/src/utils/currentUser.ts new file mode 100644 index 0000000..51ed18c --- /dev/null +++ b/RP1AnalyticsWebApp/src/utils/currentUser.ts @@ -0,0 +1,4 @@ +import { CurrentUser } from 'types'; + +// Instantiated in _Layout.cshtml. Can be null. +export const currentUser = (window) as CurrentUser | null; diff --git a/RP1AnalyticsWebApp/src/utils/parseUtcDate.ts b/RP1AnalyticsWebApp/src/utils/parseUtcDate.ts new file mode 100644 index 0000000..e6bd049 --- /dev/null +++ b/RP1AnalyticsWebApp/src/utils/parseUtcDate.ts @@ -0,0 +1,5 @@ +import { DateTime } from 'luxon'; + +export function parseUtcDate(sDt: string) { + return DateTime.fromISO(sDt, { zone: 'utc' }); +} diff --git a/RP1AnalyticsWebApp/src/utils/programSpeeds.ts b/RP1AnalyticsWebApp/src/utils/programSpeeds.ts new file mode 100644 index 0000000..f2337b6 --- /dev/null +++ b/RP1AnalyticsWebApp/src/utils/programSpeeds.ts @@ -0,0 +1 @@ +export const programSpeeds = Object.freeze({ 0: 'Normal', 1: 'Fast', 2: 'Breakneck' }) diff --git a/RP1AnalyticsWebApp/tsconfig.json b/RP1AnalyticsWebApp/tsconfig.json new file mode 100644 index 0000000..a434ced --- /dev/null +++ b/RP1AnalyticsWebApp/tsconfig.json @@ -0,0 +1,38 @@ +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "lib": [ "ES2020", "DOM", "DOM.Iterable" ], + "module": "ESNext", + "skipLibCheck": true, + "baseUrl": "./src", + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": false, + "noEmit": true, + "jsx": "preserve", + "jsxImportSource": "solid-js", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "references": [ { "path": "./tsconfig.node.json" } ], + "include": [ + "src/**/*.ts", + "src/**/*.d.ts", + "src/**/*.tsx", + "src/**/*.vue" + ], + "ts-node": { + "compilerOptions": { + "module": "ESNext", + "moduleResolution": "node" + } + } +} diff --git a/RP1AnalyticsWebApp/tsconfig.node.json b/RP1AnalyticsWebApp/tsconfig.node.json new file mode 100644 index 0000000..b11fa89 --- /dev/null +++ b/RP1AnalyticsWebApp/tsconfig.node.json @@ -0,0 +1,13 @@ +{ + "compilerOptions": { + "composite": true, + "skipLibCheck": true, + "module": "ESNext", + "moduleResolution": "bundler", + "allowSyntheticDefaultImports": true, + "types": [ "node" ] + }, + "include": [ + "vite.config.ts" + ] +} diff --git a/RP1AnalyticsWebApp/vite.config.ts b/RP1AnalyticsWebApp/vite.config.ts new file mode 100644 index 0000000..762c3fb --- /dev/null +++ b/RP1AnalyticsWebApp/vite.config.ts @@ -0,0 +1,107 @@ +import { UserConfig, defineConfig } from 'vite'; +import vue from '@vitejs/plugin-vue'; +import { spawn } from 'child_process'; +import fs from 'fs'; +import path from 'path'; + +// Get base folder for certificates. +const baseFolder = + process.env.APPDATA !== undefined && process.env.APPDATA !== '' + ? `${process.env.APPDATA}/ASP.NET/https` + : `${process.env.HOME}/.aspnet/https`; + +// Generate the certificate name using the NPM package name +const certificateName = process.env.npm_package_name; + +// Define certificate filepath +const certFilePath = path.join(baseFolder, `${certificateName}.pem`); +// Define key filepath +const keyFilePath = path.join(baseFolder, `${certificateName}.key`); + +// Pattern for CSS files +const cssPattern = /\.css$/; +// Pattern for image files +const imagePattern = /\.(png|jpe?g|gif|svg|webp|avif)$/; + +// Export Vite configuration +export default defineConfig(async () => { + // Ensure the certificate and key exist + if (!fs.existsSync(certFilePath) || !fs.existsSync(keyFilePath)) { + // Wait for the certificate to be generated + await new Promise((resolve) => { + spawn('dotnet', [ + 'dev-certs', + 'https', + '--export-path', + certFilePath, + '--format', + 'Pem', + '--no-password', + ], { stdio: 'inherit', }) + .on('exit', (code) => { + resolve(); + if (code) { + process.exit(code); + } + }); + }); + }; + + // Define Vite configuration + const config: UserConfig = { + appType: 'custom', + root: 'src', + publicDir: '../public', + plugins: [vue()], + resolve: { + alias: { + vue: 'vue/dist/vue.esm-bundler.js', + stream: 'stream-browserify' // workaround for Plotly + }, + }, + build: { + manifest: true, + emptyOutDir: true, + outDir: '../wwwroot', + assetsDir: '', + rollupOptions: { + input: ['src/navbar-main.ts', 'src/careerlog-main.ts', 'src/records-main.ts', 'src/races-main.ts', 'src/css/styles.scss'], + output: { + entryFileNames: 'js/[name].[hash].js', + chunkFileNames: 'js/[name]-chunk.js', + assetFileNames: (info) => { + if (info.name) { + if (cssPattern.test(info.name)) { + return 'css/[name][extname]'; + } + if (imagePattern.test(info.name)) { + return 'images/[name][extname]'; + } + + return 'assets/[name][extname]'; + } else { + return '[name][extname]'; // If the file name is not specified, save it to the output directory + } + }, + } + }, + }, + server: { + strictPort: true, + https: { + cert: certFilePath, + key: keyFilePath + } + }, + optimizeDeps: { + include: [], + esbuildOptions: { + define: { + global: 'globalThis' // workaround for Plotly + } + } + } + } + + return config; +}); diff --git a/RP1AnalyticsWebApp/wwwroot/css/styles.css b/RP1AnalyticsWebApp/wwwroot/css/styles.css deleted file mode 100644 index 4175d55..0000000 --- a/RP1AnalyticsWebApp/wwwroot/css/styles.css +++ /dev/null @@ -1,107 +0,0 @@ -[v-cloak] { - display: none -} - -* { - font-family: 'Poppins', sans-serif; -} - -.navbar-burger { - margin: 0; /*align navbar to the left instead of the default right*/ -} - -#navbar .navbar-item.active-filter { - color: springgreen; -} - -.contracts-app h2 { - margin-top: 0.75rem; -} - -.contracts-app .collection .collection-item { - padding: 6px 12px; -} - -.contracts-app .preloader-wrapper { - margin: 2rem 10rem; -} - -.contracts-app .inline-icon { - margin-left: 5px; - vertical-align: middle; -} - -tr.clickable { - cursor: pointer; -} - -.date-col { - white-space: nowrap; -} - -#chart { - margin: 10px 0 0 0; - height: max(min(calc(100vh * 0.875), 1000px), 350px); -} - -.copy-url { - background: lightgray; - user-select: all; -} - -.success-fail-row { - display: flex; - justify-content: space-between; - align-items: center; -} - -.success-fail-widget { - display: flex; -} - -.success-fail-widget > * { - align-self: center; -} - -/*Spinner by loading.io*/ - -.lds-ring { - display: inline-block; - position: relative; - width: 80px; - height: 80px; -} - -.lds-ring div { - box-sizing: border-box; - display: block; - position: absolute; - width: 64px; - height: 64px; - margin: 8px; - border: 8px solid blue; - border-radius: 50%; - animation: lds-ring 1.2s cubic-bezier(0.5, 0, 0.5, 1) infinite; - border-color: blue transparent transparent transparent; -} - -.lds-ring div:nth-child(1) { - animation-delay: -0.45s; -} - -.lds-ring div:nth-child(2) { - animation-delay: -0.3s; -} - -.lds-ring div:nth-child(3) { - animation-delay: -0.15s; -} - -@keyframes lds-ring { - 0% { - transform: rotate(0deg); - } - 100% { - transform: rotate(360deg); - } -} diff --git a/RP1AnalyticsWebApp/wwwroot/js/careerLog.js b/RP1AnalyticsWebApp/wwwroot/js/careerLog.js deleted file mode 100644 index 0ec0cf9..0000000 --- a/RP1AnalyticsWebApp/wwwroot/js/careerLog.js +++ /dev/null @@ -1,610 +0,0 @@ -(() => { - const ContractEventTypes = Object.freeze({ 'Accept': 0, 'Complete': 1, 'Fail': 2, 'Cancel': 3 }); - const MilestonesToShowOnChart = Object.freeze({ - 'FirstScienceSat': 'FSO', 'FirstScienceSat-Heavy': 'FSO', 'LunarImpactor': 'Lunar Impactor', 'first_OrbitCrewed': 'Crewed Orbit', - 'first_MoonLandingCrewed': 'Crewed Moon', 'MarsLandingCrew': 'Crewed Mars', 'first_spaceStation': 'Space Station' - }); - const repToSubsidyConversion = 100; - const subsidyMultiplierForMax = 2; - const perYearMinSubsidyArr = Object.freeze([ - 25000, - 30000, - 35000, - 40000, - 60000, - 80000, - 100000, - 125000, - 150000, - 200000, - 250000, - 300000, - 375000, - 450000, - 500000, - 550000, - 600000 - ]); - const yearRepMap = calculateYearRepMap(); - - let contractEvents = null; - let programs = null; - let hoverCurrentSubplotOnly = false; - let hoverListenerSetUp = false; - - const app = Vue.createApp({ - data() { - return { - careerId: null, - career: null, - careerTitle: null, - careerLogMeta: null, - isLoadingCareerMeta: false, - activeTab: 'milestones', - filters: null - }; - }, - methods: { - reset() { - this.careerId = null; - this.career = null; - this.careerLogMeta = null; - this.isLoadingCareerMeta = false; - this.careerTitle = null; - this.filters = null; - }, - handleChangeActive(tabName) { - this.activeTab = tabName; - const url = new URL(window.location); - url.searchParams.set('tab', tabName); - window.history.replaceState({}, '', url); - }, - handleCareerChange(careerId) { - const url = new URL(window.location); - url.searchParams.set('careerId', careerId); - window.history.pushState({}, '', url); - getCareerLogs(careerId); - }, - handleFiltersChange(filters) { - this.filters = filters; - } - }, - computed: { - canEdit() { - return this.career && currentUser && this.career.userLogin === currentUser.userName; - } - }, - }); - app.component('career-select', CareerSelect); - app.component('selection-tab', SelectionTab); - app.component('milestone-contracts', MilestoneContracts); - app.component('repeatable-contracts', RepeatableContracts); - app.component('tech-unlocks', TechUnlocks); - app.component('launches', Launches); - app.component('facilities', Facilities); - app.component('programs', Programs); - app.component('leaders', Leaders); - app.component('loading-spinner', LoadingSpinner); - app.component('meta-information', MetaInformation); - const vm = app.mount('#appWrapper'); - - const urlParams = new URLSearchParams(window.location.search); - const initialCareerId = urlParams.get('careerId'); - if (initialCareerId) { - getCareerLogs(initialCareerId); - } - - const tabId = urlParams.get('tab'); - if (tabId) { - vm.activeTab = tabId; - } - - bindEvents(); - vm.handleFiltersChange(vmFilters.filters); - - function bindEvents() { - document.addEventListener('keydown', event => { - hoverCurrentSubplotOnly = event.ctrlKey; - }); - document.addEventListener('keyup', event => { - hoverCurrentSubplotOnly = event.ctrlKey; - }); - - window.onpopstate = event => { - const urlParams = new URLSearchParams(window.location.search); - const initialCareerId = urlParams.get('careerId'); - if (initialCareerId) { - getCareerLogs(initialCareerId); - } - else { - vm.reset(); - } - - const tabId = urlParams.get('tab'); - if (tabId) { - vm.activeTab = tabId; - } - } - - window.filtersChanged = filters => { - vm.handleFiltersChange(filters); - } - } - - function getCareerLogs(careerId) { - console.log(`Getting Logs for ${careerId}...`); - - document.getElementById('chart').classList.toggle('is-invisible', true); - - if (!careerId) { - contractEvents = null; - programs = null; - vm.reset(); - } - else { - vm.careerId = careerId; - vm.isLoadingCareerMeta = true; - - Promise.all([ - fetch(`/api/careerlogs/${careerId}`) - .then((res) => res.json()) - .then((jsonLogs) => { - const meta = jsonLogs.careerLogMeta; - meta.lastUpdate = jsonLogs.lastUpdate; - vm.isLoadingCareerMeta = false; - vm.careerLogMeta = meta; - vm.careerTitle = jsonLogs.name; - vm.career = jsonLogs; - return jsonLogs; - }) - .catch((error) => alert(error)), - fetch(`/api/careerlogs/${careerId}/contracts`) - .then((res) => res.json()) - .then((jsonContracts) => { - contractEvents = jsonContracts; - return jsonContracts; - }) - .catch((error) => alert(error)), - fetch(`/api/careerlogs/${careerId}/programs`) - .then((res) => res.json()) - .then((jsonPrograms) => { - programs = jsonPrograms; - return jsonPrograms; - }) - .catch((error) => alert(error)) - ]).then((values) => drawChart(values[0])) - .then((chartDrawn) => document.getElementById('chart').classList.toggle('is-invisible', !chartDrawn)) - } - } - - function getValuesForField(careerLogs, fieldName) { - let arr = []; - careerLogs.forEach((entry) => { - arr.push(entry[fieldName]); - }); - - return arr; - } - - function getFundsEarned(careerLogs) { - let totals = []; - let total = 0; - - careerLogs.forEach((entry) => { - total += entry.programFunds + entry.otherFundsEarned; - totals.push(total); - }); - - return totals; - } - - function getRepCapForPeriods(careerLogs) { - const arr = []; - careerLogs.forEach((entry) => { - const dt = moment.utc(entry.endDate); - const timestamp = dt.unix(); - let prevKey, prevVal; - for (const [key, value] of yearRepMap) { - if (timestamp < key) { - const excess = timestamp - prevKey; - const range = key - prevKey; - const timeInRange = excess / range; - const approxRep = lerp(prevVal, value, timeInRange) - arr.push(approxRep); - return; - } - prevKey = key; - prevVal = value; - } - arr.push(prevVal); - }); - - return arr; - } - - function getCompletionDatesAndIndexesForContracts(careerLog, contracts) { - let arr = []; - for (let i = 0; i < careerLog.contractEventEntries.length - 1; i++) { - let entry = careerLog.contractEventEntries[i]; - if (entry.type === ContractEventTypes.Complete && - contracts.find(c => entry.internalName === c) && - !arr.find(el => el.contract === entry.internalName)) { - - const dt = moment.utc(entry.date); - const tmp = getLogPeriodForDate(careerLog.careerLogEntries, dt); - arr.push({ - contract: entry.internalName, - month: dt.format('YYYY-MM'), - index: tmp.index - }); - } - } - return arr; - } - - function getLogPeriodForDate(periods, dt) { - const idx = periods.findIndex(c => { - const dtStart = moment.utc(c.startDate); - const dtEnd = moment.utc(c.endDate); - return dt > dtStart && dt <= dtEnd; - }); - return { - index: idx, - el: idx >= 0 ? periods[idx] : null - }; - } - - function drawChart(careerLog) { - const careerPeriods = careerLog.careerLogEntries; - if (!careerPeriods) return false; - - const programFundsTrace = { - name: 'Program funding', - y: getValuesForField(careerPeriods, 'programFunds'), - type: 'scattergl', - mode: 'lines' - }; - const subsidySizeTrace = { - name: 'Subsidy size', - y: getValuesForField(careerPeriods, 'subsidySize'), - type: 'scattergl', - mode: 'lines' - }; - const currentFundsTrace = { - name: 'Current Funds', - y: getValuesForField(careerPeriods, 'currentFunds'), - type: 'scattergl', - mode: 'lines', - visible: 'legendonly' - }; - const earnedFundsTrace = { - name: 'Earned Funds', - y: getFundsEarned(careerPeriods), - type: 'scattergl', - mode: 'lines', - visible: 'legendonly', - line: { - color: 'chartreuse' - } - }; - - const sciEarnedTrace = { - name: 'Science Earned', - y: getValuesForField(careerPeriods, 'scienceEarned'), - yaxis: 'y2', - type: 'scattergl', - mode: 'lines', - line: { - color: 'dodgerblue', - } - }; - - const curSciTrace = { - name: 'Current Science', - y: getValuesForField(careerPeriods, 'currentSci'), - yaxis: 'y2', - type: 'scattergl', - mode: 'lines', - visible: 'legendonly' - }; - - const repTrace = { - name: 'Reputation', - y: getValuesForField(careerPeriods, 'reputation'), - yaxis: 'y3', - type: 'scattergl', - mode: 'lines', - line: { - color: 'darkorange', - } - }; - - const repCapTrace = { - name: 'Reputation cap', - y: getRepCapForPeriods(careerPeriods), - yaxis: 'y3', - type: 'scattergl', - mode: 'lines', - line: { - color: 'darkorange', - dash: 'dot', - width: 3 - } - }; - - const confidenceTrace = { - name: 'Confidence', - y: getValuesForField(careerPeriods, 'confidence'), - yaxis: 'y4', - type: 'scattergl', - mode: 'lines', - line: { - color: 'fuchsia' - } - }; - - const engineersTrace = { - name: 'Engineers', - y: getValuesForField(careerPeriods, 'numEngineers'), - yaxis: 'y5', - type: 'scattergl', - mode: 'lines', - line: { - color: 'red' - } - } - const researchersTrace = { - name: 'Researchers', - y: getValuesForField(careerPeriods, 'numResearchers'), - yaxis: 'y5', - type: 'scattergl', - mode: 'lines', - line: { - color: 'blue' - } - } - const engEffTrace = { - name: 'Engineer Efficiency', - y: getValuesForField(careerPeriods, 'efficiencyEngineers'), - yaxis: 'y6', - type: 'scattergl', - mode: 'lines', - line: { - color: 'red', - dash: 'dot' - } - } - - // A fake 'trace' for displaying contract status in the hover text. - const contractsTrace = { - name: 'Contracts', - y: 0, - text: getValuesForField(careerPeriods, 'startDate').map(genContractTooltip), - hovertemplate: '%{text}', - type: 'scatter', - showlegend: false, - marker: { - color: '#fff0' - } - } - - // A fake 'trace' for displaying program status in the hover text. - const programsTrace = { - name: 'Programs', - y: 0, - text: getValuesForField(careerPeriods, 'startDate').map(genProgramTooltip), - hovertemplate: '%{text}', - type: 'scatter', - showlegend: false, - marker: { - color: '#fff0' - } - } - - const traces = [ - programFundsTrace, - subsidySizeTrace, - earnedFundsTrace, - currentFundsTrace, - sciEarnedTrace, - curSciTrace, - repTrace, - repCapTrace, - confidenceTrace, - engineersTrace, - researchersTrace, - engEffTrace, - contractsTrace, - programsTrace - ]; - traces.forEach(t => { - t.x = getValuesForField(careerPeriods, 'startDate'); - t.connectgaps = true; - }); - - const layout = { - hovermode: 'x unified', - grid: { - columns: 1, - subplots: [['xy'], ['xy2'], ['xy3'], ['xy4'], ['xy5']], - ygap: 0.1 - }, - xaxis: { - title: 'Date', - type: 'date', - autorange: true - }, - yaxis: { - title: 'Funds', - autorange: true, - type: 'linear', - hoverformat: '.4s' - }, - yaxis2: { - title: 'Science', - autorange: true, - rangemode: 'nonnegative', - type: 'linear', - hoverformat: '.1f' - }, - yaxis3: { - title: 'Reputation', - autorange: true, - type: 'linear', - hoverformat: '.1f' - }, - yaxis4: { - title: 'Confidence', - autorange: true, - rangemode: 'nonnegative', - showgrid: false, - type: 'linear', - hoverformat: '.1f', - overlaying: 'y3', - side: 'right' - }, - yaxis5: { - title: 'Personnel', - autorange: true, - rangemode: 'nonnegative', - type: 'linear' - }, - yaxis6: { - title: 'Efficiency', - tickformat: ',.0%', - hoverformat: ',.1%', - showgrid: false, - autorange: true, - rangemode: 'nonnegative', - type: 'linear', - overlaying: 'y5', - side: 'right' - }, - font: { - family: 'Poppins', - size: 14 - }, - margin: { - t: 40, - r: 20, - b: 200, - l: 80, - pad: 4 - } - }; - - const annotations = []; - const contractNames = Object.keys(MilestonesToShowOnChart); - const completionArr = getCompletionDatesAndIndexesForContracts(careerLog, contractNames); - completionArr.forEach(el => annotations.push({ - x: el.month, - y: getValuesForField(careerPeriods, 'currentFunds')[el.index], - yref: 'y', - text: MilestonesToShowOnChart[el.contract], - arrowhead: 6, - ax: 0, - ay: -35 - })); - - careerPeriods.forEach((p, idx) => { - if (p.numNautsKilled > 0) { - const dt = moment.utc(p.startDate); - annotations.push({ - x: dt.format('YYYY-MM'), - y: getValuesForField(careerPeriods, 'reputation')[idx], - yref: 'y3', - text: '💀', - arrowhead: 6, - ax: 0, - ay: -25 - }); - } - }); - - if (annotations.length > 0) { - layout.annotations = annotations; - } - - const config = { - responsive: true - }; - - const plotDiv = document.querySelector('#chart'); - Plotly.react(plotDiv, traces, layout, config); - - if (!hoverListenerSetUp) { - // Display hover for all subplots. - plotDiv.on('plotly_hover', (eventData) => { - if (hoverCurrentSubplotOnly) return; - if (eventData.xvals) { - Plotly.Fx.hover( - plotDiv, - { xval: eventData.xvals[0] }, - ['xy', 'xy2', 'xy3', 'xy4', 'xy5', 'xy6'] - ); - } - }); - hoverListenerSetUp = true; - } - - return true; - } - - function genContractTooltip(xaxis) { - const dtStart = moment.utc(xaxis); - const dtEnd = dtStart.clone().add(1, 'months'); - const complete = contractEvents.filter(c => c.type === ContractEventTypes.Complete && - moment.utc(c.date) > dtStart && moment.utc(c.date) <= dtEnd); - const contractList = genTooltipContractRow('Completed', complete); - return contractList ? `${contractList}` : 'N/A'; - }; - - function genProgramTooltip(xaxis) { - const dtStart = moment.utc(xaxis); - const dtEnd = dtStart.clone().add(1, 'months'); - const completed = programs.filter(p => p.completed && moment.utc(p.completed) > dtStart && moment.utc(p.completed) <= dtEnd); - const accepted = programs.filter(p => moment.utc(p.accepted) > dtStart && moment.utc(p.accepted) <= dtEnd); - - const programList = genTooltipProgramRow('Completed', completed); - const programList2 = genTooltipProgramRow('Accepted', accepted); - return programList || programList2 ? `${programList}${programList2}` : 'N/A'; - }; - - function genTooltipContractRow(title, contracts) { - const groupedMap = contracts.reduce( - (entryMap, e) => entryMap.set(e.contractInternalName, [...entryMap.get(e.contractInternalName) || [], e]), - new Map() - ); - - const res = Array.from(groupedMap.values()).reduce( - (acc, entry) => acc + '
' + (entry.length > 1 ? entry.length + "x " : '') + entry[0].contractDisplayName, - '' - ); - return res ? `
${title} :${res}` : ''; - } - - function genTooltipProgramRow(title, programs) { - const res = programs.reduce( - (acc, entry) => acc + `
${entry.title}`, - '' - ); - return res ? `
${title} :${res}` : ''; - } - - function calculateYearRepMap() { - const yearRepMap = new Map(); // Key is Unix timestamp of the year start; value is rep cap at that point in time - for (let i = 0; i < perYearMinSubsidyArr.length; i++) { - const year = 1951 + i; - const dt = moment({ year: year, month: 1, day: 1 }); - const minSubsidy = perYearMinSubsidyArr[i]; - const maxSubsidy = minSubsidy * subsidyMultiplierForMax; - yearRepMap.set(dt.unix(), (maxSubsidy - minSubsidy) / repToSubsidyConversion); - } - - return yearRepMap; - } - - function lerp(start, end, time) { - return (1 - time) * start + time * end; - } -})(); diff --git a/RP1AnalyticsWebApp/wwwroot/js/components/career-dates.js b/RP1AnalyticsWebApp/wwwroot/js/components/career-dates.js deleted file mode 100644 index f3ee835..0000000 --- a/RP1AnalyticsWebApp/wwwroot/js/components/career-dates.js +++ /dev/null @@ -1,39 +0,0 @@ -const CareerDates = { - props: ['items', 'dateField', 'extraFields', 'title'], - computed: { - isVisible() { - return !!this.items; - } - }, - methods: { - getAndFormatDate(item) { - return this.formatDate(item[this.dateField]); - }, - formatDate(date) { - return date ? moment.utc(date).format('YYYY-MM-DD') : ''; - } - }, - template: ` -
-

{{title}}

- - - - - - - - - - - - - - - - - -
UserCareerDate{{def.title}}
{{ item.userPreferredName }}{{ item.careerName }}{{ getAndFormatDate(item) }}{{item[def.field]}}
- -
` -}; diff --git a/RP1AnalyticsWebApp/wwwroot/js/components/career-filters-modal.js b/RP1AnalyticsWebApp/wwwroot/js/components/career-filters-modal.js deleted file mode 100644 index 901fc6f..0000000 --- a/RP1AnalyticsWebApp/wwwroot/js/components/career-filters-modal.js +++ /dev/null @@ -1,217 +0,0 @@ -const CareerFiltersModal = { - props: ['isVisible', 'filters'], - emits: ['update:isVisible', 'update:filters', 'applyFilters'], - data() { - return { - players: null, - races: null - } - }, - computed: { - localFilters() { - const copy = { ...this.filters }; - if (!copy.ingameDateOp) - copy.ingameDateOp = 'ge'; - - if (!copy.ingameDate) - copy.ingameDate = '1951-01-01'; - - if (!copy.lastUpdateOp) - copy.lastUpdateOp = 'ge'; - - if (!copy.difficulty) - copy.difficulty = ''; - - if (!copy.playstyle) - copy.playstyle = ''; - - return copy; - } - }, - methods: { - closeModal() { - this.$emit('update:isVisible', false); - }, - applyFilters() { - this.$emit('update:filters', this.localFilters); - this.$emit('applyFilters', this.localFilters); - this.closeModal(); - }, - clearFilters() { - const emptyFilters = {} - this.$emit('update:filters', emptyFilters); - this.$emit('applyFilters', emptyFilters); - this.closeModal(); - }, - queryPlayers() { - fetch(`/api/users`) - .then((res) => res.json()) - .then((jsonPlayers) => { - this.players = jsonPlayers; - }) - .catch((error) => alert(error)); - }, - queryRaces() { - fetch(`/api/careerlogs/races`) - .then((res) => res.json()) - .then((jsonRaces) => { - this.races = jsonRaces; - }) - .catch((error) => alert(error)); - }, - }, - watch: { - isVisible(newIsVisible) { - if (newIsVisible && !this.players) - this.queryPlayers(); - - if (newIsVisible && !this.races) - this.queryRaces(); - } - }, - template: ` - ` -}; diff --git a/RP1AnalyticsWebApp/wwwroot/js/components/career-filters.js b/RP1AnalyticsWebApp/wwwroot/js/components/career-filters.js deleted file mode 100644 index b005ba1..0000000 --- a/RP1AnalyticsWebApp/wwwroot/js/components/career-filters.js +++ /dev/null @@ -1,111 +0,0 @@ -(() => { - const app = Vue.createApp({ - data() { - return { - modalVisible: false, - filters: {} - }; - }, - methods: { - toggleFilters() { - this.modalVisible = !this.modalVisible; - }, - applyFilters(filters) { - this.filters = filters; - if (!filters) { - localStorage.removeItem('filters'); - } - else { - localStorage.setItem('filters', JSON.stringify(filters)); - } - - if (window.filtersChanged) { - window.filtersChanged(filters); - } - } - }, - computed: { - hasActiveFilters() { - return this.filters && - (this.filters.player || - this.filters.race || - (this.filters.ingameDateOp && this.filters.ingameDate && this.filters.ingameDate !== '1951-01-01') || - (this.filters.lastUpdateOp && this.filters.lastUpdate) || - (this.filters.rp1verOp && this.filters.rp1ver) || - this.filters.difficulty || - this.filters.playstyle); - } - }, - mounted: function () { - this.$nextTick(function () { - const sFilters = localStorage.getItem('filters'); - if (sFilters) { - this.filters = JSON.parse(sFilters); - } - }); - } - }); - - app.component('career-filters-modal', CareerFiltersModal); - const vm = app.mount('#navbar'); - window.vmFilters = vm; - - window.constructFilterQueryString = function (filters, omitSeparator) { - if (!filters) return ''; - - const arr = []; - if (filters.player) { - arr.push(`UserLogin eq '${filters.player}'`); - } - - if (filters.race) { - arr.push(`Race eq '${filters.race}'`); - } - - if (filters.ingameDateOp && filters.ingameDate && filters.ingameDate !== '1951-01-01') { - arr.push(`EndDate ${filters.ingameDateOp} ${filters.ingameDate}T00:00:00.00Z`); - } - - if (filters.lastUpdateOp && filters.lastUpdate) { - arr.push(`LastUpdate ${filters.lastUpdateOp} ${filters.lastUpdate}T00:00:00.00Z`); - } - - if (filters.rp1verOp && filters.rp1ver) { - const split = filters.rp1ver.split('.'); - const mults = [1000000, 1000, 1]; - - if (filters.rp1verOp === 'eq' && split.length === 2) { - const num1 = parseInt(split[0]); - const num2 = parseInt(split[1]); - const verLowerBound = num1 * mults[0] + num2 * mults[1]; - const verUpperBound = num1 * mults[0] + (num2 + 1) * mults[1]; - - arr.push(`CareerLogMeta/VersionSort ge ${verLowerBound} and CareerLogMeta/VersionSort lt ${verUpperBound}`); - } - else { - let sortableVer = 0; - for (let i = 0; i < 3; i++) { - if (i >= split.length) break; - const num = parseInt(split[i]); - if (!isNaN(num)) { - sortableVer += num * mults[i]; - } - } - - arr.push(`CareerLogMeta/VersionSort ${filters.rp1verOp} ${sortableVer}`); - } - } - - if (filters.difficulty) { - arr.push(`CareerLogMeta/DifficultyLevel eq '${filters.difficulty}'`); - } - - if (filters.playstyle) { - arr.push(`CareerLogMeta/CareerPlaystyle eq '${filters.playstyle}'`); - } - - if (arr.length === 0) return ''; - - return `${omitSeparator ? '' : '?'}$filter=${arr.join(' and ')}`; - }; -})(); diff --git a/RP1AnalyticsWebApp/wwwroot/js/components/career-select.js b/RP1AnalyticsWebApp/wwwroot/js/components/career-select.js deleted file mode 100644 index 4907a4f..0000000 --- a/RP1AnalyticsWebApp/wwwroot/js/components/career-select.js +++ /dev/null @@ -1,56 +0,0 @@ -const CareerSelect = { - props: ['careerItems', 'selectedCareer', 'filters'], - emits: ['update:selectedCareer', 'careerChanged'], - data() { - return { - items: null, - isLoading: false - } - }, - methods: { - queryData(filters) { - this.isLoading = true; - fetch(`/odata/careerListItems${constructFilterQueryString(filters)}`) - .then(res => res.json()) - .then(odataResp => { - this.isLoading = false; - - const groupedMap = odataResp.value.reduce( - (entryMap, e) => entryMap.set(this.getPlayerName(e), [...entryMap.get(this.getPlayerName(e)) || [], e]), - new Map() - ); - - this.items = groupedMap; - }) - .catch(error => alert(error)); - }, - careerChanged(careerId) { - this.$emit('update:selectedCareer', careerId); - this.$emit('careerChanged', careerId); - }, - getPlayerName(entry) { - return entry.userPreferredName ? entry.userPreferredName : entry.user; - } - }, - watch: { - filters(newFilters, oldFilters) { - this.queryData(newFilters); - } - }, - template: ` -
-
- -
-
- -
-
` -}; diff --git a/RP1AnalyticsWebApp/wwwroot/js/components/contract-leaderboard-modal.js b/RP1AnalyticsWebApp/wwwroot/js/components/contract-leaderboard-modal.js deleted file mode 100644 index c0e6c26..0000000 --- a/RP1AnalyticsWebApp/wwwroot/js/components/contract-leaderboard-modal.js +++ /dev/null @@ -1,54 +0,0 @@ -const ContractLeaderboardModal = { - props: ['contractName', 'filters'], - data() { - return { - items: null, - isLoading: false, - isVisible: false - } - }, - watch: { - contractName(newContractName, oldContractName) { - if (newContractName !== oldContractName) { - this.queryData(newContractName); - } - } - }, - methods: { - queryData(contractName) { - this.items = null; - if (contractName) { - this.isLoading = true; - fetch(`/odata/contracts('${contractName}')${constructFilterQueryString(this.filters)}`) - .then((res) => res.json()) - .then((odataResp) => { - this.items = odataResp.value; - this.isVisible = true; - this.isLoading = false; - }) - .catch((error) => alert(error)); - } - }, - formatDate(date) { - return date ? moment.utc(date).format('YYYY-MM-DD') : ''; - }, - closeModal() { - this.isVisible = false; - } - }, - computed: { - dlgTitle() { - return this.items && this.items[0].contractDisplayName; - } - }, - template: ` - ` -}; diff --git a/RP1AnalyticsWebApp/wwwroot/js/components/contract-records-table.js b/RP1AnalyticsWebApp/wwwroot/js/components/contract-records-table.js deleted file mode 100644 index fa68bb1..0000000 --- a/RP1AnalyticsWebApp/wwwroot/js/components/contract-records-table.js +++ /dev/null @@ -1,62 +0,0 @@ -const ContractRecordsTable = { - props: ['filters'], - emits: ['contractClicked'], - data() { - return { - items: null, - isLoading: false - } - }, - methods: { - queryData(filters) { - this.isLoading = true; - fetch(`/odata/contractRecords${constructFilterQueryString(filters)}`) - .then(res => res.json()) - .then(odataResp => { - this.isLoading = false; - this.items = odataResp.value; - }) - .catch(error => alert(error)); - }, - contractClicked(contract) { - this.$emit('contractClicked', contract); - }, - getCareerUrl(r) { - return `/?careerId=${r.careerId}`; - }, - formatDate(date) { - return date ? moment.utc(date).format('YYYY-MM-DD') : ''; - } - }, - watch: { - filters(newFilters, oldFilters) { - this.queryData(newFilters); - } - }, - template: ` - - - - - - - - - - - - - - - - - -
Contract NameCompletion DateUserCareer
- {{r.contractDisplayName}} - {{formatDate(r.date)}}{{r.userPreferredName}} - {{r.careerName}} -
-
- -
` -}; diff --git a/RP1AnalyticsWebApp/wwwroot/js/components/data-tab-mixin.js b/RP1AnalyticsWebApp/wwwroot/js/components/data-tab-mixin.js deleted file mode 100644 index 573d86c..0000000 --- a/RP1AnalyticsWebApp/wwwroot/js/components/data-tab-mixin.js +++ /dev/null @@ -1,45 +0,0 @@ -const DataTabMixin = { - props: ['careerId', 'activeTab'], - data() { - return { - items: null, - isLoading: false - } - }, - watch: { - careerId(newCareerId, oldCareerId) { - console.log(`${oldCareerId} -> ${newCareerId}`); - if (newCareerId === oldCareerId) return; - - this.items = null; - this.isLoading = !!newCareerId; - if (newCareerId && this.isTabActive) { - this.queryData(newCareerId); - } - }, - activeTab(newActiveTab, oldActiveTab) { - if (newActiveTab !== oldActiveTab && this.isTabActive && this.careerId) { - this.queryData(this.careerId); - } - } - }, - methods: { - formatDate(date) { - return date ? moment.utc(date).format('YYYY-MM-DD') : ''; - }, - formatDatePlusTime(date) { - return date ? moment.utc(date).format('YYYY-MM-DD hh:mm:ss') : ''; - } - }, - computed: { - isTabActive() { - return this.activeTab === this.tabName; - }, - isVisible() { - return this.isTabActive && !this.isLoading && this.items; - }, - isSpinnerShown() { - return this.isLoading && this.isTabActive; - } - } -} \ No newline at end of file diff --git a/RP1AnalyticsWebApp/wwwroot/js/components/facilities.js b/RP1AnalyticsWebApp/wwwroot/js/components/facilities.js deleted file mode 100644 index 8e86815..0000000 --- a/RP1AnalyticsWebApp/wwwroot/js/components/facilities.js +++ /dev/null @@ -1,115 +0,0 @@ -const Facilities = { - mixins: [DataTabMixin], - methods: { - queryData(careerId) { - const p1 = fetch(`/api/careerlogs/${careerId}/facilities`) - .then(res => res.json()) - .then(jsonItems => { - return jsonItems.filter(e => e.state != 'ConstructionCancelled'); - }); - const p2 = fetch(`/api/careerlogs/${careerId}/lcs`) - .then(res => res.json()) - .then(jsonItems => { - jsonItems.forEach(i => i.visible = false); - return jsonItems.filter(e => e.state != 'ConstructionCancelled'); - }); - - Promise.all([p1, p2]) - .then((values) => { - this.isLoading = false; - const facilityItems = values[0]; - const lcItems = values[1]; - const combinedItems = facilityItems.concat(lcItems); - combinedItems.sort((a, b) => { - const v1 = a.started ? a.started : a.constrStarted; - const v2 = b.started ? b.started : b.constrStarted; - if (v1 < v2) { - return -1; - } - if (v1 > v2) { - return 1; - } - - return 0; - }); - this.items = combinedItems; - }) - .catch(error => alert(error)); - }, - getLCIcon(lc) { - if (lc.lcType === 'Pad') return 'fa-rocket'; - if (lc.lcType === 'Hangar') return 'fa-plane'; - return ''; - }, - toggleVisibility(item) { - const newState = !item.visible; - this.items.forEach(i => i.visible = false); - item.visible = newState; - }, - formatMass(value) { - if (value > 1e+38) return '∞'; - return value; - }, - getFacilityTitle(val) { - const defs = { - ResearchAndDevelopment: 'R&D', - Administration: 'Administration', - MissionControl: 'Mission Control', - TrackingStation: 'Tracking Station', - AstronautComplex: 'Astronaut Complex' - }; - const title = defs[val]; - return title ? title : val; - } - }, - computed: { - tabName() { - return 'facilities'; - } - }, - template: ` -
-

Facility construction and upgrades

- - - - - - - - - - - - - -
FacilityLevel / Max tonnageStartedCompleted
-
-
- -
` -}; diff --git a/RP1AnalyticsWebApp/wwwroot/js/components/launches.js b/RP1AnalyticsWebApp/wwwroot/js/components/launches.js deleted file mode 100644 index dda6d3c..0000000 --- a/RP1AnalyticsWebApp/wwwroot/js/components/launches.js +++ /dev/null @@ -1,172 +0,0 @@ -const Launches = { - mixins: [DataTabMixin], - props: ['canEdit'], - methods: { - queryData(careerId) { - fetch(`/api/careerlogs/${careerId}/launches`) - .then(res => res.json()) - .then(jsonItems => { - this.isLoading = false; - jsonItems.forEach(i => i.visible = false); - this.items = jsonItems; - }) - .catch(error => alert(error)); - }, - saveLaunchMetaChanges(launch) { - fetch(`/api/careerlogs/${this.careerId}/launches/${launch.launchID}`, { - method: "PATCH", - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify(launch.metadata) - }) - .catch(error => alert(error)); - }, - updateLaunchSuccessState(launch, isSuccess, event) { - const meta = launch.metadata = launch.metadata || {}; - meta.success = meta.success === isSuccess ? null : isSuccess; - event.target.closest('button').blur(); - this.saveLaunchMetaChanges(launch); - }, - getVesselIcon(launch) { - if (launch.builtAt === 'VAB') return 'fa-rocket'; - if (launch.builtAt === 'SPH') return 'fa-plane'; - return ''; - }, - getSuccessStyleForEdit(launch) { - if (launch.metadata && launch.metadata.success === true) return 'is-active'; - return 'is-outlined'; - }, - getFailStyleForEdit(launch) { - if (launch.metadata && launch.metadata.success === false) - return 'is-active'; - return 'is-outlined'; - }, - getSuccessStateIconForDisp(launch) { - if (!launch.metadata || launch.metadata.success == null) - return ''; - if (launch.metadata.success) - return 'fa-check has-text-success'; - return 'fa-xmark has-text-danger'; - }, - getSuccessStateTitle(launch) { - if (!launch.metadata || launch.metadata.success == null) - return ''; - if (launch.metadata.success) - return 'Launch met all or at least part of its goals'; - return 'Launch failed to meet its goals'; - }, - hasFailures(launch) { - return launch.failures && launch.failures.length > 0; - }, - getTFFailureIconTitle(launch) { - return `Had ${launch.failures.length} failure${launch.failures.length === 1 ? '' : 's'}`; - }, - canOpen(launch) { - return this.hasFailures(launch); - }, - toggleVisibility(item) { - if (!this.canOpen(item)) return; - - const newState = !item.visible; - this.items.forEach(i => i.visible = false); - item.visible = newState; - }, - getLaunchCount(builtAt) { - if (!this.items) return 0; - return this.items.filter(launch => launch.builtAt === builtAt).length; - }, - prettyPrintMET(launch, failure) { - const m1 = moment.utc(launch.date); - const m2 = moment.utc(failure.date); - const duration = moment.duration(m2.diff(m1)); - - return duration.format(customTemplate); - - function customTemplate() { - return this.duration.asSeconds() >= 3600 ? 'd [day] h [hour] m [minute]' : - 'm [minute] s [second]'; - } - } - }, - computed: { - tabName() { - return 'launches'; - } - }, - template: ` -
-

Launches

- -
- - - - - - - - - - - -
Vessel NameDate
-
-
- {{getLaunchCount('VAB')}} - - {{getLaunchCount('SPH')}} - -
-
-
- -
` -}; diff --git a/RP1AnalyticsWebApp/wwwroot/js/components/leaders.js b/RP1AnalyticsWebApp/wwwroot/js/components/leaders.js deleted file mode 100644 index 956e82a..0000000 --- a/RP1AnalyticsWebApp/wwwroot/js/components/leaders.js +++ /dev/null @@ -1,62 +0,0 @@ -const Leaders = { - mixins: [DataTabMixin], - methods: { - queryData(careerId) { - fetch(`/api/careerlogs/${careerId}/leaders`) - .then(res => res.json()) - .then(jsonItems => { - this.isLoading = false; - this.items = jsonItems; - }) - .catch(error => alert(error)); - }, - formatFloat(val) { - return typeof val === 'number' ? val.toFixed(1) : ''; - }, - getTypeTitle(val) { - const defs = { - Admin: 'Admin', - Engineer: 'Chief Designer', - FlightDirector: 'Flight Director', - Scientist: 'Chief Scientist', - MainContractor: 'Main Contractor', - Subcontractor: 'Subcontractor' - }; - const title = defs[val]; - return title ? title : val; - } - }, - computed: { - tabName() { - return 'leaders'; - } - }, - template: ` -
-

Leaders

- - - - - - - - - - - - - - - - - - - - -
NameTypeAddedRemovedRemove cost
{{ item.title }}{{ getTypeTitle(item.type) }}{{ formatDate(item.dateAdd) }}{{ formatDate(item.dateRemove) }}{{ item.dateRemove ? formatFloat(item.fireCost) : ''}}
-
-
- -
` -}; diff --git a/RP1AnalyticsWebApp/wwwroot/js/components/loading-spinner.js b/RP1AnalyticsWebApp/wwwroot/js/components/loading-spinner.js deleted file mode 100644 index ebaeabe..0000000 --- a/RP1AnalyticsWebApp/wwwroot/js/components/loading-spinner.js +++ /dev/null @@ -1,3 +0,0 @@ -const LoadingSpinner = { - template: `
` -}; diff --git a/RP1AnalyticsWebApp/wwwroot/js/components/meta-information.js b/RP1AnalyticsWebApp/wwwroot/js/components/meta-information.js deleted file mode 100644 index 6c6163f..0000000 --- a/RP1AnalyticsWebApp/wwwroot/js/components/meta-information.js +++ /dev/null @@ -1,78 +0,0 @@ -const MetaInformation = { - props: ['meta', 'title', 'isLoading'], - methods: { - formatToDate(date) { - if (typeof date !== 'string') return '?'; - const m = moment.utc(date); - return m.format('YYYY-MM-DD'); - }, - formatToLocalDate(date) { - if (typeof date !== 'string') return '?'; - const m = moment.utc(date); - return m.local().format('YYYY-MM-DD'); - }, - formatToUTCDateTime(date) { - if (typeof date !== 'string') return '?'; - const m = moment.utc(date); - return m.format(); - } - }, - computed: { - isVisible() { - return this.meta && !this.isLoading; - }, - versionFormatted() { - return this.meta.versionTag ? this.meta.versionTag : '?'; - }, - descriptionShowdown() { - const converter = new showdown.Converter(); - return converter.makeHtml(this.meta.descriptionText); - } - }, - - template: ` -
-
-
-
-
{{meta.careerPlaystyle}}
-
Playstyle
-
-
-
{{meta.difficultyLevel}}
-
Difficulty
-
-
-
{{meta.failureModel}}
-
Failure Model
-
-
-
-
-
{{versionFormatted}}
-
RP-1 Version
-
-
-
{{meta.modRecency}}
-
Recency
-
-
-
-
-
{{formatToLocalDate(meta.creationDate)}}
-
Creation Date
-
-
-
{{formatToLocalDate(meta.lastUpdate)}}
-
Last updated
-
-
- -
-
Notes and Remarks
-

-
-
-
- ` -}; diff --git a/RP1AnalyticsWebApp/wwwroot/js/components/milestone-contracts.js b/RP1AnalyticsWebApp/wwwroot/js/components/milestone-contracts.js deleted file mode 100644 index dcd5c9d..0000000 --- a/RP1AnalyticsWebApp/wwwroot/js/components/milestone-contracts.js +++ /dev/null @@ -1,41 +0,0 @@ -const MilestoneContracts = { - mixins: [DataTabMixin], - methods: { - queryData(careerId) { - fetch(`/api/careerlogs/${careerId}/completedmilestones`) - .then(res => res.json()) - .then(jsonContracts => { - this.isLoading = false; - this.items = jsonContracts; - }) - .catch(error => alert(error)); - } - }, - computed: { - tabName() { - return 'milestones'; - } - }, - template: ` -
-

Completed Milestones

- - - - - - - - - - - - - - -
NameCompletion Date
{{ item.contractDisplayName }}{{ formatDate(item.date) }}
-
-
- -
` -}; diff --git a/RP1AnalyticsWebApp/wwwroot/js/components/program-leaderboard-modal.js b/RP1AnalyticsWebApp/wwwroot/js/components/program-leaderboard-modal.js deleted file mode 100644 index e9e4e61..0000000 --- a/RP1AnalyticsWebApp/wwwroot/js/components/program-leaderboard-modal.js +++ /dev/null @@ -1,73 +0,0 @@ -const ProgramLeaderboardModal = { - props: ['programName', 'mode', 'filters'], - data() { - return { - items: null, - isLoading: false, - isVisible: false, - extraFields: [{ - title: 'Speed', - field: 'speed' - }] - } - }, - watch: { - programName(newProgramName, oldProgramName) { - if (newProgramName !== oldProgramName) { - this.queryData(newProgramName); - } - } - }, - methods: { - queryData(programName) { - this.items = null; - if (programName) { - this.isLoading = true; - fetch(`/odata/programs('${programName}')?type=${this.mode}&${constructFilterQueryString(this.filters, true)}`) - .then((res) => res.json()) - .then((odataResp) => { - const items = odataResp.value; - items.forEach((i) => i.speed = this.mapSpeed(i.speed)); - - this.items = odataResp.value; - this.isVisible = true; - this.isLoading = false; - }) - .catch((error) => alert(error)); - } - }, - formatDate(date) { - return date ? moment.utc(date).format('YYYY-MM-DD') : ''; - }, - closeModal() { - this.isVisible = false; - }, - mapSpeed(speed) { - const defs = { - Slow: 'Normal', - Normal: 'Fast', - Fast: 'Breakneck' - }; - const title = defs[speed]; - return title ? title : speed; - } - }, - computed: { - dlgTitle() { - return this.items && this.items[0].title; - }, - dateField() { - return this.mode; - } - }, - template: ` - ` -}; diff --git a/RP1AnalyticsWebApp/wwwroot/js/components/program-records-table.js b/RP1AnalyticsWebApp/wwwroot/js/components/program-records-table.js deleted file mode 100644 index d338686..0000000 --- a/RP1AnalyticsWebApp/wwwroot/js/components/program-records-table.js +++ /dev/null @@ -1,65 +0,0 @@ -const ProgramRecordsTable = { - props: ['mode', 'filters'], - emits: ['programClicked'], - data() { - return { - items: null, - isLoading: false - } - }, - methods: { - queryData(filters) { - this.isLoading = true; - fetch(`/odata/programRecords?type=${this.mode}&${constructFilterQueryString(this.filters, true)}`) - .then(res => res.json()) - .then(odataResp => { - this.isLoading = false; - this.items = odataResp.value; - }) - .catch(error => alert(error)); - }, - programClicked(contract) { - this.$emit('programClicked', contract); - }, - getCareerUrl(r) { - return `/?careerId=${r.careerId}`; - }, - formatDate(date) { - return date ? moment.utc(date).format('YYYY-MM-DD') : ''; - } - }, - watch: { - mode() { - this.queryData(); - }, - filters() { - this.queryData(); - } - }, - template: ` - - - - - - - - - - - - - - - - - -
Program NameDateUserCareer
- {{r.programDisplayName}} - {{formatDate(r.date)}}{{r.userPreferredName}} - {{r.careerName}} -
-
- -
` -}; diff --git a/RP1AnalyticsWebApp/wwwroot/js/components/programs.js b/RP1AnalyticsWebApp/wwwroot/js/components/programs.js deleted file mode 100644 index 584c1f5..0000000 --- a/RP1AnalyticsWebApp/wwwroot/js/components/programs.js +++ /dev/null @@ -1,54 +0,0 @@ -const Programs = { - mixins: [DataTabMixin], - created: function () { - this.ProgramSpeeds = Object.freeze({ 0: 'Normal', 1: 'Fast', 2: 'Breakneck' }); - }, - methods: { - queryData(careerId) { - fetch(`/api/careerlogs/${careerId}/programs`) - .then(res => res.json()) - .then(jsonItems => { - this.isLoading = false; - this.items = jsonItems; - }) - .catch(error => alert(error)); - }, - mapSpeedToText(speed) { - if (speed == null) return ''; - return this.ProgramSpeeds[speed]; - } - }, - computed: { - tabName() { - return 'programs'; - } - }, - template: ` -
-

Programs

- - - - - - - - - - - - - - - - - - - - -
NameSpeedAcceptedObjectives completedCompleted
{{ item.title }}{{ mapSpeedToText(item.speed) }}{{ formatDate(item.accepted) }}{{ formatDate(item.objectivesCompleted) }}{{ formatDate(item.completed) }}
-
-
- -
` -}; diff --git a/RP1AnalyticsWebApp/wwwroot/js/components/race-management.js b/RP1AnalyticsWebApp/wwwroot/js/components/race-management.js deleted file mode 100644 index 779c120..0000000 --- a/RP1AnalyticsWebApp/wwwroot/js/components/race-management.js +++ /dev/null @@ -1,74 +0,0 @@ -const RaceManagement = { - data() { - return { - items: null, - isLoading: false - } - }, - methods: { - queryData() { - this.isLoading = true; - fetch(`/api/careerLogs/list`) - .then(res => res.json()) - .then(arr => { - arr.forEach(i => i.isUpdating = false); - this.isLoading = false; - this.items = arr; - }) - .catch(error => alert(error)); - }, - saveData(item) { - item.isUpdating = true; - fetch(`/api/careerLogs/${item.id}/Race`, { - method: 'PATCH', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify(item.race) - }) - .catch(error => alert(error)) - .finally(() => { - item.isUpdating = false; - }); - }, - getCareerUrl(c) { - return `/?careerId=${c.id}`; - } - }, - mounted() { - this.queryData(); - }, - template: ` - - - - - - - - - - - - - - - -
UserCareerRace
{{item.userPreferredName}}{{item.name}} -
-
-
- -
-
- -
-
-
-
-
- -
` -}; diff --git a/RP1AnalyticsWebApp/wwwroot/js/components/repeatable-contracts.js b/RP1AnalyticsWebApp/wwwroot/js/components/repeatable-contracts.js deleted file mode 100644 index 893cf5e..0000000 --- a/RP1AnalyticsWebApp/wwwroot/js/components/repeatable-contracts.js +++ /dev/null @@ -1,41 +0,0 @@ -const RepeatableContracts = { - mixins: [DataTabMixin], - methods: { - queryData(careerId) { - fetch(`/api/careerlogs/${careerId}/completedRepeatables`) - .then(res => res.json()) - .then(jsonContracts => { - this.isLoading = false; - this.items = jsonContracts; - }) - .catch(error => alert(error)); - } - }, - computed: { - tabName() { - return 'repeatables'; - } - }, - template: ` -
-

Completed Repeatables

- - - - - - - - - - - - - - -
Name# of Completions
{{ item.contractDisplayName }}{{ item.count }}
-
-
- -
` -}; diff --git a/RP1AnalyticsWebApp/wwwroot/js/components/tech-unlocks.js b/RP1AnalyticsWebApp/wwwroot/js/components/tech-unlocks.js deleted file mode 100644 index 32afaaa..0000000 --- a/RP1AnalyticsWebApp/wwwroot/js/components/tech-unlocks.js +++ /dev/null @@ -1,46 +0,0 @@ -const TechUnlocks = { - mixins: [DataTabMixin], - methods: { - queryData(careerId) { - fetch(`/api/careerlogs/${careerId}/tech`) - .then(res => res.json()) - .then(jsonItems => { - this.isLoading = false; - this.items = jsonItems; - }) - .catch(error => alert(error)); - }, - formatFloat(val) { - return typeof val === 'number' ? val.toFixed(2) : ''; - } - }, - computed: { - tabName() { - return 'tech'; - } - }, - template: ` -
-

Unlocked Technologies

- - - - - - - - - - - - - - - - -
NameRate MultiplierCompletion Date
{{ item.nodeDisplayName }}{{ formatFloat(item.yearMult) }}{{ formatDate(item.date) }}
-
-
- -
` -}; diff --git a/RP1AnalyticsWebApp/wwwroot/js/navbar.js b/RP1AnalyticsWebApp/wwwroot/js/navbar.js deleted file mode 100644 index c62b169..0000000 --- a/RP1AnalyticsWebApp/wwwroot/js/navbar.js +++ /dev/null @@ -1,16 +0,0 @@ -document.addEventListener('DOMContentLoaded', () => { - const $navbarBurgers = Array.prototype.slice.call(document.querySelectorAll('.navbar-burger'), 0); - - if ($navbarBurgers.length > 0) { - $navbarBurgers.forEach(el => { - el.addEventListener('click', () => { - // Get the target from the "data-target" attribute - const target = el.dataset.target; - const $target = document.getElementById(target); - - el.classList.toggle('is-active'); - $target.classList.toggle('is-active'); - }); - }); - } -}); \ No newline at end of file diff --git a/RP1AnalyticsWebApp/wwwroot/js/records.js b/RP1AnalyticsWebApp/wwwroot/js/records.js deleted file mode 100644 index c6129a6..0000000 --- a/RP1AnalyticsWebApp/wwwroot/js/records.js +++ /dev/null @@ -1,52 +0,0 @@ -(() => { - const app = Vue.createApp({ - data() { - return { - programsMode: 'completed', - programName: null, - contractName: null, - filters: null - }; - }, - watch: { - programsMode() { - this.programName = null; // to prevent dialog showing outdated data when clicking on a program that was already loaded before but in different mode - } - }, - methods: { - handleChangeActive(tabName) { - this.programsMode = tabName; - }, - showProgramLeaderboard(program) { - if (this.programName === program.programName) { - this.$refs.programModal.isVisible = true; - } - this.programName = program.programName; - }, - showContractLeaderboard(contract) { - if (this.contractName === contract.contractInternalName) { - this.$refs.contractModal.isVisible = true; - } - this.contractName = contract.contractInternalName; - }, - handleFiltersChange(filters) { - this.filters = filters; - this.contractName = null; - } - } - }); - app.component('loading-spinner', LoadingSpinner); - app.component('program-record-type-select', ProgramRecordTypeSelect); - app.component('program-records-table', ProgramRecordsTable); - app.component('program-leaderboard-modal', ProgramLeaderboardModal); - app.component('contract-records-table', ContractRecordsTable); - app.component('contract-leaderboard-modal', ContractLeaderboardModal); - app.component('career-dates', CareerDates); - const vm = app.mount('#app'); - - vm.handleFiltersChange(vmFilters.filters); - - window.filtersChanged = filters => { - vm.handleFiltersChange(filters); - } -})();